	var sLastApplySubwayId;

	var iSuggestMaxLength = 20;
	var iCountSelectedStations = 0;



	function sortArrayByKey(aArray, sKey)
	{
		var compareValue = function(a, b)
		{
			return a[sKey] != b[sKey] ? a[sKey] < b[sKey] ? -1 : 1 : 0;
		}
		aArray.sort(compareValue);
	}
	
	sortArrayByKey(aCities, 'value');


	function enableAlphaMap()
	{
		setOpacity($('map-alpha'), 20);
	}

	function disableAlphaMap()
	{
		setOpacity($('map-alpha'), 100);
	}

	function compareOptionText(a, b) {
	  return a.textContent != b.textContent ? a.textContent < b.textContent ? -1 : 1 : 0;
	}

	function getSuggestList()
	{
		var sLetters = trim($('city-suggest-input').value);
		var aResultCities = [];
		var iLetterLength = sLetters.length;
		
		if (iLetterLength) {
			for (var i = 0, z = 0; i < aCities.length; i++) {
				if (z >= iSuggestMaxLength) {
					return aResultCities;	
				}
				if (isSuitableForSuggest(aCities[i].value)) {
					aResultCities[z] = aCities[i];
					z++;
				}
			}
		}
		return aResultCities;
	}

	function isSuitableForSuggest(sValue)
	{
		var sLetters = trim($('city-suggest-input').value);
		var iLetterLength = sLetters.length;
		var iSuggestLength = $('city-suggest-results').getElementsByTagName('div').length;
		if (sLetters && sValue.substr(0, iLetterLength).toLowerCase() == sLetters.toLowerCase() && 
			sLetters.toLowerCase() != sValue.toLowerCase() && iSuggestLength < iSuggestMaxLength) {
			return true;
		}
		return false;
	}

	function addFromSubway()
	{
		if ($('subway-button').className != 'passive') {
			initStations();
		}
	}

	function deleteSubwayStationsByCityId(sId)
	{
		var iId = sId.replace(/[^\d]+/, '');
		var options = $('points-list').getElementsByTagName('option');
		for (var i = 0; i < options.length; i++) {
			if (options[i].className == 'subway-station') { //   
				var iSubwayCityId = options[i].getAttribute('city-id');
				if (iSubwayCityId == iId) {
					$('points-list').removeChild(options[i]);
					i--;
				}
			}
		}	
	}

	function getCityTitle(sId)
	{
		sId = sId.replace(/[a-z]+/, '');
		for (var i = 0; i < aCities.length; i++) {
			var tmp = aCities[i];
			if (tmp.id == sId) {
				return tmp.value;
			}	
		}	
	}
	
	function doStation(oEvent)
	{
		var oEvent = getEvent(oEvent);
		var oEventElement = getEventElement(oEvent);
		var sEventType = oEvent.type;
		
		var bg = oSubwayCharacteristics.stations;
		var id = oEventElement.id.replace(/[^\d]+/g, '');
		
		var add = $('station-add-' + id);

		var target = $('station-' + id);
		var selected = target.getAttribute('selected');
		var left = target.getAttribute('left');
		var top = target.getAttribute('top');
		var style = target.style.background;
		
		if (add) {
			var targetAdd = $('station-add-' + id);
			var selectedAdd = targetAdd.getAttribute('selected');
			var leftAdd = targetAdd.getAttribute('left');
			var topAdd = targetAdd.getAttribute('top');
			var styleAdd = targetAdd.style.background;
		}

		if (sEventType == 'mouseover') {
			if (style.match(bg)) {
				target.style.background = '';
				if (add) {
					targetAdd.style.background = '';
				}
			} else {
				target.style.background = 'url(' + bg + ') -' + left + 'px -' + top + 'px no-repeat scroll';
				addEvent(target, 'click', doStation);
				if (add) {
					targetAdd.style.background = 'url(' + bg + ') -' + leftAdd + 'px -' + topAdd + 'px no-repeat scroll';
					addEvent(targetAdd, 'click', doStation);
				}
			}
		} else if (sEventType == 'mouseout') {
			target.style.background = '';
			if (add) {
				targetAdd.style.background = '';
			}
		}

		if (sEventType == 'click') {
			if (selected == '1') {
				iCountSelectedStations--;
				target.setAttribute('selected', 0);
				target.style.background = '';
				addEvent(target, 'mouseover', doStation);
				addEvent(target, 'mouseout', doStation);
				
				if (add) {
					targetAdd.setAttribute('selected', 0);
					targetAdd.style.background = '';
					addEvent(targetAdd, 'mouseover', doStation);
					addEvent(targetAdd, 'mouseout', doStation);
				}
			} else {
				iCountSelectedStations++;
				target.setAttribute('selected', 1);
				target.style.background = 'url(' + bg + ') -' + left + 'px -' + top + 'px no-repeat scroll';
				removeEvent(target, 'mouseover', doStation);
				removeEvent(target, 'mouseout', doStation);
				
				if (add) {
					targetAdd.setAttribute('selected', 1);
					targetAdd.style.background = 'url(' + bg + ') -' + leftAdd + 'px -' + topAdd + 'px no-repeat scroll';
					removeEvent(targetAdd, 'mouseover', doStation);
					removeEvent(targetAdd, 'mouseout', doStation);
				}
			}
			writeSelectedStationsSubmit();
		} 
	}
	
	function writeSelectedStationsSubmit()
	{
		if (iCountSelectedStations > 0) {
			enableAlphaMap();
			$('commit-stations').value = sDefaultCommitStationsValue + ' (' + iCountSelectedStations + ')';
			$('uncheck-stations').disabled = false;
		}  else {
			disableAlphaMap();
			$('commit-stations').value = sDefaultCommitStationsValue + ' (0)';
			$('uncheck-stations').disabled = true;
		}
	}
	
	function clearStations()
	{
		iCountSelectedStations = 0;
		$('map-stations').innerHTML = '';
	}
	
	function saveStations()
	{
		$('stored-stations').innerHTML = '';
		
		var aStations = $('map-stations').getElementsByTagName('div');
		for (var i = 0, z = 1; i < aStations.length; i++) {
			var oStation = aStations[i];
			if (oStation.getAttribute('selected') == '1' && !oStation.id.match('-add-')) {
				
				var tmp = oStation;
				var tempId = tmp.id;
				tempId = 'pps' + tempId.replace(/[^\d]+/, '');
				var tempValue = tmp.getAttribute('title');
				var tempClassName = 'subway-station';
				var tempCityId = $('map-stations').getAttribute('city-id');

				var oSpan = document.createElement('span');
				oSpan.setAttribute('id', tempId);
				oSpan.setAttribute('city-id', tempCityId);
				oSpan.setAttribute('title', tempValue);
				oSpan.className = tempClassName;
				oSpan.innerHTML = tempValue;
				
				if (iCountSelectedStations > z) {
					oSpan.innerHTML += ', '; //add separator
					z++;
				}
				
				$('stored-stations').appendChild(oSpan);	
			}
		}
		//  
		ajax_add_cities($('geo-opener-container').innerHTML);
		hidePopup();
		clearStations();
	}
	
	function uncheckStations(oEvent)
	{
		stopEvent(oEvent);	
		var aStations = $('map-stations').getElementsByTagName('div');
		if (aStations.length) {
			for (i = 0; i < aStations.length; i++) {
				if (aStations[i].getAttribute('selected') == '1') {
					aStations[i].style.background = '';
					aStations[i].setAttribute('selected', '0');
					addEvent(aStations[i], 'mouseover', doStation);
					addEvent(aStations[i], 'mouseout', doStation);
				}
			}
		}
		iCountSelectedStations = 0;
		writeSelectedStationsSubmit();
	}
	
	function rollbackStations()
	{
		hidePopup();
		clearStations();
	}
	
	function getStoredStationsKeys(sCityId)
	{
		var aSelected = [];
		
		var sCityId = sCityId.toString(); //IE
		sCityId = sCityId.replace(/[^\d]+/, '');
		
		var aStoredStations = $('stored-stations').getElementsByTagName('span');
		
		for (var i = 0; i < aStoredStations.length; i++) {
			aSelected[i] = aStoredStations[i].id;
		}
		return aSelected;
	}

	function drawStations(sCityId)
	{
		var aSelectedStations = getStoredStationsKeys(sCityId);

		var mapStations = $('map-stations');
		for (var i = 0; i < aSubwayStations.length; i++) {
			var tmp = aSubwayStations[i];
			
			var station = document.createElement('div');
			station.setAttribute('id', 'station-' + tmp.id);
			station.setAttribute('title', tmp.value);
			station.setAttribute('left', tmp.left);
			station.setAttribute('top', tmp.top);
			setAttributeStyle(station, 'top: ' + tmp.top + 'px; left: ' + tmp.left + 'px; width: ' + tmp.width + 'px; height: ' + tmp.height + 'px');


			if (tmp.add) {
				var stationAdd = document.createElement('div');
				stationAdd.setAttribute('id', 'station-add-' + tmp.id);
				stationAdd.setAttribute('title', tmp.value);
				stationAdd.setAttribute('left', tmp.add.left);
				stationAdd.setAttribute('top', tmp.add.top);
				setAttributeStyle(stationAdd, 'top: ' + tmp.add.top + 'px; left: ' + tmp.add.left + 'px; width: ' + tmp.add.width + 'px; height: ' + tmp.add.height + 'px');
			}
			
			if (in_array('pps' + tmp.id, aSelectedStations)) {
				iCountSelectedStations++;
				station.setAttribute('selected', '1');
				station.style.background = 'url(' + oSubwayCharacteristics.stations + ') -' + tmp.left + 'px -' + tmp.top + 'px no-repeat scroll';
				addEvent(station, 'click', doStation);
				if (tmp.add) {
					stationAdd.setAttribute('selected', '1');
					stationAdd.style.background = 'url(' + oSubwayCharacteristics.stations + ') -' + tmp.add.left + 'px -' + tmp.add.top + 'px no-repeat scroll';
					addEvent(stationAdd, 'click', doStation);
				}
			} else {
				station.setAttribute('selected', '0');
				addEvent(station, 'mouseover', doStation);
				addEvent(station, 'mouseout', doStation);
				if (tmp.add) {
					stationAdd.setAttribute('selected', '0');
					addEvent(stationAdd, 'mouseover', doStation);
					addEvent(stationAdd, 'mouseout', doStation);
				}
			}
			
			mapStations.appendChild(station);
			if (tmp.add) {
				mapStations.appendChild(stationAdd);
			}

		}
		writeSelectedStationsSubmit();
	}
	

	function initStations()
	{
		var tmp = $('stored-city');
		var tmpCityId = tmp.getAttribute('city-id').replace(/[^\d]+/, '') || tmp.getAttribute('id').replace(/[^\d]+/, '');
//		var tmpCityId = tmp.getAttribute('city-id') || tmp.getAttribute('id').replace(/[^\d]+/, '');

		for (var i = 0; i < aSubwayCharacteristics.length; i++) {
			if (aSubwayCharacteristics[i].id == tmpCityId) {
				oSubwayCharacteristics = aSubwayCharacteristics[i];
				aSubwayStations = oSubwayCharacteristics.list;
				break;
			}
		}

		clearStations();

		if (!tmp && !tmpCityId) {
			return false;
		}
	
		$('map-stations').setAttribute('city-id', tmpCityId);

		addEvent($('rollback-stations'), 'click',  rollbackStations);
		addEvent($('subway-closer'), 'click',  rollbackStations);
		addEvent($('commit-stations'), 'click', saveStations);
		addEvent($('uncheck-stations'), 'click', uncheckStations);
		
		
		$('subway-title').innerHTML = oSubwayCharacteristics.title;
		
		$('subway-wrapper').style.width = (oSubwayCharacteristics.width + 20) +'px';
		$('subway').style.width = (oSubwayCharacteristics.width) +'px';
		
		
		$('map-alpha').style.width = oSubwayCharacteristics.width + 'px';
		$('map-alpha').style.height = oSubwayCharacteristics.height + 'px';
		
		$('map-stations').style.width = oSubwayCharacteristics.width + 'px';
		$('map-stations').style.height = oSubwayCharacteristics.height + 'px';
		
		$('map-alpha').style.background = 'url(' + oSubwayCharacteristics.map + ') left top no-repeat';
	
		drawStations(tmpCityId);

		showPopup();
	}
	
	/*
	function hasSubwayInCity(iCityId)
	{
		var bInAttribute = false;
		var bInCharacteristics = false;
		
		for (var i = 0; i < aCities.length; i++) {
			if (aCities[i].id == iCityId && aCities[i].subway == 1) {
				bInAttribute = true;
				break;
			}
		}
		
		for (var i = 0; i < aSubwayCharacteristics.length; i++) {
			if (aSubwayCharacteristics[i].id == iCityId) {
				bInCharacteristics = true;
				break;
			}
		}
		
		return (bInAttribute && bInCharacteristics);
	}
	*/
	
	function setCity(oEvent, oInfo)
	{
		var oEvent = getEvent(oEvent);
		stopEvent(oEvent);

		$('city-suggest').style.display = 'none';
		
		
		
		$('stored-city').innerHTML = oInfo.value;
//		$('stored-city').setAttribute('city-id', oInfo.key);
		$('stored-city').setAttribute('city-id', 'pps'+oInfo.key);

		if (oInfo.subway) {
			$('stored-city').className = 'has-subway';
			$('subway-label').style.display = '';
			$('subway-selector').style.display = '';
			
			clearAnotherCityStations(oInfo.key);
			
		} else {
			$('stored-stations').innerHTML = '';
			
			$('subway-label').style.display = 'none';
			$('subway-selector').style.display = 'none';
			
			$('stored-city').className = '';
		}
		ajax_add_cities($('geo-opener-container').innerHTML);
	}
	
	function clearAnotherCityStations(sCityId)
	{
		var sCityId = sCityId.toString(); //IE
		sCityId = sCityId.replace(/[^\d]+/, '');
		
		var aStoredStations = $('stored-stations').getElementsByTagName('span');

		for (var i = 0; i < aStoredStations.length; i++) {
			var oTemp = aStoredStations[i];
			if (sCityId != oTemp.getAttribute('city-id')) {
				$('stored-stations').innerHTML = '';
				return;
			}
		}

	}
	
	function setCityInInput(oEvent)
	{
		var oEvent = getEvent(oEvent);
		var oElement = getEventElement(oEvent);
		
		var sValue = oElement.innerHTML;
		
		var iId = oElement.id.replace(/^suggest-/, '');

		$('city-suggest-results').innerHTML = '';
		$('city-suggest-results').style.display = 'none';
		
		$('city-suggest-input').focus();
		$('city-suggest-input').value = sValue;

		trackSuggest();
	}
	
	function trackSuggest()
	{
		if (issetInCities()) {
			$('city-suggest-submit').disabled = false;
		} else {
			$('city-suggest-submit').disabled = true;
		}	
	}
	
	function fillCitySuggestResults()
	{
		$('city-suggest-results').innerHTML = '';
		$('city-suggest-results').style.display = 'block';
		
		var aElements = getSuggestList();
		if (aElements.length) {
			for (var i = 0; i < aElements.length; i++) {
				var oTemp = document.createElement('div');
				var oTempSpan = document.createElement('span');
				oTempSpan.id = 'suggest-' + aElements[i].id;
				
				if (aElements[i].subway == 1) {
					oTempSpan.setAttribute('has-subway', aElements[i].id);
					oTemp.className = 'has-subway';
				}
					
				oTempSpan.innerHTML = aElements[i].value;

				oTemp.appendChild(oTempSpan);
				$('city-suggest-results').appendChild(oTemp);

				addEvent(oTempSpan, 'click', setCityInInput);
			}
		}
		trackSuggest();
	}
	
	function stopSubmit(oEvent)
	{
		var oEvent = getEvent(oEvent);
		var oElement = getEventElement(oEvent);
		
		if ((oEvent.type == 'keypress' && oElement.id == 'city-suggest-input' && oEvent.keyCode == 13) || (oEvent.type == 'click' && oElement.id == 'city-suggest-submit')) {
			stopEvent(oEvent);
			var oInfo = issetInCities();
			if (oInfo) {
				setCity(oEvent, oInfo);
			}
		}
	}

	function issetInCities()
	{	
		var sValue = trim($('city-suggest-input').value).toLowerCase();
		for (var i = 0; i < aCities.length; i++) {
			if (sValue == aCities[i].value.toLowerCase()) {
				return {
					key: aCities[i].id, 
					value: aCities[i].value,
					subway: aCities[i].subway ? 1 : 0
				}
			}
		}
		return false;
	}

	function initSuggest()
	{
		var oTL = getOffset($('search-places'));
		
		var iLeft = oTL.left + 10;
		var iTop = oTL.top - 4;

		$('city-suggest').style.left = iLeft + 'px';
		$('city-suggest').style.top = iTop + 'px';

		$('city-suggest').style.display = 'block';
		
		$('city-suggest-results').style.display = 'block';
		$('city-suggest-input').value = $('stored-city').innerHTML;
		
		$('city-suggest-input').select();
		$('city-suggest-input').focus(); //opera
			
		$('city-suggest-results').innerHTML = sCitySuggestHelp;
		
		$('city-suggest-submit').disabled = false;
		
		addEvent($('city-suggest-input'), 'keypress',  stopSubmit);
		addEvent($('city-suggest-input'), 'keyup', fillCitySuggestResults);

		addEvent($('city-suggest-submit'), 'click', stopSubmit);
	}

	function listenEscape(oEvent)
	{
		var oEvent = getEvent(oEvent);
		var iKeyCode = oEvent.keyCode || oEvent.which;

		if (iKeyCode == 27) {
			stopEvent(oEvent); 
			$('city-suggest').style.display = 'none';
			rollbackStations();
		}
	}
	
	function trackGeoClickOut(oEvent)
	{
		var oEvent = getEvent(oEvent);
		var oElement = getEventElement(oEvent);
		
		while (oElement.parentNode) {
			if (oElement.id == 'city-suggest' || oElement.id == 'stored-city') {
				rollbackStations();
				return;
			}
			if (oElement.id == 'popup' || oElement.id == 'subway-selector') {
				$('city-suggest').style.display = 'none';
				return;
			}
			
			oElement = oElement.parentNode;
			if (oElement.tagName == 'BODY') {
				$('city-suggest').style.display = 'none';
				rollbackStations();
				return;
			}
		}
	}
	
	function initGeo()
	{
		addEvent($('stored-city'), 'click', initSuggest);
		addEvent($('subway-selector'), 'click', initStations);
		
		addEvent(document, 'click', trackGeoClickOut);
		addEvent(document, 'keydown', listenEscape);
	}
	
	addEvent(window, 'load', initGeo);
