// Global vars -----------------------------------------
var flagsentieri=0;
var flagservizi=0;
var flagminori=0;	
var loading = false;
var al = "";
var ar = [];
var routePoints = new Array(0);
var total_distance = 0;
var colour = "#cc0000";
var distpoints = [];
var distpolys = [];
var lineadist = "";

var marker1;
var marker2;
var label1;
var label2;
var button=0;
var dist=0;
var line;
var poly;
var saddr;
var daddr;

      var lng = 9.5857;
      var lat = 40.3014;
      var zoom = 11;
      var maptype = G_NORMAL_MAP;

var MILES = {
	label : "miles",
	f : function (distance) {
			return distance / 1609.344;
	}
}

var KMS = {
	label: "km",
	f : function (distance) {
			return distance / 1000;
	}
}

//default units
var unit_handler = KMS;

// Distance in metres
var EARTH_RADIUS = 6367000;

iconStart=new GIcon(G_DEFAULT_ICON, "http://maps.google.com/mapfiles/dd-start.png");
iconDest=new GIcon(G_DEFAULT_ICON, "http://maps.google.com/mapfiles/dd-end.png");


      // === Create an associative array of GIcons() ===
        // Create our "tiny" marker icon
      var baseicon = new GIcon();
      baseicon.shadow = "icolite/shadow50.png";	  
      baseicon.shadowSize = new GSize(18, 17);
 //     baseicon.iconSize = new GSize(9, 15);
      baseicon.iconAnchor = new GPoint(4, 16);
      baseicon.infoWindowAnchor = new GPoint(9, 2);	  
      baseicon.infoShadowAnchor = new GPoint(18, 25);




//parsing degli argomenti inseriti nella url di chiamata
      var query = location.search.substring(1);	  
      var pairs = query.split("&");
      for (var i=0; i<pairs.length; i++) {
        // break each pair at the first "=" to obtain the argname and value
	var pos = pairs[i].indexOf("=");
	var argname = pairs[i].substring(0,pos).toLowerCase();
	var value = pairs[i].substring(pos+1).toLowerCase();

        // process each possible argname
        if (argname == "lat") {lat = parseFloat(value);}
        if (argname == "lng") {lng = parseFloat(value);}
        if (argname == "zoom") {zoom = parseInt(value);}
        if (argname == "type") {
          if (value == "m") {maptype = G_NORMAL_MAP;}
          if (value == "k") {maptype = G_SATELLITE_MAP;}
          if (value == "h") {maptype = G_HYBRID_MAP;}
        }}

	  var flagicon = new GIcon();
//      flagicon.shadow = "icolite/shadow40.png";	  
 //     flagicon.shadowSize = new GSize(18, 17);
 //     flagicon.iconSize = new GSize(13, 17);
      flagicon.iconAnchor = new GPoint(4, 16);
      flagicon.infoWindowAnchor = new GPoint(9, 2);	  
      flagicon.infoShadowAnchor = new GPoint(18, 25);

      var noshadow = new GIcon();
      noshadow.shadow = "";	  	  
//      noshadow.iconSize = new GSize(9, 8);
      noshadow.iconAnchor = new GPoint(4, 4);
      noshadow.infoWindowAnchor = new GPoint(4, 4);	  
	  
	  var gicons = [];
	  var gmarkers = [];	  
	  var glines = [];
      gicons["grigio"] = new GIcon(noshadow, "icolite/puntogrigio.gif");	  
	  gicons["rosa"] = new GIcon(baseicon,"icolite/rosa.gif");
	  gicons["verdino"] = new GIcon(baseicon, "icolite/verdino.gif");	 
	  gicons["museo"] = new GIcon(baseicon, "icolite/museum.gif");	 	
	  gicons["cartazuc"] = new GIcon(baseicon, "icolite/cartazuc.gif");		
	  gicons["giallo"] = new GIcon(baseicon, "icolite/giallo.gif");			
	  gicons["puntoverdino"] = new GIcon(noshadow, "icolite/puntoverdino.gif");		
	  gicons["nuraghe"] = new GIcon(noshadow, "icolite/puntorosa.gif");		  		  		         
	  gicons["viola"] = new GIcon(baseicon, "icolite/viola.gif");	 
	  gicons["rosso"] = new GIcon(flagicon, "icolite/flag_red.gif");		
	  gicons["verde"] = new GIcon(flagicon, "icolite/flag_green.gif");			    
	  gicons["nero"] = new GIcon(baseicon, "icolite/chiesa.png");			
	  gicons["servizio"] = new GIcon(noshadow, "icolite/circle_s.gif");			
	  gicons["servtras"] = new GIcon(noshadow, "icolite/circle_t.gif");			
	  gicons["hotel"] = new GIcon(noshadow, "icolite/hotel.gif");			
	  gicons["agriturismo"] = new GIcon(noshadow, "icolite/agritur.gif");			
      gicons["ristorante"] = new GIcon(noshadow, "icolite/ristoranti.gif");				  
      gicons["bb"] = new GIcon(noshadow, "icolite/bb.gif");				  
      gicons["grotta"] = new GIcon(noshadow, "icolite/puntocartazuc.gif");		
	  gicons["cerchioblu"] = new GIcon(noshadow, "icolite/circle_blu.gif");			  
	    			  		  	  
      var tilelayers2 = [new GTileLayer(new GCopyrightCollection("Orografia: Giorgio Plazzotta"),6,14)];
      tilelayers2[0].getCopyright = function(a,b) {
        return {prefix:"Orografia: ", copyrightTexts:["Giorgio Plazzotta"]};
      }
      var quad; 
	  tilelayers2[0].getTileUrl = function (a,b) {	  
        TileToQuadKey(a.x,a.y,b); 
		return "http://www.geodorgali.it/tiles/dtm/"+quad+".png";
      } ;  


	function TileToQuadKey  ( tx,  ty,  zl) { 
    quad = ""; 
    for (var i = zl; i > 0; i--){ 
        var mask = 1 << (i - 1); 
        var cell = 0; 
        if ((tx & mask) != 0) 
            cell++; 
        if ((ty & mask) != 0) 
            cell += 2; 
        quad += cell; 
    } 
    return quad; }  
	

      // A function to create a tabbed marker and set up the event window
      function createTabbedMarker(point,html1,html2,label1,label2,icontype,label3,gruppo) {
        var marker = new GMarker(point, {title:label3 , icon:gicons[icontype]});
        gmarkers.push(marker);
	    marker.type = gruppo; 
        GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowTabsHtml([new GInfoWindowTab(label1,html1), new GInfoWindowTab(label2,html2)]);
        });

        return marker;
      }
      // ==================================================

	
function Markers(gruppo){
   map.closeInfoWindow();
   cursor_wait();
   if (document.getElementById(gruppo).checked==false) { // hide the marker
      for (var i=0;i<gmarkers.length;i++) {
         if (gmarkers[i].type==gruppo)  {
            map.removeOverlay(gmarkers[i]);
			document.getElementById(gruppo).checked=false;
         }
      }
   } else { // show the marker again 
      if (gruppo == 'snt' && flagsentieri == 0) {
	  readMap("sentieri.xml");
	  flagsentieri = 1;
	   }
      if (gruppo == 'ser' && flagservizi == 0) {
	  readMap("servizi.xml");
	  flagservizi = 1;
	   }	   
      if (gruppo == 'min' && flagminori == 0) {
	  readMap("minori.xml");
	  flagminori = 1;
	   }		   
      for (var i=0;i<gmarkers.length;i++) {
          if (gmarkers[i].type==gruppo)  {
            map.addOverlay(gmarkers[i]);
			document.getElementById(gruppo).checked=true;
         }
      }
   }
   if (gruppo == 'snt') {
      Lines();
   }
cursor_clear(); 
}

function Lines(){
map.closeInfoWindow();
   if (document.getElementById('snt').checked==false) { // hide the marker
      for (var i=0;i<glines.length;i++) {
            map.removeOverlay(glines[i]);
			document.getElementById('snt').checked=false;
      }
   } else { // show the marker again
      for (var i=0;i<glines.length;i++) {
            map.addOverlay(glines[i]);
			document.getElementById('snt').checked=true;
      }
   }
}

     // A function to read the data
    function readMap(url) {
      // Read the data from example.xml
      var request = GXmlHttp.create();
      request.open("GET", url, true);
      request.onreadystatechange = function() {
        if (request.readyState == 4) {
          var xmlDoc = request.responseXML;
          // obtain the array of markers and loop through it
          markers = xmlDoc.documentElement.getElementsByTagName("marker");
          
           // hide the info window, otherwise it still stays open where the removed marker used to be
            map.getInfoWindow().hide();
			
            // clear all existing markers
 
           // map.clearOverlays(); 
			// empty the array
         //  gmarkers = [];			
 
          for (var i = 0; i < markers.length; i++) {
            // obtain the attribues of each marker
            var lat = parseFloat(markers[i].getAttribute("lat"));
            var lng = parseFloat(markers[i].getAttribute("lng"));
            var point = new GLatLng(lat,lng);
            var piccola1 = markers[i].getAttribute("piccola1");		
            var piccola2 = markers[i].getAttribute("piccola2");					
            var label = markers[i].getAttribute("label");		
            var pagina = markers[i].getAttribute("pagina");		
            var html = markers[i].getAttribute("html");					
            var ecolabel = markers[i].getAttribute("ecolabel");			
            var descr = markers[i].getAttribute("descr");							
            var icontype = markers[i].getAttribute("icontype");					
            var gruppo = markers[i].getAttribute("gruppo");												
            // create the marker
            var foto = "";
            if (!(piccola1==null)){
	           var foto = "<img src='../immagini/thumb/" + piccola1 + "'>";}
            if (!(piccola2==null)){
		       var foto = foto + "<img src='../immagini/thumb/" + piccola2 + "'>";  }
			var foto = "<span class='insidemap'>" + foto + "</span>";
            var unidescr = "";
            if (!(gruppo=="snt")) {
			   if (!(pagina==null)){
			       var unidescr = "<a href='/" + pagina + "' target='_blank'>" +  label + "</a><br>";
			   } 
			   if (!(descr==null)){
				   var unidescr = unidescr + descr; 
				}   
			   if (!(ecolabel==null)){
				   var unidescr = unidescr + "<img src='../grafica/ecolabel.gif' width='49' height='51' />"; 
				}  				
	        var html = "<span class='insidemap'>" + unidescr + "</span>";
            }
			else {

				var html = "<span class='insidemap'>" + html + "</span>";
			}
            var marker = createTabbedMarker(point,html,foto,"Descrizione","Foto",icontype,label,gruppo);
    		map.addOverlay(marker);
          }

          // ========= Now process the polylines ===========
		  var lines = xmlDoc.documentElement.getElementsByTagName("line");
		  // read each line
          for (var a = 0; a < lines.length; a++) {
		    // get any line attributes
            var colour = lines[a].getAttribute("colour");
            var width  = parseFloat(lines[a].getAttribute("width"));
            // read each point on that line
            var points = lines[a].getElementsByTagName("point");
            var pts = [];
            for (var i = 0; i < points.length; i++) {
               pts[i] = new GLatLng(parseFloat(points[i].getAttribute("lat")),
                                   parseFloat(points[i].getAttribute("lng")));
            }

            var linea = new GPolyline(pts,colour,width);
			glines.push(linea);
			map.addOverlay(linea);
          }
          // ================================================           
        }
      }
      request.send(null);
	        // When initially loaded, use the data from "map11a.xml"
      }	


      // This function picks up the click and opens the corresponding info window
      function myclick(i) {
        gmarkers[i].openInfoWindowHtml(htmls[i]);
      }	  

function handleSelected(opt) { 
 var i = opt.selectedIndex - 1; 
 var a1 = opt.value;
 var ar=a1.split(',');
setTimeout("map.setMapType(G_SATELLITE_MAP);",1);
cursor_wait();
 map.setCenter(new GLatLng(ar[1], ar[0]), parseInt(ar[2])); 
cursor_clear();
 
}
 
function loadingDone() {
//Jolly good :-)
}		

function indicateLoading() {
	loading = true;
	displayLoadingMsg();
}

function displayLoadingMsg() {
	var oLMsg = document.getElementById('loadingMessage');
	oLMsg.style.display = '';

	if (loading){
		var to = window.setTimeout('displayLoadingMsg()',300);
	}
	else {
		oLMsg.style.display = 'none';
	}
}	
function cursor_wait() {
  document.body.style.cursor = 'wait';
  indicateLoading();  
}

function cursor_clear() {
  document.body.style.cursor = 'default';
  loading = false;
}

function clearMap () {
   document.form1.text.value = "Clicca 'Imposta percorso' per definire il punto di partenza e di arrivo di un percorso stradale. Clicca su 'Misura percorso' per disegnare una linea spezzata e calcolare le distanze";
    document.getElementById('commenti').style.display="none";
    total_distance = 0.00;
	routePoints = [];
      for (var i=0;i<distpoints.length;i++) {
			map.removeOverlay(distpoints[i]);
      }
      for (var i=0;i<distpolys.length;i++) {
			map.removeOverlay(distpolys[i]);
      }
   GEvent.clearInstanceListeners(map);	  
    //map.clearOverlay(routepoints);
   //document.getElementById("rjour").checked="false";
	updateDisplay();
}

function statert () {
	alert (document.getElementById("rjour").checked);
}

function changeColourWhite () {
	colour="#ffffff";
	map.addOverlay(new GPolyline(routePoints,colour));
}
function changeColourBlack() {
	colour="#000000";
	map.addOverlay(new GPolyline(routePoints,colour));
}
function changeColourBlue() {
	colour="#0000ff";
	map.addOverlay(new GPolyline(routePoints,colour));
}
function changeColourGreen() {
	colour="#99ff00";
	map.addOverlay(new GPolyline(routePoints,colour));
}
function updateDisplay () {
	var dist = unit_handler.f(total_distance);
	document.getElementById("distance").value = dist.toFixed(3);
} 

function toggleUnits (arg) {
	if (arg == "MILES") 
		unit_handler = MILES;
	else 
		unit_handler = KMS;
	// Refresh
	updateDisplay();
}
// Takes an array of points and works out the total distance
function calculateDistance (points) {
	if (points.length < 2)	
		return 0;
	var dist = 0.0;
	for (var i = 0; i < points.length - 1; i++) {
		dist += distance_between_points(points[i], points[i + 1]);		
	}

	return dist;
}
// Utility function for converting degrees to radians
Math.deg2rad = function ( x ) {
        return x * (Math.PI / 180.0); 
}


// Calculates the distance (in metres) between 2 points. 
function distance_between_points ( p1, p2 ) {
        var a = Math.deg2rad( 90 - p1.y);
        var b = Math.deg2rad( 90 - p2.y);
        var theta = Math.deg2rad( p2.x - p1.x);
        var c = Math.acos( Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(theta));
        return c * EARTH_RADIUS; 
}
function toggleReturn () {
	if ((document.getElementById("rjour").checked)==true)
	{
		total_distance *= 2;
	}
		if ((document.getElementById("rjour").checked)==false)
	{
		total_distance /= 2;
	}
	updateDisplay();
}


function resizeMap( map, points ) {
  var minLong = 999;
  var minLat = 999;
  var maxLong = -999;
  var maxLat = -999;
  
  // Get the current map width/height
  var size = map.getSpanLatLng();
  var mapWidth = size.width;
  var mapHeight = size.height;
  var baseWidth = mapWidth;
  var baseHeight = mapHeight;
  
  // Figure out the elemental unit (depends on the size of the map)
  // You will need to re-run resizeMap() if the size of the map changes.
  if ( map.getZoomLevel() > 0 ) {
    baseWidth /= Math.pow( 2, map.getZoomLevel() );
    baseHeight /= Math.pow( 2, map.getZoomLevel() );
  }
  
  // Find the max/min points
  for ( var i = 0; i < points.length; i++ ) {
    if ( points[i].x < minLong ) minLong = points[i].x;
    if ( points[i].x > maxLong ) maxLong = points[i].x;
    if ( points[i].y < minLat ) minLat = points[i].y;
    if ( points[i].y > maxLat ) maxLat = points[i].y;
  }
  
  // Find the optimal Width Zoom
  var wZoom = 0;
  var w = Math.abs( maxLong - minLong );
  for ( var i = 1; i < 16; i++ ) {
    if ( baseWidth > w ) break;
    baseWidth *= 2;
    wZoom = i;
  }
  
  // Find the optimal Height Zoom
  var hZoom = 0;
  var h = Math.abs( maxLat - minLat );
  for ( var i = 1; i < 16; i++ ) {
    if ( baseHeight > h ) break;
    baseHeight *= 2;
    hZoom = i;
  }
  
  // Reposition
  map.centerAndZoom(
    new GPoint( ( minLong + maxLong ) / 2, ( minLat + maxLat ) / 2 ), ( wZoom > hZoom ? wZoom : hZoom )
  );
}
function ZoomOut () {
	resizeMap (map,routePoints);
}

function percorso(){
        document.form1.text.value = "cliccare su piu' punti dello schermo per disegnare la linea del percorso";
        document.getElementById('commenti').style.display="block";
		GEvent.addListener(map, "click", function(overlay, point) {
        if (point) {
			//map.clearOverlays();
			routePoints.push(point);
			var lineadist = new GPolyline(routePoints,colour);
			distpolys.push(lineadist);		
			map.addOverlay(lineadist);
			// Add a marker at the beginning and the end
			var marker = new GMarker(routePoints[0]);
			distpoints.push(marker);
			map.addOverlay(marker);
			GEvent.addListener(marker, "click", function() {
			map.clearOverlays();
			routePoints.push(routePoints[0]);
			var lineadist = new GPolyline(routePoints,colour);
			distpolys.push(lineadist);		
			map.addOverlay(lineadist);
			// Add a marker at the beginning and the end
			var lastLeg = distance_between_points(routePoints[routePoints.length - 2], routePoints[routePoints.length - 1]);
			total_distance += lastLeg;	
			document.getElementById("rjour").checked=false;
			document.getElementById("rjour").disabled=true;
			updateDisplay();	
			});
			
			if ( routePoints.length > 1 ) {
                marker = new GMarker(routePoints[routePoints.length - 1]);
				map.addOverlay(marker);
				distpoints.push(marker);
			}
			// Re-calculate the distance so far
				var lastLeg = distance_between_points(routePoints[routePoints.length - 2], routePoints[routePoints.length - 1]);
				total_distance += lastLeg;	
				updateDisplay();
		}
	  });
}

function chiamagmaps(){
	
if (!(saddr==null)) {
			map.removeOverlay(poly);	
			map.removeOverlay(marker1);	
			map.removeOverlay(marker2);	
			map.removeOverlay(label1);	
			map.removeOverlay(label2);			
   document.getElementById("add").value="Imposta percorso";			
   document.form1.text.value = "Clicca 'Imposta percorso' per definire il punto di partenza e di arrivo di un percorso stradale. Clicca su 'Misura percorso' per disegnare una linea spezzata e calcolare le distanze";
   GEvent.clearInstanceListeners(map);
   window.open(direct());
} else {     document.form1.text.value = "per richiedere il calcolo di un percorso stradale e' necessario impostare prima i punti di partenza e di arrivo";
}
}

function direct(){
  var txt = 'http://maps.google.com/?saddr=' + saddr +'&daddr=' + daddr;
  return txt;
}

function add()
{
dist=0;button=0;
document.form1.text.value = "clicca nella mappa per impostare il punto di inizio del percorso";
function measure(){
if(marker1&&marker2)
   line = [marker1.getPoint(),marker2.getPoint()];
   dist=marker1.getPoint().distanceFrom(marker2.getPoint());
   dist=dist.toFixed(0)+"m";
   if(parseInt(dist)>10000){dist=(parseInt(dist)/1000).toFixed(1)+"km";}
      label1.setContents(dist);label2.setContents(dist);
      label1.setPoint(marker1.getPoint());
      label1.setContents(dist);
      label2.setPoint(marker2.getPoint());
	 if(poly)map.removeOverlay(poly); 
       poly = new GPolyline(line,'#FFFF00', 8, 1)
      map.addOverlay(poly);
     saddr = marker1.getPoint().toUrlValue();
     daddr = marker2.getPoint().toUrlValue();
}
document.getElementById("add").value="imposta punto di partenza";
   GEvent.addListener(map, "click", function(overlay, pnt) {
 document.form1.text.value = "Spostate il segnaposto rosso sul punto di arrivo del percorso. In seguito cliccate sul pulsante 'Calcola percorso'";
   if(pnt&&button==0) {
      marker1 = new GMarker(pnt,{draggable: true, icon:iconStart, dragCrossMove: true});
      map.addOverlay(marker1);
      marker1.enableDragging();
      label1=new ELabel(pnt, dist,"labelstyle",new GSize(2,20),60);
      map.addOverlay(label1);
      marker2 = new GMarker(pnt,{draggable: true, icon:iconDest});
      map.addOverlay(marker2);
      marker2.enableDragging();
      label2=new ELabel(pnt, dist,"labelstyle",new GSize(2,20),60);
      map.addOverlay(label2);
   }
GEvent.addListener(marker1,"drag",function(){measure()});
GEvent.addListener(marker1,"dblclick",function(){clr()});
GEvent.addListener(marker2,"drag",function(){measure()});
GEvent.addListener(marker2,"dblclick",function(){clr()});
document.getElementById("add").value="Imposta punto di arrivo";
saddr = marker1.getPoint().toUrlValue();
daddr = marker2.getPoint().toUrlValue();
document.getElementById("distance").value = dist;
button++;
});

function clr(){
//map.clearOverlays();
map.removeOverlay(poly);
map.removeOverlay(marker1);
map.removeOverlay(marker2);
map.removeOverlay(label1);
map.removeOverlay(label2);
button=0;
document.getElementById("add").value="Nuovo Percorso";
dist=0;
}
}

