var serverTime = new Date();//jeśli zbyt długo nie będzie odpowiedzi z serwera - próbujemy jeszcze raz
var backendURL = "zamowonline_backend.php";
var interacting = false;//czy przeglądarka jest w trakcie interakcji z serwerem
var f_name = '';//trzon pliku do wymiany z serwerem Sawa (bez rozszerzenia)
var pe;//"pusty" periodical executer
var updateInterval = 4;//w s.
var updateIntervalPZ = 15;//w s. - do ponownego zamawiania
var updateIntervalAccept = 70;//w s. - do potwierdzenia - jeśli klient czeka zbyt długo, otrzymuje komunikat z błędem

var checkFileTime = new Date();

function checkSerwer() {
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	
	var params = {};
	params.action = 'checkZamow';
	$("debug").innerHTML = params.action;
	
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				if(resp.f_name!='') {
					$("debug").innerHTML = resp.f_name;
					f_name = resp.f_name;
					checkFileTime = new Date();//zerujemy czas sprawdzania pliku
					checkFile();
					pe = new PeriodicalExecuter(checkFile, updateInterval);
				}
				else {
					throwErr();
					pe.stop();
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function checkFile() {
	showWait();
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	
	var params = {};
	params.action = 'checkFile';
	$("debug").innerHTML = params.action;
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = resp.f_exists;
				if(resp.f_exists=='1') showForm();
				else {
					var sMinelyCF = Math.round((serwerAktT.getTime() - checkFileTime.getTime())/1000);
					if(sMinelyCF>20) throwErr();
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}



function submitForm() {
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	showWait();

	var params = {};
	params.action = 'submitForm';
	params.zo_nazwisko = $('zo_nazwisko').value;
	params.zo_telefon = $('zo_telefon').value;
	params.zo_data = $('zo_data').value;
	params.zo_godzina = $('zo_godzina').value;
	params.zo_miasto = $('zo_miasto').value;
	params.zo_lokalizacja = $('zo_lokalizacja').value;
	params.zo_nr_bloku = $('zo_nr_bloku').value;
	params.zo_nr_mieszkania = $('zo_nr_mieszkania').value;
	params.zo_opis = $('zo_opis').value;
	params.zo_chce_karte = $('zo_chce_karte').value;
	
	$("debug").innerHTML = params.action;
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = tr.responseText;
				var err_cnt = parseInt(resp.submit_output.err_cnt);//ilość błędów
				var err_str = resp.submit_output.err_str;//lista błędów
				if(err_cnt>0) {
					var alert_str = 'Wystąpiły błędy. Prosimy je poprawić i spróbować jeszcze raz.';
					if(err_str.nazwisko) alert_str+="\nNieprawidłowe nazwisko lub numer karty.";
					if(err_str.telefon) alert_str+="\nNieprawidłowy telefon.";
					if(err_str.data) alert_str+="\nNieprawidłowa data.";
					if(err_str.godzina) alert_str+="\nNieprawidłowa godzina.";
					if(err_str.lokalizacja) alert_str+="\nNieprawidłowa ulica.";
					if(err_str.nr_bloku) alert_str+="\nNieprawidłowy nr bloku.";
					showForm();
					alert(alert_str);
				}
				else {
					var lokalizacje = resp.submit_output.lokalizacje;
					showConfirm(lokalizacje);
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function showConfirm(lokalizacje) {//ekran z potwierdzeniem
	showConf();
	
	var confTxt = '<strong>Godzina przyjazdu taksówki:</strong> '+$('zo_data').value+' '+$('zo_godzina').value+'<br />';
	confTxt += '<strong>Miejscowość:</strong> '+$('zo_miasto').options[$('zo_miasto').selectedIndex].text+'<br />&nbsp;<br />';
	confTxt += '<strong>Nazwa miejsca:</strong><br />';

	if(lokalizacje.length==0) {
		confTxt += $('zo_lokalizacja').value;
	}
	else if(lokalizacje.length==1) {
		confTxt += '<input type="hidden" id="lokalizacja_id" value="'+lokalizacje[0]['id']+'">'+lokalizacje[0]['lokalizacja'];
	}
	else {
		confTxt += 'Niejednoznaczna nazwa miejsca, proszę wybrać z listy:<br /><select id="lokalizacja_id">';
		for(var i=0;i<lokalizacje.length;i++) confTxt+='<option value="'+lokalizacje[i]['id']+'">'+lokalizacje[i]['lokalizacja']+'</option>';
		confTxt += '</select>';
	}
	confTxt += '<br />&nbsp;<br />';
	confTxt += '<strong>Nr budynku / nr mieszkania:</strong> '+$('zo_nr_bloku').value+($('zo_nr_mieszkania').value!=''?'/'+$('zo_nr_mieszkania').value:'')+'<br />';
	if($('zo_opis').value!='') confTxt += '<strong>Dodatkowa informacja dla kierowcy:</strong> '+$('zo_opis').value+'<br />';
	confTxt += '<strong>Bezgotówkowa forma płatności:</strong> '+($('zo_chce_karte').checked?'tak':'nie')+'<br />&nbsp;<br />';
	confTxt += '<input type="button" onclick="showForm();" style="cursor:pointer" value="Popraw" />&nbsp;'+
				'<input type="button" onclick="acceptData();" style="cursor:pointer" value="Potwierdź" />';
	$('confHTML').innerHTML = confTxt;
}

function acceptData() {
	showWait();
	var lokalizacja_id = 0;
	if($('lokalizacja_id')) lokalizacja_id = parseInt($('lokalizacja_id').value);
	
	var params = {};
	params.action = 'zamow';
	params.zo_nazwisko = $('zo_nazwisko').value;
	params.zo_telefon = $('zo_telefon').value;
	params.zo_data = $('zo_data').value;
	params.zo_godzina = $('zo_godzina').value;
	params.zo_miasto = $('zo_miasto').value;
	params.zo_lokalizacja = $('zo_lokalizacja').value;
	params.zo_lokalizacja_id = lokalizacja_id;
	params.zo_nr_bloku = $('zo_nr_bloku').value;
	params.zo_nr_mieszkania = $('zo_nr_mieszkania').value;
	params.zo_opis = $('zo_opis').value;
	params.zo_chce_karte = $('zo_chce_karte').value;
	
	$("debug").innerHTML = params.action;
	
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = tr.responseText;
				if(resp.submit_output.errors.length>0) {
					throwErr();
				}
				else {
					checkFileTime = new Date();//zerujemy czas sprawdzania pliku
					pe = new PeriodicalExecuter(checkFileAccept, updateInterval);
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function checkFileAccept() {
	showWait();
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	
	var params = {};
	params.action = 'checkFileAccept';
	$("debug").innerHTML = params.action;
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = tr.responseText;
				if(resp.submit_output.f_exists=='1') {
					pe.stop();
					showFinalAccept(resp.submit_output.dane_org);
				}
				else {
					var sMinelyCF = Math.round((serwerAktT.getTime() - checkFileTime.getTime())/1000);
					if(sMinelyCF>20) throwErr();
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function showFinalAccept(dane_org) {
	pe = new PeriodicalExecuter(tooLong, updateIntervalAccept);
	var finalAccept = '';
	if(dane_org['godzina']!=dane_org['godzreal']) finalAccept += "Jesteśmy w stanie zrealizować Państwa zamówienie na nastepującą godzinę.<br />";
	if(dane_org['godzina']!=dane_org['godzreal']) finalAccept += "<font color=\"#FF0000\"><strong>Godzina&nbsp;przyjazdu&nbsp;taksówki:</strong></font> ";
	else finalAccept += "<strong>Godzina&nbsp;przyjazdu&nbsp;taksówki:</strong> ";
	if(dane_org['godzina']!=dane_org['godzreal']) finalAccept += "<font color=\"#FF0000\">"+dane_org['godzreal']+"</font>";
	else finalAccept += dane_org['godzreal'];
	finalAccept += "<br /><br />";
	finalAccept += "<strong>Prosimy o potwierdzenie zamówienia.</strong>";
	finalAccept += "<br /><br />";
	
	//finalAccept += "<br /><br />";
	

	if(dane_org['data']!=dane_org['datareal']) finalAccept += "<font color=\"#FF0000\">Data:</font>&nbsp;";
	else finalAccept += "<strong>Data:</strong>&nbsp;";
	//finalAccept += "<br /><br />";
	if(dane_org['data']!=dane_org['datareal']) finalAccept += "<font color=\"#FF0000\">"+dane_org['datareal']+"</font>";
	else finalAccept += dane_org['datareal'];
	finalAccept += "<br />";
	finalAccept += "<strong>Nazwisko lub nr karty:</strong>&nbsp;"+dane_org['nazwisko'];
	finalAccept += "<br /><strong>Miejscowość:</strong>&nbsp;"+dane_org['miejsce'];
	finalAccept += "<br /><strong>Ulica:</strong>&nbsp;"+dane_org['ulica'];
	if(dane_org['ulica_numer']!='') {
		finalAccept += "<br />Numer budynku/mieszkania:&nbsp;";
		finalAccept += dane_org['ulica_numer'];
		if(dane_org['mieszkanie']!='') finalAccept += "&nbsp;/&nbsp;"+dane_org['mieszkanie'];
	}
	finalAccept += "<br /><strong>Telefon:</strong>&nbsp;"+dane_org['telefon'];
	finalAccept += "<br /><strong>Płatność kartą:</strong>&nbsp;"+dane_org['chce_karte'];
	finalAccept += "<br /><br />";
	
	
	finalAccept += "<input type=\"button\" onclick=\"zrezygnuj();\" value=\"Zrezygnuj\" style=\"cursor:pointer;\">&nbsp;";
	finalAccept += "<input type=\"button\" onclick=\"finalZamow();\" value=\"Zamów\" style=\"cursor:pointer;\">";
	$('confHTML').update(finalAccept);
	showConf();
}

function tooLong() {
	pe.stop();
	var confTxt = 'Przekroczono czas oczekiwania<br />&nbsp;<br /><input type="button" onclick="showForm();" style="cursor:pointer" value="Zamów ponownie" />';
	$('confHTML').innerHTML = confTxt;
	showConf();
	pe = new PeriodicalExecuter(ponowneZamowienie, updateIntervalPZ);
}

function zrezygnuj() {
	$('confHTML').update('Dziękujemy i zapraszamy ponownie.');
	showConf();
	pe = new PeriodicalExecuter(ponowneZamowienie, updateIntervalPZ);
}

function finalZamow() {
	checkFileTime = new Date();//zerujemy czas sprawdzania pliku
	showWait();
	pe = new PeriodicalExecuter(checkKoniec, updateInterval);
}

function checkKoniec() {
	showWait();
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	
	var params = {};
	params.action = 'checkKoniec';
	$("debug").innerHTML = params.action;
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = tr.responseText;
				if(resp.submit_output.f_exists=='1') {
					checkFileTime = new Date();//zerujemy czas sprawdzania pliku
					pe.stop();
					pe = new PeriodicalExecuter(checkKoniecSawa, updateInterval);
				}
				else {
					var sMinelyCF = Math.round((serwerAktT.getTime() - checkFileTime.getTime())/1000);
					if(sMinelyCF>20) {
						throwErr();
						pe.stop();
					}
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function checkKoniecSawa() {
	showWait();
	var serwerAktT=new Date();
	var sMinely = Math.round((serwerAktT.getTime() - serverTime.getTime())/1000);
	if(interacting&&sMinely<20) return;
	interacting = true;
	serverTime = new Date();//zerujemy czas interakcji z serwerem
	
	var params = {};
	params.action = 'checkKoniecSawa';
	$("debug").innerHTML = params.action;
	var ar = new Ajax.Request(backendURL, {
		method: 'post',
		parameters: params,
		onFailure: function(tr) {
			//alert('Error code: ' + tr.status + '\n');
			$("debug").innerHTML = (tr.responseText);
			interacting = false;
			throwErr();
			},
		onSuccess: function(tr) {
			interacting = false;
			var resp = '';
			try {
				resp = tr.responseText.evalJSON();
				$("debug").innerHTML = tr.responseText;
				if(resp.submit_output.f_exists=='0') {
					pe.stop();
					thankYou();
				}
				else {
					var sMinelyCF = Math.round((serwerAktT.getTime() - checkFileTime.getTime())/1000);
					if(sMinelyCF>20) {
						throwErr();
						pe.stop();
					}
				}
			}
			catch(err) {
				$("debug").innerHTML = tr.responseText;
			}
			//if (tr.responseText) $("debug").innerHTML = (tr.responseText);
		}
	});
}

function thankYou() {
	$('confHTML').update('Dziękujemy za zamówienie!');
	showConf();
	pe = new PeriodicalExecuter(ponowneZamowienie, updateIntervalPZ);
}

function ponowneZamowienie() {
	pe.stop();
	checkSerwer();
}

//pomocnicze
function showWait() {
	$('zo_wait').show();
	$('zo_err').hide();
	$('zo_form').hide();
	$('zo_conf').hide();
}

function showForm() {
	$('zo_wait').hide();
	$('zo_err').hide();
	$('zo_form').show();
	$('zo_conf').hide();
	pe.stop();
	$('zo_submit').observe('click',submitForm);
}

function throwErr() {
	$('zo_wait').hide();
	$('zo_err').show();
	$('zo_form').hide();
	$('zo_conf').hide();
	pe.stop();
}

function showConf() {
	$('zo_wait').hide();
	$('zo_err').hide();
	$('zo_form').hide();
	$('zo_conf').show();
}