
// Some global variables
var pathData, polygonData, pathResults, polygonResults;
var verySmall, numLevels, zoomFactor, order;
var minLat, maxLat, minLng, maxLng;
var inputText, stateChange;
var map, commentary;

var area,luogo,lati,longi,zoom,draggable,ll_array,luo_array;

function showArea() {
	//if((inputText != document.getElementById("EncodingForm").InputText.value || "") ||
	//   stateChange) {
		if(getData()) {
			encodeData();
			setMap();
		}
	//}
	//else if(inputText != "") {
	//	setMap();
	//}
}


// Gets the input data and packs it into a pathData array
// and a polygonData array.
function getData() {
	var allCoordStrings = new Array(0);
	var thisCoordString, theseCoordStrings, lle, newCoordString;
	pathData = new Array(0);
	polygonData = new Array(0);
	var rawPathData, rawPolygonData, thisPolygonData, point, points;
	var placeData;
	var h, i, j, k;
	var inputText2, inputTextArray, lineStrings, theseCoords, areaStrings, descriptor;
	var found = false, xmldoc;
		
	//verySmall = 1*document.getElementById("EncodingForm").verySmall.value;
 	//numLevels = 1*document.getElementById("EncodingForm").numLevels.value;
	//zoomFactor = 1*document.getElementById("EncodingForm").zoomFactor.value;
	
	//GV
	verySmall = 0.00001;
 	numLevels = 18;
	zoomFactor = zoom;
	stateChange = false;
	
	//inputText = document.getElementById("EncodingForm").InputText.value;
	
	//GV
	//inputText = "A TN\n" + 
	//						"46.066933,11.122821\n" + 
	//						"46.06179698466216,11.239013671875\n " +
	//						"45.89000815866184,11.0357666015625\n";
	
	inputText = "A\n";						
	for(i=0;i<ll_array.length;i++)
	{
		inputText = inputText + ll_array[i] + "\n";		 					
  }
  inputText = inputText + ll_array[0] + "\n";
    
	
	if(inputText != "") {
		found = true;
	}
	// Perform an overly simple check to see if this is a KML file.
	if(inputText.substring(0,100).match("kml xmlns") == "kml xmlns") {
		if(typeof DOMParser != "undefined") {
			xmldoc = (new DOMParser()).parseFromString(inputText, "application/xml");
		}
		else if(typeof ActiveXObject != "undefined") {
			xmldoc = new ActiveXObject("MSXML2.DOMDocument");
			xmldoc.loadXML(inputText);
		}
		else {
			var url = "data:text/xml;charset=utf-8," + encodeURIComponent(inputText);
			var request = new XMLHttpRequest();
			request.open("GET", url, false);
			request.send(null);
			xmldoc = request.responseXML;
		}
		// Process the polygons
		rawPolygonData = xmldoc.getElementsByTagName("Polygon");
		for(i=0; i<rawPolygonData.length; i++) {
			thisPolygonData = new Array(0);
			for(j=0; j<rawPolygonData[i].getElementsByTagName("coordinates").length; j++) {
				rawPolygonData[i].getElementsByTagName("coordinates")[j].normalize();
				thisCoordString = 
					rawPolygonData[i].getElementsByTagName("coordinates")[j].firstChild.data;
				thisCoordString = thisCoordString.replace(/^\s*/,"").replace(/\s*$/,"");
				theseCoordStrings = thisCoordString.split(/\s+/);
				points = new Array(0);
				for(k=0; k<theseCoordStrings.length;k++) {
					lle = theseCoordStrings[k].split(",");
					points.push([lle[1], lle[0]]);
				}
				thisPolygonData.push(points);
			}
			polygonData.push(thisPolygonData);
		}
		
		// Process the polylines
		// Lump together lines inside the same Placemark.
		placeData = xmldoc.getElementsByTagName("Placemark");
		for(i=0; i<placeData.length; i++) {
			rawPathData = placeData[i].getElementsByTagName("LineString");
			if(rawPathData.length > 0) {
				thisPathData = new Array(0);
				for(j=0; j<rawPathData.length; j++) {
					rawPathData[j].getElementsByTagName("coordinates")[0].normalize();
					thisCoordString = rawPathData[j].getElementsByTagName("coordinates")[0].firstChild.data;
					thisCoordString = thisCoordString.replace(/^\s*/,"").replace(/\s*$/,"");
					theseCoordStrings = thisCoordString.split(/\s+/);
					points = new Array(0);
					for(k=0; k<theseCoordStrings.length;k++) {
						lle = theseCoordStrings[k].split(",");
						points.push([lle[1], lle[0]]);
					}
					thisPathData.push(points);
				}
				pathData.push(thisPathData);
			}
		}
 	}
	// Otherwise, assume that it's a sequence of lat/lng pairs.
	else {
		// Use some regular expression stuff to simplify the input.
		inputText2 = inputText.replace(/\s*\n\s*/g,"\n").replace(/^\s*/,"").replace(/\s*$/,"");
		
		// Check to see if we've got just a single polyline
		if(inputText2.charAt(0) != "A" && inputText2.charAt(0) != "L") {
			process(["L 1\n" + inputText2], "path");
		}
		// Otherwise, assume we've got a collection of lines and areas.
		else {
			// Split into the individual parts.
			inputTextArray = inputText2.split(/\n(?=[AL])/);
			
			// Scan through the data
			i=0;
			while(i<inputTextArray.length) {
				// Process the lines and lump consecutive lines with the same
				// descriptor together.
				if(inputTextArray[i] && inputTextArray[i].charAt(0) == "L") {
					lineStrings = new Array(0);
					descriptor = inputTextArray[i].match(/\S+(?=\n)/)[0];
					j = i;
					while(inputTextArray[j] && inputTextArray[j].match(/\S+(?=\n)/)[0] == descriptor) {
						lineStrings.push(inputTextArray[j]);
						j++; i++;
					}
					process(lineStrings, "path");
				}
				// Process the polygons lumping together polygons 
				// with the same desriptor.
				else if(inputTextArray[i] && inputTextArray[i].charAt(0) == "A") {
					areaStrings = new Array(0);
					descriptor = inputTextArray[i].match(/\S+(?=\n)/)[0];
					j = i;
					while(inputTextArray[j] && inputTextArray[j].match(/\S+(?=\n)/)[0] == descriptor) {
						areaStrings.push(inputTextArray[j]);
						j++; i++;
					}
					process(areaStrings, "area");
				}
			}
		}
	}
	return found;
}


// The next two functions are called by the getData function during
// the processing of the data from the Input text.
function process(areaStrings, flag) {
	var i, j, thisBoundary, thisBoundaryString, theseCoords, points;
	thisBoundary = new Array(0);
	for(i=0; i<areaStrings.length; i++) {
		points = new Array(0);
		thisBoundaryString = areaStrings[i].split("\n");
		for(j=1; j<thisBoundaryString.length; j++) {
			theseCoords = thisBoundaryString[j].split(/,\s*|\s+/);
			if(order == "latlng") {
				points.push([theseCoords[0], theseCoords[1]]);
			} 
			if(order == "lnglat") {
				points.push([theseCoords[1], theseCoords[0]]);
			}
		}
		thisBoundary.push(points);
	}
	if(flag=="area") {
		polygonData.push(thisBoundary);
	}
	if(flag=="path") {
		pathData.push(thisBoundary);
	}
}

// Translate the data to latLngs and encode.  Called by showCode or 
// showMap, if necessary.
// Most of the work is done by a PolylineEncoder object.
function encodeData() {
 	var polylineEncoder = new PolylineEncoder(numLevels, zoomFactor, verySmall);
 	var thisPolygonResults, thisPathResults;
 	var i, j, k, latLngs;
 	
	pathResults = new Array(0);
	polygonResults = new Array(0);
 	if(pathData.length > 0) {
 		minLat = maxLat = pathData[0][0][0][0];
 		minLng = maxLng = pathData[0][0][0][1];
 	}
 	else if(polygonData.length > 0) {
 		minLat = maxLat = polygonData[0][0][0][0];
 		minLng = maxLng = polygonData[0][0][0][1];
 	}
 	for(i=0; i<pathData.length; i++) {
 		thisPathResults = new Array(0);
 		for(j=0; j<pathData[i].length; j++) {
 			latLngs = new Array(0);
 			for(k=0; k<pathData[i][j].length; k++) {
 				latLngs.push(new PolylineEncoder.latLng(pathData[i][j][k][0],pathData[i][j][k][1]));
	 			if(1*pathData[i][j][k][0] < 1*minLat) {
	 				minLat = pathData[i][j][k][0];
	 			}
	 			if(1*pathData[i][j][k][0] > 1*maxLat) {
	 				maxLat = pathData[i][j][k][0];
	 			}
	 			if(1*pathData[i][j][k][1] < 1*minLng) {
	 				minLng = pathData[i][j][k][1];
	 			}
	 			if(1*pathData[i][j][k][1] > 1*maxLng) {
	 				maxLng = pathData[i][j][k][1];
	 			}
  			}
 			thisPathResults.push(polylineEncoder.dpEncode(latLngs));
 		}
 		pathResults.push(thisPathResults);
 	}
 	
 	for(i=0; i<polygonData.length; i++) {
 		thisPolygonResults = new Array(0);
 		for(j=0; j<polygonData[i].length; j++) {
 			latLngs = new Array(0);
 			for(k=0; k<polygonData[i][j].length; k++) {
 				latLngs.push(new PolylineEncoder.latLng(polygonData[i][j][k][0],polygonData[i][j][k][1]));
	 			if(1*polygonData[i][j][k][0] < 1*minLat) {
	 				minLat = polygonData[i][j][k][0];
	 			}
	 			if(1*polygonData[i][j][k][0] > 1*maxLat) {
	 				maxLat = polygonData[i][j][k][0];
	 			}
	 			if(1*polygonData[i][j][k][1] < 1*minLng) {
	 				minLng = polygonData[i][j][k][1];
	 			}
	 			if(1*polygonData[i][j][k][1] > 1*maxLng) {
	 				maxLng = polygonData[i][j][k][1];
	 			}
  			}
 			thisPolygonResults.push(polylineEncoder.dpEncode(latLngs));
 		}
 		polygonResults.push(thisPolygonResults);
 	}
}

// The last step of the showArea function.
function setMap() {
	var polyline, polylines, polygon;
	var latCenter, lngCenter, i, j;
	var sw = new GLatLng(minLat, minLng);
	var ne = new GLatLng(maxLat, maxLng);
	latCenter = (1*minLat + 1*maxLat)/2;
	lngCenter = (1*minLng + 1*maxLng)/2;
	
	var bounds = new GLatLngBounds(sw, ne);
	var mapZoomLevel = map.getBoundsZoomLevel(bounds);
	var mapCenter = new GLatLng(latCenter, lngCenter)
	map.setCenter(mapCenter, mapZoomLevel);
	
	for(i=0; i<pathData.length; i++) {
		for(j=0; j<pathData[i].length; j++) {
			polyline = new GPolyline.fromEncoded({
				color: colorString(i),
				weight: 4,
				opacity: 0.8,
				points: pathResults[i][j].encodedPoints,
				levels: pathResults[i][j].encodedLevels,
				zoomFactor: zoomFactor,
				numLevels: numLevels});
			map.addOverlay(polyline);
		}
	}

	for(i=0; i<polygonData.length; i++) {
		polylines = new Array(0);
		for(j=0; j<polygonData[i].length; j++) {
			polyline = {
				points: polygonResults[i][j].encodedPoints,
				levels: polygonResults[i][j].encodedLevels,
				color: colorString(i),
				numLevels: numLevels,
				zoomFactor: zoomFactor};
			polylines.push(polyline);
		}
		polygon  = new GPolygon.fromEncoded({
			polylines: polylines,
			fill: true,
			color: colorString(i),
			outline: true});
		map.addOverlay(polygon);
	}
}

// Chooses the color of the ith object.
function colorString(i) {
	var colorStep = 6408323;
	return "#" + ((Math.floor((0xff + i*colorStep)) % 0x1000000) + 
		0x1000000).toString(16).substring(1);
}



// The rest of the functions respond to various events.
function load() {

	area = document.getElementById("area").innerHTML;
	luogo = document.getElementById("luogo0").innerHTML;					
	lati = document.getElementById("coordinate0").innerHTML.split(',')[0];	
	longi = document.getElementById("coordinate0").innerHTML.split(',')[1];	
	zoom = parseInt(document.getElementById("zoom").innerText);
	draggable = document.getElementById("trascinabile").innerHTML;
	
	ll_array = new Array();
		for(i=0;i<5;i++)    
			ll_array[i] = document.getElementById("coordinate"+i).innerHTML;									
				
	luo_array = new Array();
		for(i=0;i<5;i++)    
			luo_array[i] = document.getElementById("luogo"+i).innerHTML;	
	
	if(area == "1")
	{
			// Set up the initial form state.
			inputText = "";
			stateChange = false;			
			commentary = true;			
			order = "latlng";			
			// Set up the initial map state.
			if(document.implementation.hasFeature(
				"http://www.w3.org/TR/SVG11/feature#SVG","1.1")){ 
				_mSvgEnabled = true;
				_mSvgForced  = true;
			}
			map = new GMap2(document.getElementById("map"));
			GEvent.addListener(map, "moveend", function() {
				var zoomLevel = map.getZoom();
				var center = map.getCenter();				
			});
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.addControl(new GScaleControl());
			var omc = new GOverviewMapControl();
			map.addControl(omc);
			omc.hide();
			map.setCenter(new GLatLng(lati, longi), zoom);
			
			showArea();
	}
	else
	{
			map = new GMap2(document.getElementById("map"));                                
      map.addControl(new GSmallMapControl());	                            
      map.setCenter(new GLatLng(lati,longi), zoom);
	
			function createMarker(point, description) 
				{
					var marker;
					if(draggable == "" || draggable == "0")
					{
						marker = new GMarker(point);
						GEvent.addListener(marker, "click", function() {
							marker.openInfoWindowHtml(description);
						});
          }
          
          if(draggable == "1")
					{
						 marker = new GMarker(point,{draggable: true});
						 GEvent.addListener(marker, "click", function() {
						 	marker.openInfoWindowHtml(description);
							});
							
					}
					
					GEvent.addListener(marker, "dragstart", function() {
					map.closeInfoWindow();
					});
			
					GEvent.addListener(marker, "dragend", function() {
						marker.openInfoWindowHtml("lat:" + marker.getPoint().lat() + "<br>lng:" + marker.getPoint().lng());
					});
					          
          return marker;
        }
        
        for(i=0;i<ll_array.length;i++)
				{
					var la = ll_array[i].split(',')[0];
					var lo = ll_array[i].split(',')[1];
					var luo = luo_array[i];
					if(la != "" && lo != "")											
						map.addOverlay(createMarker(new GLatLng(la,lo), luo)); 					
        }			
	}
}











