var map = false;
var info;
var markers;
var posicion;
var i = 0;
var timeout = 1;
var lMessage;

var baseIcon;

function initialize_GMap() {
  this.baseIcon = new GIcon();
  this.baseIcon.image = "http://www.google.com/mapfiles/marker.png";
  this.baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  this.baseIcon.iconSize = new GSize(20, 34);
  this.baseIcon.shadowSize = new GSize(37, 34);
  this.baseIcon.iconAnchor = new GPoint(9, 34);
  this.baseIcon.infoWindowAnchor = new GPoint(9, 2);
  this.baseIcon.infoShadowAnchor = new GPoint(18, 25);
}

function handleKey( a )
{
  if( this.ignoreKeyEvent( a ) ) return true;
  var key = a.keyCode;
  switch( key )
  {
    case 48: key += 10; // fall-through (0 = zoom level 10)
    case 49:case 50:case 51:case 52:case 53:
    case 54:case 55:case 56:case 57:case 58:case 59: // zoom with 0-9
      this.setZoom( key - 49 ); break;
    //case 27: escape
    case 77:case 109: this.setMapType( this.getMapTypes()[0] ); break;
    case 83:case 115: this.setMapType( this.getMapTypes()[1] ); break;
    case 84:case 116:
      var mt = this.getMapTypes();
      if( mt[0] == this.getCurrentMapType() )
	this.setMapType( mt[1] );
      else
	this.setMapType( mt[0] );
      break;
    case 38:case 40:case 37:case 39:
      this.panKeys.add( key );
      this.startContinuousPan();
      A(a); return false;
    case 34:
      this.pan(0,-Math.floor(this.viewSize.height*0.75));
      A(a); return false;
    case 33:
      this.pan(0,Math.floor(this.viewSize.height*0.75));
      A(a); return false;
    case 36:
      this.pan(Math.floor(this.viewSize.width*0.75),0);
      A(a); return false;
    case 35:
      this.pan(-Math.floor(this.viewSize.width*0.75),0);
      A(a); return false;
    case 187:case 107:
      this.setZoom(this.zoomLevel-1);
      A(a); return false;
    case 189:case 109:
      this.setZoom(this.zoomLevel+1);
      A(a); return false;
  }
  switch( a.which )
  {
    case 61:case 43:
      this.setZoom(this.zoomLevel-1);
      A(a); return false;
    case 45:case 95:
      this.setZoom(this.zoomLevel+1);
      A(a); return false;
  }
  return true;
}

function mapOne() {

//  alert("we have " + markers.length + " markers " + i);

  if ( i < markers.length )
  {
//    alert("adding marker");

    var max = Math.min(i + 20, markers.length);

    while (i < max) {

      var point = new GPoint(parseFloat(markers[i].getAttribute("lng")),
                             parseFloat(markers[i].getAttribute("lat")));

      var html = markers[i].getAttribute("txt");
      var icon = markers[i].getAttribute("icon");

		marker = createMarker(point, html, icon);
      map.addOverlay(marker);

//      alert("adding marker");

      i++;
    }
    if (lMessage)
    {
//	lMessage.innerHTML="<p>Loading " + i + " of " + markers.length + "</p>";
    }
    window.setTimeout(mapOne,timeout);
  }
  if ( i >= markers.length )
  {
//    document.getElementById('loading').style.visibility='hidden';
  }
}

var _zoomLevels = new Array
(
0.006909370422363281,
0.013818740844726562,
0.027637481689453125,
0.05527496337890625,
0.1105499267578125,
0.221099853515625,
0.44219970703125,
0.8843994140625,
1.768798828125,
3.53759765625,
7.0751953125,
14.150390625,
28.30078125,
56.6015625,
113.203125,
226.40625,
452.8125,
905.625
);

function calculateZoomLevel(spanLng, spanLat)
{
    var level = _zoomLevels.length-1;
    var found = false;
    var index = 0;

    // Get largest value
    var compareTo = spanLng;
    if (spanLat>spanLng) compareTo = spanLat;

    while (!found && index<_zoomLevels.length)
    {
        if (_zoomLevels[index]>compareTo)
        {
            level = index;
            found = true;
        }
        index++;
    }

    return level

}

function resizeMap()
{
	var myHeight = ( document.body.clientHeight > 0 ) ? document.body.clientHeight : window.innerHeight;
	document.getElementById("map").style.height = '' + (myHeight - 40 ) + "px";
}

function loadCoords(url)
{
    if (url == "")
	return;

    i = 0;
    var request = GXmlHttp.create();
    request.open("GET", 'gmapxml.php?url=' + escape(url), true);

//alert("getting gmapxml.php?url=" + escape(url));

request.onreadystatechange = function() {
  if (request.readyState == 4) {
    var xmlDoc = request.responseXML;

    var centers = xmlDoc.documentElement.getElementsByTagName("center");
//    alert("centers " + centers[0].getAttribute("lng") + ", " + centers[0].getAttribute("lat"));

    var spans = xmlDoc.documentElement.getElementsByTagName("span");

    var zoom = calculateZoomLevel(parseFloat(spans[0].getAttribute("lng")), parseFloat(spans[0].getAttribute("lat")));

    //document.getElementById('map').style.width = '100%';
    //document.getElementById('map').style.height = 500;
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl(new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(100,10))));
    map.setCenter(new GLatLng(parseFloat(this.markers[0].getAttribute("lat")),
                              parseFloat(this.markers[0].getAttribute("lng")), zoom));
    map.enableScrollWheelZoom();
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    map.handleKey = handleKey;
    map.registerKeyHandlers( window );

// zoom is 0-17

//  lMessage = document.getElementById('lMessage');
//    alert("zoom level 100");

//    alert("finding markers");

    markers = xmlDoc.documentElement.getElementsByTagName("marker");

    window.setTimeout(mapOne, timeout)
    }
  }
request.send(null);
}

function createMarker(point, html, icon)
{
	var marker;

	if (icon == "generic")
	{
	  marker = new GMarker(point);
	}
	else
	{
	  baseIcon.image = icon;
	  marker = new GMarker(point, baseIcon);
	}

  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });

  return marker;
}

function showCenter()
{
  var center = map.getCenter();
  var latLngStr = "(" + center.y + ', ' + center.x + ")";
  document.getElementById("centerCoords").innerHTML = latLngStr;
}

function showDirection()
{
	direction = document.getElementById("address").value;
    var geocoder = new GClientGeocoder();

	geocoder.getLatLng(
		direction,
		function(point) {
			if (!point) {
				alert(direction + " not found");
			} else {
				var latLngStr = point.y + ' ' + point.x;
				document.getElementById("c").value = latLngStr;
				convertText(latLngStr);
			}
		}
	);
}

function showGMap(lat, lon)
{
    if (!map)
    {
      map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();
		map.enableDoubleClickZoom();
		map.enableContinuousZoom();
	 	map.setCenter(new GLatLng(lat, lon), 14);

         GEvent.addListener(map, "click", function(overlay, point) {
				if (point) {
					var latLngStr = "(" + point.y + ', ' + point.x + ")";
					document.getElementById("centerCoords").innerHTML = latLngStr;
				}
				centerPos(point.y, point.x);
			} );

			GEvent.addListener(map, "mousemove", function(latlng) {
				document.getElementById("actualCoords").innerHTML = " " + latlng;
			} );


    } else {
	 	if ( !posicion ) {
		 	map.setCenter(new GLatLng(lat, lon), 13);



		} else {
	      map.setCenter(new GLatLng(parseFloat(this.posicion.lat()),
		                             parseFloat(this.posicion.lng()), 14));

         	map.panTo(new GLatLng(lat, lon));
			map.clearOverlays();
		}
	 }

    var point = new GPoint(lon, lat);
    var marker = new GMarker(point, baseIcon);
    map.addOverlay(marker);
//    showCenter();
}

function mapURL(mag)
{
	var lat = coords.getLat().toDec();
	var lon = coords.getLong().toDec();

	if (lat > 0) {

		if (mag == null) {
		  mag = ".070";
		}

		showGMap(lat, lon);
		posicion = new GLatLng(lat, lon);

		var latLngStr = "(" + lat + ', ' + lon + ")";
		document.getElementById("centerCoords").innerHTML = latLngStr;
		
		getElevation(lat, lon);
	}
}

function getAjax() {
	var ret = null;
	try {
		ret = new XMLHttpRequest();
	} catch (e) {
		try {
			ret = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			ret = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return ret;
}

function getElevation(latitude,longitude)
{
	var xhr = getAjax();
	if ( xhr == null ) return;
	xhr.onreadystatechange = function() {
		if(xhr.readyState==4) {
			var json = xhr.responseText;
			document.getElementById("elevationCoords").innerHTML = json + " meters";
		}
	}
	
	xhr.open("GET","google_elevation.php?latitude="+latitude+"&longitude="+longitude, true);
	xhr.send(null);
}
