
var time=20;
var closeTime=3;
var url="/cgi-bin/taxi.cgi";
var first;
var ua = navigator.userAgent.toLowerCase();
var isIE = (ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1);

function init (city) {
//	alert(location.href);
	if (!city) {city="";} else {first="no";}
	var lnk = url + "?type=init&city=" + city + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = afterInit;
	request.send(null);

	var cityElement = document.getElementById("city_name");
	cityElement.className="loading_mini_white";
	cityElement.innerHTML="";
}

function afterInit() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var xmlDoc = request.responseXML;
	var cityNameElement = document.getElementById("city_name");
	var regionNameElement = document.getElementById("region_name");
	cityNameElement.className="zag1";

	var type = xmlDoc.getElementsByTagName("type")[0].firstChild.nodeValue;
	if (type=="ok") { 
		phone_status.style.display="block";

		var phone = xmlDoc.getElementsByTagName("phone")[0].firstChild.nodeValue;
		var city_name = xmlDoc.getElementsByTagName("city_name")[0].firstChild.nodeValue;
		var region_name = xmlDoc.getElementsByTagName("region_name")[0].firstChild.nodeValue;
		var city_id = xmlDoc.getElementsByTagName("city_id")[0].firstChild.nodeValue;
		var city_code = xmlDoc.getElementsByTagName("city_code")[0].firstChild.nodeValue;

		var cityIdElement = document.getElementById("city");
		var cityCodeElement = document.getElementById("city_code");
		var cityCodeElement2 = document.getElementById("city_code2");
		cityIdElement.value=city_id;
		replaceText(cityCodeElement, "("+city_code+")");
		replaceText(cityCodeElement2, "("+city_code+")");

		phNum=10-city_code.length;
		phoneNum.value=phNum;
		document.getElementById("phone1").setAttribute('maxlength', phNum);
		document.getElementById("phone2").setAttribute('maxlength', phNum);

		if (phone == "no") {phone="";}
		else { showCat(); }
		if (first=="no" || (location.hash)) { showCat(); }
		
		save(phone);
		cityName=city_name;

		var address=region_name + ", " + city_name;
		showMap(address);
	}
	else { 	cityName="город не определен"; region_name=" ";}
	replaceText(cityNameElement, cityName);
	replaceText(regionNameElement, region_name);
    } else error(request.status);
  }
}

function showMap(address) {
	var mapElement = document.getElementById("map_panel");
	if (GBrowserIsCompatible()) {
		geocoder = new GClientGeocoder();
	        geocoder.getLatLng(
	          address,
        	  function(point) {
	            if (point) {
			mapElement.style.height="220px";
			map = new GMap2(mapElement);
			map.addControl(new GSmallZoomControl());
       			map.setCenter(point, 13);
	            } else {
			mapElement.innerHTML="";
			mapElement.style.height="0px";
	            }
        	  }
	        );

	}

}


function showDop () {

	var leftElement = document.getElementById("left_panel");
	leftElement.innerHTML="";

	var statPanel = document.createElement("div");
	statPanel.id = "stat_panel";
	leftElement.appendChild(statPanel);

	var lnk_stat = url + "?type=mystat&cash=" + new Date().getTime();
	request.open("GET", lnk_stat, true);
	request.onreadystatechange = listStat;
	request.send(null);

	var statElement = document.getElementById("stat_panel");
	statElement.className="loading_mini_white";
	statElement.innerHTML="";

}

function listStat() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var response = request.responseText;
	var statElement = document.getElementById("stat_panel");
	statElement.className="";
	statElement.innerHTML=response;
    } else error(request.status);
  }
}


function showCat (cloud) {

	var city = document.getElementById("city").value;
	if (!city) {chRegion(); }

	var vidEl = document.getElementById("vid");
	vidEl.style.display="block";

	var vidElement = document.getElementById("vid_spisok");
	var vidElement2 = document.getElementById("vid_cloud");

	if (vidElement2.checked == true) {
		var cloud=1;
		vidElement.parentNode.className="un_check";
		vidElement2.parentNode.className="check";
	} else {
		vidElement.parentNode.className="check";
		vidElement2.parentNode.className="un_check";
	}


	var lnk = url + "?type=catalog&city=" + city +
			"&cloud=" + cloud + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = listCat;
	request.send(null);

	var catElement = document.getElementById("catalog");
	catElement.className="loading_big";
	catElement.innerHTML="";
}

function listCat() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var response = request.responseText;
	var catElement = document.getElementById("catalog");
	catElement.className="";
	catElement.innerHTML=response;
	showDop(); 
	if(location.hash){ fast_call(); location.href="#";}
    } else error(request.status);
  }
}

function fast_call() {
	var t_id=location.hash.substring(1);
	var ch = document.getElementById(t_id);
	if (ch) { call(t_id); }
}

function call(id) {
	document.getElementById("taxi").value=id;
	block(nabor);
	show(nomer);
	ph=save_phone.value;
	if (!ph) {enterPhone();}
	else { hide(nomer); connect();}
}

function connect() {
	id=taxi.value;

	if (id) {
		show(caller);
		hide(finish);
		saved=savedId.value;
		if (saved) { makeCall(); }
		else { savedId.value=id; show(anons); }
	} else {
		unblock(nabor);
	}
}

function makeCall() {
	hide(closer);
	hide(anons);
	id=taxi.value;
	taxiInfo(id);

	var lnk = url + "?type=connect&phone=" + escape(save_phone.value) +
			"&id=" + id + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = afterConnect;
	request.send(null);

	var callerElement = document.getElementById("caller");
	callerElement.className="loading_mini";
	text="Проверка связи";
	replaceText(callerElement, text);
}

function afterConnect() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var xmlDoc = request.responseXML;
	var type = xmlDoc.getElementsByTagName("type")[0].firstChild.nodeValue;
	var comment = xmlDoc.getElementsByTagName("comment")[0].firstChild.nodeValue;

	if (type=="connecting") { 
		pId=comment;
		waitChoise();
	}
	else { error(comment);}
    } else error(request.status);
  }
}

function waitChoise() {
	var statusElement = document.getElementById("statusId");
	statusElement.value=pId;
	var callerElement = document.getElementById("caller");
	callerElement.className="loading_normal";
	text="Идет соединение \""+nameTaxi+"\" с номером "+save_phone.value+". Дождитесь ответа оператора и назовите ему адрес.";
	replaceText(callerElement, text);

 	window.setTimeout("showChoise()",time*1000);
}

function error (text) {
	show(closer);
	text="Ошибка: "+text;
	var callerElement = document.getElementById("caller");
	callerElement.className="status";
	replaceText(callerElement, text);
 	window.setTimeout("closeNabor()",closeTime*1000);
}

function taxiInfo(id) {
	tblock = document.getElementById(id);
	info=tblock.getElementsByTagName('span');

	var vidElement = document.getElementById("vid_cloud");
	if (vidElement.checked == true) {
		nameTaxi=info[0].firstChild.nodeValue;		
	} else {
		nameTaxi=info[1].firstChild.nodeValue;
		phoneTaxi=info[2].firstChild.nodeValue;
		if (info[3].firstChild) { 
			descTaxi=info[3].firstChild.nodeValue;
		} else {descTaxi="";}
	}


}

function showChoise () {
	show(finish);
	var callerElement = document.getElementById("caller");
	callerElement.className="status";
	text="Вызов \""+nameTaxi+"\"" + " состоялся. Выберите:";
	replaceText(callerElement, text);

	var nextTaxiElement = document.getElementById("endNext");
	var repTaxiElement = document.getElementById("endRep");
	var okTaxiElement = document.getElementById("endOk");
	nextTaxiElement.onclick = nextTaxi;
	repTaxiElement.onclick = reConnect;
	okTaxiElement.onclick = okEnd;
}

function nextTaxi (id) {
	chStatus("no");
	closeNabor();

//	if (!id) {
		var idElement = document.getElementById("taxi");
		id=idElement.value;
//	}
	tblock = document.getElementById(id);
	tblock.className="badTaxi";
	
	goTimer(id,"Неудавшийся вызов");
}

function reConnect () {
	var idElement = document.getElementById("taxi");
	id=idElement.value;

	tblock = document.getElementById(id);
	tblock.className="badTaxi";
	
	goTimer(id,"Неудавшийся вызов");

	connect();
}


function okEnd () {
	chStatus("ok");
	show(closer);
	var callerElement = document.getElementById("caller");
	callerElement.className="status";
	hide(finish);
	text="Благодарим за использование сервиса";
	replaceText(callerElement, text);
 	window.setTimeout("markOk()",closeTime*1000);
}

function markOk (id) {
	closeNabor();

	if (!id) {
		var idElement = document.getElementById("taxi");
		id=idElement.value;
	}
	tblock = document.getElementById(id);
	tblock.className="goodTaxi";

	goTimer(id,"Машина выехала","ok");
}

function goTimer(id,text,type){
	now = new Date();
	starttime = now.getTime();
	callId = "call" + starttime;

	rblock = document.getElementById(id).getElementsByTagName("ul")[0];
	rblock.style.display="block";

	uHeight=rblock.offsetHeight;
	tblock.style.height=eval(uHeight + 30) + "px";


	lElement = document.createElement("li");
	lElement.setAttribute('id', callId);
	textNode = document.createTextNode(text);
	lElement.appendChild(textNode);
	if (type=="ok") lElement.className="ok_call";

	fLi=rblock.getElementsByTagName('li')[0];
	rblock.insertBefore(lElement, fLi);

	startTimer(callId,text,starttime);
}

function startTimer(id,text,starttime){
      now = new Date();
      diff = Math.floor((now.getTime()-starttime)/1000);
      hours = Math.floor(diff/3600);
      mins = Math.floor(diff/60) % 60;
      secs = diff % 60;
      if (hours < 10)
         hours = "0"+hours;
      if (mins < 10)
         mins = "0"+mins;
      if (secs < 10)
         secs = "0"+secs;
         
	timeLeft= text + ": " + mins + ":" + secs;

	callElement = document.getElementById(id);	
	replaceText(callElement, timeLeft);

	window.setTimeout("startTimer(\""+id+"\",\""+text+"\","+starttime+")",1000);
}

function chStatus(status) {
	var statusElement = document.getElementById("statusId");
	pId=statusElement.value;

	var lnk = url + "?type=status&id=" + escape(pId) +
			"&status=" + status + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.send(null);
}

function editPhone() {
	block(nabor);
	show(edit_nomer);
	fElement = document.getElementById("phone1");
	fElement.focus();
}

function enterPhone() {
	show(nomer);
	fElement = document.getElementById("phone2");
	fElement.focus();
}

function save(tel) {
	save_phone.value=tel;
	var enterNomer = document.getElementById("save_phone_text");
	fElement = document.getElementById("phone1");
	fElement.value=tel;
	fElement2 = document.getElementById("phone2");
	fElement2.value=tel;
	if (!tel) { fElement.value=""; fElement2.value=""; tel="не определен"; }
	showText=enterNomer.firstChild;
	newText=document.createTextNode(tel);
	enterNomer.replaceChild(newText,showText);
}

function save_connect(tel) {
	save(tel);
	var id=taxi.value;
	hide(nomer);
	if (id) {connect(id);} 
	else { closeNabor(); }
}

function save_exit(tel) {
	save(tel);
	hide(edit_nomer);
	closeNabor();
}


function chRegion () {
	block(nabor);
	nabor.style.width="900px";
	nabor.style.top="5%";
	nabor.style.left="5%";

	var regionElement = document.getElementById("region");
	show(regionElement);
	showTown();
}


function showTown(type,id) {
	if (!type) {type="region";}
	var lnk = url + "?type=" + type + "&id=" + id + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = afterTown;
	request.send(null);
	var regionElement = document.getElementById("region");
	regionElement.className="loading_normal";
	text="Загрузка списка";
	regionElement.innerHTML=text;
}

function afterTown() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var response = request.responseText;
	var regionElement = document.getElementById("region");
	regionElement.className="townList";
	regionElement.innerHTML=response;

    } else error(request.status);
  }
}


function chTown(city) {
	var regionElement = document.getElementById("region");
	hide(regionElement);
	closeNabor();
	init(city);
//	editPhone();
}

function feedBack() {
	block(nabor);
	var naborElement = document.getElementById("nabor");
	var feedElement = document.getElementById("feed_form");
	show(feedElement);
	naborElement.appendChild(feedElement);
	var closeElement = document.getElementById("closer");
	closeElement.onclick = closeFeed;
	document.getElementById("feed_name").focus();

}

function addFeed(feed_name,feed_mail,feed_text) {

	if (!feed_name) { alert("Мы не сможем нормально общаться, не зная имени обратного адресата. Введите свое имя."); return false;}
	if (!feed_mail) { alert("Не зная e-mail мы не сможем ответить. Укажите e-mail."); return false;}
	if (feed_text.length < 100 ) { alert("Если хотите сообщить нам что-то важное - потрудитесь набрать более 100 символов."); return false; }

	var city_name = document.getElementById("city_name").firstChild.nodeValue;

	var lnk = url + "?type=feed" +
			"&city=" + city_name + 
			"&name=" + encodeURIComponent(feed_name) + 
			"&mail=" + encodeURIComponent(feed_mail) + 
			"&text=" + feed_text;
	request.open("GET", lnk, true);
	request.onreadystatechange = afterFeed;
	request.send(null);

	var feedElement = document.getElementById("feed_form");
	hide(feedElement);

	var naborElement = document.getElementById("nabor");

	var statusPanel = document.createElement("div");
	statusPanel.id = "status_panel";
	naborElement.appendChild(statusPanel);

	statusPanel.className="loading_mini";
	text="Отправка сообщения";
	statusPanel.innerHTML="";
	replaceText(statusPanel, text);
	
}

function afterFeed() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var xmlDoc = request.responseXML;
	var type = xmlDoc.getElementsByTagName("type")[0].firstChild.nodeValue;
	var comment = xmlDoc.getElementsByTagName("comment")[0].firstChild.nodeValue;

	var feedElement = document.getElementById("status_panel");
	feedElement.className="status";

	if (type=="added") { 
		replaceText(feedElement, comment);
	 	window.setTimeout("closeFeed();",closeTime*2000);
	} else { 
		replaceText(feedElement, "Ошибка: " + comment);
		feedBack();
	}
 	window.setTimeout("closeStatus();",closeTime*2000);
    } else error(request.status);
  }
}

function check_feed(feed_text) {
	var ftElement = document.getElementById("feed_text_status");
	if (feed_text.length < 100 ) { 
		left_feed_text=100-feed_text.length;
		ftElement.innerHTML="Осталось придумать " + left_feed_text + " символов";
	} else {
		ftElement.innerHTML="";
	}
}

function closeFeed() {
	var feed_text = document.getElementById("feed_text");
	feed_text.value="";
	var feedElement = document.getElementById("feed_form");
	hide(feedElement);
	closeNabor();
}

function closeStatus() {
	var feedElement = document.getElementById("status_panel");
	var naborElement = document.getElementById("nabor");
	naborElement.removeChild(feedElement);
}

function showAdd() {
	block(nabor);
	var naborElement = document.getElementById("nabor");
	var addElement = document.getElementById("add_taxi");
	show(addElement);
	naborElement.appendChild(addElement);
	var cityCodeElement = document.getElementById("city_code");
	var cityCodeElement3 = document.getElementById("city_code3");
	cityCodeElement3.innerHTML=cityCodeElement.firstChild.nodeValue;
	var closeElement = document.getElementById("closer");
	closeElement.onclick = closeAdd;
	document.getElementById("add_phone").setAttribute('maxlength', phoneNum.value);
	var addPh = document.getElementById("add_phone");
	addPh.focus();

}

function addTaxi(add_phone,add_name,add_opis) {
	if (!add_phone) { alert("Введите телефон"); return false;}
	if (!add_name) { alert("Введите название"); return false;}

	var city_id = document.getElementById("city").value;

	var lnk = url + "?type=add&phone=" + escape(add_phone) +
			"&name=" + encodeURIComponent(add_name) + 
			"&opis=" + add_opis + 
			"&city=" + city_id + 
			"&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = afterAdd;
	request.send(null);

	var addElement = document.getElementById("add_taxi");
	addElement.className="loading_mini";
	text="Добавление номера";
	addElement.innerHTML="";
	replaceText(addElement, text);
	
}

function afterAdd() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var xmlDoc = request.responseXML;
	var type = xmlDoc.getElementsByTagName("type")[0].firstChild.nodeValue;
	var comment = xmlDoc.getElementsByTagName("comment")[0].firstChild.nodeValue;

	var addElement = document.getElementById("add_taxi");
	addElement.className="status";

	if (type=="added") { 
		replaceText(addElement, comment);
	} else { 
		replaceText(addElement, "Ошибка: " + comment);
	}
	var addBlockElement = document.getElementById("addBlock");
	addBlockElement.innerHTML="";
	hide(addBlockElement);
 	window.setTimeout("closeAdd();",closeTime*1000);
    } else error(request.status);
  }
}

function closeAdd() {
	var addElement = document.getElementById("add_taxi");
	var naborElement = document.getElementById("nabor");
	naborElement.removeChild(addElement);

	showCat();
	closeNabor();
}

function showInfo(id) {
	block(nabor);
	show(caller);

	var lnk = url + "?type=info&id=" + id + "&cash=" + new Date().getTime();
	request.open("GET", lnk, true);
	request.onreadystatechange = afterInfo;
	request.send(null);

	var callerElement = document.getElementById("caller");
	callerElement.className="loading_mini";
	callerElement.innerHTML="";
	text="Загрузка информации";
	replaceText(callerElement, text);

}

function afterInfo() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var response = request.responseText;
	var statElement = document.getElementById("caller");
	statElement.className="";
	statElement.innerHTML=response;
    } else error(request.status);
  }
}


function closeNabor() {
	show(closer);
	hide(anons);
	hide(edit_nomer);
	hide(nomer);
	hide(caller);
	hide(finish);
	var regionElement = document.getElementById("region");
	hide(regionElement);
	unblock(nabor);
	nabor.style.width="480px";
}


function block(area) {
	overlay.style.height=document.body.scrollHeight;
	overlay.style.width=document.body.clientWidth;

	scTop=document.body.scrollTop;

	nabor.style.left = document.body.scrollLeft + (document.body.clientWidth - 470) / 2;
	if (isIE) {
		top_h=document.body.clientHeight*0.2;
		nabor.style.top = (top_h+scTop) + 'px';
	}

	overlay.style.display="block";
	area.style.display="block";

	var closeElement = document.getElementById("closer");
	closeElement.onclick = closeNabor;
}

function unblock(area) {
	overlay.style.display="none";
//	body.style.overflow="auto";
	area.style.display="none";
}

function show(area) {
	area.style.display="block";
}

function hide(area) {
	area.style.display="none";
}


function validate(string,key) {

	button=string.name+'_but';
	var butEl=document.getElementById(button);
	if (phoneNum.value == string.value.length) {butEl.style.visibility="visible";}
	else {butEl.style.visibility="hidden";}

	var Chars = "0123456789";

	for (var i = 0; i < string.value.length; i++) {
		if (Chars.indexOf(string.value.charAt(i)) == -1) {
			string.value=string.value.substr(0,string.value.length-1);
		}
	}
} 


function showPage(page) {
	request.open("GET", page + "?cash=" + new Date().getTime(), true);
	request.onreadystatechange = listPage;
	request.send(null);

	var catElement = document.getElementById("catalog");
	catElement.className="loading_big";
	catElement.innerHTML="";
	self.scroll(0,0);
}

function listPage() {
  if (request.readyState == 4) {
    if (request.status == 200) {
	var response = request.responseText;
	var catElement = document.getElementById("catalog");
	catElement.className="";
	catElement.innerHTML=response;
    } else error(request.status);
  }
}

function isValidEmail (email)
{
 return (/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i).test(email);
}