
function appendOrReplace(param, fieldnum, value) {
	var tmp = param.split("|");
	var result = "";
	
	if (fieldnum >= tmp.length) {
		param += "|";
		param += value;
		//window.alert("append " + value);
		return param;
	}
	
	for (var i = 0; i < tmp.length; i++) {
		if (i > 0) {
			result += "|";
		}
		if (i != fieldnum) {
			result += tmp[i];
		} else {
			//window.alert(tmp[i] + " replaced to " + value);
			result += value;
		}
	}
	return result;
}

function saveMarkerPosition(latlng, num) {
	var el = document.getElementById('lat');
	el.value = appendOrReplace(el.value, num, latlng.lat());
	
	el = document.getElementById('lng');
	el.value = appendOrReplace(el.value, num, latlng.lng());
	
	//window.alert("lat: " + latlng.lat() + ", lng: " + latlng.lng());
}

function createIconForLotStoika(image) {
    var icon = new GIcon(G_DEFAULT_ICON);
    icon.image = '/img/' + image;
    icon.iconSize = new GSize(16, 16);
    icon.shadow = null;
    icon.infoWindowAnchor = new GPoint(7,5);
    icon.iconAnchor = new GPoint(6,20);
    return icon;
}

// Создаёт и возвращает маркер.
// latlng должен быть типом GLatLng и указывать на координаты, в которых будет
// размещен маркер.
// Если параметр draggable истинен, то пользователь сможет изменять положение
// маркера.
function createMarker(latlng, draggable, num, type_icon) {
    //window.alert(latlng + " | " + draggable + " | " + num);
	var opts = '';

    if(type_icon)
    {
        opts = createIconForLotStoika(type_icon);
    }

    //window.alert(document.getElementById('type2').value);
	if (draggable) {
		opts = {draggable: true, bouncy: false};
	}
	
	var marker = new GMarker(latlng, opts);
	
	if (draggable) {
		// сохраняем координаты при изменении положения маркера
		GEvent.addListener(marker, "dragend", function() {
			// сохраняем координаты точки в полях формы
			saveMarkerPosition(marker.getLatLng(), num);
		});
	}
	
	return marker;
}

function createLine(latlngs, color) {
    var line = new GPolyline(latlngs, color, 4, 0.7);

    return line;
}

// center должен иметь тип GLatLng
function createMap(center, width, detail) {

    // для IE указываем размеры вручную, т.к. он по какой-то причине не
	// понимает "width: 100%"
	var opts = '';

    if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
    	opts = {size: new GSize(width, 270)};}
	
	// создаём карту, в указанном div-е
	var map = new GMap2(document.getElementById("gmap"), opts);

    //৻⠥?? ?    //map.enableGoogleBar();

	// устанавливаем начальные координаты для отображения
	map.setCenter(center, detail);

    //map.enableScrollWheelZoom();

	// добавляем панель для изменения масштаба
	map.addControl(new GSmallMapControl());
	
	// добавляем панель для изменения типа местности
	map.addControl(new GMapTypeControl());

    //$(document.body).bind('unload', GUnload);

    // не отображаем обе панели по умолчанию
	map.hideControls();

    // отображаем обе панели при наведении курсором на карту
	GEvent.addListener(map, "mouseover", function() {
		map.showControls();
	});
	
	// скрываем обе панели, когда курсор не на карте
	GEvent.addListener(map, "mouseout", function() {
		map.hideControls();
	});
    

    return map;
}

function hideNeighbouringLines(markers, lines, currentMarker) {
	var markerIdx = markers.indexOf(currentMarker);
	
	// скрываем линию связующую текущую точку с предыдущей
	// (у первой точки нет предыдущей точки, с которой она была бы связана)
	if (markerIdx > 0) {
		var prevLineIdx = markerIdx - 1;
		lines[prevLineIdx].hide();
	}
	
	// скрываем линию связующую текущую точку со следующей
	// (у последней точки нет следующей точки, с которой она была бы связана)
	if (markerIdx != markers.length - 1) {
		var nextLineIdx = markerIdx;
		lines[nextLineIdx].hide();
	}
}

function showNeighbouringLines(markers, lines, currentMarker, map) {
	var markerIdx = markers.indexOf(currentMarker);
	
	// отрисовываем линию связующую текущую точку с предыдущей
	// (у первой точки нет предыдущей точки, с которой она была бы связана)
	var prevMarkerIdx = markerIdx - 1;
	if (prevMarkerIdx >= 0) {
		var coords = new Array(markers[prevMarkerIdx].getLatLng(), currentMarker.getLatLng());
		var newPrevLine = createLine(coords, "#ff0000");
		map.addOverlay(newPrevLine);
		lines[prevMarkerIdx] = newPrevLine;
	}
	
	// отрисовываем линию связующую текущую точку со следующей
	// (у последней точки нет следующей точки, с которой она была бы связана)
	var nextMarkerIdx = markerIdx + 1;
	if (nextMarkerIdx != markers.length) {
		var coords = new Array(markers[nextMarkerIdx].getLatLng(), currentMarker.getLatLng());
		var newNextLine = createLine(coords, "#ff0000");
		map.addOverlay(newNextLine);
		lines[markerIdx] = newNextLine;
	}
}

function initMap(editable, lat, lng, lineCoords, type_icon) {
	// если браузер не сможет выполнить весь этот код

    if (! GBrowserIsCompatible()) {
		return;
	}
	
	var pos = null;
	
	// используется при рисовании линий:
	// координаты маркеров и линий
	var markerObjs = [];
	var lineObjs = [];
	
	if (lat != 0 && lng != 0) {
		pos = new GLatLng(lat, lng);
	} else if (lineCoords != null && lineCoords.length > 0) {
		pos = lineCoords[lineCoords.length/2];
		if (pos == null) {
			pos = lineCoords[0];
		}
	} else {
		// Москва, Кремль
		pos = new GLatLng(55.752, 37.616);
	}
	
	var map = createMap(pos, 500, 13);
	
	if (lineCoords != null) {
		for (var i = 0; i < lineCoords.length; i++) {
			if (lineCoords[i] == null) {
				continue;
			}
			
			var currentMarker = createMarker(lineCoords[i], editable, markerObjs.length);
			map.addOverlay(currentMarker);
				
			// скрываем линии, связующие точку с двумя соседними
			GEvent.addListener(currentMarker, "dragstart", function() {
				hideNeighbouringLines(markerObjs, lineObjs, this);
			});
				
			// отрисовываем линии снова, на основании новых координат
			GEvent.addListener(currentMarker, "dragend", function() {
				showNeighbouringLines(markerObjs, lineObjs, this, map);
				// saveMarkerPosition() будет вызван из обработчика, который был зарегистрирован при создании
			});
			
			// сохраняем координаты точки в полях формы
			//saveMarkerPosition(currentMarker.getLatLng(), markerObjs.length);
			
			if (markerObjs.length)  {
				// рисуем линию от последнего маркера до текущего
				var coords = new Array(markerObjs[markerObjs.length-1].getLatLng(), currentMarker.getLatLng());
				var line = createLine(coords, "#ff0000");
				map.addOverlay(line);
				lineObjs.push(line);
			}
			
			markerObjs.push(currentMarker);
		}
	}
	
	// разрешено ли создавать маркер по клику
	// (используется для ограничения количества маркеров)
	var noMoreMarkers = false;
	
	if (lat != 0 && lng != 0) {
        
        //window.alert(type_icon);
		map.addOverlay(createMarker(pos, editable, 0, type_icon));
		if (document.getElementById('type2').value == 'm') {
			noMoreMarkers = true;
		}
	}
	
	// при клике по карте добавлять маркер (если маркера ещё нет)
	if (editable) {
		GEvent.addListener(map, "click", function(overlay, latlng) {
			var type = document.getElementById('type2').value;
			
			if (latlng && (!noMoreMarkers || type != 'm')) {
				var currentMarker = createMarker(latlng, editable, markerObjs.length);
				map.addOverlay(currentMarker);
				
				// скрываем линии, связующие точку с двумя соседними
				GEvent.addListener(currentMarker, "dragstart", function() {
					hideNeighbouringLines(markerObjs, lineObjs, this);
				});
				
				// отрисовываем линии снова, на основании новых координат
				GEvent.addListener(currentMarker, "dragend", function() {
					showNeighbouringLines(markerObjs, lineObjs, this, map);
					// saveMarkerPosition() будет вызван из обработчика, который был зарегистрирован при создании
				});
				
				// сохраняем координаты точки в полях формы
				saveMarkerPosition(latlng, markerObjs.length);
				
				if (type != 'm') {
					if (markerObjs.length)  {
						// рисуем линию от последнего маркера до текущего
						var coords = new Array(markerObjs[markerObjs.length-1].getLatLng(), latlng);
						var line = createLine(coords, "#ff0000");
						map.addOverlay(line);
						lineObjs.push(line);
					}
					
				} else {
					noMoreMarkers = true;
				}
				
				markerObjs.push(currentMarker);
			}
		});
	}
    
}

