// JavaScript Document
//<! [CDATA[

// global:
var map;
var icon;
var tooltip;
var progressBar;
var markerMgr;
var mapcenter; 
var maploaded = false;

// for timelog
var loadBegin;
var fetchBegin;
var fetchData;

// my locations & links
var locations = new Array();
var links = new Array();

// use Debug
var _useDebug = false;
var _useGLog = false;
var c_expiredays = 1;

GMarker.prototype.setOwner = function(location) {
  this.nodelocation = location;
}

GMarker.prototype.getOwner = function() {
  return this.nodelocation;
}

function setCenter(lat, lng)
{
  pt = new GLatLng(lat, lng);
  map.setCenter(pt);
}

function loadMap(lat,lng,res) 
{	
	if( !checkBrowser() ) 
		return;


  var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");
  copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));

  var tilesMapnik     = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'});
  var tilesOsmarender = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tah.openstreetmap.org/Tiles/tile/{Z}/{X}/{Y}.png'});

  var mapMapnik     = new GMapType([tilesMapnik],     G_NORMAL_MAP.getProjection(), "Mapnik", {urlArg: 'x'});
  var mapOsmarender = new GMapType([tilesOsmarender], G_NORMAL_MAP.getProjection(), "OSM", {urlArg: 'y'});
	
	map = new GMap2(document.getElementById("map"),{mapTypes:[G_NORMAL_MAP, mapOsmarender, G_HYBRID_MAP, G_SATELLITE_MAP, G_PHYSICAL_MAP, mapMapnik]});

	// die Controlleinheiten
	controlpos1 = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,20));
	map.addControl(new GLargeMapControl(), controlpos1);
	controlpos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(60,10));
	map.addControl(new GMapTypeControl(), controlpos);
	controlpos3 = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10, 10));
	map.addControl(new GOverviewMapControl());

  makeIcon();
	
	mapcenter = new GLatLng(lat,lng);
	map.setCenter(mapcenter, res);

  var progressBarOptions = {width: 150, loadstring: 'loading ...'};
  progressBar = new ProgressbarControl(map, progressBarOptions);
  
  markerMgr = new MarkerManager(map, {borderPadding: 30});

  new GKeyboardHandler(map);
  map.enableGoogleBar();

	map.enableDoubleClickZoom();
  map.enableContinuousZoom();
	map.enableScrollWheelZoom();
		
  maploaded = true;
	
  log("Neues GMap2 Objekt wurde erzeugt.");



  // hover tooltip
  tooltip = document.createElement("div");
  document.getElementById("map").appendChild(tooltip);
  tooltip.style.visibility = "hidden";

	geocoder = new GClientGeocoder();
	log("geocoding wurde Aktiviert");

	log("Die Daten werden nun geladen...");
	fetchBegin = new Date();
	
	// auslesen der location's
  GDownloadUrl("/export/googlemap", onData);
	
	
	GEvent.addListener(map, "dblclick", onMapDblClick);
	GEvent.addListener(map, "click", onMapClick);
  //GEvent.addListener(map, "mousemove", onMouseMove);  

	//GEvent.addListener(map, "moveend", savePostition);
	//GEvent.addListener(map, "zoomend", saveResolution);

  if (map.getZoom() > 15) {
     map.setMapType(G_NORMAL_MAP);
  }
}

function onMapDblClick(marker,point) {
	map.setCenter(point);
	map.zoonIn();
}

function saveResolution(oldLevel, newLevel) {
  if(oldLevel != newLevel) {
    log("saving Resoltion");
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+c_expiredays);
    var res=map.getZoom();
    document.cookie = "res=" + escape(res) +  ";expires="+exdate.toGMTString();
    log("cookiename: res=" + escape(newLevel) + " --res=" + res + " oldlevel=" + oldLevel +", expires: " + exdate.toGMTString());
  }
}

function savePostition () {
	log("starting create cookies");
	var center = map.getCenter();
	var latlng = center.y + "-" + center.x;
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+c_expiredays);
        document.cookie = "gps=" +escape(latlng)+ ";expires="+exdate.toGMTString();
	log("cookiesname: gps="+ escape(latlng) + ", expires: " + exdate.toGMTString());
	
//	setCookie('gps',latlng,1);
}


function makeIcon() 
{
	icon = new GIcon();
	icon.image = "/images/cam_icon_red.png";
  //	icon.shadow = "/path/to/shadow.png";
	icon.iconSize = new GSize(10,10);
  //	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(5,5);
	icon.infoWindowAnchor = new GPoint(5,1);
}


function onMapClick(mmarker,point) {
	if (mmarker) {
   	 //	map.removeOverlay(mmarker);
  } 
	else 
  {
    map.panTo(point);
    
    var marker = new GMarker(point,icon);
    map.addOverlay(marker);
        
    var link = '/location/new/?lat=' + point.y + '&lng=' + point.x;

    html = '<b>Kamerastandort eintragen:</b><br />';
    if (map.getZoom() > 16) 
    {
      html += '<p>Versuchen sie den Kamerastandort genau zu pinnen!</p>'
      html += '<p><b>Link:</b><a href="'+link +'">pin Location</a></p>';
    }
    else
    {
      html += '<p>Bitte genau pinnen!<br />Sie <b>m&uuml;ssen</b> den kompletten ' +
        'Zoombereich ausn&uuml;tzen!<p>';
      html += '<form action="#" onsubmit="zoomIn(); return false">' + 
        '<input type="submit" value="Zoom In"></form>';
    }
    marker.openInfoWindowHtml(html);
    GEvent.addListener(marker,"infowindowclose",function () {
      map.removeOverlay(marker);
    });
	}
}

function onMarkerOver() 
{
  showTooltip(this);
}

function onMarkerOut() 
{
  tooltip.style.visibility = "hidden";
}

function showTooltip(marker) {
  tooltip.innerHTML = '<div id="tooltip">' + marker.tooltip + '</div>';
  var point  = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
  var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
  var anchor = marker.getIcon().iconAnchor;
  var width  = marker.getIcon().iconSize.width;
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width, -offset.y + point.y + anchor.y));
  pos.apply(tooltip);
  tooltip.style.visibility = "visible";
}


function zoomIn()
{
  var point = map.getCenter();
  map.setCenter(point, 17, G_NORMAL_MAP);
}

function createLocations() 
{
  // the following try...catch looks if the google maps scripts are already loaded...
  try {
    var xmlData = GXml.parse( fetchData );
  } catch (e)
  {
    setTimeout( createLocations, 100 );
    return;
  }

	var element = xmlData.getElementsByTagName("node");
	log("Die Node Objekte werden erzeugt...");
	var start = new Date();

  progressBar.start(element.length);

	for (var i = 0; i< element.length; i++) 
  {
    log(element[i].getAttribute("name"));
		var id = element[i].getAttribute("id");
		var name = element[i].getAttribute("name");
		var lat  = parseFloat(element[i].getAttribute("lat"));
		var lon  = parseFloat(element[i].getAttribute("lon"));
		var path = element[i].getAttribute("path");
		var width = parseInt(element[i].getAttribute("width"));
		var height = parseInt(element[i].getAttribute("height"));
		locations.push(new Location(id,name, lat, lon, path));
	}
  delete( fetchData );

	var end = new Date();
	log(locations.length + " Nodes wurden erzeugt in " + (end-start) + "ms.");
	var loadEnd = new Date();
	log("GoogleMap wurde vollstaendig geladen in " + (loadEnd-loadBegin) + "ms.");
  markerMgr.refresh();
  progressBar.remove();
}

function Location(id, name, lat, lon, path) 
{
	this.id = id;
	this.name = name;
	this.lat = lat;
	this.lon = lon;
  this.point = new GLatLng(lat, lon);
  if( path ) {
  	this.image = new Image();
    this.image.src = path;
  }

	this.marker = new GMarker( this.point, icon );
  this.marker.tooltip = "Kamerastandort: " + this.name;

	this.marker.setOwner(this);

	GEvent.addListener(this.marker, "click", onMarkerClick);
  GEvent.addListener(this.marker, "mouseout", onMarkerOut);
  GEvent.addListener(this.marker, "mouseover", onMarkerOver);

	//map.addOverlay( this.marker );
  markerMgr.addMarker(this.marker, 0);
  progressBar.updateLoader(1); 
}

function onMarkerClick() 
{
	var location = this.getOwner();
	var html ='';
	var link_location = '/location/show/' + location.id;
	var link_picture_upload = '/picture/new/' + location.id;

  html += '<div class="marker">';  
  html += '<p>Location: <a href="' + link_location + '">' + location.name + '</a></p>';
 	html += '<p>Picture: <a href="' + link_picture_upload + '">upload</a></p>';

	if( location.image )
  {
		html += '<a href="' +link_location + '" ><img src="' + location.image.src + '" width="' 
      + location.image.width + '" height="' + location.image.height + '" alt="Bild: ' +location.name + '" /></a>';
  }
  html += '</div>';

	log(html);
	location.marker.openInfoWindowHtml(html);
}

function convertCoords(x) 
{
  var deg = Math.floor(x);
  var min = (x - deg) * 60;
  var sec = (min - Math.floor(min)) * 60;
  return deg + "° " + Math.floor(min) + "' " + sec.toFixed(0) + "\"";
}

function log(msg) {
	if (_useDebug) {
		if (_useGLog) {
			GLog.write(msg);
		} else {
			var date = new Date();
			var tmp = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
			document.getElementById("log").innerHTML += tmp + ": " + msg + "<br>";
		}
	}
}

function checkBrowser() {
	if (GBrowserIsCompatible()) {
		return true;
	} else {
		var html = '<center><h3 style="color:red">';
		html += 'Dein Browser ist leider nicht kompatibel mit der Google Maps API!</h3>';
		html += 'Wir empfehlen: '
		html += '<a href="http://www.mozilla.com/firefox/">http://www.mozilla.com/firefox/</a></center>';
		document.getElementById("map").innerHTML = html;
		return false;
	}
}


function onData(data, responseCode) {
	if (responseCode < 200 || responseCode > 299) 
  {
		// return alert("Fehler: Konnte die Daten nicht laden!\n(Server Antwort-Code: " + responseCode + ")");
    return;
	}
	fetchData = data;
	var fetchEnd = new Date();
	log("Die Daten wurden in " + (fetchEnd-fetchBegin) + "ms erfolgreich geladen.");
	createLocations();
}

function showAddress(address) 
{
  if (geocoder) 
  {
    geocoder.setBaseCountryCode('at')
    geocoder.getLatLng(address, function(point) 
    {
      if (!point) {
        alert(address + " not found");
      } else {
      map.setCenter(point, 16);

      var marker = new GMarker(point,{draggable: true});

      GEvent.addListener(marker, "dragstart", function() {
        map.closeInfoWindow();
        });
      GEvent.addListener(marker, "dragend", function() {
        marker.openInfoWindowHtml(makeNewNodeText(point));
        });
      map.addOverlay(marker);
      marker.openInfoWindowHtml(makeNewNodeText(point));
      }
    });
  }
}

function makeNewNodeText(point) 
{
  var pixel_x_str = "";
  pixel_x_str += point.x;
  var pixel_y_str = "";
  pixel_y_str += point.y;

  var link = '/location/new/?lat=' + point.y + '&lng=' + point.x + '&res'+ map.getZoom();

  var html = '';
  html += '<b>Kamerastandort eintragen<br /></b>';
  html += '<table><tr><td><b>Link:</b></td><td><a href="'+link +'">pin Location</a></td></tr></table>';
  // html += '<tr><td><b>lon:</b></td><td>' + convertCoords(point.x) +
  //'</td></tr><tr><td><b>lat:</b></td><td>' + convertCoords(point.y) + '</td></tr></table>';
  html += 'Versuchen die den Standort genau zu pinnen <br />Nutzen sie den Zoombereich komplett aus!';
  //html += '</table>';
  return html;                                  
}


//]]>

