///////////////////////////////////
//////////////////////////////////
// All rights reserved to Amadot(ZBN) Ltd. (c)
// Google Maps handling version 2.0
// Polygons handling
// last update -  02/10/10
/////////////////////////////////
MAPS.Overlays = {};
MAPS.Overlays.draw = function(poly, onFinish)
{
	MAPS.Overlays.add(poly);
	MAPS.Overlays.enableEditing(poly, true);
	google.maps.Event.addListener(poly, "endline", function()
	{
		// listening to line updated event
		//google.maps.Event.addListener(poly, "lineupdated", onUpdate);
		onFinish(poly);
	});
}

MAPS.Overlays.enableEditing = function(poly, startFromScracth)
{
	if (startFromScracth === true)
	{
		poly.enableDrawing();
	}
	else
	{
		poly.enableEditing(
		{
			onEvent : "mouseover"
		});
		poly.disableEditing( 
		{
			onEvent : "mouseout"
		});
	}
}

MAPS.Overlays.diableEditing = function(poly, handler)
{
	poly.disableEditing();
	if (typeof(handler) !== 'undefined')
		google.maps.Event.removeListener(handler);
}

MAPS.Overlays.add = function(poly)
{
	MAPS.mapObj.addOverlay(poly);
}

MAPS.Overlays.remove = function(poly)
{
	MAPS.mapObj.removeOverlay(poly);
}


///////////////////////////// POLYGON //////////////////
MAPS.Overlays.Polygon = {};
MAPS.Overlays.Polygon.lineColor = "#FF0000";
MAPS.Overlays.Polygon.lineWidth = 2;
MAPS.Overlays.Polygon.lineOpacity = 0.8;
MAPS.Overlays.Polygon.fillColor = "#DEDEDE";
MAPS.Overlays.Polygon.fillOpac = 0.6;

MAPS.Overlays.Polygon.tempObj = null;
MAPS.Overlays.Polygon.previousPoly = null;
MAPS.Overlays.Polygon.draw = function()
{
	var poly = new google.maps.Polygon([],
				MAPS.Overlays.Polygon.lineColor,
				MAPS.Overlays.Polygon.lineWidth,
				MAPS.Overlays.Polygon.lineOpacity,
				MAPS.Overlays.Polygon.fillColor,
				MAPS.Overlays.Polygon.fillOpac);
	
	
	// drawing polygon
	MAPS.Overlays.draw(poly, MAPS.Overlays.Polygon.onFinish);
}

MAPS.Overlays.Polygon.onFinish = function(poly)
{
	if (confirm("Is the Polygon ok?"))
		MAPS.Overlays.Polygon.tempObj = poly;
	MAPS.Overlays.remove(poly);
	MAPS.Overlays.diableEditing(poly);
	
	///////////
	MAPS.Forms.InputForm.show();
	document.getElementById(MAPS.DivNames.polyControl).style.display = "none";
	viewMode = "editor";
}

MAPS.Overlays.Polygon.edit = function(poly)
{
	MAPS.Forms.InputForm.hide();
	document.getElementById(MAPS.DivNames.polyControl).style.display = "block";
	viewMode = ''; //canceling the CTRL affect
	
	// copying current polygon
	var arr = new Array();
	var count = poly.getVertexCount();
	for(var i=0;i<count;++i)
	{
		arr.push(poly.getVertex(i));
	}
	MAPS.Overlays.Polygon.previousPoly = new google.maps.Polygon(arr,
		MAPS.Overlays.Polygon.lineColor,
		MAPS.Overlays.Polygon.lineWidth,
		MAPS.Overlays.Polygon.lineOpacity,
		MAPS.Overlays.Polygon.fillColor,
		MAPS.Overlays.Polygon.fillOpac);
	
	// listening to a click on the poly shape
	google.maps.Event.addListener(poly, "click", function(latlng, index)
	{
		if (typeof index !== "number") return;
		poly.deleteVertex(index);
	});
	
	// showing polygon
	MAPS.Overlays.add(poly);
	MAPS.Overlays.enableEditing(poly);
	MAPS.Overlays.Polygon.tempObj = poly;
}

MAPS.Overlays.Polygon.cancel = function()
{
	MAPS.Overlays.remove(MAPS.Overlays.Polygon.tempObj);
	
	if (MAPS.Overlays.Polygon.previousPoly === null)
		MAPS.Overlays.Polygon.tempObj = null;
	else
		MAPS.Overlays.Polygon.tempObj = MAPS.Overlays.Polygon.previousPoly;
	
	MAPS.Forms.InputForm.show();
	document.getElementById(MAPS.DivNames.polyControl).style.display = "none";
	viewMode = "editor";
}

MAPS.Overlays.Polygon.finishEdit = function()
{
	MAPS.Overlays.Polygon.onFinish(MAPS.Overlays.Polygon.tempObj);
	MAPS.Overlays.Polygon.previousPoly = null;
}

MAPS.Overlays.Polygon.start = function()
{
	// if dealing w/ new marker  or editing a marker w/ no polygon
	if ((MAPS.Markers.editableMarkerNum == null) || (MAPS.Markers.arr[MAPS.Markers.editableMarkerNum].polygon == null) || (!MAPS.Markers.arr[MAPS.Markers.editableMarkerNum].polygon) )
	{
		MAPS.Forms.InputForm.hide();
		MAPS.Overlays.Polygon.draw();
	}
	else
	{
		var poly = MAPS.Markers.arr[MAPS.Markers.editableMarkerNum].polygon; 
		MAPS.Overlays.Polygon.edit(poly);
	}
}

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
MAPS.Overlays.Polygon.serialize = function(poly)
{
	var str = '';
	var midStr = '';
	
	var point = null;
	var lat = null;
	var lng = null;
	
	var count = poly.getVertexCount();
	for (var i=0;i<count;i++)
	{
		point = poly.getVertex(i);			
		lat = point.lat();
		lng = point.lng();
		midStr = lat + "," + lng;
		str = (str != '') ? str + '^' + midStr : midStr;
	}
	return str;
}

MAPS.Overlays.Polygon.deserialize = function(polyString)
{
	var pointsArr = polyString.split("^");
	
	var latLngObj = null;
	var latlngSplit = '';
	var _lat = 0;
	var _lng = 0;
	
	var arr = new Array();
	for (var i=0;i<pointsArr.length;i++)
	{
		latlngSplit = pointsArr[i].split(",");
		_lat = latlngSplit[0];
		_lng = latlngSplit[1];
		latLngObj = new google.maps.LatLng(_lat,_lng);
		arr.push(latLngObj);
	}
	
	MAPS.Overlays.Polygon.tempObj = new google.maps.Polygon(arr,
			MAPS.Overlays.Polygon.lineColor,
			MAPS.Overlays.Polygon.lineWidth,
			MAPS.Overlays.Polygon.lineOpacity,
			MAPS.Overlays.Polygon.fillColor,
			MAPS.Overlays.Polygon.fillOpac);
}






