var map = null;
var geocoder = null;
var scale_max;
var response_id = '';
var lat_c;
var lng_c;
var scale_c;
var marker_content;
var scale_change = false;
var click_marker;
var marker_arr = new Array();

function createRequest() {
	var request = null;
	try {
		request = new XMLHttpRequest;
	} catch (microsoft) {
		try {
			request = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (error) {
				request = null;
			}
		}
	}
	if (request == null) {
		alert('К сожалению Ваш браузер не поддерживает некоторых функций.\r\nУбедитесь, что у Вас включен Javascript в настройках Вашего браузера.');
	} else {
		return request;
	}
}

function gebi(id) {
	return document.getElementById(id);
}

/**
 * Подгружает близлежащие объекты
 * 
 * @param address -
 *            адрес
 */
function load_near_address(address, table, build_type, kom, komnat) {
	// масштаб карты
	if (map.getZoom() < scale_max) {
		map.setZoom(scale_max);
		scale_change = true;
		return;
	}

	if (scale_change == true) {
		scale_change = false;
		return;
	}

	// определяем центр карты
	var point_center = map.getCenter();
	var lat = point_center.lat();
	var lng = point_center.lng();

	// определяем координаты углов карты
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();

	// определяем диапазон координат, в котором будем искать объекты
	var latSpan = northEast.lat() - southWest.lat();
	var lngSpan = northEast.lng() - southWest.lng();

	// отправляем запрос на сервер
	var reqAdr = createRequest();
	var id = response_id;
	// id += (click_marker != null && response_id != click_marker) ?
	// ','+click_marker : '';
	var url = '/gmap/load_data.php?address=' + escape(address) + '&table='
			+ escape(table) + '&build_type=' + build_type + '&kom=' + kom
			+ '&komnat=' + komnat + '&lat=' + escape(lat) + '&lng='
			+ escape(lng) + '&latSpan=' + escape(latSpan) + '&lngSpan='
			+ escape(lngSpan) + '&id=' + escape(id);
	reqAdr.onreadystatechange = function() {
		updateAdr(reqAdr)
	};
	reqAdr.open('GET', url, true);
	reqAdr.send(null);
}

/**
 * обновляет карту после запроса
 */
function updateAdr(req) {
	if (req.readyState == 4) {
		if (req.status == 200) {
			// alert(req.responseText);
			var xml = req.responseXML;
			var data = xml.documentElement;
			var adr_arr = data.getElementsByTagName('address');
			var dc = new Array();
			var dc_count = new Array();
			var pi = Math.PI;
			var Ry = 0.00015;
			var Rx = 0.0003;
			var Dpi = 9;
			for (i in marker_arr) {
				if (i != click_marker && i != response_id)
					map.removeOverlay(marker_arr[i]);
			}
			marker_arr = new Array();
			for ( var i = 0; i < adr_arr.length; i++) {
				var adr = adr_arr[i];
				var id = adr.getAttribute('id');
				var lat = Number(adr.getElementsByTagName('lat')[0].firstChild.nodeValue);
				var lng = Number(adr.getElementsByTagName('lng')[0].firstChild.nodeValue);
				if (adr.getElementsByTagName('content')[0].firstChild) {
					var content = adr.getElementsByTagName('content')[0].firstChild.nodeValue;
					var index = lat + ' ' + lng;
					dc_count[index.toString()] = (dc_count[index.toString()] != null) ? dc_count[index
							.toString()] + 1
							: 0;
					dc_count[index.toString()] = (lat == lat_c && lng == lng_c && dc_count[index
							.toString()] == 0) ? dc_count[index.toString()] + 1
							: dc_count[index.toString()];
					dc[index.toString()] = (dc[index.toString()] != null) ? dc[index
							.toString()]
							: 0;
					dc[index.toString()] = (dc_count[index.toString()] > 0) ? dc[index
							.toString()]
							+ pi / Dpi
							: dc[index.toString()];
					if (dc[index.toString()] > 2 * pi) {
						dc[index.toString()] = 0;
						Rx += 0.0003;
						Ry += 0.00015;
						Dpi *= 1.5;
					}
					d_lat = (dc_count[index.toString()] > 0) ? Ry
							* Math.sin(dc[index.toString()]) : 0;
					d_lng = (dc_count[index.toString()] > 0) ? Rx
							* Math.cos(dc[index.toString()]) : 0;
					var open = (id == click_marker) ? true : false;
					if (id != click_marker)
						set_marker(lat + d_lat, lng + d_lng, id, content, open,
								'other');
				}
			}
		}
	}
}

/**
 * Устанавливает маркер
 * 
 * @param lat -
 *            широта
 * @param lng -
 *            долгота
 * @param address -
 *            адрес
 */
function set_marker(lat, lng, id, content, open, marker_icon) {
	// определяем точку
	var point = new GLatLng(lat, lng);

	// устанавливаем иконку для остальных объектов
	var otherIcon = new GIcon(G_DEFAULT_ICON);
	otherIcon.image = (marker_icon != 'main') ? "/_img/item_blue.png"
			: "/_img/item_red.png";
	markerOptions = {
		icon : otherIcon
	};

	// ставим маркер
	var marker = new GMarker(point, markerOptions);
	map.addOverlay(marker);
	var content = '<div style="margin-top:10px; text-align:left;" >' + content
			.replace(/^(Россия, )?[0-9]*(, )?|Россия, ([0-9]*, )?|Россия, /, '') + '</div>';
	marker.bindInfoWindowHtml(content);
	/*
	 * if (open) { marker.openInfoWindowHtml(content); }
	 */
	GEvent.addListener(marker, "click", function() {
		click_marker = id;
	});
	// GEvent.addListener(marker, "infowindowclose", function() {marker_arr[id]
	// = marker;});
	marker_arr[id] = marker;
	return marker;
}

/**
 * Инпициализирует карту
 */
function initialize() {
	if (GBrowserIsCompatible() && gebi('coord_address') && map == null) {
		// получаем координаты, адресб контент и масштаб
		lat_c = gebi('coord_lat').value;
		lng_c = gebi('coord_lng').value;
		response_id = gebi('coord_id').value;
		var address = gebi('coord_address').value;
		scale_c = Number(gebi('coord_scale').value);
		scale_max = Number(gebi('coord_scale_max').value);
		var content = gebi('coord_content').value;
		var table = gebi('coord_table').value;
		var build_type = Number(gebi('coord_build_type').value);
		var kom = gebi('coord_kom').value;
		var komnat = gebi('coord_komnat').value;

		marker_content = address + '<br />' + content;

		// задаем опции для карты
		var map_opts = {
			size : new GSize(655, 400)
		};

		// создаем карту
		map = new GMap2(document.getElementById('gmap'), map_opts);

		// изменение масштаба скролом
		// map.enableScrollWheelZoom();

		// добавляем элементы управления
		var mapControl = new GSmallMapControl();
		map.addControl(mapControl);

		var mapType = new GMapTypeControl();
		map.addControl(mapType);

		// устанавливаем центр карты
		var point = new GLatLng(lat_c, lng_c);
		map.setCenter(point, scale_c);
		marker = set_marker(lat_c, lng_c, response_id, marker_content, true,
				'main');

		// устанавливаем вызов всплывающего сообщения при клике
		marker
				.openInfoWindowHtml('<div style="margin-top:10px; text-align:left;" >' + marker_content
						.replace(
								/^(Россия, )?[0-9]*(, )?|Россия, ([0-9]*, )?|Россия, /,
								'') + '</div>');

		// вешаем на событие изменение вида карты вызов функции, подгружающей
		// близлежащие объекты
		GEvent.addListener(map, "moveend", function() {
			load_near_address(address, table, build_type, kom, komnat);
		});
		load_near_address(address, table, build_type, kom, komnat);
	}
}

var small_map = null;

/**
 * Инпициализирует карту
 */
function init_small_map() {
	if (GBrowserIsCompatible() && gebi('coord_address') && small_map == null) {
		// получаем координаты, адресб контент и масштаб
		var lat = gebi('coord_lat').value;
		var lng = gebi('coord_lng').value;
		scale_c = Number(gebi('coord_scale').value);
		var address = gebi('coord_address').value;

		// задаем опции для карты
		var map_opts = {
			size : new GSize(130, 115)
		};

		// создаем карту
		small_map = new GMap2(document.getElementById('small_map'), map_opts);

		// устанавливаем центр карты
		var point = new GLatLng(lat, lng);
		small_map.setCenter(point, scale_c);
		small_map.disableDragging();
		// marker = set_marker(lat, lng, marker_content, 'main');

		// устанавливаем иконку для остальных объектов
		var otherIcon = new GIcon(G_DEFAULT_ICON);
		otherIcon.image = "/_img/item_red.png";
		var markerOptions = {
			icon : otherIcon
		};

		// ставим маркер
		var marker = new GMarker(point, markerOptions);
		GEvent.addListener(marker, "click", function() {
			go_location_tab();
		});
		small_map.addOverlay(marker);

	}
}