


// radios.js - различные интерактивы на странице



// Выбранный транспорт (avto, tram, trol)

var selectedTransport	=	"none";



var selectedWayIndex	=	0;

var selectedDateIndex	=	0;

var selectedDirIndex	=	0;

// Текущий шаг в производстве запроса

// 0 = не выбран транспорт

// 1 = не выбран маршрут

// 2 = не выбран день недели

// 3 = не выбрано направление

// 4 = не выбрана остановка

// 5 = выбрано всё

var currentStep		=	0;



//var httpRequest = null;





function initAJAX()

{

/*	if (window.XMLHttpRequest)

	{

		httpRequest = new XMLHttpRequest();

		httpRequest.overrideMimeType('text/xml');



	}

	else if (window.ActiveXObject)

	{

		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	}*/

}









// cacheTransportImages

// Осуществляет кэширование картинок транспорта

// Ну, чтоб появлялись мгновенно.

function cacheTransportImages()

{

	var imgAvto = new Image;

	var imgTrol = new Image;

	var imgTram = new Image;



	imgAvto.src = "avto.png";

	imgTrol.src = "trol.png";

	imgTram.src = "tram.png";

}





// changeTransportIcon

// Меняет значок транспорта на странице

// Следует передать только принятое сокращение для транспорта

// (avto, tram или trol), остальное функция делает сама.

function changeTransportIcon(newfile)

{

	var iconplace = document.getElementById("transpicon");



	if (iconplace == null)

	{

		alert("Ошибка JavaScript или DOM на этой странице: отсутствует иконка транспорта");

		return;

	}



	var fname = newfile + ".png";

	iconplace.src = fname;

}





// disableAllForm()

// Дизаблит всю форму к чёртовой бабушке.

function disableAllForm()

{

	var i;

	var cnt = document.forms[0].elements.length;



	for (i = 0; i < cnt; i++)

	{

		document.forms[0].elements[i].disabled = true;

	}

}





// hintForStep()

// Показывает справку для шага поиска nStep

function hintForStep(nStep)

{

	// Определение в виде массива всех текстов заголовков и подсказок

	var hHints = new Array (

			"Нужна помощь?",

			"Выбор маршрута",

			"Нужные дни недели",

			"Направление движения",

			"Какие остановки?",

			"Всё готово!"

			);



	var tHints = new Array (

			"<p class=\"contexthelp\">Здесь всегда будет доступна краткая справка по проведению поиска. Если возникнут затруднения, просто прочитайте совет в этой справочной области.</p><p class=\"contexthelp\">Сейчас выберите нужный вид транспорта, - автобус, троллейбус или трамвай, - щелчком по одному из переключателей.</p>",

			"<p class=\"contexthelp\">Обратите внимание - с нашего сервера был загружен список маршрутов, и теперь маршруты доступны для выбора. Выберите нужный маршрут из списка.</p><p class=\"contexthelp\">Забыли номер маршрута? Поищите его через <a href=\"http://www.mosgortrans.org/routefinder/\" target=\"_blank\">каталог маршрутов</a> или воспользуйтесь сторонними сайтами (<a href=\"http://info.dtis.ru/tat.php\" target=\"_blank\">справочник транспортной сети</a> или &quot;<a href=\"http://moskva.ruz.net/att.htm\" target=\"_blank\">Москва Пассажирская</a>&quot;.</p>",

			"<p class=\"contexthelp\">Для выбранного маршрута произведена проверка доступных дней недели. Теперь стал активен список дней, из которого следует выбрать нужный.</p><p class=\"contexthelp\">Нужного дня нет в списке? Попробуйте прочитать справку <a href=\"help.php#noday\" target=\"_blank\">здесь</a>.</p>",

			"<p class=\"contexthelp\">Теперь укажите направление движения, для которого требуется получить расписание. Направление движения показывает, от какой и до какой конечной следует нужный транспорт.</p>",

			"<p class=\"contexthelp\">На любом маршруте существуют некоторые ключевые остановки, для которых и определено расписание. Все остановки маршрута редко бывают ключевыми, так что непосредственно нужной остановки в списке может и не оказаться. Выберите ближайшую согласно нашим <a href=\"help.php#tips\" target=\"_blank\">советам по выбору остановки</a>, после чего нажмите кнопку поиска.</p>",

			"<p class=\"contexthelp\">Сейчас в новом окне должен открыться результат поиска."

			);



	var iHeader = document.getElementById("infoheader");

	var iText = document.getElementById("infotext");



	if (iHeader == null || iText == null)

	{

		alert("AJAX: ошибка DOM на странице, попробуйте упрощённую версию поиска");

		return;

	}



	iHeader.innerHTML = hHints[nStep];

	iText.innerHTML = tHints[nStep];

}



// jumpToStep()

// Переход к указанному параметром шагу выбора (с включением

// соответствующих полей)

function jumpToStep(nStep)

{

	// В любом случае разрешаем радиокнопки

	var ravt = document.getElementById("ravto");

	var rtrl = document.getElementById("rtrol");

	var rtrm = document.getElementById("rtram");



	if (ravt == null || rtrl == null || rtrm == null)

	{

		alert("AJAX: Ошибка включения флажков на странице");

		return;

	}



	ravt.disabled = false;

	rtrl.disabled = false;

	rtrm.disabled = false;



	// Теперь в зависимости от шага включаем нужные поля

	var fieldsToEnable = new Array ("way", "date", "direction", "waypoint");

	var i;

	var itm;



	for (i = 0; i < nStep; i++)

	{

		itm = document.forms[0].elements.namedItem(fieldsToEnable[i]);

		itm.disabled = false;



		// Корявеньки if, но иначе страница моргает.

		if (i == (nStep - 1))

		{

			itm.focus();

		}

	}



	// Кроме того для 4-го шага разрешаем и кнопку отправки

	if (nStep >= 4)

	{

		var bsub = document.getElementById("bsubmit");

		if (bsub == null)

		{

			alert("Ошибка AJAX: не найдена кнопка submit");

		}



		bsub.disabled = false;

	}



	// Выводим подсказку

	hintForStep(nStep);



	currentStep = nStep;

}



// showWaitingMessage()

// Отображает картинку Waiting

function showWaitingMessage()

{

	var waiting = document.getElementById("waiting");



	if (waiting == null)

	{

		alert("Ошибка AJAX: нет элемента waiting");

		return;

	}



	waiting.style.visibility = "visible";

}



// hideWaitingMessage()

// Скрывает картинку Waiting

function hideWaitingMessage()

{

	var waiting = document.getElementById("waiting");



	if (waiting == null)

	{

		alert("Ошибка AJAX: нет элемента waiting");

		return;

	}



	waiting.style.visibility = "hidden";

}





///////////////////////////////////////////////////////////////////////////////

// Функция, дожидающаяся возврата результатов по запросу маршрутов

///////////////////////////////////////////////////////////////////////////////

function waysRequestReceiver(httpRequest)

{

	if (httpRequest.readyState == 4)

	{

		// Принят запрос

		if (httpRequest.status == 200)

		{

			var ways = httpRequest.responseText;



			// Разбиваем маршруты по переносам

			var pos = 0;

			var pos2 = 0;



			var waysArray = new Array();



			var oneWay = "";



			while (pos >= 0)

			{

				pos2 = ways.indexOf("\n", pos);



				if (pos2 > 0)

				{

					oneWay = ways.substring(pos, pos2);



					// Patch for F.S.H.O (Fucking Stupid Hated Opera)

					if (oneWay.indexOf("\r", 0) > 0)

					{

						oneWay = oneWay.substring(0, oneWay.length - 2);

					}

					// end patch



					waysArray.push(oneWay);

				}



				pos = (pos2 > 0)? pos2 + 1: -1;

			}



			// Добавляем наконец в список

			var wayList = document.forms[0].way;



			if (window.opera)

			{

				wayList.disabled = false;

			}



			wayList.options.length = waysArray.length + 1;



			wayList.options[0].value = "";

			wayList.options[0].text = "=== Выберите нужный маршрут ===";



			var i;

			for (i = 0; i < waysArray.length; i++)

			{

				wayList.options[i+1].value = waysArray[i];

				wayList.options[i+1].text = waysArray[i];

			}



			wayList.selectedIndex = 0;

			selectedWayIndex = 0;



			hideWaitingMessage();

			jumpToStep(1);

		}

		else

		{

			hideWaitingMessage();

			alert("AJAX: ошибка запроса списка маршрутов. Возможно, сервер сейчас на профилактике.");

		}

	}



	httpRequest = null;

}





function convertDayMask(mask)

{

	// Индусский код, правда? Отладить в целом и переписать...

	if (mask == "1111100")

	{

		return "Будни";

	}

	else if (mask == "0000011")

	{

		return "Выходные";

	}

	else if (mask == "1111111")

	{

		return "Единое расписание (все дни недели)";

	}

	else if (mask == "0000010")

	{

		return "Суббота";

	}

	else if (mask == "0000001")

	{

		return "Воскресенье";

	}

	else

	{

		// Тут уже разбор по маске...

		var dayNames = new Array(

		"Понедельник",

		"Вторник",

		"Среда",

		"Четверг",

		"Пятница",

		"Суббота",

		"Воскресенье"

		);



		var finalString = "";

		var i;



		for (i = 0; i < 7; i++)

		{

			if (mask.charAt(i) == '1')

			{

				if (finalString.length > 0)

				{

					finalString += ", ";

				}



				finalString += dayNames[i];

			}

		}



		return finalString;

	}

}





function daysRequestReceiver(httpRequest)

{

	if (httpRequest.readyState == 4)

	{

		// Принят запрос

		if (httpRequest.status == 200)

		{

			var days = httpRequest.responseText;



			// Разбиваем маршруты по переносам

			var pos = 0;

			var pos2 = 0;



			var daysArray = new Array();



			var oneDay = "";



			while (pos >= 0)

			{

				pos2 = days.indexOf("\n", pos);



				if (pos2 > 0)

				{

					oneDay = days.substring(pos, pos2);



					// Patch for F.S.H.O (Fucking Stupid Hated Opera)

					if (oneDay.indexOf("\r", 0) > 0)

					{

						oneDay = oneDay.substring(0, oneDay.length - 2);

					}

					// end patch



					if (oneDay.length > 1)

					{

						daysArray.push(oneDay);

					}

				}



				pos = (pos2 > 0)? pos2 + 1: -1;

			}



			// Добавляем наконец в список

			var dayList = document.forms[0].date;



			// Patch for F.S.H.O.

			if (window.opera)

			{

				dayList.disabled = false;

			}

			// End patch



			dayList.options.length = daysArray.length + 1;



			dayList.options[0].value = "";

			dayList.options[0].text = "=== Выберите нужные дни ===";



			var i;

			for (i = 0; i < daysArray.length; i++)

			{

				dayList.options[i+1].value = daysArray[i];

				dayList.options[i+1].text = convertDayMask(daysArray[i]);

			}



			dayList.selectedIndex = 0;

			selectedDateIndex = 0;





			// Если в списке всего один день, то сразу перескакиваем на получение

			// направлений, иначе ждём выбора пользователя

			if (daysArray.length == 1)

			{

				dayList.selectedIndex = 1;

				dateHasBeenSelected();

			}

			else

			{

				hideWaitingMessage();

				jumpToStep(2);

			}

		}

		else

		{

			hideWaitingMessage();

			alert("AJAX: ошибка запроса списка дат. Возможно, сервер сейчас на профилактике.");

		}

	}



	httpRequest = null;

}





function directionsRequestReceiver(httpRequest)

{

	if (httpRequest.readyState == 4)

	{

		// Принят запрос

		if (httpRequest.status == 200)

		{

			var dirs = httpRequest.responseText;



			var dirList = document.forms[0].direction;

			if (window.opera)

			{

				dirList.disabled = false;

			}



			dirList.options.length = 3;



			dirList.options[0].value = "";

			dirList.options[0].text = "=== Выберите направление движения ===";



			var pos = dirs.indexOf("\n", 0);

			var pos2 = dirs.indexOf("\n", pos+1);



			dirList.options[1].value = "AB";

			dirList.options[1].text = dirs.substring(0, pos);



			dirList.options[2].value = "BA";

			dirList.options[2].text = dirs.substring(pos+1, pos2);



			dirList.selectedIndex = 0;

			selectedDirIndex = 0;

		}



		hideWaitingMessage();

		jumpToStep(3);

	}

}



function waypointsRequestReceiver(httpRequest)

{

	if (httpRequest.readyState == 4)

	{

		// Принят запрос

		if (httpRequest.status == 200)

		{

			var ways = httpRequest.responseText;



			// Разбиваем маршруты по переносам

			var pos = 0;

			var pos2 = 0;



			var pointsArray = new Array();



			var oneWaypoint = "";



			while (pos >= 0)

			{

				pos2 = ways.indexOf("\n", pos);



				if (pos2 > 0)

				{

					oneWaypoint = ways.substring(pos, pos2);



					// Patch for F.S.H.O (Fucking Stupid Hated Opera)

					if (oneWaypoint.indexOf("\r", 0) > 0)

					{

						oneWaypoint = oneWaypoint.substring(0, oneWaypoint.length - 2);

					}

					// end patch



					if (oneWaypoint.length > 0)

					{

						pointsArray.push(oneWaypoint);

					}

				}



				pos = (pos2 > 0)? pos2 + 1: -1;

			}



			// Добавляем наконец в список

			var waypointsList = document.forms[0].waypoint;

			if (window.opera)

			{

				waypointsList.disabled = false;

			}



			waypointsList.options.length = pointsArray.length + 1;



			waypointsList.options[0].value = "all";

			waypointsList.options[0].text = "Все остановки маршрута";



			var i;

			for (i = 0; i < pointsArray.length; i++)

			{

				waypointsList.options[i+1].value = i;

				waypointsList.options[i+1].text = pointsArray[i];

			}



			waypointsList.selectedIndex = 0;



			hideWaitingMessage();

			jumpToStep(4);

		}

		else

		{

			hideWaitingMessage();

			alert("AJAX: ошибка запроса списка остановок. Возможно, сервер сейчас на профилактике.");

		}

	}



	httpRequest = null;

}







// clickOnTransport()

// Обработчик щелка по радиокнопке транспорта. Выполняет AJAX-запрос если

// выбран другой вид транспорта.

// Принимает avto, tram, trol...

function clickOnTransport(newtransp)

{

	var httpRequest;

	if (window.XMLHttpRequest)

	{

		httpRequest = new XMLHttpRequest();

		//httpRequest.overrideMimeType('text/xml');

		//httpRequest.setRequestHeader("Accept-Language", "ru, en");



	}

	else if (window.ActiveXObject)

	{

		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	}



	if (newtransp == selectedTransport)

	{

		// Новый транспорт на самом деле не выбран

		return;

	}



	selectedTransport = newtransp;



	// Сменим иконку

	changeTransportIcon(newtransp);



	// Выключим форму чтобы не мешалась

	disableAllForm();



	// Выполним AJAX-запрос для маршрутов

	// А пока что покажем картинку с ожиданием

	showWaitingMessage();



	var wayList = document.forms[0].way;



	var cnt = wayList.options.length;

	var i;



	// Очищаем список маршрутов

	for (i = cnt - 1; i >= 0; i--)

	{

		wayList.remove(i);

	}



	wayList.options.length = 1;

	wayList.options[0].text = "Загрузка...";



	// AJAX

	if (httpRequest == null)

	{

		alert("AJAX: ошибка создания запроса");

		return;

	}



	httpRequest.onreadystatechange = function() {waysRequestReceiver(httpRequest);};



	var reqString = "http://" + window.location.host + "/pass3/request.ajax.php?list=ways&type=";

	reqString += newtransp;



	httpRequest.open('GET', reqString, true);

	httpRequest.send(null);





	/*wayList.options.length = 2;

	wayList.options[0].value = 0;

	wayList.options[0].text = " = Выберите маршрут =";



	wayList.options[1].value = 1;

	wayList.options[1].text = "Допустим, 60";



	jumpToStep(1);*/

}





// wayHasBeenSelected()

// Обработчик выбора маршрута. Загружает даты

function wayHasBeenSelected()

{

	var httpRequest;

	if (window.XMLHttpRequest)

	{

		httpRequest = new XMLHttpRequest();

		//httpRequest.overrideMimeType('text/xml');

		//httpRequest.setRequestHeader("Accept-Language", "ru, en");



	}

	else if (window.ActiveXObject)

	{

		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	}



	if (document.forms[0].way.selectedIndex == 0)

	{

		// Не выделено ничего полезного

		if (selectedWayIndex != 0)

		{

			document.forms[0].way.selectedIndex = selectedWayIndex;

		}



		return;

	}



	selectedWayIndex = document.forms[0].way.selectedIndex;



	disableAllForm();



	showWaitingMessage();





	var dateList = document.forms[0].date;

	var cnt = dateList.options.length;



	for (i = cnt - 1; i >= 0; i--)

	{

		dateList.remove(i);

	}



	dateList.options.length = 1;

	dateList.options[0].text = "Загрузка...";



	// AJAX

	if (httpRequest == null)

	{

		alert("AJAX: ошибка создания запроса");

		return;

	}



	httpRequest.onreadystatechange = function() {daysRequestReceiver(httpRequest);};



	var reqString = "http://" + window.location.host + "/pass3/request.ajax.php?list=days&type=";

	reqString += selectedTransport;

	reqString += "&way=";

	reqString += document.forms[0].way.options[document.forms[0].way.selectedIndex].value;



	httpRequest.open('GET', reqString, true);

	httpRequest.send(null);



	/*dateList.options.length = 2;

	dateList.options[0].value = 0;

	dateList.options[0].text = " = Выберите дату =";



	dateList.options[1].value = 1;

	dateList.options[1].text = "Допустим, будни";



	jumpToStep(2);*/

}





// dateHasBeenSelected()

// Обработчик выбора даты. Загружает направления

function dateHasBeenSelected()

{

	var httpRequest;



	if (window.XMLHttpRequest)

	{

		httpRequest = new XMLHttpRequest();

		//httpRequest.overrideMimeType('text/xml');

		//httpRequest.setRequestHeader("Accept-Language", "ru, en");



	}

	else if (window.ActiveXObject)

	{

		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	}



	if (document.forms[0].date.selectedIndex == 0)

	{

		// Не выделено ничего полезного

		if (selectedDateIndex != 0)

		{

			document.forms[0].date.selectedIndex = selectedDateIndex;

		}



		return;

	}



	selectedDateIndex = document.forms[0].date.selectedIndex;



	disableAllForm();

	showWaitingMessage();



	var dirList = document.forms[0].direction;

	var cnt = dirList.options.length;

	var i;



	for (i = cnt - 1; i >= 0; i--)

	{

		dirList.remove(i);

	}



	dirList.options.length = 1;

	dirList.options[0].text = "Загрузка...";



	// AJAX

	if (httpRequest == null)

	{

		alert("AJAX: ошибка создания запроса");

		return;

	}



	httpRequest.onreadystatechange = function() {directionsRequestReceiver(httpRequest);};



	var reqString = "http://" + window.location.host + "/pass3/request.ajax.php?list=directions&type=";

	reqString += selectedTransport;

	reqString += "&way=";

	reqString += document.forms[0].way.options[document.forms[0].way.selectedIndex].value;

	reqString += "&date=";

	reqString += document.forms[0].date.options[document.forms[0].date.selectedIndex].value;



	httpRequest.open('GET', reqString, true);



	showWaitingMessage();



	httpRequest.send(null);



	//jumpToStep(3);

}



// directionHasBeenSelected()

// Обработчик выбора направления. Загружает список остановок

function directionHasBeenSelected()

{

	var httpRequest;

	if (window.XMLHttpRequest)

	{

		httpRequest = new XMLHttpRequest();

		//httpRequest.overrideMimeType('text/xml');

		//httpRequest.setRequestHeader("Accept-Language", "ru, en");



	}

	else if (window.ActiveXObject)

	{

		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	}





	if (document.forms[0].direction.selectedIndex == 0)

	{

		if (selectedDirIndex != 0)

		{

			document.forms[0].direction.selectedIndex = selectedDirIndex;

		}



		return;

	}



	selectedDirIndex = document.forms[0].direction.selectedIndex;



	disableAllForm();

	showWaitingMessage();



	var pointsList = document.forms[0].waypoint;

	var cnt = pointsList.options.length;

	var i;



	for (i = cnt - 1; i >= 0; i--)

	{

		pointsList.remove(i);

	}



	pointsList.options.length = 1;

	pointsList.options[0].text = "Загрузка...";





	if (httpRequest == null)

	{

		alert("AJAX: ошибка создания запроса");

		return;

	}





	httpRequest.onreadystatechange = function() {waypointsRequestReceiver(httpRequest);};



	var reqString = "http://" + window.location.host + "/pass3/request.ajax.php?list=waypoints&type=";

	reqString += selectedTransport;

	reqString += "&way=";

	reqString += document.forms[0].way.options[document.forms[0].way.selectedIndex].value;

	reqString += "&date=";

	reqString += document.forms[0].date.options[document.forms[0].date.selectedIndex].value;

	reqString += "&direction=";

	reqString += document.forms[0].direction.options[document.forms[0].direction.selectedIndex].value;





	httpRequest.open('GET', reqString, true);

	httpRequest.send(null);

}