    var map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(55.68029,12.49695), 17-6, G_HYBRID_MAP);

  
    var points = [];
    var markers = [];
    var polyline;
    var showMilestones = false;
    var c = (180 / Math.PI); // decimal to radian constant
    var dist = 0; // distance til at gemme i db

    // Create our "tiny" marker icon
	var icon = new GIcon();
	icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
	icon.iconSize = new GSize(12, 20);
	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);

	var icon5 = new GIcon();
	icon5.image = "http://labs.google.com/ridefinder/images/mm_20_white.png";
	icon5.iconSize = new GSize(12, 20);
	icon5.shadowSize = new GSize(22, 20);
	icon5.iconAnchor = new GPoint(6, 20);
	icon5.infoWindowAnchor = new GPoint(5, 1);
	
	// DEAKTIVERET 01-11-2008
	// map.enableScrollWheelZoom();

	map.addControl(new GOverviewMapControl(new GSize(140,140))); 
	positionOverview(0,0);
	    
	parseURL();

    GEvent.addListener(map, 'click', function(overlay, point) {
		if (overlay)
			return;
    
        points.push(point);
        redrawRoute();
        hideAddThis();
    });

	function positionOverview(x,y) {
       var omap=document.getElementById("map_overview");
       var place=document.getElementById("map");
       // place.appendChild(omap);

       // omap.firstChild.style.border = "1px solid #F7931D";
       // omap.firstChild.style.margin = "5px";
   }

    // Creates a marker whose info window displays the given number
    function createMarker(point) {
      var marker = new GMarker(point);
//      GEvent.addListener(marker, "click", function() {
//        marker.openInfoWindowHtml(html);
//      });
      return marker;
    }

    function createMarker2(point, pointIndex) {
      var marker = new GMarker(point, {draggable:true});
      map.addOverlay(marker);
      marker.enableDragging();
      markers.push(marker);

	  GEvent.addListener(marker, "dragend", function(point){
	    points[pointIndex] = marker.getPoint();
	    redrawRoute();
	    });
    }

    function createMilestone(point, distance) {
      var marker = null;
      if (distance % 5 == 0) 
		marker = new GMarker(point, icon5);
	  else if (distance < 50)
	    marker = new GMarker(point, icon);
	  if (marker) {
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(getDistanceInfo(distance));
		});
		map.addOverlay(marker);
		markers.push(marker);
      }
    }
    
    function getDistanceInfo(dist){
		var s = "<b>Distance:</b> " + dist + " km.<br />";
		var pace = 0;
		s += "<b>Udvalgte mellemtider:</b><br />";
		s += "<span class='tabular'>";
		for (i = 3; i < 7; i++){
			for (j = 0; j < 4; j++){
			 	pace = i + (j * 0.15);
			 	if ((j == 3) && (i < 6)){
					s += "<span class='rowDelimiter'>";
					s += "" + (getTimeFromPace(dist, pace)) + " (" + pace.toFixed(2) + " min/km.) <br />";
					s += "</span>";
				} else {
					s += "" + (getTimeFromPace(dist, pace)) + " (" + pace.toFixed(2) + " min/km.) <br />";
				}
			}
		}
		s += "</span>";
		return s;
	}
	
	function getTimeFromPace(dist, pace){
		var totalTime = parseInt((parseInt(pace) * 60 + Math.round((pace - parseInt(pace)) * 100) ) * dist);
		var H = ""; 
		var M = ""; 
		var S = "";
		if (totalTime > 3600) {
			H = Math.floor(totalTime / 3600);
			totalTime = totalTime - (H * 3600);
			H = formatInt(H, 2) + ":";
		} 
		M = Math.floor(totalTime / 60);
		totalTime = totalTime - (M * 60);
		M = formatInt(M, 2) + ":";
		S = totalTime;
		S = formatInt(S, 2);
		return H + M + S;
	}
	
	function formatInt(i, n){
	 	var s = "";
	 	for (k = 0; k < n; k++){
			s += "0"
		}
		s += i; 
		s = s.substring(s.length - n);
		return s;
	}

    function createMilestone5(point) {
      var marker = new GMarker(point, icon5);
      map.addOverlay(marker);
      markers.push(marker);
    }

    function calcRoutePiece(startPoint, endPoint) {
        var lat1 = startPoint.y / c;
        var lat2 = endPoint.y / c;
        var lon1 = startPoint.x / c;
        var lon2 = endPoint.x / c;
		return 6378.7*Math.acos(Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon2-lon1));
    }

    function createMilestones(distance, last_distance, last_point, point) {
      if (!showMilestones)
		return;
      var dist = Math.ceil(distance);
      while (dist < distance + last_distance) {
        if (dist > 0) {
		  var fac = (dist - distance) / last_distance;
		  var dx = point.x - last_point.x;
		  var dy = point.y - last_point.y;
		  createMilestone(new GPoint(last_point.x+dx*fac,last_point.y+dy*fac),dist);
		}
		dist++;
      }
    }

    function removeLastPoint() {
		if (points.length == 0)
			return;
		points.pop();
		redrawRoute();
    }

	function toogleMilestones() {
		showMilestones = !showMilestones;
		redrawRoute();
		document.getElementById("toogleBtn").innerHTML = showMilestones ? "Skjul" : "Vis";
	}

    function getURL() {
        var e = encodePoints();
        var center = map.getCenter();
        var x = Math.round(100000 * center.x) / 100000;
        var y = Math.round(100000 * center.y) / 100000;
        var z = 17 - map.getZoom();
        var s = 'x=' + x + '&y=' + y + '&z=' + z + '&route=' + e;
        location.href = "?" + s;
    }

	function getID(){
	  	if (points.length == 0)
	  		return ;
	  		
        var e = encodePoints();
        var center = map.getCenter();
        var x = Math.round(100000 * center.x) / 100000;
        var y = Math.round(100000 * center.y) / 100000;
        var z = 17 - map.getZoom();
        var s = 'x=' + x + '&y=' + y + '&z=' + z + '&route=' + e + '&distance=' + dist;
		GDownloadUrl("saveUrlToDB.php?" + s , function(data, responseCode) {
		  var shorturl = 'www.irun.dk/runmap.php?id=' + data;
		  document.getElementById("shorturl").innerHTML = "<br /><br />Direkte link til ruten:<br /><a href='http://" + shorturl + "'>" + shorturl + "</a>";
//		  document.getElementById("shorturl").innerHTML = "<p>Direkte link til ruten:<br /><a href='http://" + shorturl + "'>" + shorturl + "</a></p>";
		});        
	}
	
	function setStartMap(){
        var center = map.getCenter();
        var x = Math.round(100000 * center.x) / 100000;
        var y = Math.round(100000 * center.y) / 100000;
        var z = 17 - map.getZoom();
        var s = 'x=' + x + '&y=' + y + '&z=' + z;	  
	    GDownloadUrl("saveStartPoint.php?" + s , function(data, responseCode) {
			  document.getElementById("userRoutes").innerHTML = data;	  
		});
	}
    
    function getUserRoutes(){
        if (document.getElementById("userRoutes").innerHTML == ""){
	      	document.getElementById("userRoutesLoading").innerHTML = "<img src='ajax-loader.gif'>";
			GDownloadUrl("getUserRoutes.php", function(data, responseCode) {
			  document.getElementById("userRoutes").innerHTML = data;
			});        	  
	      	setTimeout("clearLoading()",1250);
		} else {
		  document.getElementById("userRoutes").innerHTML = "";
		}
	}
	
	function editRouteData(routeId){
      	document.getElementById("userRoutesLoading").innerHTML = "<img src='ajax-loader.gif'>";
			GDownloadUrl("getUserRouteData.php?id=" + routeId, function(data, responseCode) {
			  var s;
			  s = "<p>bleh..<br/>";
			  s = s + data;
			  s = s + "</p>";
			  document.getElementById("userRoutes").innerHTML = s;
			});        	  	  
      	setTimeout("clearLoading()",1250);
	}
       
    function deleteRoute(routeId){
        if (confirm("Ønsker du virkelig at slette ruten med ID: " + routeId + " for altid?")) { 
            var s;
  	        document.getElementById("userRoutesLoading").innerHTML = "<img src='ajax-loader.gif'>";
	        GDownloadUrl("deleteRoute.php?id=" + routeId, function(data, responseCode) {
	          s = "<p class='infobox'>" + data + "</p>";	        
	        });
			GDownloadUrl("getUserRoutes.php", function(data, responseCode) {
			  document.getElementById("userRoutes").innerHTML = s + data;
			});        	  
  	        setTimeout("clearLoading()",1250);
        }        
	}       
       
    function clearLoading(){
	  document.getElementById("userRoutesLoading").innerHTML = "";
	}
	
    function encodePoints() {
		if (points.length < 2)
			return "";

		var s = "";
		var x0 = 0;
		var y0 = 0;
			
		for (i = 0; i < points.length; i++) {
			x = points[i].x / 1.0E-7;
			xd = x - x0;
			x0 = x;
			f = (Math.abs(xd) << 1) - (xd < 0);
			
			do {
				e = f & 31;
				f >>= 5;
				if (f) {
					e |= 32;
				}
				s += String.fromCharCode(e + 63);
			} 
			while (f != 0);
			
			y = points[i].y / 1.0E-7;
			yd = y - y0;
			y0 = y;
			f = (Math.abs(yd) << 1) - (yd < 0);
			
			do {
				e = f & 31;
				f >>= 5;
				if (f) {
					e |= 32;
				}
				s += String.fromCharCode(e + 63);
			} 
			while (f != 0);
		}
	
		return s;
    }


	function decodeRoute(s) {
 	   if (!s)
	        return [];
	    Ch = s.length;
	    pb = 0;
	    locations = [];
	    Ka = 0;
	    Pa = 0;
	    while (pb < Ch) {
	        oc = 0;
	        Fa = 0;
	        do { ub = s.charCodeAt(pb)-63;pb += 1;Fa |= (ub&31)<<oc;oc+=5;} while(ub>=32);
	        
	        if (Fa & 1) {
				i = ~(Fa>>1);
	        }
	        else { 
				i = Fa>>1;
	        }
	        Ka = Ka+i;
	
	        oc = 0;
	        Fa = 0;
	        do {
	            ub = s.charCodeAt(pb)-63;
	            pb += 1;
	            Fa |= (ub&31)<<oc;
	            oc += 5;
	        }
	        while (ub >= 32);
	        if (Fa & 1) {
				i = ~(Fa>>1);
			}
	        else {
				i = Fa>>1;
			}
	        Pa = Pa+i;
	
	        locations.push(new GPoint(Ka*1.0E-7,Pa*1.0E-7));
	    }
	    return locations
	}

    function redrawRoute() {
	  removeRoute();
	  
	  if (points.length != 0){
		  polyline = new GPolyline(points);
		  map.addOverlay(polyline);
	  }

      var distance = 0;
      var last_point;
      for (var i = 0; i < points.length; i++) {
        if (i == 0) {
          createMarker2(points[i], i);
        } else {
		  var last_dist = calcRoutePiece(last_point,points[i]);
		  if (distance + last_dist > Math.ceil(distance)) {
			createMilestones(distance, last_dist, last_point, points[i]);
		  }
		  distance += last_dist;
		  
		  if (i == points.length-1) 
		    createMarker2(points[i], i);
        }
        last_point = points[i];
      }
      dist = Math.round(1000*distance)/1000;
      document.getElementById("distance").innerHTML = dist;
    }
    
    function removeRoute() {
      if (polyline) {
        map.removeOverlay(polyline);
        polyline = null;
      }
      for (var i = 0; i < markers.length; i++) {
        map.removeOverlay(markers[i]);
      }
      markers = [];
    }
    
    function startOver() {
		points = [];
		redrawRoute();
		document.getElementById("shorturl").innerHTML = "";
    }


	function debug(s) {
		document.getElementById("message").innerHTML += s + "<br>";
	}
	
	function showAddThis() {
		document.getElementById("addthisbutton").style.visibility="visible";
	}
	
	function hideAddThis() {
		document.getElementById("addthisbutton").style.visibility="hidden";
	}

	function parseURL(){
		var qs = new Querystring();
		var i = qs.get("id", "");
		var x;
		var y;
		var z;
		var s;
		if (i != "") {  	
			GDownloadUrl("getUrlFromDB.php?id=" + i, function(data, responseCode) {
  				var xml = GXml.parse(data);
				var tmp = xml.documentElement.getElementsByTagName("route");
				s = tmp[0].firstChild.nodeValue;
				x = tmp[0].getAttribute("x");
				y = tmp[0].getAttribute("y");
				z = tmp[0].getAttribute("z");
				map.setCenter(new GLatLng(y,x), 17-z, G_HYBRID_MAP);
				points = decodeRoute(s);
				redrawRoute();
				showAddThis();
  			});
		} else {
		  // Hent startpunkt, hvis brugeren er logget på bruger vi startpunkt fra db
		  	GDownloadUrl("getStartPoint.php", function(data, responseCode){
			    var xml = GXml.parse(data);
			    var tmp = xml.documentElement.getElementsByTagName("initpoint");
				x = qs.get("x", tmp[0].getAttribute("x"));
				y = qs.get("y", tmp[0].getAttribute("y"));
				z = qs.get("z", tmp[0].getAttribute("z"));
//				GLog.write(x);
//				GLog.write(y);
//				GLog.write(z);
				map.setCenter(new GLatLng(y,x), 17-z, G_HYBRID_MAP);
			
				s = qs.get("route", "");
				points = decodeRoute(s);
				redrawRoute();
				if (s != "")
				{
					showAddThis();
				}
			});
		}
	}
	
	
	/* Client-side access to querystring name=value pairs
	Version 1.2.3
	22 Jun 2005
	Adam Vandenberg
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object();
	this.get=Querystring_get;
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length);

	if (qs.length == 0) return;

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=');
		var name = unescape(pair[0]);

		if (pair.length == 2)
			value = unescape(pair[1]);
		else
			value = name;
		
		this.params[name] = value;
	}
}

function Querystring_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	
	var value=this.params[key];
	if (value==null) value=default_;
	
	return value;
}