﻿
// Some internal state vars
var dfMapMapObj = '';
var dfMapMarker = '';
var dfMapResponse = '';
var dfMapPlacemarkNo = '';
var dfMapZoomLevel = '';
var dfMapMetaObj = '';
var dragged = false;



// Process returned data
function getLocationsResponse(response) {
	
		setLoadingState(false);
	
	// Internal api error
	if (response && (response.Status.code == G_GEO_SERVER_ERROR || response.Status.code == G_GEO_BAD_KEY || response.Status.code == G_GEO_TOO_MANY_QUERIES)) {
		
		alert("Si è verificato un errore interno, riprova più tardi!");
		
	// Successfuly reply
	} else if (response && (response.Status.code == G_GEO_SUCCESS)) {
		
		dfMapResponse = response;
		
		// Check if there are more multiple results
		if (response.Placemark.length > 1 ) {
			
			// Display input layer
			document.body.style.overflow = 'hidden';
			document.getElementById('inputScreenContent').innerHTML = '';
			document.getElementById('inputScreenBG').style.visibility = 'visible';
			document.getElementById('inputScreenBG').style.display = 'block';
			document.getElementById('inputScreen').style.visibility = 'visible';
			document.getElementById('inputScreen').style.display = 'block';
			
			// Write down possible locations
			for (var i = 0; i < response.Placemark.length; i++) {				
				var placemark = response.Placemark[i];
				var address = '';
				var country = '';
				var administrativeArea = '';
				var subAdministrativeArea = '';
				var locality = '';
				var dependentLocality= '';				
				if (response && placemark) {
					address = placemark.address;
					if (placemark.AddressDetails.Country) {
						country = placemark.AddressDetails.Country.CountryNameCode;
						if (placemark.AddressDetails.Country.AdministrativeArea) {
							administrativeArea = placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
							if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea) {
								subAdministrativeArea = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
								if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) {
									locality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
									if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality) {
										dependentLocality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.DependentLocalityName;
									}
								}
							}
						}
					}
				}
				//document.getElementById('inputScreenContent').innerHTML += '<button type="button" onclick="dfMapPlacemarkNo = ' + i + '; dfMapDrawPlacemark();" style="margin-bottom:0.5em;">' + (dependentLocality ? dependentLocality + ', ' : '') + (locality ? locality + ', ' : '') + (subAdministrativeArea ? subAdministrativeArea + ', ' : '') + (administrativeArea ? administrativeArea + ', ' : '') + country + '</button><br />';
			}
			
		// Just draw the result if there was only one
		} else {
			
			dfMapPlacemarkNo = 0;
			dfMapDrawPlacemark();
			
		}
		
	// Location not found
	} else {
		
		alert("Non è stato possibile trovare l'indirizzo richiesto!");
				
	}
}



// Draw placemark
function dfMapDrawPlacemark() {
		
		// Hide input layer if it has been on display
		//document.getElementById('inputScreen').style.visibility = 'hidden';
		//document.getElementById('inputScreen').style.display = 'none';
		//document.getElementById('inputScreenBG').style.visibility = 'hidden';
		//document.getElementById('inputScreenBG').style.display = 'none';
		//document.body.style.overflow = 'auto';
	
		// Get location data
		var placemark = dfMapResponse.Placemark[dfMapPlacemarkNo];		
		var point = new GLatLng(placemark.Point.coordinates[1], placemark.Point.coordinates[0]);  
		
		// Center map
		dfMapMapObj.setCenter(point, 14, G_NORMAL_MAP);
		
		// Add marker to map
		dfMapMarker = new GMarker(point, {draggable: true});
		GEvent.addListener(dfMapMarker, "click", function() {
				dfMapFillMarker();
		}, this);
		GEvent.addListener(dfMapMarker, "dragend", function() {
				dragged = true;
				dfMapFillMarker();
		}, this);
		dfMapMapObj.addOverlay(dfMapMarker);
		dfMapFillMarker();
		
}



// Returns a points rounded latitude
function dfMapGetPointLat(point) {
	
	var accuracy = document.getElementById('dfMapAccuracy').options[document.getElementById('dfMapAccuracy').selectedIndex].value;
	var value = point.lat();
	return dfMapGeoAccuracy(value, accuracy);
	
}



// Returns a points rounded longitude
function dfMapGetPointLng(point) {
	
	var accuracy = document.getElementById('dfMapAccuracy').options[document.getElementById('dfMapAccuracy').selectedIndex].value;
	var value = point.lng();
	return dfMapGeoAccuracy(value, accuracy);
	
}



// Round a lng/lat value
function dfMapGeoAccuracy(value, accuracy) {
	
	return value.toFixed(accuracy);
	
}



// Calculates a degree value
function dfMapPosToDegree(position, type) {
	
	var result = '';
	var degree = Math.floor(Math.abs(position));
	var minutes = Math.floor((Math.abs(position) - degree) * 60);
	var seconds = (((Math.abs(position) - degree) * 60 - minutes) * 60).toFixed(2);
	var extension;	
	if (type == 'lat') {
		if (position > 0 ) {
			extension = 'N';
		} else {
			extension = 'S';
		}
	} else {
		if (position > 0 ) {
			extension = 'O';
		} else {
			extension = 'W';
		}		
	}
	
	return degree + '&deg; ' + minutes + '\' ' + seconds + '\'\' ' + extension;
	
}



// Draw address position and zoom in there
function dfMapFillMarker() {
	
	// Abort if no response so far
	if (!dfMapResponse) {
		return;
	}
	
	var placemark = dfMapResponse.Placemark[dfMapPlacemarkNo];
	
	var accuracy = '?';
	var address = '';
	var country = '';
	var administrativeArea = '';
	var subAdministrativeArea = '';
	var locality = '';
	var thoroughfare = '';
	var postalCode = '';
	var dependentLocality = '';
	var dependentLocalityThoroughfare = '';
	var dependentLocalityPostalCode = '';
	var GGeoAddressAccuracy = new Array(
		'Sconosciuto',
		'Livello nazione',
		'Livello regione',
		'Livello provincia',
		'Livello località',
		'Livello codice postale',
		'Livello strada',
		'Livello intersezione',
		'Livello indirizzo'
	);
	
	// Get placemark data
	if (placemark && !dfMapMetaObj && !isGeoCoord(getAddress())) {
		address = placemark.address;
		if (placemark.AddressDetails.Country) {
			country = placemark.AddressDetails.Country.CountryNameCode;
			accuracy = placemark.AddressDetails.Accuracy;
			if (placemark.AddressDetails.Country.AdministrativeArea) {
				administrativeArea = placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
				if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea) {
					subAdministrativeArea = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
					if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) {
						locality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
						if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare) {
							thoroughfare = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
						}
						if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) {
							postalCode = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
						}
						if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality) {
							dependentLocality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.DependentLocalityName;
							if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare) {
								thoroughfare = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName;
							}
							if (placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode) {
								postalCode = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode.PostalCodeNumber;
							}
						}
					}
				}
			}
		}
	}
	
	// Zoom in only if not dragged since last result
	if (!dragged) {
		var zoomLevel = 10;
		if (dfMapZoomLevel > 0) {
			zoomLevel = dfMapZoomLevel;			
		} else if (accuracy == 0) {
			zoomLevel = 0;
		} else if (accuracy == 1) {
			zoomLevel = 3;
		} else if (accuracy == 2) {
			zoomLevel = 6;
		} else if (accuracy == 3) {
			zoomLevel = 8;
		} else if (accuracy == 4) {
			zoomLevel = 12;
		} else if (accuracy == 5) {
			zoomLevel = 13;
		} else if (accuracy == 6) {
			zoomLevel = 15;
		} else if (accuracy == 7) {
			zoomLevel = 16;
		} else if (accuracy == 8) {
			zoomLevel = 17;
		}
		dfMapMapObj.setZoom(zoomLevel);
	}
	
	var thisAddress = (dfMapMetaObj ? dfMapMetaObj.geoPlacename : (address ? address : getAddress()));
	var thisRegion = (dfMapMetaObj ? dfMapMetaObj.geoRegion : (country && administrativeArea ? country + '-' + administrativeArea : ''));
	
	var lng = dfMapGetPointLng(dfMapMarker.getPoint());
	var lat = dfMapGetPointLat(dfMapMarker.getPoint());
	var lngDeg = dfMapPosToDegree(lng, 'lng');
	var latDeg = dfMapPosToDegree(lat, 'lat');
	
	var zoomLevel = dfMapMapObj.getZoom();
	var mapType = '';

	// Fill marker
	dfMapMarker.openInfoWindowHtml('<span id="dfMapMarkerHtml"><span class="dfMapGeoDataLabel">Latitudine:</span><span class="dfMapGeoData"> ' + lat + ' (' + latDeg + ')</span><br /><span class="dfMapGeoDataLabel">Longitudine:</span><span class="dfMapGeoData"> ' + lng + ' (' + lngDeg + ')</span><br /><div class="dfMapMarkerInfo">Trascina il puntatore o clicca sulla mappa per modificare la posizione!<br><br><a href="javascript:ImpostaCoordinate();">Io sono qui</a> | <a href="/home/segnala_produttore.aspx">Segnalo un Produttore/Venditore</a></div></span>');
	
	// Fill geo-data
	//document.getElementById('dfMapGeoDatasheet').innerHTML = '<p><table border="0"><tr><th>Indirizzo:</th><td>' + thisAddress + '</td></tr><tr><th>Latitudine:</th><td>' + lat + ' (' + latDeg + ')</td></tr><tr><th>Longitudine:</th><td>' + lng + ' (' + lngDeg + ')</td></tr><tr><th></th><td>&nbsp;</td></tr><tr><th>Nazione:</th><td>' + country + '</td></tr><tr><th>Regione:</th><td>' + administrativeArea + '</td></tr><tr><th>Provincia:</th><td>' + subAdministrativeArea + '</td></tr><tr><th>Località:</th><td>' + locality + '</td></tr><tr><th>Indirizzo:</th><td>' + thoroughfare + '</td></tr><tr><th>CAP:</th><td>' + postalCode + '</td></tr><tr><th>Località:</th><td>' + dependentLocality + '</td></tr><tr><th>Indirizzo:</th><td>' + dependentLocalityThoroughfare + '</td></tr><tr><th>CAP:</th><td>' + dependentLocalityPostalCode + '</td></tr><tr><th>Precisione:</th><td>' + GGeoAddressAccuracy[accuracy] + ' (' + accuracy + ' su 8)</td></tr></table></p>';
	
	// Fill geo-metatags
	//document.getElementById('dfMapGeoMetatags').value = '<meta name="geo.placename" content="' + thisAddress + '" />' + "\n" + '<meta name="geo.position" content="' + lat + ';' + lng + '" />' + "\n" + '<meta name="geo.region" content="' + thisRegion + '" />' + "\n" + '<meta name="ICBM" content="' + lat + ', ' + lng + '" />';
	
	// Fill geo-tags
	//document.getElementById('dfMapGeoTags').value = "geotagged\ngeo:lat=" + lat + "\ngeo:lon=" + lng;
	
	// Fill kml
	//document.getElementById('dfMapKml').value = "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<kml xmlns=\"http://earth.google.com/kml/2.1\">\n  <Placemark>\n    <name>" + thisAddress + "</name>\n    <description></description>\n    <Point>\n      <coordinates>" + lng + "," + lat + ",0</coordinates>\n    </Point>\n  </Placemark>\n</kml>";
	
	// Fill kml download
	//document.getElementById('dfMapKmlDownload').innerHTML = '<button type="button" onclick="window.open(\'kml.php?coordinates=' + lng + ',' + lat + ',0&name=' + thisAddress + '\');"><img src="images/kml-icon.png" /> Scarica il file KML</button>';
	
	// Fill link
	//document.getElementById('dfMapLink').value = 'http://www.mygeoposition.com/loc/' + (dragged ? lat + ',' + lng : thisAddress) + '/?zoomLevel=' + zoomLevel + '&mapType=' + mapType;
	//document.getElementById('dfMapLinkGoogleMaps').value = 'http://maps.google.com/?q=' + lat + ',' + lng;
	//document.getElementById('dfMapLinkLiveLocal').value = 'http://local.live.com/?lvl=14&cp=' + lat + '~' + lng;
	//document.getElementById('dfMapLinkYahoo').value = 'http://maps.yahoo.com/#q1=' + thisAddress + '&mag=6&lon=' + lng + '&lat=' + lat;
	
}

// Zoom
function dfMapZoom(zoomModification) {
	
	dfMapMapObj.setZoom(dfMapMapObj.getZoom() + zoomModification);
	
}



// Map type
function dfMapType(mapType) {
	
	dfMapMapObj.setMapType(mapType);
	
	document.getElementById('dfMapButtonTypeMapNormal').style.fontWeight = 'normal';
	document.getElementById('dfMapButtonTypeMapSatellite').style.fontWeight = 'normal';
	document.getElementById('dfMapButtonTypeMapHybrid').style.fontWeight = 'normal';
	
	if (mapType == G_NORMAL_MAP) {
		document.getElementById('dfMapButtonTypeMapNormal').style.fontWeight = 'bold';
	} else if (mapType == G_SATELLITE_MAP) {
		document.getElementById('dfMapButtonTypeMapSatellite').style.fontWeight = 'bold';		
	} else if (mapType == G_HYBRID_MAP) {
		document.getElementById('dfMapButtonTypeMapHybrid').style.fontWeight = 'bold';
	}
	
}



// Validate url
function isUrl(url) {
  var urlPattern = /^(?:(?:ftp|https?):\/\/)?(?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+(?:com|edu|biz|org|gov|int|info|mil|net|name|museum|coop|aero|[a-z][a-z])\b(?:\d+)?(?:\/[^;"'<>()\[\]{}\s\x7f-\xff]*(?:[.,?]+[^;"'<>()\[\]{}\s\x7f-\xff]+)*)?/;
  return urlPattern.test(url.toLowerCase());
}



// Validate url
function geoCoordPrecision(string) {
	var match = string.match(/\.([0-9]*)/g);
	var result = 0;
	if (match) {
		for(var i = 0; i <match.length; i++) {
			if (match[i].length > result) {
				result = match[i].length;
			}
		}
	}
	if (result > 0) {
		result--;
	}
	return result;
}



// Validate url
function isGeoCoord(string) {
  var stringPattern = /^[+\-]{0,1}[0-9]{1,3}(\.[0-9]*)?[\, ][ ]*[+\-]{0,1}[0-9]{1,3}(\.[0-9]*)?$/;
  return stringPattern.test(string);
}



// Lookup
/*
function lookup() {
	
	if (document.getElementById('dfMapAddress').value == 'Brescia, BS, Italia') {
		return;
	}
	
	var xmlHttpReq = false;
	var self = this;
	
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		self.xmlHttpReq = new XMLHttpRequest();
	}
	// IE
	else if (window.ActiveXObject) {
		self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	self.xmlHttpReq.open('GET', '/lookup.php?q=' + getAddress(), true);
	self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	self.xmlHttpReq.send('');
	
}
*/


// Load geodata from url
/*
function loadGeoFromUrl() {
	
	var xmlHttpReq = false;
	var self = this;
	
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		self.xmlHttpReq = new XMLHttpRequest();
	}
	// IE
	else if (window.ActiveXObject) {
		self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	self.xmlHttpReq.open('GET', 'geofromurl.php?url=' + getAddress(), true);
	self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	self.xmlHttpReq.onreadystatechange = function() {
		if (self.xmlHttpReq.readyState == 4) {
			setLoadingState(false);
            if (self.xmlHttpReq.status == 200 && self.xmlHttpReq.responseText) {
            	var metaObj = eval("(" + self.xmlHttpReq.responseText + ")");
            	var pos = (metaObj.geoPosition ? metaObj.geoPosition : (metaObj.icbm ? metaObj.icbm  : ''));
            	pos = pos.replace(/;/g, ',');
            	//lookup();
            	setAddress(pos);
            	dfMapReset(metaObj);
            } else {
                alert("Non è stato possibile trovare l'indirizzo web richiesto,\nla pagina non contiene geotag.");
            }
		}
	}
	
	setLoadingState(true);
	self.xmlHttpReq.send('');
}
*/


// Remove search field placeholder
function focusSearchField(id) {
	
	if(document.getElementById(id).value == "Brescia, BS, Italia") {
		document.getElementById(id).style.color = "rgb(0, 0, 0)";
		document.getElementById(id).value = "";
	}
	
}



// Restore search field placeholder
function blurSearchField(id) {
	
	if(document.getElementById(id).value == "" || document.getElementById(id).value == "Brescia, BS, Italia") {
		document.getElementById(id).style.color = "rgb(150, 150, 150)";
		document.getElementById(id).value = "Brescia, BS, Italia";
	}
	
}



// Loading state
function setLoadingState(state) {
	if (state) {
		document.body.style.cursor = 'wait';
		document.body.style.overflow = 'hidden';
		//document.getElementById('loadingScreenBG').style.visibility = 'visible';
		//document.getElementById('loadingScreenBG').style.display = 'block';
		//document.getElementById('loadingScreen').style.visibility = 'visible';
		//document.getElementById('loadingScreen').style.display = 'block';	
	} else {
		document.body.style.cursor = 'default';
		//document.getElementById('loadingScreen').style.visibility = 'hidden';
		//document.getElementById('loadingScreen').style.display = 'none';
		//document.getElementById('loadingScreenBG').style.visibility = 'hidden';
		//document.getElementById('loadingScreenBG').style.display = 'none';		
	}	
}



// Copy textarea contents to clipboard
function copyToClipboard(textareaId){
	
	var copied = document.getElementById(textareaId).createTextRange();
	copied.execCommand("Copy");
	
}



// Display copy button
function displayCopyButton(elementId, ps) {
	if ( (navigator.appName=="Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4)) {
			document.write((ps ? '<p>' : '') + "<button onclick=\"copyToClipboard('" + elementId + "');\">Copia negli appunti</button>" + (ps ? '</p>' : ''));
	}
}



// Dump a var or object
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;

	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";

	if(typeof(arr) == 'object') { //Array/Hashes/Objects
		for(var item in arr) {
			var value = arr[item];

			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}



// Get address
function getAddress() {
	if (document.getElementById('dfMapAddress').value == 'Brescia, BS, Italia') {
		return 'Italy, Brescia';
	} else {
		return document.getElementById('dfMapAddress').value;
	}
}



// Set address
function setAddress(string) {
	document.getElementById('dfMapAddress').value = string;
}



// Start application and query
function dfMapReset(metaObj) {
	
	dfMapMapObj.clearOverlays();

	dfMapMarker = '';
	dfMapResponse = '';
	dfMapPlacemarkNo = 0;
	dfMapZoomLevel = '';
	dfMapMetaObj = (metaObj ? metaObj : '');
	dragged = false;
	
	if (isGeoCoord(getAddress())) {
		var precision = geoCoordPrecision(getAddress());
		var zoomLevel;
		if (precision >= 3) {
			zoomLevel = 17;
		} else if (precision == 2) {
			zoomLevel = 14;
		} else if (precision == 1) {
			zoomLevel = 11;
		} else {
			zoomLevel = 8;
		}
		dfMapZoomLevel = zoomLevel;
	}
	
	if (isUrl(getAddress())) {
		//loadGeoFromUrl();
	} else {	
		var dfMapGeocoder = new GClientGeocoder();
		//setLoadingState(true);
		dfMapGeocoder.getLocations(getAddress(), getLocationsResponse);
		//lookup();
	}
	
}



// Declare map
function loadApplication() {
	dfMapMapObj = new GMap2(document.getElementById("dfMapMap"));
	//dfMapMapObj.disableDoubleClickZoom();
	//dfMapMapObj.enableScrollWheelZoom();
	//dfMapMapObj.enableContinuousZoom();
	GEvent.addListener(dfMapMapObj, "click", function(overlay,  point) {
		if (point) {
			dragged = true;
			dfMapMarker.setPoint(point);
			dfMapFillMarker();
		}
	}, this);
	
	// Add controls to map
	dfMapMapObj.addControl(new GLargeMapControl());
	//dfMapMapObj.addControl(new GMapTypeControl());
	//dfMapMapObj.addControl(new GScaleControl());
	//blurSearchField('dfMapAddress');
		
	// Finally start geocoding
	dfMapReset();
	
}

function LoadByLatLong(lat,long) {
	dfMapMapObj = new GMap2(document.getElementById("dfMapMap"));
	dfMapMapObj.addControl(new GSmallMapControl());
    dfMapMapObj.addControl(new GMapTypeControl());
   	dfMapMapObj.setCenter(new GLatLng(lat, long), 14);
	var point = new GLatLng(lat, long);  
	var dfMapMarker1 = new GMarker(point);   	
	dfMapMapObj.addOverlay(dfMapMarker1);
}




