var map;
var geo;
var reasons = [];
var GEO_ZOOM = 14;
var INIT_ZOOM = 11;
var INIT_LAT = 55.755786;
var INIT_LNG = 37.617633;
var INIT_REGION = "Москва г.";
var ENDINGS = ["объект", "объекта", "объектов"];
var ADDRESS_DEFAULT_VAL = "Адрес";
var METRO_DEFAULT_VAL = "Станция метро";
var indicator_timeout;
var INDICATOR_TIMEOUT_DELAY = 1000;
var INDICATOR_CLEAR_TIMEOUT_DELAY = 1;
var indicator_interval;
var INDICATOR_INTERVAL_DELAY = 10;
var INDICATOR_CLEAR_INTERVAL_DELAY = 500;
var old_markers = [];
var new_markers = [];
//во сколько раз увеличивается область подгрузки объектов в сравнении с видимой областью карты
var AURA = 1;
var MAX_ZOOM = 17;
var gIcons = new Object();
var is_zoomed = false;
var info_opened = false;
//путь, по которому идут AJAX-запросы
var DIR_PATH = "/gmap/DeArtus/";
//var DIR_PATH = "";
var CLUSTER_CLICK_ZOOM_IN = 3;

$(document).ready(function() {
	parseQueryString();

	pic1 = new Image(11, 18);
	pic1.src = DIR_PATH + "images/map/terminal.png";

	pic2 = new Image(21, 18);
	pic2.src = DIR_PATH + "images/map/shadow-terminal.png";

	pic3 = new Image(13, 21);
	pic3.src = DIR_PATH + "images/map/cluster.png";

	pic4 = new Image(24, 21);
	pic4.src = DIR_PATH + "images/map/shadow-cluster.png";

	sendJson(DIR_PATH + "ArtusGetRegions.aspx", "", onGetRegionsSuccess, onGetRegionsFailure, false, { method: "get", stringify: false, debugMode: false });

	$("#AddressTextBox").click(function() {
		if ($(this).val() == ADDRESS_DEFAULT_VAL) {
			$(this).val("");
		}
		setTimeout(function() {
			//$("#MetrosDDL option:eq(0)").attr("selected", "selected");
		}, 1);
	});

	$("#AddressTextBox").blur(function() {
		if ($(this).val() == "") {
			setTimeout(function() {
				$("#AddressTextBox").val(ADDRESS_DEFAULT_VAL);
			}, 1);
		}
	});

	$("#MetrosDDL").change(function() {
		setTimeout(function() {
			$("#AddressTextBox").val(ADDRESS_DEFAULT_VAL);
		}, 1);
	});

	$("#get_map_link").click(function() {
		$("#get_map_link_block").show();
		$("#get_map_link_block input").val(getMapLink());
		$("#get_map_link_block input").get(0).select();
		$("#get_map_link_block input").get(0).focus();
		return false;
	});

	$("#get_map_link_block a").click(function() {
		$("#get_map_link_block").hide();
		return false;
	});

	loadGMap();
});

function getMapLink() {
	var map_link = "http://";
	map_link += window.location.hostname;
	map_link += window.location.pathname;
	map_link += "?";
	map_link += "zoom=" + map.getZoom();
	map_link += "&";
	var center = map.getCenter();
	map_link += "lat=" + center.lat();
	map_link += "&";
	map_link += "lng=" + center.lng();
	map_link += "&";
	map_link += "h24=" + ($("#h24ChB").is(":checked") ? 1 : 0);
	return map_link;
}

function parseQueryString() {
	var queryArray = [];
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i = 0; i < vars.length; i++) {
		var pair = vars[i].split("=");
		queryArray[pair[0]] = pair[1];
	}

	INIT_ZOOM = parseInt(queryArray["zoom"]) || INIT_ZOOM;
	INIT_LAT = parseFloat(queryArray["lat"]) || INIT_LAT;
	INIT_LNG = parseFloat(queryArray["lng"]) || INIT_LNG;

	if (queryArray["h24"] == 1) {
		$("#h24ChB").attr("checked", "checked");
	}
}

function loadGMap() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		var customUI = map.getDefaultUI();
		customUI.controls.scalecontrol = false;
		map.setUI(customUI);
		map.setCenter(new GLatLng(INIT_LAT, INIT_LNG), INIT_ZOOM);

		//G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP, G_DEFAULT_MAP_TYPES
		map.setMapType(G_NORMAL_MAP);

		reasons[G_GEO_SUCCESS] = "Адрес найден.";
		reasons[G_GEO_MISSING_ADDRESS] = "Адрес не содержит значения.";
		reasons[G_GEO_UNKNOWN_ADDRESS] = "Адрес не был найден. Попробуйте изменить параметры поиска.";
		reasons[G_GEO_UNAVAILABLE_ADDRESS] = "Адрес не может быть найден по юридическим причинам.";
		reasons[G_GEO_BAD_KEY] = "Ключ содержит ошибку либо не соответствует домену.";
		reasons[G_GEO_TOO_MANY_QUERIES] = "Превышение дневной квоты на геозапросы.";
		reasons[G_GEO_SERVER_ERROR] = "Ошибка сервера.";

		geo = new GClientGeocoder();

		gIcons.terminalIcon = new GIcon(G_DEFAULT_ICON);
		gIcons.terminalIcon.image = DIR_PATH + "images/map/terminal.png";
		gIcons.terminalIcon.shadow = DIR_PATH + "images/map/shadow-terminal.png";
		gIcons.terminalIcon.iconSize = new GSize(11.0, 18.0);
		gIcons.terminalIcon.shadowSize = new GSize(21.0, 18.0);
		gIcons.terminalIcon.iconAnchor = new GPoint(5.0, 9.0);
		gIcons.terminalIcon.infoWindowAnchor = new GPoint(5.0, 3.0);
		
		gIcons.clusterIcon = new GIcon(G_DEFAULT_ICON);
		gIcons.clusterIcon.image = DIR_PATH + "images/map/cluster.png";
		gIcons.clusterIcon.shadow = DIR_PATH + "images/map/shadow-cluster.png";
		gIcons.clusterIcon.iconSize = new GSize(13.0, 21.0);
		gIcons.clusterIcon.shadowSize = new GSize(24.0, 21.0);
		gIcons.clusterIcon.iconAnchor = new GPoint(6.0, 10.0);
		gIcons.clusterIcon.infoWindowAnchor = new GPoint(6.0, 3.0);


		GEvent.addListener(map, "moveend", MoveEnd);
		GEvent.addListener(map, "zoomstart", ZoomStart);
		GEvent.addListener(map, "zoomend", ZoomEnd);

		GetPoints();

	}
	else {
		alert("К сожалению, Ваш браузер не работает с картами Google.");
	}
}

function onGetRegionsSuccess(d, o) {
	$("#RegionsDDL option").each(function() {
		$(this).remove();
	});
	var regionsCount = d.length;
	for (var i = 0; i < regionsCount; i++) {
		$("#RegionsDDL").append($("<option>").attr("value", d[i][0]).text(d[i][1]));
	}

	$("#RegionsDDL").change(function() {
		sendJson(DIR_PATH + "ArtusGetMetros.aspx", "city=" + $(this).find(":selected").val(), onGetMetrosSuccess, onGetMetrosFailure, false, { method: "get", stringify: false, debugMode: false });
	});

	setTimeout(function() {
		$("#RegionsDDL").val(INIT_REGION);
		$("#RegionsDDL").trigger("change");
	}, 1);
}

function onGetRegionsFailure(m, st, et, o) {
}

function onGetMetrosSuccess(d, o) {
	$("#MetrosDDL option").each(function() {
		$(this).remove();
	});
	$("#MetrosDDL").append($("<option></option>").text(METRO_DEFAULT_VAL));
	var metrosCount = d.length;
	for (var i = 0; i < metrosCount; i++) {
		if (d[i] == "") {
			continue;
		}
		else {
			$("#MetrosDDL").append($("<option></option>").text(d[i]));
		}
	}
	if ((metrosCount == 0) || ((metrosCount == 1) && ((d[0] == "") || (d[0] == "Неизвестная"))) || ((metrosCount == 2) && ((d[0] == "") || (d[0] == "Неизвестная")))) {
		$("#MetrosDDL").hide();
	}
	else {
		$("#MetrosDDL").show();
	}
}

function onGetMetrosFailure(m, st, et, o) {
}


function SearchAddress() {
	$("#get_map_link_block").hide();
	$("#search_results").html("<p></p>");
	var search = "";
	if ((($("#MetrosDDL :selected").val() == METRO_DEFAULT_VAL) ||
		 ($("#MetrosDDL :selected").val() == "")) && 
		 ($("#AddressTextBox").val() == ADDRESS_DEFAULT_VAL)) {
		sendJson(DIR_PATH+"ArtusGetRegionBounds.aspx", "region=" + $("#RegionsDDL :selected").val(), onGetRegionBoundsSuccess, onGetRegionBoundsFailure, false, { method: "get", stringify: false, debugMode: false });
	}
	else {
		search += $("#RegionsDDL :selected").text() + ", ";
		if (($("#MetrosDDL :selected").val() != "") &&
			($("#MetrosDDL :selected").val() != undefined) &&
			($("#MetrosDDL :selected").val() != METRO_DEFAULT_VAL)) {
			search += "станция метро " + $("#MetrosDDL :selected").val() + ", ";
		}
		else {
			search += $("#AddressTextBox").val();
		}
		geo.getLocations(search, function(result) {
			if (result.Status.code == G_GEO_SUCCESS) {
				var suggestion = "<span id='search_results_head'>Результаты поиска</span><br />";
				var geoCount = result.Placemark.length;
				var p = result.Placemark[0].Point.coordinates;
				map.setCenter(new GLatLng(p[1], p[0]), GEO_ZOOM);
				for (var i = 0; i < geoCount; i++) {
					p = result.Placemark[i].Point.coordinates;
					suggestion += "<br/>" + (geoCount > 1 ? (i + 1) + ": " : "") + "<a href='javascript:map.setCenter(new GLatLng(" + p[1] + "," + p[0] + "), " + GEO_ZOOM + ")'>" + result.Placemark[i].address + "</a>";
				}
				$("#search_results").html(suggestion);
			}
			else {
				if (reasons[result.Status.code]) {
					$("#search_results").html("<p>" + reasons[result.Status.code] + "</p>");
					sendJson(DIR_PATH+"ArtusGetRegionBounds.aspx", "region=" + $("#RegionsDDL :selected").val(), onGetRegionBoundsSuccess, onGetRegionBoundsFailure, false, { method: "get", stringify: false, debugMode: false });
				}
			}
		});
	}
}

function onGetRegionBoundsSuccess(d, o) {
	var swLat = parseFloat(d[0].replace(",", "."));
	var swLng = parseFloat(d[1].replace(",", "."));
	var neLat = parseFloat(d[2].replace(",", "."));
	var neLng = parseFloat(d[3].replace(",", "."));
	zoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(swLat, swLng), new GLatLng(neLat, neLng)));
	if ((swLat == NaN) || (swLng == NaN) || (neLat == NaN) || (neLng == NaN) || (zoom <= 0)) {
		$("#search_results").html("<p>К сожалению, в данном регионе терминалов найдено не было.</p>");
		return false;
	}
	else {
		map.setCenter(new GLatLng((swLat + neLat) / 2, (swLng + neLng) / 2), Math.min(zoom, 15));
	}
}

function onGetRegionBoundsFailure(m, st, et, o) {
	$("#search_results").html("<p>К сожалению, в данном регионе терминалов найдено не было.</p>");
	return false;
}


function MoveEnd() {
	$("#get_map_link_block").hide();
	if (!is_zoomed && !info_opened) {
		GetPoints();
	}
	else {
		is_zoomed = false;
		info_opened = false;
	}
}

function ZoomStart() {
}

function ZoomEnd() {
	$("#get_map_link_block").hide();
	is_zoomed = true;
	GetPoints();
}

function GetPoints() {
	indicator_timeout = setTimeout(function() {
		//alert("indicator_timeout");
		indicator_interval = setInterval(function() {
			$("#map_indicator_block").show();
		}, INDICATOR_INTERVAL_DELAY);
	}, INDICATOR_TIMEOUT_DELAY);

	setTimeout(function() {
		var center = map.getCenter();
		var bounds = map.getBounds();
		var query = [];
		query.push("h24=" + ($("#h24ChB").is(":checked") ? 1 : 0));
		//область карты с запасом
		query.push("swLat=" + (AURA * bounds.getSouthWest().lat() - (AURA - 1) * center.lat()));
		query.push("swLng=" + (AURA * bounds.getSouthWest().lng() - (AURA - 1) * center.lng()));
		query.push("neLat=" + (AURA * bounds.getNorthEast().lat() - (AURA - 1) * center.lat()));
		query.push("neLng=" + (AURA * bounds.getNorthEast().lng() - (AURA - 1) * center.lng()));
		query.push("zoom=" + map.getZoom());

//        alert(query);
		sendJson(DIR_PATH+"ArtusGetPoints.aspx", query.join("&"), onGetPointsSuccess, onGetPointsFailure, false, { method: "get", stringify: false, debugMode: false });
	}, 0);
}

function onGetPointsSuccess(d, o) {
	if (indicator_timeout != undefined) {
		setTimeout(function() {
		//alert("Clear Timeout");
		$("#map_indicator_block").hide();
			clearTimeout(indicator_timeout);
			clearInterval(indicator_interval);
		}, INDICATOR_CLEAR_TIMEOUT_DELAY);
	}

	setTimeout(function() {
		old_markers = new_markers;
		new_markers = [];

		var pointCount = 0;
		for (var i = 0; i < d.length; i++) {
			pointCount += parseInt(d[i][4]);
			NewMarker(d[i]);
		}
		d = null;
		o = null;
		$("#points_count").text(pointCount + " " + getEndings(ENDINGS, pointCount));

		for (var i = 0; i < old_markers.length; i++) {
			map.removeOverlay(old_markers[i]);
		}
		old_markers = [];

		setTimeout(function() {
			//alert("Clear Interval");
			clearInterval(indicator_interval);
			$("#map_indicator_block").hide();
		}, INDICATOR_CLEAR_INTERVAL_DELAY);
	}, 0);
}

function onGetPointsFailure(m,st,et,o) {
}

function NewMarker(point) {
	var pointID = point[2];
	var ids_count = parseInt(point[4]);
	var pointTitle = pointID != 0 ? point[3] : (ids_count + " " + getEndings(ENDINGS, ids_count));
	var pointIcon = pointID != 0 ? gIcons.terminalIcon : gIcons.clusterIcon;
	var marker = new GMarker(new GLatLng(parseFloat(point[0]), parseFloat(point[1])), {
		draggable: false,
		bouncy: false,
		title: pointTitle,
		icon: pointIcon
	});
	map.addOverlay(marker);
	new_markers.push(marker);

	if (pointID != 0) {
		GEvent.addListener(marker, 'click', function() {
			sendJson(DIR_PATH+"ArtusGetTerminalInfo.aspx", "id=" + pointID, onGetTerminalSuccess, onGetTerminalFailure, false, { method: "get", stringify: false, marker: marker, debugMode: false });
		});
	}
	else {
		GEvent.addListener(marker, 'click', function() {
			map.setCenter(marker.getLatLng(), Math.min(map.getZoom() + CLUSTER_CLICK_ZOOM_IN, MAX_ZOOM));
		});
	}
	
	return true;
}

function onGetTerminalSuccess(d, o) {
	info_opened = true;
	var html = "";
	html += "<div class=\"balloon_html\">";
	//html += d.id ? "ID: " + d.id + "<br/>" : "";
	//html += d.region ? "Регион: " + d.region + "<br/>" : "";
	html += d.city ? "Город: " + d.city + "<br/>" : "";
	html += d.address ? "Адрес: " + d.address + "<br/>" : "";
	html += d.objtype ? "Тип: " + d.objtype + "<br/>" : "";
	html += d.place ? "Место: " + d.place + "<br/>" : "";
	html += d.metro ? "Метро: " + d.metro + "<br/>" : "";
	html += d.route ? "Маршрут: " + d.route + "<br/>" : "";
	html += d.time ? "Время работы: " + d.time + "<br/>" : "";
	html += d.status ? "Статус: " + d.status + "<br/>" : "";
	html += d.restriction ? "Ограничения: " + d.restriction + "<br/>" : "";
	html += "</div>";

	o.marker.openInfoWindowHtml(html);
}

function onGetTerminalFailure(m, st, et, o) {
}


function getEndings(ENDINGS, n) {
	var n_10 = n % 10;
	var n_100 = n % 100;

	if ((n_10 == 0) || (n_10 >= 5 && n_10 <= 9) || (n_100 >= 11 && n_100 <= 19)) {
		return ENDINGS[2]; //объектов
	}
	else {
		if ((n_10 == 1)) {
			return ENDINGS[0]; //объект
		}
		else {
			return ENDINGS[1]; //объекта
		}
	}
}
