var map;
var destStat=false;
 
var GPSCoords="";
var GPSDestCoords="";
var cameraloc=0;
var subjectloc=0;

 

function updateEtool (map){
  if (!isDragging) return;
 
  function dec2sex(dec, lat, isdest ) {
    
    var letter = lat ? (dec > 0 ? "N" : "S") : (dec > 0 ? "E" : "W");
    if ( lat ) {
      r = isdest?"-GPSDestLatitudeRef":"-GPSLatitudeRef";
    } else {
      r = isdest?"-GPSDestLongitudeRef":"-GPSLongitudeRef";
    }
    r=r+("="+letter);
    r=r+" ";
    dec = Math.abs(dec);
    var deg = Math.floor(dec);
    var min = Math.floor((dec - deg) * 60);
    var sec = (dec - deg - min / 60) * 3600;
    if (lat) { 
      r = r + (isdest?"-GPSDestLatitude":"-GPSLatitude");
    } else {
      r = r + (isdest?"-GPSDestLongitude":"-GPSLongitude");
    }
    r=r+("="+deg+","+min+","+sec.toFixed(2));
    return r;
  }	

 
 // exiftool -GPSLatitude=42,1,17.54 -GPSLongitude=12,28,6.08 -GPSLatitudeRef=N -GPSLongitudeRef=E  -GPSMapDatum=WGS84 -GPSDestLatitude=42,1,17.54 -GPSDestLongitude=12,28,6.08 -GPSDestLongitudeRef=E -GPSDestLatitudeRef=N -overwrite_original
  
  var center = map.getCenter();	
  
  if (destStat) {
    r = dec2sex(center.lat(), true,true)+" "+dec2sex(center.lng(), false,true);
    GPSDestCoords = r;
    subjectloc = center;
    
  } else {
    r = dec2sex(center.lat(), true,false)+" "+dec2sex(center.lng(), false,false);
    GPSCoords = r;
    cameraloc = center;
  }
    
  updateExif();
 
 }
 
function updateExif(){
  exif="exiftool -overwrite_original -GPSMapDatum=WGS84 ";
  exif = exif+" "+GPSCoords +" "+GPSDestCoords; 
  exif =exif + " myimage.jpg";
  $('etool').innerHTML = exif;
}
 
function displayStat (){
  if (!destStat) {
    $('dest').innerHTML="CAMERA(click 4 subject)";
  } else {
    $('dest').innerHTML="SUBJECT(click 4 camera)";
  }
}
 
function toggleStat(){
  
  destStat =!destStat;
  displayStat();
  // goto prev location
  if (destStat) {
    if (subjectloc) map.panTo (subjectloc);
  } else {
    if (cameraloc) map.panTo (cameraloc);
  }
}
 
function equalize (){

  GPSDestCoords=GPSCoords;
  subjectloc = cameraloc;
  map.panTo (cameraloc);
  
  updateExif();
 
 }
 
 
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);
	   updateEtool (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-100)+"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 setupGMap(m, opts) {
  m = sizeMap();
  map = new GMap2(m);
  hash = readCookie("zmaphash");
  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, "dragstart", dragStart);
  GEvent.addListener(map, "dragend", dragEnd);

}

var isDragging=false;
function dragStart(){
  isDragging=true;

}
function dragEnd(){
  isDragging=false;

}


function load() {
if (GBrowserIsCompatible()) {
  setupGMap();
  onMoveEndMap();
  //updateEtool(map);
  displayStat();
  
}
}

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();
  hasher = getStatusString();
  writeCookie("zmaphash",hasher,30);
}


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();
  hasher = "lt="+(p.lat().toFixed(6))+"&ln="+(p.lng().toFixed(6))+"&z="+z+"&k="+k;
  return hasher;
}

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