var map; // переменная карты
var mapIcons = []; // массив иконок
var pathMarkers = 1216; // код маркера пути
var http_request = false;
var url = 'http://www.ilovepetersburg.ru/';
var mapMarkers = [];
var pathlength; // протяженность маршрута
var setMarkerType = 0; // тип маркера для редактора
var deletPoint = 0;

/**
 * Запускаем приложение google map
 */
initialize = function () {
	//if (GBrowserIsCompatible()) {
		// определяем размер контейнера div
        windowOnResize();
		
		// запуск карты и установка центра
		map = new GMap2(document.getElementById("map"), {draggableCursor:"crosshair"});
		setCenter();
		map.setUIToDefault();
		
		mapIcons['group1'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1'].image = '/map-resource/marker1.png';
		mapIcons['group1'].iconSize = new GSize(32,32);
		mapIcons['group1'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group2'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group2'].image = '/map-resource/marker2.png';
		mapIcons['group2'].iconSize = new GSize(32,32);
		mapIcons['group2'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1211'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1211'].image = '/map-resource/marker1211.png';
		mapIcons['group1211'].iconSize = new GSize(32,32);
		mapIcons['group1211'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1212'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1212'].image = '/map-resource/marker1212.png';
		mapIcons['group1212'].iconSize = new GSize(32,32);
		mapIcons['group1212'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1213'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1213'].image = '/map-resource/marker1213.png';
		mapIcons['group1213'].iconSize = new GSize(32,32);
		mapIcons['group1213'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1214'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1214'].image = '/map-resource/marker1214.png';
		mapIcons['group1214'].iconSize = new GSize(32,32);
		mapIcons['group1214'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1215'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1215'].image = '/map-resource/marker1215.png';
		mapIcons['group1215'].iconSize = new GSize(32,32);
		mapIcons['group1215'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1216'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1216'].image = '/map-resource/marker1216.png';
		mapIcons['group1216'].iconSize = new GSize(32,32);
		mapIcons['group1216'].iconAnchor = new GPoint(16, 32);
		
		mapIcons['group1217'] = new GIcon(G_DEFAULT_ICON);
		mapIcons['group1217'].image = '/map-resource/marker1217.png';
		mapIcons['group1217'].iconSize = new GSize(32,32);
		mapIcons['group1217'].iconAnchor = new GPoint(16, 32);
		
		GEvent.addListener (map, 'click', mapClickEvent);
		
		if (window.pointsIn) {
			// добавление точек на карту из массива pointsIn
			addPointsOfMap(true);
		}
	//}
}

/**
 * Устанавливаем координаты центра и маштаб
 */
setCenter = function () {
	// сначало проверка на присутствие переменной а потом присвоение
	if (!window.gcx) gcx = 59.938987;
	if (!window.gcy) gcy = 30.31513;
	if (!window.gcz) gcz = 10;
	map.setCenter(new GLatLng(gcx, gcy), gcz);
}

/**
 * Функция изменения размера контейнера div
 */
windowOnResize = function () {
	// 525 фиксированная высота карты
	var contentmap = q('map');
	contentmap.style.height = 630 + 'px';
}

/**
 * Вернуть объект по id
 */
q = function (id) {
	return document.getElementById (id);
}

/**
 * добавить точки на карте из массива pointsIn
 */
addPointsOfMap = function (activ) {
	removeAllMarker();
	
	pathlength = 0;
	mapMarkers = new Array();
	for (var j in pointsIn) {
		if (pointsIn[j]['view']) { // проверить отображать ли массив
			for (var i in pointsIn[j]['points']) {
				if (pointsIn[j]['type'] == 'line' && i != 0) {
					// вычисляем протяженность маршрута
					tmp1 = new GLatLng (pointsIn[j]['points'][i][1], pointsIn[j]['points'][i][2]); // точка предыдущая
					// последняя точка
					if(pointsIn[j]['points'][(i-1)]) {
    					distance_x = pointsIn[j]['points'][(i-1)][1];
    					distance_y = pointsIn[j]['points'][(i-1)][2];
        			    pathlength = pathlength + Math.round(tmp1.distanceFrom(new GLatLng (distance_x, distance_y))); // вычисление расстояния
        			}
				}
				if (pointsIn[j]['points'][i][0] == 'point') 
					createPoint(pointsIn[j]['points'][i][1], pointsIn[j]['points'][i][2], j, pointsIn[j]['points'][i][3], j+':'+i, pathlength);
			}
		}
	}
	if (activ) GEvent.trigger(mapMarkers['1216:0'], 'click');
	// добавить путь на карте
	//if (typedisplay == 'line')
	drawLine();
}

/**
 * создание точки на карте
 */
createPoint = function (x,y,group,text,i,length) {
	tmp = new GLatLng(x, y) // получить координаты точки
	mapMarkers[i] = new GMarker(tmp, mapIcons['group' + group]);
	if (length != 0) 
		text = text + '<p>Протяженность от начала <br>маршрута ' + length +' м</p>';
	if (text != '') {
		GEvent.addListener(mapMarkers[i], 'click', function(tmp) {
			mapMarkers[i].openInfoWindowHtml (text);
		});
	}
	map.addOverlay(mapMarkers[i]);
}

/**
 * Удалить все установленные маркеры на карте
 */
removeAllMarker = function () {
	map.clearOverlays();
}

/**
 * активация группы маркеров
 */
mapCheckGroup = function (id) {
	// если эта переменная подлежит удалению то удалить из массива pointsIn
	if (id == deletPoint) {
		pointsIn[deletPoint] = undefined;
		deletPoint = 0;
	}
	
	// проверить есть ли загруженные маркеры
	if (window.pointsIn[id]) {
		// есть переключить их тригер статуса - отобразить или нет
		if (pointsIn[id]['view'] == 1) {
			pointsIn[id]['view'] = 0;
		} else {
			pointsIn[id]['view'] = 1;
		}
		// переписовать карту
		addPointsOfMap();
	} else {
		// нет загрузить и установить их статус в видимый
		pointsIn[id] = [];
		pointsIn[id]['view'] = 1;
		getHttpRequest();
		if (!http_request) return;
		get = url + 'map.ajax.php?idgroup=' + id;
		http_request.onreadystatechange = updateMarker;
		http_request.open('GET', get, true);
		http_request.send(null);
	}
}

/**
 * Отобразить список маршрутов
 */
mapCheckPath = function (id) {
	// сбросить показ всех путей
	view = q('group' + id).checked;
	resetMapCheck();
	if (!view) {
		// удалить путь если он есть
		pointsIn[pathMarkers]['view'] = 0;
		addPointsOfMap();
	} else {
		// показать нужный путь
		q('group' + id).checked = true;
		q('selectgroup' + id).style.display = 'block';
	}
}

/**
 * Сбросить чекбоксы для карты
 */
resetMapCheck = function () {
	inputs = q('groupcheckbox').getElementsByTagName ('input');
	if (inputs.length > 0) {
		for (i=0; i < inputs.length; i++) {
			if (inputs[i].className == 'path')
				inputs[i].checked = false;
		}
	}
	inputs = q('groupcheckbox').getElementsByTagName ('select');
	if (inputs.length > 0) {
		for (i=0; i<inputs.length; i++) {
			inputs[i].style.display = 'none';
			inputs[i].options.selectedIndex = 0;
		}
	}
}

/**
 * загрузить маршрут
 */
selectPath = function (id,group) {
	pointsIn[pathMarkers] = [];
	pointsIn[pathMarkers]['view'] = 1;
	
	idgroup = group;
	getHttpRequest();
	if (!http_request) return;
	get = url + 'map.ajax.php?id=' + id;
	http_request.onreadystatechange = updateMarker;
	http_request.open('GET', get, true);
	http_request.send(null);
}

/**
 * создать обьект для ajax
 */
getHttpRequest = function () {
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
			// Читайте ниже об этой строке
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) {
		alert('Не вышло :( Невозможно создать экземпляр класса XMLHTTP ');
	}
}

/**
 * функция ждущая ответа через ajax и обновляющая карту
 */
updateMarker = function () {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			a = new Array ();
			b = http_request.responseXML;
			typedisplay = b.getElementsByTagName('draw')[0].firstChild.data;
			idterm = b.getElementsByTagName('idterm')[0].firstChild.data;
			b = b.getElementsByTagName('point');
			// присваиваем массиву pointsIn полученные данные
			var i,tmp;
			for (i=0; i <b.length; i++) {
				tmp = b[i];
				a.push (new Array(
					tmp.getElementsByTagName ('type')[0].firstChild.data,
					tmp.getElementsByTagName ('x')[0].firstChild.data,
					tmp.getElementsByTagName ('y')[0].firstChild.data,
					tmp.getElementsByTagName ('text')[0].firstChild.data
				));
			}
			pointsIn[idterm]['points'] = a; // загрузка в массив
			pointsIn[idterm]['type'] = typedisplay;
			// отображаем новые
			addPointsOfMap();
		}
	}
}

/**
 * Рисует линию по точкам
 */
drawLine = function () {
    if(window.pointsIn[pathMarkers]) {
    	if (window.pointsIn[pathMarkers]['view']) { // !!! error
	    	if (pointsIn[pathMarkers]['view'] == 0) 
	    		return;
    	} else {
		    return;
	    }
	} else {
	    return false;
	}
	
	GEvent.trigger(mapMarkers['1216:0'], 'click'); // показать начало маршрута
	
	// рисуем маршрут по точкам из pathMarkers
	pointsLine = new Array();
	for (var i in pointsIn[pathMarkers]['points']) {
	    if(pointsIn[pathMarkers]['points'][i][1]) {
    		pointsLine.push( new GLatLng(pointsIn[pathMarkers]['points'][i][1], pointsIn[pathMarkers]['points'][i][2]));
    	}
	}
	mapDist = new GPolyline (pointsLine, '#f0f');
	map.addOverlay (mapDist);
}

/**
 * Функция слушающая клик на карте
 */
mapClickEvent = function (overlay, latlng) {
	if (latlng) {
		if (setMarkerType == 0) return;

		// ставим маркер а в его подпись пихаем код
		if (setMarkerType == 1) type = 'point';
			else type = 'hide';
		text = type + '==' + mapRound (latlng.lat ()) + ',' + mapRound (latlng.lng ()) + '==;;';
		//alert(mapMarkers.length)
		createPoint(mapRound(latlng.lat ()), mapRound(latlng.lng ()), setMarkerType,text,mapMarkers.length,0);
	}
}

mapRound = function (N) {
	return parseInt (N * 100000) / 100000;
}

