/**
 * map2.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.height = (myHeight-220)+"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();
}
 
function isInside (point,poly) {
  var j=0;
  var oddNodes = false;
  var x = point.lng();
  var y = point.lat();
  var cnt = poly.getVertexCount();
  for (var i=0; i < cnt; i++) {
    j++;
    if (j == cnt) {j = 0;}    
    ivertex = poly.getVertex(i);
    jvertex = poly.getVertex(j);    
    if (((ivertex.lat() < y) && (jvertex.lat() >= y))
    || ((jvertex.lat() < y) && (ivertex.lat() >= y))) {
      if ( ivertex.lng() + (y - ivertex.lat())
      /  (jvertex.lat()-ivertex.lat())
      *  (jvertex.lng() - ivertex.lng())<x ) {
        oddNodes = !oddNodes
      }
    }
  }
  return oddNodes;
}
GPolyline.prototype.Contains = function(point) {
  return isInside (point,this);
}
GPolygon.prototype.Contains = function (point) {
  return isInside (point,this);
}
function highlightPoly (point,poly){
	if (poly.Contains(point)) {
		if (!poly.onMap) {
		  map.addOverlay (poly);
		  poly.onMap=true;
		}
	} else {
	  if (poly.onMap) {
		  map.removeOverlay(poly);
		  poly.onMap = false;
		}
	}
}
// mouse move = only point
GPolyline.prototype.displayOrHide = function(point) {
  return highlightPoly (point,this);
}
GPolygon.prototype.displayOrHide = function (point) {
  return highlightPoly (point,this);
}

function displayPoly (poly) {
		if (!poly.onMap) {
		  map.addOverlay (poly);		  
		  $('placeinfo').innerHTML=poly.descrizione;
		  poly.onMap=true;
		}
		return poly.onMap;
}
GPolyline.prototype.displayOnMap = function() {
  return displayPoly(this);
}
GPolygon.prototype.displayOnMap = function(){
  return displayPoly(this);
}
function removePoly (poly){
	  if (poly.onMap) {
		  map.removeOverlay(poly);
		  poly.onMap = false;
		}
		return poly.onMap;
}

GPolyline.prototype.removeFromMap = function() {
	return removePoly (this);
}
GPolygon.prototype.removeFromMap = function(){
	return removePoly (this);
}
function unBindEvent (poly){
	if (poly.bindMouseMoveHandle) {
		GEvent.removeListener (poly.bindMouseMoveHandle);
	}
}
GPolyline.prototype.unBind = function(){
	return unBindEvent(this);
}
GPolygon.prototype.unBind = function(){
	return unBindEvent(this);
}

function setDistance(point,poly){
  var dx = point.lng()-poly.qcx;
  var dy = point.lat() -poly.qcy;
	//this.distanceFrom=Math.sqrt (Math.pow(x-this.qcx,2) + Math.pow(y-this.qcy,2));
	//this.distanceFrom=(Math.pow(x-this.qcx,2) + Math.pow(y-this.qcy,2));
	// .. tanto serve solo come parametro per ordinare le distanze, non serve il valore assoluto
	poly.distanceFrom=dx*dx+dy*dy;
}

GPolyline.prototype.setDistanceFrom = function(point){
 setDistance (point,this);
}
GPolygon.prototype.setDistanceFrom = function(point){
  setDistance (point,this);
}

function mapClick(overlay,point){
    if (overlay) {
        
    } else {
    	// se in poligono vado su pagina tag
    	if (currentPoly) {
    	  var url = baseUrl+"tag/"+currentPoly.tag;
    	  window.location=url;
    	}
    }
}

function setupGMap(m, opts) {
  m = sizeMap();
	map = new GMap2(m);
	hash = readCookie("mapHash");
	var o = { ln: 12.5, lt: 41.9, z: 11, 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, "mousemove", evidencePoly);
  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("mapHash",hash,30);
	
	
	// TODO: gestione + intelligente
  if (loaded) return;
  loaded=true;	
  geoXml = new GGeoXml(allFeedUrl);
   
   // cambiare icon
  map.addOverlay (geoXml);      
  
	var url ="map/get?minx="+minx+"&maxx="+maxx+"&miny="+miny+"&maxy="+maxy;
	new Ajax.Request(url, {
	method:"get",
  onSuccess: function(transport) {      
  		//map.clearOverlays();
  	  polyS = new Array();
  	  
      json = eval('(' + transport.responseText + ')');
      //alert (json.quartieri);
      json.quartieri.each(function(qua) {
        var polyl= new GPolyline.fromEncoded({
				  color: "#0000ff",
				  weight: 4,
				  opacity: 0.8,
				  points: qua.pointString,
				  levels: qua.levelString,
				  zoomFactor: 2,
				  numLevels: 18
			});
			var poly = polyline2polygon(polyl);
			
			poly.onMap = false;
			poly.qcx = qua.qcx;
			poly.qcy = qua.qcy;
			poly.descrizione = qua.descrizione;
			poly.tag = qua.tag;
			if (qua.oncenter){
			  poly.onMap = true;
				map.addOverlay(poly);
				dovesono = qua.descrizione;
			}
			polyS.push (poly);
      });
  }
  });
}
function evidencePoly(point){
	var elapsed = getTime();
	
	for (var i=0;i<polyS.length;i++){
		polyS[i].setDistanceFrom (point);	
	}
	// sort distances
	polyS.sort (function (a,b){ return a.distanceFrom - b.distanceFrom});
	var t1 = getTime()-elapsed;
	var t2="n/a";
	var drawed=false;
	
	// hide/show
	var check=true;
	for (var i=0;i<polyS.length;i++){
	  var cpoly = polyS[i];
		if (check){
		  if (cpoly.Contains(point)){
		  	t2 = getTime()-elapsed;		  
  		  cpoly.displayOnMap();
		  	check = false;
		  	drawed=true;
		  	currentPoly=cpoly;
		  } else {
		  	cpoly.removeFromMap();
		  }
		} else {
      cpoly.removeFromMap();
		}
	}
	if (!drawed) {$('placeinfo').innerHTML="";currentPoly=null;}
  var t99 = getTime()-elapsed;
	
	mapDebug ("t1 ["+t1+"] t2 ["+ t2+"] t99 ["+t99+"]");

}

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){}
}





 

