/**
 * spqrmap.js 
 */
 
 var map;
 var polyS = new Array();
 var currentPoly=null;
 
 function writeCookie(name,value,days){
    if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name){
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name){
    createCookie(name,"",-1);
}
 
 function mapDebug (s){
	// $("#mapdebug").html(s);
}
function getTime (){
  return new Date().getTime();
}

function GPositionControl() {}
GPositionControl.prototype = new GControl(true, true);
function getCoordsCenter(map){
	function dec2sex(dec, lat)	{
		var letter = lat ? (dec > 0 ? "N" : "S") : (dec > 0 ? "E" : "W");
		dec = Math.abs(dec);
		var deg = Math.floor(dec);
		var min = Math.floor((dec - deg) * 60);
		var sec = (dec - deg - min / 60) * 3600;
		return deg + "º " + min + "' " + sec.toFixed(2) + "\" " + letter;
	}	
	var center = map.getCenter();	
	return dec2sex(center.lat(), true) + " " + dec2sex(center.lng());
}
GPositionControl.prototype.initialize = function(map){
	var container = document.createElement("div");
	var extra = document.createElement("div");
	extra.innerHTML = getCoordsCenter(map);
	extra.style.color = map.getCurrentMapType() == G_NORMAL_MAP ? "black" : "white";
	extra.style.fontSize = "8pt";
	container.appendChild(extra);
	map.getContainer().appendChild(container);	
	GEvent.addListener(map, "move", function() { extra.innerHTML = getCoordsCenter(map) });
	GEvent.addListener(map, "maptypechanged", function() { extra.style.color = map.getCurrentMapType() == G_NORMAL_MAP ? "black" : "white" });	
	return container;
}
GPositionControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(70, 7));
}
function clamp(i,a,b){return i<=a?a:i>=b?b:i}
function hookMouseWheelToZoom(mapobj, map){
	function wheelZoom(a) { (a.detail || -a.wheelDelta) < 0 ? map.zoomIn() : map.zoomOut(); }
	GEvent.addDomListener(mapobj, "DOMMouseScroll", wheelZoom); 
	GEvent.addDomListener(mapobj, "mousewheel", wheelZoom); 
}
function polyline2polygon (poly){
 	var points =new Array();
  for (var v=0; v<poly.getVertexCount(); v++) {
    var polyPoint =poly.getVertex(v);
    points.push(polyPoint);
  }
  // GPolygon(points,  strokeColor?,  strokeWeight?,  strokeOpacity?,  fillColor?,  fillOpacity?)
  var polygon = new GPolygon(points,"#000000",2,1,"#000000",0.3);
  return polygon;
}
function Dimensions(left, top, width, height) {
	this.left = left;
	this.top = top;
	this.width = width;
	this.height = height;
}
function getDimensions(control) {
	var tmp = control;
	var left = 0;
	var top = 0;

	if (tmp != null) {
		left += tmp.offsetLeft;
		top += tmp.offsetTop;
		tmp = tmp.offsetParent;
	}

	return new Dimensions(left, top, control.offsetWidth, control.offsetHeight);
}

function sizeMap (){
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth; myHeight = window.innerHeight;
  } else if( document.documentElement && (document.documentElement.clientWidth ||document.documentElement.clientHeight ) ) {
      myWidth = document.documentElement.clientWidth; myHeight =document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
      myWidth = document.body.clientWidth; myHeight = document.body.clientHeight;
  }
  var mm = $("map");
  //mm.style.width = (myWidth-20)+"px";
  mm.style.height = (myHeight-121)+"px";
  var d = getDimensions(mm);
  var ch = $("crosshair");
  ch.style.display="block";
  ch.style.top=(d.top +(d.height - ch.height) / 2) + "px";
  ch.style.left=(d.left + (d.width - ch.width) / 2) + "px";
  return mm;
}

function resizeApp() {
  sizeMap();
}
 
 /**
  *  click su mappa
  */
function mapClick(overlay,point){
    if (overlay) {
    	// click su un overlay
        
    } else {
    	// click su mappa
    }
}

function setupGMap(m, opts) {
  m = sizeMap();
	map = new GMap2(m);
	hash = readCookie("SPQRmapHash");
	var o = { ln: 12.5, lt: 41.9, z: 12, k: 0 };
	parseStatusString(hash, o);
		
  map.setCenter(new GLatLng(o.lt, o.ln), o.z, map.getMapTypes()[o.k]);
	
	//map.setCenter(new GLatLng(41.9,12.5), 11);

	// Adding controls to the maps
	map.addControl(new GMapTypeControl());
	map.addControl(new GLargeMapControl());
	map.addControl(new GPositionControl());
	map.enableDoubleClickZoom();
	map.enableContinuousZoom();

	// Hook the mouse wheel to the zoom function
  //	hookMouseWheelToZoom(m, map);
  // map.enableScrollWheelZoom();	// API version >= 2.78

	GEvent.addListener(map, "moveend", onMoveEndMap);
  GEvent.addListener(map, "click", mapClick);
}

function load() {
	if (GBrowserIsCompatible()) {
		setupGMap();
		onMoveEndMap();
	}
}

var loaded=false;

//  load polydata & kml 
function onMoveEndMap() {
	lb = map.getBounds();
	var lb_sw = lb.getSouthWest();
	var lb_ne = lb.getNorthEast();	
	minx= lb_sw.lng();
	miny= lb_sw.lat();
	maxx= lb_ne.lng();
	maxy= lb_ne.lat();

	hash = getStatusString();
	writeCookie("SPQRmapHash",hash,30);
	
	
  if (loaded) return;
  loaded=true;	
  geoXml = new GGeoXml(allFeedUrl);
        
        // cambiare icon
  map.addOverlay (geoXml);      

}

function r(a) { return a.toFixed(6); }
function getStatusString() {
	var p = map.getCenter();
	var t = map.getCurrentMapType();
	var k = t == G_NORMAL_MAP ? 0 : t == G_SATELLITE_MAP ? 1 : 2;
	var z = map.getZoom();
	var hash = "lt=" + r(p.lat()) + "&ln=" + r(p.lng()) + "&z=" + z + "&k=" + k ;
	return hash;
}

function parseStatusString(location, obj){
	if (location) {
		var ar = location.split("&");
		for (var i = 0; i < ar.length; i++) {
			var a = ar[i].split("=");
			//a[0]=a[0].replace(/^#+/,'');
			obj[a[0]] = parseFloat(a[1]);
		}
	}
}

function unLoadMap (){
	try {
	GUnload();
	} catch (e){}
}



var markers = [];

var btimerId;
btimerId=false;

function clearBTimer(){
	if (btimerId) {
		clearTimeout (btimerId);
		btimerId=false;
	}
}

function itemMap(points, descriptions, baseUrl) {
	var mapEl = document.getElementById("gmap");
	mapEl.setAttribute('class','gmap');
	map = new GMap2(mapEl);
	
	// http://mapki.com/wiki/APIv2#Using_map.getBoundsZoomLevel.28.29
	var bounds = new GLatLngBounds;
	for (i=0;i<points.length;i++) {
   	bounds.extend(points[i]);
	}
  bestZoom = map.getBoundsZoomLevel(bounds);
  center = bounds.getCenter();
  
	map.setCenter(center, bestZoom);
		
	var icon = new GIcon();
	icon.iconSize = new GSize(26, 29);
	icon.iconAnchor = new GPoint(26, 29);
	icon.infoWindowAnchor = new GPoint(0, 0);
	icon.infoShadowAnchor = new GPoint(0, 0);
	icon.image = baseUrl + "images/point.png";
	for (var i = 0; i < points.length; i++) {
  	var marker = new GMarker(points[i], icon);
  	var desc = descriptions[i];
  	marker.desc = desc;
  	marker.infow=0;

  	GEvent.addListener(marker, "mouseover", function() {
  		//map.closeInfoWindow();
  		if (this.infow==0){
    		this.openInfoWindowHtml("<h2>" + this.desc + "</h2><p>Clicca per visualizzare un'immagine satellitare.</p>");
    		this.infow=1;
    		for (j=0;j<markers.length;j++) {if (markers[j]!=this) {markers[j].infow=0;} }
    		clearBTimer();
    		btimerId = setTimeout("map.closeInfoWindow()",2000); 
    	}

  	});
  	GEvent.addListener(marker, "click", function() {
  		//map.closeInfoWindow();  
  		clearBTimer();
    	this.showMapBlowup({zoomLevel:17, mapType:G_SATELLITE_MAP});
  	});
  	
  	map.addOverlay(marker);
  	markers.push(marker);
  	
  } 

	GEvent.addListener(map, "infowindowclose", function() {
	    		for (j=0;j<markers.length;j++) {markers[j].infow=0; }
	});

  var mapTypeControl = new GMapTypeControl();
	var zoomControl = new GSmallZoomControl();
	
	GEvent.addListener(map, "mouseover", function() {
	  	map.addControl(mapTypeControl);
	  	map.addControl(zoomControl);
		});
	GEvent.addListener(map, "mouseout", function() {
	  	map.removeControl(mapTypeControl);
	  	map.removeControl(zoomControl);
		});
	
}

function panTo(pointIndex) {
map.panTo(points[pointIndex]);
//markers[pointIndex].openInfoWindowHtml("<h2>" + markers[pointIndex].desc + "</h2><p>Clicca per visualizzare un'immagine satellitare.</p>");
//markers[pointIndex].infow=1;
for (j=0;j<markers.length;j++) {if (j!=pointIndex) markers[j].infow=0; }
clearBTimer();
markers[pointIndex].showMapBlowup({zoomLevel:17, mapType:G_SATELLITE_MAP});
}

