GMap2.prototype.addOverlays=function(a) 
{
	for (var i=0;i<a.length;i++) {
		if (a[i].type == mode['type'] || ( mode['type'] == 1 && a[i].type == 0 ) )
		{
			try {
				if (a[i].poly!= undefined )
					this.addOverlay(a[i].poly);
				if (a[i].marker!= undefined )
					this.addOverlay(a[i].marker);
			}
			catch(ex) { alert('err: ' + i + ', ' + ex.toString()); }
		}
	}
}

function createMarker(point, html, object_id, object_type, count_comments, title) 
{
	
	var form_comment = "";
	form_comment = form_comment + "<form id=\"comment_"+object_id+"\" onsubmit=\"$.post('http://www.forpo.ru/maps/ajax.php?ajax=add_comment&object_id="+object_id+"', { author: $('form#comment_"+object_id+" input[@name=author]').val(), html: $('form#comment_"+object_id+" textarea[@name=html]').val() }, function(res) { if (res=='1') { $('form#comment_"+object_id+" input[@name=author]').val(''); $('form#comment_"+object_id+" textarea[@name=html]').val(''); $('form#comment_"+object_id+" div.comix-message').html('Ваше сообщение доставлено, после проверки модератором, оно будет опубликовано.'); } else $('form#comment_"+object_id+" div.comix-error').html('Ваше сообщение не доставлено, попробуйте повторить попытку позже.'); } ); return false;\">";
	form_comment = form_comment + "<div class=\"comix-message\"></div>";
	form_comment = form_comment + "<div class=\"comix-error\"></div>";
	form_comment = form_comment + "<div class=\"comix-text\">Имя:</div>";
	form_comment = form_comment + "<input type=\"text\" name=\"author\" value=\"\" class=\"comix-input-text\" />";
	form_comment = form_comment + "<div class=\"comix-text\">Комментарии:</div>";
	form_comment = form_comment + "<textarea name=\"html\" class=\"comix-textarea\"></textarea>";
	form_comment = form_comment + "<input type=\"submit\" class=\"comix-input-submit\" value=\"Отправить\" />";
	form_comment = form_comment + "</form>";
	
	var infoTabs = [
		new GInfoWindowTab("Инфо", "<div class=\"comix\">"+html+"</div>"),
		new GInfoWindowTab("Отзывы", "<div class=\"comix\" id=\"comix_comments_"+object_id+"\">"+"</div>"),
		new GInfoWindowTab("Ответить", "<div class=\"comix\">"+form_comment+"</div>")
	];
    
	var marker = new GMarker(point, {icon:icon[object_type], title: title + ". Отзывов: "+count_comments});
    GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowTabsHtml(infoTabs, {maxWidth: 300});
    	eval("$('div#comix_comments_'+object_id).html('Подгружаются последние отзывы, пожалуйста, подождите...');");
    	eval("$.get('http://www.forpo.ru/maps/ajax.php?ajax=get_last_comments&object_id='+object_id, function(data){	$('div#comix_comments_'+object_id).html(data);}	);");
	});
	return marker;
}
/*
function createMarker(point, html) {
	var marker = new GMarker(point);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}
*/
function Place(title)
{
// title, poly, marker, type
	this.title	= title;
	this.type	= arguments.length>3 ? arguments[3] : 1;
	this.poly	= arguments.length>1 ? (
		arguments[1].length != undefined
		?	new GPolygon(arguments[1], params_type[this.type]['borderColor'], params_type[this.type]['borderWidth'], params_type[this.type]['opacity'], params_type[this.type]['fillColor'], params_type[this.type]['opacity'])
		:	new GPolygon.fromEncoded({
				polylines: [{
					points: arguments[1].points,
					levels: arguments[1].levels,
					color: params_type[this.type]['borderColor'],
					numLevels: 4,
					zoomFactor: 32
				}],
				fill:true,
				color: params_type[this.type]['fillColor'],
				opacity: params_type[this.type]['opacity'],
				outline: params_type[this.type]['borderWidth']
			})
		) : undefined;
	this.marker	= arguments.length>2 ? arguments[2] : undefined;

   // type
   // 0 - официальные особо опасные участки
   // 1 - официальные опасные участки
   // 2 - посетители - опасные участки
   // 3 - посетители - места аварий
   // 4 - посетители - плохие дороги
}



function showObject(index)
{
	if ( objects.length > index && objects[index] != undefined )
	{
		map.panTo( objects[index].marker.getPoint() );
	}
}




function encode(num)
{
	if (num != Math.ceil(num))
		num = Math.ceil(num * 100000);

	num = num << 1;
	if (num < 0)
	{
		num = ~(num);
	}

	var encodeString = "";
	while (num >= 0x20) {
		encodeString = "" + encodeString + String.fromCharCode((0x20 | (num & 0x1f)) + 63);
		num >>= 5;
	}
	encodeString = "" + encodeString + String.fromCharCode(num + 63);
	return encodeString;
}

function encode_row(row){
	return encode(row[0]) + "" + encode(row[1]);
}


function encodeThat(arr)
{
	res = "";
	prev_row = new Array(0,0);
	for(i=0; i<arr.length; i++)
	{
		res = "" + res + encode_row(new Array( arr[i][0] - prev_row[0], arr[i][1] - prev_row[1] ));
		prev_row = arr[i];
	}
	return res;
}
/*
function encodeThatAjax(arr)
{
	var get = "?";
	for(var i=0; i<arr.length; i++)
		get = "" + get + "lat[]=" + arr[i][0] + "&lng[]=" + arr[i][1] + "&";
	
	var res = "";
	$.getScript("http://www.forpo.ru/maps/crypt.php"+get, function(data){res = data; alert(data + "   \n" + encodeThat(arr));});
	window.open("http://www.forpo.ru/maps/crypt.php"+get);
	return res;
}
*/




function removePoly()
{
	if (user_poly == undefined)
		return;
		
	for (var i=0; i<user_poly.getVertexCount()-1; i++)
	{
		eval(" map.removeOverlay(dmarker"+i+"); ");
		eval(" dmarker"+i+" = undefined; ");
	}
	map.removeOverlay(user_poly);
	user_poly = undefined;
}

function savePoly()
{
	if (user_poly == undefined)
		return;
		
	var points = [];
	var levels = "";
	var vertex = undefined;
	var mid_lat = 0;
	var mid_lng = 0;

	for (var i=0; i<user_poly.getVertexCount(); i++)
	{
		vertex = user_poly.getVertex(i);
		points.push(new Array(vertex.lat(), vertex.lng()));
		levels = "" + levels + "B";
		if (i>0)
		{
			mid_lat+= vertex.lat()
			mid_lng+= vertex.lng()
		}
	}
	
	mid_lat = mid_lat / (user_poly.getVertexCount() - 1);
	mid_lng = mid_lng / (user_poly.getVertexCount() - 1);
	
	removePoly();
	
	var title = $('form[@name=add] input[@name=title]').val();
	var html = $('form[@name=add] textarea[@name=html]').val();
	var author = $('form[@name=add] input[@name=author]').val();
	
	$('form[@name=add] input[@name=title]').val("");
	$('form[@name=add] textarea[@name=html]').val("");
	//$('form[@name=add] input[@name=author]').val("");
	
	$.post("http://www.forpo.ru/maps/ajax.php?ajax=add_object", {title: title, polyline_points: encodeThat(points), polyline_levels: levels, marker_lat: mid_lat, marker_lng: mid_lng, html: html, author: author, type: mode['type']}, function(){controlUpdateData();	});
}

function updatePoly(point, index)
{
	var new_poly_points = Array( user_poly.getVertexCount() );
	for (var i=0; i<user_poly.getVertexCount()-1; i++)
		new_poly_points[i] = (i == index) ? point : user_poly.getVertex(i);
	new_poly_points[user_poly.getVertexCount()-1] = new_poly_points[0];

	map.removeOverlay(user_poly);
	user_poly = new GPolygon(new_poly_points, "#DA00EF", 3, 0.8, "#F8ABFF", 0.4);
	map.addOverlay(user_poly);
}

function generatePoly()
{
	if (user_poly != undefined)
		return;

	var center = map.getCenter();

	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var lngSpan = (northEast.lng() - southWest.lng())*0.1;
	var latSpan = (northEast.lat() - southWest.lat())*0.1;

	var points = new Array(
		new GLatLng(center.lat()-latSpan, center.lng()-lngSpan),
		new GLatLng(center.lat()-latSpan, center.lng()+lngSpan),
		new GLatLng(center.lat()+latSpan, center.lng()+lngSpan),
		new GLatLng(center.lat()+latSpan, center.lng()-lngSpan),
		new GLatLng(center.lat()-latSpan, center.lng()-lngSpan)
	);

	user_poly = new GPolygon(points, "#DA00EF", 3, 0.8, "#F8ABFF", 0.4);
	map.addOverlay(user_poly);

	for(var i=0; i<points.length-1; i++)
	{
		eval(" dmarker"+i+" = new GMarker(points["+i+"], {draggable:true, icon:icon['dot'], bouncy:false}); ");
		eval(" GEvent.addListener(dmarker"+i+", 'dragend', function() {		updatePoly(dmarker"+i+".getPoint(), "+i+");		}); ");
		eval(" map.addOverlay(dmarker"+i+"); ");
	}

}



function generateMarker()
{
	if (newMarker != undefined)
		return;
	
	newMarker = new GMarker(map.getCenter(), {draggable: true, icon:icon['addCrash'], bouncy:false});
	map.addOverlay( newMarker );
}

function removeMarker()
{
	if (newMarker == undefined)
		return;
	
	map.removeOverlay(newMarker);
	newMarker = undefined;
}


function saveMarker()
{
	if (newMarker == undefined)
		return;
	
	var point = newMarker.getPoint();
		
	var title = $('form[@name=add] input[@name=title]').val();
	var html = $('form[@name=add] textarea[@name=html]').val();
	var author = $('form[@name=add] input[@name=author]').val();
	
	$('form[@name=add] input[@name=title]').val("");
	$('form[@name=add] textarea[@name=html]').val("");
	//$('form[@name=add] input[@name=author]').val("");
	
	$.post("http://www.forpo.ru/maps/ajax.php?ajax=add_object", {title: title, polyline_points: "", polyline_levels: "", marker_lat: point.lat(), marker_lng: point.lng(), html: html, author: author, type: mode['type']}, function(){controlUpdateData();	});
	
	removeMarker();
}










function TextualZoomControl() {}
TextualZoomControl.prototype = new GControl();

TextualZoomControl.prototype.initialize = function(map) {
	var container = document.createElement("div");
	container.className = "zoom-buttons";
	
	var title = document.createElement("div");
	title.className = "zoom-buttons-title";
	title.appendChild(document.createTextNode("Масштаб: "));
	container.appendChild(title);
	
	zoomArray = new Array();
	zoomArray[0] = new Array();
	zoomArray[1] = new Array();
	zoomArray[2] = new Array();
	zoomArray[3] = new Array();
	zoomArray[4] = new Array();
	zoomArray[0][0] = 17;
	zoomArray[0][1] = "дом";
	zoomArray[1][0] = 15;
	zoomArray[1][1] = "улица";
	zoomArray[2][0] = 13;
	zoomArray[2][1] = "район";
	zoomArray[3][0] = 12;
	zoomArray[3][1] = "полгорода";
	zoomArray[4][0] = 11;
	zoomArray[4][1] = "город";
	
	for (var i=0; i<zoomArray.length; i++)
	{
		var zoomInDiv = document.createElement("a");
		zoomInDiv.setAttribute("href", "javascript: void(0);");
		zoomInDiv.setAttribute("id", 'zoom-'+zoomArray[i][0]);
		if (zoomArray[i][0] == mode['zoom'])
			zoomInDiv.className = 'current';
		container.appendChild(zoomInDiv);
		zoomInDiv.appendChild(document.createTextNode(zoomArray[i][1]));
		GEvent.addDomListener(zoomInDiv, "click", function() {	$('.zoom-buttons a').removeClass(); changeZoom(this.id.substr(5)); this.className = 'current'; return false;	});
	}

	map.getContainer().appendChild(container);
	
	return container;
}

TextualZoomControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
}



function editmodeControl() {}
editmodeControl.prototype = new GControl();

editmodeControl.prototype.initialize = function(map) {
	var test = document.createElement("div");
	test.id = "editmodeControl";
	map.getContainer().appendChild(test);
	$('#editmodeControl').html('<div style="float: left; font-weight: bold; color: #e55;">Режим редактирования:</div><div style="float: right;"><button onclick="controlAddCancel(); return false;">Сбросить пометку</button> <button onclick="controlAddSave(); return false;">Сохранить пометку</button></div>');
	return test;
}
editmodeControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0, 0));
}




function load() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		map.setCenter(new GLatLng(55.0293995792307, 82.9529571533203), mode['zoom']);
		map.setMapType(G_SATELLITE_MAP);
		map.addControl(new GScaleControl());
		map.addControl(new editmodeControl());
		map.addControl(new TextualZoomControl());

		
		//$('#editmodeControl').css('border', '5px solid red');
		
		controlUpdateData();
	}
}

