﻿var map;
var GeographyInfoRoot;
var coWorkerCompleted = false;
var MansionsScale = 13;
var Markers;
var activeMarker;

function LoadMapPage2(uri, uriXml, divId, mansionId, divMap, scale) {
	var div = document.getElementById(divMap);
	if (div) {
		var eventXml = 
			function (result) {
				GeographyInfoRoot = XmlRootByText(result);
				if (coWorkerCompleted) LoadMapOnlyImage(mansionId, divMap, scale);
				else coWorkerCompleted = true;
			};
		var event = 
			function (result) {
				div.innerHTML = result;
				PopupOpen();
				ReplaceSelects(document);
				if (coWorkerCompleted) LoadMap(mansionId, divMap, scale);
				else coWorkerCompleted = true;
			} // end event
		HttpRequest(SitePath + AddPageId(uriXml), null, null, eventXml);		
		if (coWorkerCompleted) LoadMap(mansionId, divMap, scale);
 	      			else coWorkerCompleted = true;


//		HttpRequest(SitePath + AddPageId(uri), null, divId, event);		
	} // end if
	return false;
} // end function

function LoadMapOnlyImage(mansionId, divMap, scale){
	var CurrentMansion = GetNodeById(GeographyInfoRoot, mansionId, true);
	MansionsScale = scale;
	/* Проверка на совместимость с используемым браузером*/
	if (GBrowserIsCompatible()) {
		/* Создание объекта карты, googlemap - имя, по которому находится объект карты, 	описываемый ниже*/
		map = new GMap2(document.getElementById(divMap));
		/* Создать элементы навигации, масштабную линейку */
		var map_ctrl=new GLargeMapControl();
		var map_type_ctrl=new GMapTypeControl();
		var map_scale_ctrl=new GScaleControl();
		/* Добавить элементы навигации */
		map.addControl(map_ctrl);
		/* Кнопки выбора типа карты*/
		map.addControl(map_type_ctrl);
		/* Добавить масштабную линейку */
		map.addControl(map_scale_ctrl);

		/*Центрирование карты*/
		var point = new GLatLng(CurrentMansion.getAttribute("coordX"), CurrentMansion.getAttribute("coordY"));
		map.setCenter(point, scale);
		PlacementMarkers(mansionId);
	}
}

function LoadMapPage(uri, uriXml, divId, mansionId, divMap, scale) {
	var div = document.getElementById(divId);
	if (div) {
		var eventXml = 
			function (result) {
				GeographyInfoRoot = XmlRootByText(result);
				if (coWorkerCompleted) LoadMap(mansionId, divMap, scale);
				else coWorkerCompleted = true;
			};
		var event = 
			function (result) {
				div.innerHTML = result;
				PopupOpen();
				ReplaceSelects(document);
				if (coWorkerCompleted) LoadMap(mansionId, divMap, scale);
				else coWorkerCompleted = true;
			} // end event
		HttpRequest(SitePath + AddPageId(uriXml), null, null, eventXml);		
		HttpRequest(SitePath + AddPageId(uri), null, divId, event);		
	} // end if
	return false;
} // end function

function LoadMap(mansionId, divMap, scale){
	var CurrentMansion = GetNodeById(GeographyInfoRoot, mansionId, true);
	MansionsScale = scale;
	/* Проверка на совместимость с используемым браузером*/
	if (GBrowserIsCompatible()) {
		/* Создание объекта карты, googlemap - имя, по которому находится объект карты, 	описываемый ниже*/
		map = new GMap2(document.getElementById(divMap));
		/* Создать элементы навигации, масштабную линейку */
		var map_ctrl=new GLargeMapControl();
		var map_type_ctrl=new GMapTypeControl();
		var map_scale_ctrl=new GScaleControl();
		/* Добавить элементы навигации */
		map.addControl(map_ctrl);
		/* Кнопки выбора типа карты*/
		map.addControl(map_type_ctrl);
		/* Добавить масштабную линейку */
		map.addControl(map_scale_ctrl);

		/*Центрирование карты*/
		if (CurrentMansion) {
			var point = new GLatLng(CurrentMansion.getAttribute("coordX"), CurrentMansion.getAttribute("coordY"));
			map.setCenter(point, scale);
		};
		PlacementMarkers(mansionId);
	};
	if (CurrentMansion) {
		var CurrentRegion = CurrentMansion.parentNode;
		FillSelect(CurrentRegion, 'GoogleMansionsSelect', 'Mansion', 'Mansion', CurrentMansion.getAttribute("id"), OnMansionChange);
		var CurrentCity = CurrentRegion.parentNode;
		FillSelect(CurrentCity, 'GoogleRegionsSelect', 'Region', 'Region', CurrentRegion.getAttribute("id"), OnRegionChange);
		var div = document.getElementById('CityName');
		div.innerHTML = CurrentCity.getAttribute("name");
	};
}

function CreateMap(div, centerLat, centerLong, scale) {
	if (GBrowserIsCompatible()) {
		/* Создание объекта карты, googlemap - имя, по которому находится объект карты, 	описываемый ниже*/
		map = new GMap2(document.getElementById(div));
		/* Создать элементы навигации, масштабную линейку */
		var map_ctrl=new GLargeMapControl();
		var map_type_ctrl=new GMapTypeControl();
		var map_scale_ctrl=new GScaleControl();
		/* Добавить элементы навигации */
		map.addControl(map_ctrl);
		/* Кнопки выбора типа карты*/
		map.addControl(map_type_ctrl);
		/* Добавить масштабную линейку */
		map.addControl(map_scale_ctrl);

		/*Центрирование карты*/
		if (centerLat && centerLong) {
			var point = new GLatLng(centerLat, centerLong);
			map.setCenter(point, scale);
		};
		return map;
	} else return null;
}

function PlacementMarkers(mansionId) {
	/* Создание иконки */
	var baseIcon = new GIcon();
	baseIcon.iconSize=new GSize(27,27);
	baseIcon.iconAnchor=new GPoint(13,27);
	baseIcon.infoWindowAnchor=new GPoint(13,0);

	/*Расстановка фишек*/
	var Mansions = GetXmlNodesByTagName(GeographyInfoRoot, 'house');
	Markers = new Array();
	for (i=0; i < Mansions.length; i++){
		var point = new GLatLng(Mansions[i].getAttribute("coordX"), Mansions[i].getAttribute("coordY"));
		var newIcon = new GIcon(baseIcon);
		if (Mansions[i].getAttribute("id") == mansionId)
			newIcon.image = SitePath + 'sevgorod/img/ball_active.png';
		else 
			newIcon.image = SitePath + 'sevgorod/img/ball.png';
		var building = new GMarker(point, {icon: newIcon, title: Mansions[i].getAttribute("name")});
		if (Mansions[i].getAttribute("id") == mansionId)
			activeMarker = building;		
		building.caption = "<b>"+ Mansions[i].getAttribute("name") + "</b><br>" + Mansions[i].getAttribute("message");
		building.id = Mansions[i].getAttribute("id");
		GEvent.addListener(building, "click", function() {this.openInfoWindowHtml(this.caption); OnMarkerClick(this);});
		map.addOverlay(building);
		Markers.push(building);
	}
}

function OnMarkerClick(marker){
	if (marker == activeMarker) return;
	var CurrentMansion = GetNodeById(GeographyInfoRoot, marker.id, true);
	var CurrentRegion = CurrentMansion.parentNode;
	FillSelect(CurrentRegion, 'GoogleMansionsSelect', 'Mansion', 'Mansion', CurrentMansion.getAttribute("id"), OnMansionChange);
	var CurrentCity = CurrentRegion.parentNode;
	FillSelect(CurrentCity, 'GoogleRegionsSelect', 'Region', 'Region', CurrentRegion.getAttribute("id"), OnRegionChange);
	SetActiveMarker(marker);
	LoadPage('AJAX/GetEstateConclusion.aspx?MansionId=' + CurrentMansion.getAttribute("id") + '&SimilarEstateId=' + document.getElementById('CurrentEstateId').value, 'EstateConclusion');
	/*var input = document.getElementById("SaveAndClose");
	input.disabled = false;*/
}

function ChangeMapCenter(GObject){
	if (GBrowserIsCompatible()){
		var coordX = GObject.getAttribute("coordX");
		var coordY = GObject.getAttribute("coordY");
		try {
			var scale = GOBject.getAttribute("scale");
		} catch (e) {
			scale = MansionsScale;
		}
		var point = new GLatLng(coordX, coordY);
		map.setCenter(point, scale);
	}
}

function SetCity(cityId) {
	var city = GetNodeById(GeographyInfoRoot, cityId);
	FillSelect(city, 'GoogleRegionsSelect', 'Region', 'Region', 0, OnRegionChange);
	var div = document.getElementById('CityName');
	div.innerHTML = city.getAttribute("name");
//	var region = GetNodeById(GeographyInfoRoot, document.getElementById('Region').value, true);
	FillSelect(city, 'GoogleMansionsSelect', 'Mansion', 'Mansion', 0, OnMansionChange, 'house');
	ChangeMapCenter(city);
}

function OnRegionChange(){
	var region = GetNodeById(GeographyInfoRoot, this.value, true);
	if (region != null) {
		FillSelect(region, 'GoogleMansionsSelect', 'Mansion', 'Mansion', 0, OnMansionChange);
		ChangeMapCenter(region);
	}
	else {
		var city = GetNodeById(GeographyInfoRoot, document.getElementById('PopupCity').value, true);
		FillSelect(city, 'GoogleMansionsSelect', 'Mansion', 'Mansion', 0, OnMansionChange, 'house');
	}
}

function OnMansionChange(){
	var mansionId = this.value;
	var mansion = GetNodeById(GeographyInfoRoot, mansionId, true);
	if (mansion != null) {
		ChangeMapCenter(mansion);
		//PlacementMarkers(mansion.getAttribute("id"));
		var i = 0;
		while ((i < Markers.length) && (Markers[i].id != mansionId)) i++;
		if (i < Markers.length) SetActiveMarker(Markers[i]);
		LoadPage('AJAX/GetEstateConclusion.aspx?MansionId=' + this.value + '&SimilarEstateId=' + document.getElementById('CurrentEstateId').value, 'EstateConclusion');

		$("div.wide a.button").text($('option:selected', this).text());
		$('#ui-bottom-mansion-list').val(mansionId);
		$('#ui-bottom-mansion-list').change();
		makeTraceRoute();

	}
/*	var input = document.getElementById("SaveAndClose");
	input.disabled = false;*/
}

function FillSelect(parent, divId, selectId, selectName, selectedId, onChange, tagName) {
	var select = document.createElement('select');
	select.id=selectId; select.name=selectName;
	select.className = "select"; select.onchange = onChange;
	var defaultOption = document.createElement('option');
	defaultOption.value = 1;
	defaultOption.innerHTML = "Любой";
	select.appendChild(defaultOption);
	if (parent != null) {
		var children;
		if (tagName == null)
			children = parent.childNodes;
		else
			children = parent.getElementsByTagName(tagName);
		for (var j = 0; j < children.length; j++) {
			if (children[j].nodeType == 1){
				var option = document.createElement('option');
				option.value = children[j].getAttribute("id");
				option.innerHTML = children[j].getAttribute("name");
				if (children[j].getAttribute("id") == selectedId) option.selected = 'selected';
				select.appendChild(option);
			}
		}
	}
	var div = document.getElementById(divId);
	div.innerHTML = '';
	div.appendChild(select);
	ReplaceSelects(div);
}

function GetNodeById(parent, id, deep) {
	if (!parent.childNodes) return;
	var children = parent.childNodes;
	for (var i = 0; i < children.length; i++) {
		if (children[i].nodeType == 1) {
			if (children[i].getAttribute("id") == id) return children[i];
			var result;
			if (deep) result = GetNodeById(children[i], id, true);
			if (result) return result;
		}
	}
	return;
}

function SetActiveMarker(marker){
	if ((marker != activeMarker) && GBrowserIsCompatible()) {
		marker.setImage(SitePath + 'sevgorod/img/ball_active.png');
		activeMarker.setImage(SitePath + 'sevgorod/img/ball.png');
		activeMarker = marker;
	}
}


//====================================TRACE ROUTE SCRIPT====================================
function __StringFormat()
{
	for(var i=1;i<arguments.length;i++)
	{
		var exp = new RegExp('\\{' + (i-1) + '\\}','gm');
		arguments[0] = arguments[0].replace(exp,arguments[i]);
	}
	return arguments[0];
}

if(!String.Format)
{
	String.Format = __StringFormat;
}

function onMansionItemChanged (sender) {
	//var selectedMansion = eval( "(" + sender.options[sender.selectedIndex].value + ")");
	var selectedMansion = GetNodeById(GeographyInfoRoot, sender.value, true);
	var mansion = {};
	mansion.coordX = selectedMansion.getAttribute('coordX');
	mansion.coordY = selectedMansion.getAttribute('coordY');
	mansion.address = selectedMansion.getAttribute('message');
	mansion.name = selectedMansion.getAttribute('name');
	map.setCenter(new GLatLng(mansion.coordX, mansion.coordY), 13);
	map.clearOverlays();
	addMarker(mansion);
	$('div.wide a.button').focus();
	if (typeof($('div.wide a.button').get().onkeypress) == 'undefined') {
		$('div.wide a.button').keypress(function (e) {
			if (e.keyCode == 13) {
				makeTraceRoute();
				e.preventDefault();
			}
		});
	}

	var CurrentMansion = GetNodeById(GeographyInfoRoot, sender.value, true);
	var CurrentRegion = CurrentMansion.parentNode;
	FillSelect(CurrentRegion, 'GoogleMansionsSelect', 'Mansion', 'Mansion', CurrentMansion.getAttribute("id"), OnMansionChange);
	var CurrentCity = CurrentRegion.parentNode;
	FillSelect(CurrentCity, 'GoogleRegionsSelect', 'Region', 'Region', CurrentRegion.getAttribute("id"), OnRegionChange);

	$('#ui-destination-text').html(String.Format("Проложить маршрут к &laquo;{0}&raquo;", mansion.name));
	resetForm();
}

function showErrorMessage(text) {
	$('#ui-message-text').html(text);
	if (!$('#ui-message-text').hasClass('error')) {
		$('#ui-message-text').addClass('error');
	}
}

var _from = {};

function clearDistancePanel() {
	document.getElementById('ui-distance-panel').innerHTML = '';
}

function loadTraceRoute(from, to) {
	var directions = new GDirections(map, document.getElementById('ui-distance-panel'));
	GEvent.addListener(directions, 'error', function() {
		showErrorMessage(String.Format('Ошибка при загрузке маршрута. Код ошибки: {0}', directions.getStatus().code));
	});
	GEvent.addListener(directions, 'addoverlay', function() {
		window.setTimeout('clearDistancePanel()', 10);

	});
	GEvent.addListener(directions, 'load', function() {
		$('#ui-print-link-container').show();
		showMessage(String.Format("Длина маршрута от <b>{0}</b> до <b>{1}</b> - <b>{2}</b> км", document.getElementById('ui-trace-from').value, getSelectedMansion().address, directions.getDistance().meters/1000));
		if (!$('#ui-get-route-action').hasClass('active')) {
			$('#ui-get-route-action').addClass('active');
		}
		map.clearOverlays();
		var selectedMansion = getSelectedMansion();
		addMarker(selectedMansion);
	});
	var query = 'from: ' + from + ' to: ' + to;
	directions.load(query, { travelMode: G_TRAVEL_MODE_WALKING, locale : '', preserveViewPort : false, avoidHighways: false });
}

function showMessage (text) {
	$('#ui-message-text').html(text);
	if ($('#ui-message-text').hasClass('error')) {
		$('#ui-message-text').removeClass('error');
	}
}

function getSelectedMansion() {
	var selectedMansion = GetNodeById(GeographyInfoRoot, $('#ui-bottom-mansion-list option:selected').val(), true);
	var result = {};
	result.coordX = selectedMansion.getAttribute('coordX');
	result.coordY = selectedMansion.getAttribute('coordY');
	result.address = selectedMansion.getAttribute('message');
	result.name = selectedMansion.getAttribute('name');
	return result;
/*
	var selects = document.getElementById("route-panel").getElementsByTagName('select');
	if (selects) {
		return eval( "(" + selects[0].options[(selects[0].selectedIndex)].value + ")");
	}
*/
}

function resetForm() {
	showMessage('');
	if ($('#ui-get-route-action').hasClass('active')) {
		$('#ui-get-route-action').removeClass('active');
		$('#ui-print-link-container').hide();
	}
	$('#ui-suggestion-panel span').siblings().remove();
	$('#ui-suggestion-panel').hide();
	$('div.popup_text').css('height', '700px');
}

function printMap () {
	var sm = getSelectedMansion();
	
	$.post("/ajax/prepare_print_data.aspx", { fromXCoord: _from.coordY,  fromYCoord: _from.coordX, fromName: _from.name, toXCoord: sm.coordX, toYCoord: sm.coordY, toName: sm.address},
		function(data) {
			window.open('/ajax/print_map.aspx', '_blank', 'fullscreen,status=yes');
			return false;
		}
	);
	return false;
}

function addMarker(mansion) {
	var baseIcon = new GIcon();
	baseIcon.iconSize=new GSize(27,27);
	baseIcon.iconAnchor=new GPoint(13,27);
	baseIcon.infoWindowAnchor=new GPoint(13,0);
	var point = new GLatLng(mansion.coordX, mansion.coordY);
	//var point = new GLatLng(mansion.getAttribute('coordX'), mansion.getAttribute('coordY'));

	var newIcon = new GIcon(baseIcon);
	newIcon.image = SitePath + 'sevgorod/img/ball_active.png';
	var building = new GMarker(point, {icon: newIcon, title: mansion.name});
	//var building = new GMarker(point, {icon: newIcon, title: mansion.getAttribute('name')});
	map.addOverlay(building);
}

function makeTraceRoute (sender) {
	showMessage('');
	$('#ui-suggestion-panel span').siblings().remove();
	$('#ui-suggestion-panel').hide();
	$('div.popup_text').css('height', '700px');
	if ($('#ui-get-route-action').hasClass('active')) {
		$('#ui-get-route-action').removeClass('active');
		$('#ui-print-link-container').hide();
	}
	var uiTraceFrom = document.getElementById('ui-trace-from');
	if (uiTraceFrom) {
		if (uiTraceFrom.value != '' && uiTraceFrom.value != 'Введите адрес вашего местонахождения') {
			var geocoder = new GClientGeocoder();
			/*geocoder.getLatLng(uiTraceFrom.value, function (point) {*/
			geocoder.getLocations(uiTraceFrom.value, function (point) {
				if (!point) {
					showErrorMessage(String.Format("Адрес '{0}' не найден", uiTraceFrom.value));
				} else {
					if (point.Placemark) {
						var selectedMansion = getSelectedMansion();
						map.clearOverlays();
						traceTo = String.Format("{0},{1}",selectedMansion.coordX, selectedMansion.coordY);
						//traceFrom = String.Format("{0},{1}", point.y, point.x);
						traceFrom = String.Format("{0},{1}", point.Placemark[0].Point.coordinates[1], point.Placemark[0].Point.coordinates[0]);
						_from.coordX = point.x;
						_from.coordY = point.y;
						_from.name = uiTraceFrom.value;
	
						loadTraceRoute(traceFrom, traceTo);
						if (point.Placemark.length > 1) {
							$('#ui-suggestion-panel').show();
							var suggestionContent = '';
							var popupHeight = $('div.popup_text').css('height');
							var popupHeight = popupHeight.substr(0, popupHeight.indexOf('px'));
							var popupHeight = Number(popupHeight) + 11 * point.Placemark.length + 'px';
							$('div.popup_text').css('height', popupHeight);
							for (var i = 1; i < point.Placemark.length; i++) {
								suggestionContent += String.Format('<div><a href="#">{0}</a></div>', point.Placemark[i].address);
							}
							$('#ui-suggestion-panel').append(suggestionContent);
							$('#ui-suggestion-panel div a').click(function(e){
								$('#ui-trace-from').val($(e.target).text());
								makeTraceRoute();
								e.preventDefault();
							});
						}
					} else {
						showErrorMessage(String.Format("Адрес '{0}' не найден", uiTraceFrom.value));
					}
				}
			});
		} else {
			//showErrorMessage('Вы ввели пустую строку адреса!');
		}
	}
}
function keyPress(event) {
	event = event || window.event;
	if (event.keyCode == 13) {
		makeTraceRoute();
		event.preventDefault ? event.preventDefault() : (event.returnValue = false);
	}
}
//====================================END TRACE ROUTE SCRIPT====================================