var ANIMATION_DELAY = 50;
var ANIMATION_START_DELAY = 500;
var ANIMATION_LINE_SEGMENTS = 10;

//var START_ROUTE_ICON = "/App_Themes/AltForDamerne/Images/green-dot.png";

//var START_POINT_ICON = "/App_Themes/AltForDamerne/Images/marker_green_f.png";
//var INTERMEDIATE_POINT_ICON = "/App_Themes/AltForDamerne/Images/sport.png";
//var END_POINT_ICON = "/App_Themes/AltForDamerne/Images/marker_red_f.png";
//var MARKER_ICON = null;// "/App_Themes/AltForDamerne/Images/green-dot.png";
//var MARKER_ICON_HOVER = "male_hilight.gif";
var START_POINT_ICON = ICONS_LINK + "trip_start.png";
var RED_POINT_ICON = ICONS_LINK + "trip_end.png";
var INTERMEDIATE_POINT_ICON = ICONS_LINK + "white_point.png";
var END_POINT_ICON = ICONS_LINK + "trip_end.png";
var MARKER_ICON = null;// "/App_Themes/AltForDamerne/Images/green-dot.png";
var MARKER_ICON_HOVER = ICONS_LINK + "male_hilight.gif";
var snapOn=0;
var markerCount = 0;
var snapToRoad=1;
var map;
var pLineArray = [];
var polyline;
var latlngs = [];
var latlngsSnapStatus = [];
var isEditMode_;
var firstMarker = null;
var routes;
var markers = [];
var markersHistory = [];
var distanceOverlays = [];
var routeId;
var refresh=false;
var routeDistance;
var clusterer;
var geocoder;
var hintStep = 1;
var lastClickedMarker = null;
var centerLat = 55.66629146700371;
var centerLng = 12.54714049454817;
var activeAnimationID = 0;
var defaultMapType = G_HYBRID_MAP;
var customOverlayShiftX = 15;
var customOverlayShiftY = 25;
var completePathIndex;
var dirn1;
var dirn2;
var dirn3;
var currentIndex;
var statusIndex;
var color="#0000FF";
function initMap(isIsEditMode) {
   isEditMode_ = isIsEditMode;

   // Check if browser is capable to run google maps
   if (GBrowserIsCompatible()) {
      // Create googls maps instance


      map = new GMap2(document.getElementById("map"));

//new trip code starts here
	    //var map = new GMap2(document.getElementById("map"));
        map.setCenter(new GLatLng(G_LAT_LNG_X, G_LAT_LNG_Y), G_MAP_CENTER_N	);
		//map.addControl(new GMapTypeControl());
		//map.addControl(new GSmallMapControl());
		//map.addControl(new CustomZoom());  
		map.addControl(new GSmallMapControl());  
		map.addControl(new GScaleControl()); 
		map.enableContinuousZoom();
		map.enableDoubleClickZoom();
		dirn1 = new GDirections();
		dirn2 = new GDirections();
		dirn3 = new GDirections();

		//map.addControl(new HtmlControl('<p>Hello World!</p>'), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(100, 100)));	
      
    

//new trip code ends here

      map.getDragObject().setDraggableCursor("default");
      //map.addControl(new GLargeMapControl());
      //map.addControl(new GMapTypeControl());
      //set map type controls
      //setMapTypeControls();

      //Initialize Location vars
      if (isEditMode_) {
          initializeLocations();
      }
      
      // Initialize map center
     // var center = new GLatLng(centerLat, centerLng);
      //map.setCenter(center, 13);
      
//      GEvent.addListener(map, "zoomend", function(oldLevel, newLevel){
//			if (newLevel < 12)
//			{
//				clusterer.removeMarkers();
//			}
//      });

      GEvent.addListener(map, "movestart", function(overlay, point) {
          if (hintStep == 1) {
              GoToHintStepTwo();
          }
      });
      
//      geocoder = new GClientGeocoder();
//	  clusterer = new ClusterMarker(map, {clusterMarkerClick:ClusterClick});

      if (isEditMode_) {
		map.addControl(new RouteLengthControl());
		
         // Handle click on map
		GEvent.addListener(map, "click", function(overlay, point) {
		    if (overlay) {
		    
		        return;
		    }

		    if (hintStep == 1) {
		        GoToHintStepTwo();
		    }
		     
		       
//alert('hi mmarker clicked1');
		    // Add a new marker
		    if(snapOn==1)
		    {
		    var way;
		        dirn1.clear()
		        if(!firstMarker)
		        {
		         way = ([point, point]);
		       
		        }
		        else
		        {   
		           way=([latlngs[latlngs.length-1],point]);
		        }
		        dirn1.loadFromWaypoints(way,{getPolyline:true});
		        
		        // == when the load event completes, plot the point on the street ==
		    }
		    else
		    {
			     addNextMarker(point, markerCount);
		    }
//alert('hi mmarker clicked2');
		    // TODO: Insert custom code here

		    //Start Location script
//		    if (markerCount == 1) {
//		        lastpoint = point;
//		        // Set the geocoder viewport to reduce the number of results later on (optional)
//		        geocoder.setViewport(map.getBounds());

//		        gdir.clear();

//		        var way = ([point, point]);
//		        gdir.loadFromWaypoints(way, { getSteps: true, locale: "en_US" });
//		    }
		    //End Location Script
		});
		
		        GEvent.addListener(dirn1,"error", function() {
                   //alert('eeror');
                   alert(dirn1.getStatus());
                   }
               )
         
               GEvent.addListener(dirn1,"load", function() {
                  // snap to last vertex in the polyline
                 var n = dirn1.getPolyline().getVertexCount();
                 var p=dirn1.getPolyline().getVertex(n-1);
                 addNextMarker(p, markerCount);
                 
               });
           
         GEvent.addListener(dirn2,"load", function() {
         pLineArray[currentIndex]=dirn2.getPolyline();
         if(refresh==true)
         {
         refreshPolyline(latlngs,latlngsSnapStatus);
         refresh=false;
         }
      
      });
        
       GEvent.addListener(dirn3,"load", function() {
        // snap to first vertex in the polyline
      //  var p=dirn3.getPolyline().getVertex(0);
        pLineArray[currentIndex+1]=dirn3.getPolyline();
        // add the new polyline
        refreshPolyline(latlngs,latlngsSnapStatus);
      });
               
		
      }
     // else
     // {
//		 GEvent.addListener(map, "click", function(overlay, point){
//			if (hintStep == 1)
//			{
//				GoToHintStepTwo();
//			}
//		 });
	//	 loadRouteXml();
		 //GEvent.addListener(map, "moveend", loadRouteXml);
     // }
      
      setTimeout(function(){
			var a0=document.getElementById("amtc_option_0");
			if (a0)
			{
				a0.style.background="#000";
				a0.style.color="#fff";
				a0.style.border="#000";
			}
			var a1=document.getElementById("amtc_option_1");
			if (a1)
			{
				a1.style.background="#000";
				a1.style.color="#fff";
				a1.style.border="#000";
			}
			var a2=document.getElementById("amtc_option_2"); 
			if (a2)
			{
				a2.style.background="#000";
				a2.style.color="#fff"; 
				a2.style.border="#000";
			}
	   }, 1000);
   }

}

///code2 from newtrip starts here
	function CustomZoom() {
	}
	CustomZoom.prototype = new GControl();
	CustomZoom.prototype.initialize = function(map) {
	  var container = document.createElement("div");

	  var zoomInDiv = document.createElement("div");
	  this.setButtonStyle_(zoomInDiv);
	  container.appendChild(zoomInDiv);
	  zoomInDiv.innerHTML = '<img src="' + IMAGES_LINK + 'zoom_in.png" width=23 height=23 onclick="map.zoomIn()">';
	  GEvent.addDomListener(zoomInDiv, "click", function() {
	    map.zoomIn();
	  });

	  var zoomOutDiv = document.createElement("div");
	  this.setButtonStyle_(zoomOutDiv);
	  container.appendChild(zoomOutDiv);
	  zoomOutDiv.innerHTML = '<img src="' + IMAGES_LINK + 'zoom_out.png" width=23 height=23 onclick="map.zoomOut()">'; 
	  GEvent.addDomListener(zoomOutDiv, "click", function() {
	    map.zoomOut();
	  });

	  map.getContainer().appendChild(container);
	  return container;
	}
	// By default, the control will appear in the top left corner of the
	// map with 7 pixels of padding.
	CustomZoom.prototype.getDefaultPosition = function() {
	  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10, 10));
	}
	CustomZoom.prototype.setButtonStyle_ = function(button) {
	  //button.style.textDecoration = "underline";
	  //button.style.color = "#0000cc";
	  //button.style.backgroundColor = "white";
	  //button.style.font = "small Arial";
	  //button.style.border = "1px solid black";
	  //button.style.padding = "2px";
	  //button.style.marginBottom = "3px";
	  //button.style.textAlign = "center";
	  //button.style.width = "6em";
	  button.style.cursor = "pointer";
	}
//code 2 from new trip ends here

function setMapTypeControls() {
    //Set Map in default mode
    map.setMapType(defaultMapType);

    //Set Custom GMapTypeControl buttons
    var html = '<div class="but" id="btnTypeNormal"><span class=left href="#">&nbsp;</span><span>KORT</span><span class=right href="#">&nbsp;</span></div><div class="but" id="btnTypeSatellite"><span class=left href="#">&nbsp;</span><span>SATELLIT</span><span class=right href="#">&nbsp;</span></div><div class="but" id="btnTypeHybrid"><span class=left href="#">&nbsp;</span><span>HYBRID</span><span class=right href="#">&nbsp;</span></div>';
    //'
    map.addControl(new HtmlControl(html), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 3)));

    GEvent.addDomListener(document.getElementById('btnTypeNormal'), 'click', function() {
        map.setMapType(G_NORMAL_MAP)
        var buttonNormal = document.getElementById('btnTypeNormal');
        var buttonSatellite = document.getElementById('btnTypeSatellite');
        var buttonHybrid = document.getElementById('btnTypeHybrid');
        buttonNormal.className = "but-act";
        buttonSatellite.className = "but";
        buttonHybrid.className = "but";
    });

    GEvent.addDomListener(document.getElementById('btnTypeSatellite'), 'click', function() {
        map.setMapType(G_SATELLITE_MAP)
        var buttonNormal = document.getElementById('btnTypeNormal');
        var buttonSatellite = document.getElementById('btnTypeSatellite');
        var buttonHybrid = document.getElementById('btnTypeHybrid');
        buttonNormal.className = "but";
        buttonSatellite.className = "but-act";
        buttonHybrid.className = "but";
    });

    GEvent.addDomListener(document.getElementById('btnTypeHybrid'), 'click', function() {
        map.setMapType(G_HYBRID_MAP)
        var buttonNormal = document.getElementById('btnTypeNormal');
        var buttonSatellite = document.getElementById('btnTypeSatellite');
        var buttonHybrid = document.getElementById('btnTypeHybrid');
        buttonNormal.className = "but";
        buttonSatellite.className = "but";
        buttonHybrid.className = "but-act";
    });
}

//function initMapWithRoute(ids, drawMode)
//{
//  if (typeof drawMode == "undefined") {
//    drawMode = true;
//  }
//  //alert(drawMode);
//  
//	if (!ids || ids == "")
//	{
//		return;
//	}
//	if (GBrowserIsCompatible())
//	{
//		var idPairsArray = ids.split(";");
//		
//		for (var j = 0; j < idPairsArray.length; j++)
//		{
//			var divId = idPairsArray[j].split(":")[0];
//			var hfid = idPairsArray[j].split(":")[1];
//		  //alert(divId + " " +hfid);
//			// Create googls maps instance
//			map = new GMap2(document.getElementById(divId));
//			map.getDragObject().setDraggableCursor("default");
//			map.addControl(new GLargeMapControl());
//			//set map type controls
//			//setMapTypeControls();
//			
//			// Initialize map center
//			//var center = new GLatLng(centerLat, centerLng);
//			//map.setCenter(center, 13);
//	      
//	        geocoder = new GClientGeocoder();
//			
//			var routeXml = GXml.parse(document.getElementById(hfid).value);
//			routes = routeXml.getElementsByTagName('route');

//			if (!routes || 0 == routes.length)
//			{
//				return;
//			}

//			latlngs = [];
//			var coordinates = routes[0].getElementsByTagName('coordinate');
//			
//			if (coordinates.length == 0)
//			{
//				return;
//			}
//			
//			var lat = coordinates[0].getAttribute('lat');
//			var lng = coordinates[0].getAttribute('lng');
//			var point = new GLatLng(lat,lng);
//			var marker = new GMarker(point, {icon:GetStartIcon()});
//			
//			map.panTo(point);
//			
//			for (var i = 0; i < coordinates.length; ++i) {
//				var coordinate = coordinates[i];
//				// Read lat and lng attributes
//				lat = coordinate.getAttribute('lat');
//				lng = coordinate.getAttribute('lng');
//				// Add a new GLatLng instance with current coordinates to points array
//				latlngs.push(new GLatLng(lat, lng));
//			 }
//			 
//			 var distance = getDistance(latlngs);
//			 var distanceKm = Math.round(distance / 10) /100;
//			 var text = "Rutens totale længde: " + distanceKm + " km";
//			 map.openInfoWindowHtml(marker.getPoint(), text);
//			 
//			 var totalLengthParagraph = document.getElementById("pTotalLength");
//			 if (totalLengthParagraph)
//			 {
//				totalLengthParagraph.innerHTML = text;
//			 }
//			 
//			map.addOverlay(marker);
//			
//			if (drawMode)
//			{
//				playRouteAnimation();
//			}
//			else
//			{
//				var route = new GPolyline(latlngs, "#ff0000", 7);
//				map.addOverlay(route);
//			}
//		}
//		
//		setTimeout(function(){
//			var a0=document.getElementById("amtc_option_0");
//			if (a0)
//			{
//				a0.style.background="#000";
//				a0.style.color="#fff";
//				a0.style.border="#000";
//			}
//			var a1=document.getElementById("amtc_option_1");
//			if (a1)
//			{
//				a1.style.background="#000";
//				a1.style.color="#fff";
//				a1.style.border="#000";
//			}
//			var a2=document.getElementById("amtc_option_2"); 
//			if (a2)
//			{
//				a2.style.background="#000";
//				a2.style.color="#fff"; 
//				a2.style.border="#000";
//			}
//	   }, 1000);
//	}
//}

function addNextMarker(point, index) {
   var marker;
   
   if (!firstMarker) {
	  marker = createMarker(point, markerCount, GetStartIcon());
      firstMarker = marker;
      lastClickedMarker = marker;
      if (hintStep == 2)
      {
		GoToMakeRouteStepThree();
      }
   }
   else
   {
	if (hintStep == 3)
	{
		GoToMakeRouteStepFour();
	}
	
	if (firstMarker != lastClickedMarker)
	{
		map.removeOverlay(lastClickedMarker);
		var intermediateMarker =
			createMarker(lastClickedMarker.getPoint(), lastClickedMarker.number, GetIntermediateIcon());
		intermediateMarker.index = lastClickedMarker.number;
		markersHistory[intermediateMarker.index] = intermediateMarker;
		GEvent.addListener(intermediateMarker, "dragend", function() {
		
		    if ('undefined' == typeof intermediateMarker.index) {
		        return;
		    }
		    latlngs[intermediateMarker.index] = intermediateMarker.getPoint();
             currentIndex=intermediateMarker.index;
             way=([latlngs[currentIndex-1],latlngs[currentIndex]]);
             dirn2.loadFromWaypoints(way,{getPolyline:true});    
   
            way=([latlngs[currentIndex],latlngs[currentIndex+1]]);
            dirn3.loadFromWaypoints(way,{getPolyline:true});
            refreshDistanceInfoForIntermediateMarker(intermediateMarker);
		    updateRouteLength();
		});
		statusIndex=latlngs.length - 1;
        var distanceHTML = '<div class="sml"><div class="sml-lft">&nbsp;</div><div class="sml-mdl">' + GetDistanceFromPreviousPoint(latlngs[latlngs.length - 1], latlngs[latlngs.length - 2]) + '</div><div class="sml-rt">&nbsp;</div></div>';
		var distanceOverlay = new CustomOverlay(latlngs[latlngs.length - 1], distanceHTML, customOverlayShiftX, customOverlayShiftY);
		distanceOverlay.index = intermediateMarker.index;
		map.addOverlay(distanceOverlay);
		distanceOverlays[distanceOverlay.index] = distanceOverlay;		
	}
	if (point == firstMarker.getPoint())
	{
		marker = createMarker(point, markerCount, GetEndIcon());
	}
	else
	{
	    marker = createMarker(point, markerCount, GetRedIcon());
	}
	lastClickedMarker = marker;
   }

   // Handle marker drag stop
   GEvent.addListener(marker, "dragend", function() {
      if ('undefined' == typeof marker.index) {
           return;
       }
        
       latlngs[marker.index] = marker.getPoint();
       if (marker.index == 0)
       {
              //lastpoint = marker.getPoint();
               // Set the geocoder viewport to reduce the number of results later on (optional)
           //geocoder.setViewport(map.getBounds());
            // gdir.clear();
            currentIndex=marker.index;
            way=([latlngs[currentIndex],latlngs[currentIndex]]);
            dirn2.loadFromWaypoints(way,{getPolyline:true});  
         if(latlngs.length>1)
            {
            way=([latlngs[currentIndex],latlngs[currentIndex+1]]);
            dirn3.loadFromWaypoints(way,{getPolyline:true});
            }

          // var way = ([lastpoint, lastpoint]);
          // gdir.loadFromWaypoints(way, { getSteps: true, locale: "en_US" });
       }
       //alert('markerIndex='+marker.index+'totallent='+latlngs.length);
       if (marker.index==latlngs.length-1 && latlngs.length>1)
       {
         currentIndex=marker.index;
         refresh=true;
         way=([latlngs[currentIndex-1],latlngs[currentIndex]]);
         dirn2.loadFromWaypoints(way,{getPolyline:true});
        }
       refreshDistanceInfo(marker);
      // refreshPolyline(latlngs,latlngsSnapStatus);
       updateRouteLength();
   });

   // Handle clicks on marker
   GEvent.addListener(marker, "click", function() {
       var distance;
       var text;

       // If click on last marker
       if (marker.number == markerCount - 1) {
           return;
       }
       else {
           // Add a new marker
         addNextMarker(marker.getPoint(), markerCount);
       }

       // TODO: Insert custom code here
   });

   marker.index = markerCount;
   markersHistory[marker.index] = marker;

   // Add clicked point to route list of LatLngs
   latlngs.push(point);
   latlngsSnapStatus.push(snapOn);
   pLineArray.push(dirn1.getPolyline());
   // Refresh route polyline
   refreshPolyline(latlngs,latlngsSnapStatus);

  
   updateRouteLength();
	
   ++markerCount;
}

function GetDistanceFromPreviousPoint(point, previousPoint) {
     var distance;
    
   if(latlngsSnapStatus[statusIndex]==0)
     {
       distance = point.distanceFrom(previousPoint);
      }
     else
     {
      distance =pLineArray[statusIndex].getLength();
     }
     var distanceKm = (Math.round(distance / 10) / 100);
     var text = distanceKm + " km";
     return text;
 }

function refreshDistanceInfoForIntermediateMarker(intermediateMarker) {
    //change distance overlay
    var indexCurrent = intermediateMarker.index;
    statusIndex=indexCurrent;
    map.removeOverlay(distanceOverlays[indexCurrent]);
    var distanceHTML = '<div class="sml"><div class="sml-lft">&nbsp;</div><div class="sml-mdl">' + GetDistanceFromPreviousPoint(latlngs[indexCurrent], latlngs[indexCurrent - 1]) + '</div><div class="sml-rt">&nbsp;</div></div>';
    var distanceOverlay = new CustomOverlay(latlngs[indexCurrent], distanceHTML, customOverlayShiftX, customOverlayShiftY);
    distanceOverlay.index = indexCurrent;
    map.addOverlay(distanceOverlay);
    distanceOverlays[distanceOverlay.index] = distanceOverlay;

    //if not last change distance overlay for previous point too
    if (distanceOverlay.index < distanceOverlays.length - 1) {
        var indexNext = intermediateMarker.index + 1;
       statusIndex=indexNext;
        map.removeOverlay(distanceOverlays[indexNext]);
        var distanceHTML = '<div class="sml"><div class="sml-lft">&nbsp;</div><div class="sml-mdl">' + GetDistanceFromPreviousPoint(latlngs[indexNext], latlngs[indexNext - 1]) + '</div><div class="sml-rt">&nbsp;</div></div>';
        var distanceOverlay = new CustomOverlay(latlngs[indexNext], distanceHTML, customOverlayShiftX, customOverlayShiftY);
        distanceOverlay.index = indexNext;
        map.addOverlay(distanceOverlay);
        distanceOverlays[distanceOverlay.index] = distanceOverlay;
    }
}

function refreshDistanceInfo(marker) { 
    //check if we have more then 2 points
    if (markersHistory.length < 3) {
  
        return;
    }

    //check for first point
    if (marker.index == 0) {
        var indexCurrent = marker.index + 1;
        statusIndex=indexCurrent;
        map.removeOverlay(distanceOverlays[indexCurrent]);
        var distanceHTML = '<div class="sml"><div class="sml-lft">&nbsp;</div><div class="sml-mdl">' + GetDistanceFromPreviousPoint(latlngs[indexCurrent], latlngs[indexCurrent - 1]) + '</div><div class="sml-rt">&nbsp;</div></div>';
        var distanceOverlay = new CustomOverlay(latlngs[indexCurrent], distanceHTML, customOverlayShiftX, customOverlayShiftY);
        distanceOverlay.index = indexCurrent;
        map.addOverlay(distanceOverlay);
        distanceOverlays[distanceOverlay.index] = distanceOverlay;
    }
}

function createMarker(point, number, icon) {
   var marker = new GMarker(point, {icon:icon,draggable:true});
   //marker.enableDragging();
   marker.number = number;
   map.addOverlay(marker);

   if (MARKER_ICON) {
      marker.setImage(MARKER_ICON);
   }

   return marker;
}

function showInfoWindow(point) {

   var distanceKm = Math.round(getDistance(latlngs) / 10) /100;
   var text = "Rutens totale længde: " + distanceKm + " km";
   map.openInfoWindowHtml(point, text);

   var totalLengthParagraph = document.getElementById("pTotalLength");
   if (totalLengthParagraph)
   {
		totalLengthParagraph.innerHTML = text;
   }
}

function refreshPolyline(latlngs,latlngsSnapStatus) {
   if (polyline) {
      map.removeOverlay(polyline);
   }
   var latlngArray =[];
    for (var i=1; i<latlngs.length; i++)
    {
    
        if(latlngsSnapStatus[i]==1)
        { 
            var pLine=pLineArray[i];
             for(var j=0; j<pLine.getVertexCount(); j++)
             {
                latlngArray.push(pLine.getVertex(j));
             }           
        }
        else
        {
            latlngArray.push(latlngs[i-1]);
            latlngArray.push(latlngs[i]);
        }
    }
    polyline=new GPolyline(latlngArray, color, 4);
    map.addOverlay(polyline);
}

//function submit() {
//   var routesForm = document.getElementById('routesForm');

//   routesForm['route'].value = serializeRouteXml();
//   
//   var distanceKm = Math.round(getDistance(latlngs) / 10) /100;
//   routesForm['distance'].value = distanceKm;
//   
//   routesForm.submit();
//}

//function serializeRouteXml() {
//   var xml = [];
//   xml.push('<?xml version="1.0"?>');
//   xml.push('<route>');
//   for (var i = 0; i < latlngs.length; ++i) {
//      var latlng = latlngs[i];
//      xml.push('<coordinate lat="');
//      xml.push(latlng.lat());
//      xml.push('" lng="');
//      xml.push(latlng.lng());
//      xml.push('" />');
//   }
//   xml.push('</route>');
//   return xml.join('');
//}

//function loadRouteXml() {
////	if (map.getZoom() < 12)
////	{
////		map.clearOverlays();
////		
////		return;
////	}
////clusterer.fitMapMaxZoom=12;
////	clusterer.removeMarkers();
////	latlngs = [];
////	markers = [];

////	if (lastClickedMarker)
////	{
////		markers.push(lastClickedMarker);
////		clusterer.addMarkers(markers);
////		lastClickedMarker = null;
////	}

//   var request = GXmlHttp.create();
//   var handlerUrl = "/Templates/runrunrun/GetRoutesXml.ashx?"
//   
////   var mapBounds = map.getBounds();
////   var sw = mapBounds.getSouthWest();
////   var ne = mapBounds.getNorthEast();
////   handlerUrl += "swlat=" + sw.lat();
////   handlerUrl += "&swlng=" + sw.lng();
////   handlerUrl += "&nelat=" + ne.lat();
////   handlerUrl += "&nelng=" + ne.lng();
//   
//   request.open("GET", handlerUrl, true);

//   request.onreadystatechange = function() {
//      if (request.readyState == 4) {
//		if(!request.getResponseHeader("Date"))
//		{
//		  var cached = request;
//		  request = GXmlHttp.create();
//		  request.open("GET", handlerUrl, true);
//		  var ifModifiedSince = cached.getResponseHeader("Last-Modified");
//		  ifModifiedSince = (ifModifiedSince) ?
//			  ifModifiedSince : new Date(0); // January 1, 1970
//		  request.open("GET", handlerUrl, false);
//		  request.setRequestHeader("If-Modified-Since", ifModifiedSince);
//		  request.send("");
//		  if(request.status == 304)
//		  {
//			request = cached;
//		  }
//		}

//		
//		
//         routes = request.responseXML.getElementsByTagName('route');

//         if (!routes || 0 == routes.length) {
//            return;
//         }

//		 for (var i = 0; i < routes.length; i++)
//		 {
//			addFirstPointOfRoute(i);
//         }
//         clusterer.addMarkers(markers);
//         clusterer.refresh();
//      }
//   }
//   request.send(null);
//}

function removeLastPoint() {
    if (markerCount < 2) {
        clearRoute();
        return;
    }

    var lastMarker = markersHistory[markerCount - 1]
    if ((typeof (lastMarker) != 'undefined')) {
        var marker = null;
        var prevMarker = markersHistory[lastMarker.index - 1];

        markersHistory.pop();
        latlngs.pop();
        latlngsSnapStatus.pop();
        pLineArray.pop();
        map.removeOverlay(lastMarker);
        if (markerCount != 2) {
             map.removeOverlay(prevMarker);
            map.removeOverlay(distanceOverlays[prevMarker.index]);
           marker = createMarker(prevMarker.getPoint(), prevMarker.index, GetRedIcon());
            // Handle marker drag stop
            GEvent.addListener(marker, "dragend", function() {
              if ('undefined' == typeof marker.index) {
                    return;
                }
               latlngs[marker.index] = marker.getPoint();
               latlngsSnapStatus[marker.index]=snapOn;
                //hk
//                            
               //pLineArray[marker.index]=dirn2.getPolyline();
                refreshPolyline(latlngs,latlngsSnapStatus);
                updateRouteLength();
            });
            

            // Handle clicks on marker
            GEvent.addListener(marker, "click", function() {
                var distance;
                var text;

                // If click on last marker
                if (marker.number == markerCount - 1) 
                 {
                    return;
                 }
                else 
                 {   // Add a new marker
                    addNextMarker(marker.getPoint(), markerCount);
                 }

                // TODO: Insert custom code here
            });
            
            marker.index = prevMarker.index;
            markersHistory[prevMarker.index] = marker;

            lastClickedMarker = marker;
        }
        else 
        {
           lastClickedMarker = prevMarker;
        }
        
        markerCount--;
        
        refreshPolyline(latlngs,latlngsSnapStatus);
        updateRouteLength();
    }
}

function clearRoute() {
   firstMarker = null;
   lastClickedMarker = null;
   markers = [];
   latlngs = [];
   latlngsSnapStatus=[];
   pLineArray=[];
   markersHistory = [];
   distanceOverlays = [];
   markerCount = 0;
   map.clearOverlays();
   updateRouteLength();

}

//function addFirstPointOfRoute(routeNumber)
//{
//	 var coordinates = routes[routeNumber].getElementsByTagName('coordinate');
//	 
//	 if (coordinates.length == 0)
//	 {
//		return;
//	 }
//	 
//	 var lat = coordinates[0].getAttribute('lat');
//	 var lng = coordinates[0].getAttribute('lng');
//	 var point = new GLatLng(lat,lng);
//	 var marker = new GMarker(point, {icon:GetStartIcon()});
//	 
//	 marker.id = routes[routeNumber].getAttribute('id');
//	 marker.distance = routes[routeNumber].getAttribute('distance');
//	 
//	 GEvent.addListener(marker, "click", function() {
//		lastClickedMarker = marker;
//	 
//		latlngs = [];
//		//hk
//		latlngsSnapStatus=[];
//		
////		routeId = routes[routeNumber].getAttribute('id');
////		routeDistance = routes[routeNumber].getAttribute('distance');
//        for (var i = 0; i < coordinates.length; ++i) {
//			var coordinate = coordinates[i];
//			// Read lat and lng attributes
//			var lat = coordinate.getAttribute('lat');
//			var lng = coordinate.getAttribute('lng');
//			// Add a new GLatLng instance with current coordinates to points array
//			latlngs.push(new GLatLng(lat, lng));
//			//hk
//			   latlngsSnapStatus.push(snapOn);
//		 }
//		 
//		 var distance = getDistance(latlngs);
//		 var distanceKm = Math.round(distance / 10) /100;
//		 var text = "Rutens totale længde: " + distanceKm + " km";
//		 map.openInfoWindowHtml(marker.getPoint(), text);
//		 
//		 var totalLengthParagraph = document.getElementById("pTotalLength");
//		 if (totalLengthParagraph)
//		 {
//			totalLengthParagraph.innerHTML = text;
//		 }
//		 
//		 if (hintStep == 2)
//		 {
//			GoToHintStepThree();
//		 }
//		 
//		 playRouteAnimation();
//     });
//     markers.push(marker);
//	 //map.addOverlay(marker);
//	 //clusterer.AddMarkers(marker, 3);
//}

function getDistance(latlngs) {
   var distance = 0;
   var latlngPrevious = null;
   for (var i = 0; i < latlngs.length; ++i) {
      var latlng = latlngs[i];
        if (latlng && latlngPrevious) {
        distance += latlng.distanceFrom(latlngPrevious);
      }
      latlngPrevious = latlng;
   }
   return distance;
}

//function playRouteAnimation() {
//   var iLine = 1;
//   var iSegment = 0;
//   ++activeAnimationID;
//   if(activeAnimationID > 10000) {
//    activeAnimationID = 0;
//   }
//   
//   var onTimeout = function(animationID) {
//      if(activeAnimationID != animationID) {
//        return;
//      }
//      var slice = latlngs.slice(0, iLine);

//      var latlng;
//      if (iLine < latlngs.length) {

//         var latlngStart = slice[slice.length-1];
//         var latlngEnd = latlngs[iLine];
////hkR
//         var dLat = latlngStart.lat() - latlngEnd.lat();
//         var dLng = latlngStart.lng() - latlngEnd.lng();

//         var lat = latlngStart.lat() - (iSegment * (dLat/ANIMATION_LINE_SEGMENTS));
//         var lng = latlngStart.lng() - (iSegment * (dLng/ANIMATION_LINE_SEGMENTS));

//         latlng = new GLatLng(lat, lng);

//         slice.push(latlng);
//      }
//      else {
//         latlng = slice[slice.length - 1];
//      }

//      // If we are on the very first frame
////      if (1 == iLine && 0 == iSegment) {
////         var marker = createMarker(latlng, 0);
////         // Handle clicks on marker
////         GEvent.addListener(marker, "click", function() {
////            var distance = getDistance(latlngs);
////            var distanceKm = Math.round(distance / 10) /100;
////            var text = "Total distance: " + distanceKm + "km";
////            map.openInfoWindowHtml(marker.getPoint(), text);

////            // TODO: Insert custom code here
////         });

////         showInfoWindow(latlng);
////      }
//      
//      // Refresh route polyline
//      //hkr
//      refreshPolyline(slice);

//      // Get map bounds
//      var latlngBounds = map.getBounds();
////      // If last route point is visible on map
////      if (!latlngBounds.contains(latlng)) {
////         map.panTo(latlng);
////      }

//      if (iSegment < ANIMATION_LINE_SEGMENTS && iLine < latlngs.length) {
//         ++iSegment;
//      }
//      else {
//         ++iLine;
//         iSegment = 0;
//      }

//      if (iLine <= latlngs.length) {
//         setTimeout(function(){onTimeout(animationID);}, ANIMATION_DELAY);
//      }
//   }
//   setTimeout(function(){onTimeout(activeAnimationID);}, ANIMATION_START_DELAY);
//}


function ClusterClick(args) {
	clusterer.defaultClickAction=function(){
		map.setCenter(args.clusterMarker.getLatLng(), map.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds))
		delete clusterer.defaultClickAction;
	}
	var html='<div style="width:200px;height:100px"><div style="overflow:auto;width:200px;height:100px"><h4>'+args.clusteredMarkers.length+' Ruter:</h4>';
	for (i=0; i<args.clusteredMarkers.length; i++) {
		var distance = parseFloat(args.clusteredMarkers[i].distance);
		html+='<a href="javascript:clusterer.triggerClick('+args.clusteredMarkers[i].index+')">'+ distance +' km</a><br />';
	}
	html += '</div></div>';
	args.clusterMarker.openInfoWindowHtml(html);
}

function GoToAddress()
{
	if (geocoder)
	{
		var address = document.getElementById("address");
		if (address.value)
		{
			geocoder.getLatLng(address.value, function(point){
				 map.panTo(point);
			});
		}
	}
	
	if (hintStep == 1)
	{
		GoToHintStepTwo();
	}
}

function GoToHintStepTwo()
{
	hintStep++;
	var hintParagraph = document.getElementById("pHintText");
	var hfFirstDragOrSearchText = document.getElementById("hfFirstDragOrSearchText");
	if (hintParagraph && hfFirstDragOrSearchText)
	{
		hintParagraph.innerHTML = hfFirstDragOrSearchText.value;
	}
}

function GoToHintStepThree()
{

	hintStep++;
	var hintParagraph = document.getElementById("pHintText");
	var hfRouteSelectedText = document.getElementById("hfRouteSelectedText");
	if (hintParagraph && hfRouteSelectedText)
	{
		hintParagraph.innerHTML = hfRouteSelectedText.value;
	}
}

function GoToMakeRouteStepThree()
{ 

	hintStep++;
	var hintParagraph = document.getElementById("pHintText");
	var hfFirstPointChosenText = document.getElementById("hfFirstPointChosenText");
	if (hintParagraph && hfFirstPointChosenText)
	{
		hintParagraph.innerHTML = hfFirstPointChosenText.value;
	}
}

function GoToMakeRouteStepFour()
{  
	hintStep++;
	var hintParagraph = document.getElementById("pHintText");
	var hfAnotherPointChosenText = document.getElementById("hfAnotherPointChosenText");
	if (hintParagraph && hfAnotherPointChosenText)
	{
		hintParagraph.innerHTML = hfAnotherPointChosenText.value;
	}
}

function CopyRouteXmlToFields(routeid, distanceid)
{

	var route = document.getElementById(routeid);
	route.value = serializeRouteXml();

	var distanceKm = Math.round(getDistance(latlngs) / 10) /100;
	var distance = document.getElementById(distanceid);
	distance.value = distanceKm;
}

function RouteSelectedHandler(btn, hfId)
{
	var hfLastClickedMarker = document.getElementById(hfId);
	if (lastClickedMarker && hfLastClickedMarker)
	{
		hfLastClickedMarker.value = lastClickedMarker.id;
		return true;
	}
	else
	{
		return false;
	}
}

function GetStartIcon(G_DEFAUTL_ICON)
{
	var icon = new GIcon();
	icon.image = START_POINT_ICON;
	icon.iconSize = new GSize(56,38);
	icon.iconAnchor = new GPoint(47, 30);
	icon.infoWindowAnchor = new GPoint(47,30)
	icon.iconShadow = "";
	
	return icon;
}

function GetEndIcon(G_DEFAUTL_ICON)
{
	var icon = new GIcon();
	
	icon.image = END_POINT_ICON;
	icon.iconSize = new GSize(56,38);
	icon.iconAnchor = new GPoint(47, 30);
	
	return icon;
}

function GetIntermediateIcon(G_DEFAUTL_ICON)
{
	var icon = new GIcon();
	
	icon.image = INTERMEDIATE_POINT_ICON;
	icon.iconSize = new GSize(10,10);
	icon.iconAnchor = new GPoint(5, 5);
	icon.iconShadow = "";
	
	return icon;
}

function GetRedIcon(G_DEFAUTL_ICON)
{
	var icon = new GIcon();
	
	icon.image = RED_POINT_ICON;
	icon.iconSize = new GSize(10,10);
	icon.iconAnchor = new GPoint(5, 5);
	icon.infoWindowAnchor = new GPoint(5,5)
	icon.iconShadow = "";
	
	return icon;
}

function RouteLengthControl(text) {
}
RouteLengthControl.prototype = new GControl();

RouteLengthControl.prototype.initialize = function(map) {
  var container = document.createElement("div");

  var routeLengthDiv = document.createElement("div");
  routeLengthDiv.setAttribute("id","routelengthcontrol");
  this.setDivStyle_(routeLengthDiv);
  container.appendChild(routeLengthDiv);
  routeLengthDiv.appendChild(document.createTextNode("0 km"));

  map.getContainer().appendChild(container);
  return container;
}

RouteLengthControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(7, 420));
}

// Sets the proper CSS for the given div element.
RouteLengthControl.prototype.setDivStyle_ = function(button) {
  //button.style.textDecoration = "underline";
  button.style.backgroundImage = "url(/App_Themes/AltForDamerne/Images/red_km.png)";
  button.style.color = "#fff";
  //button.style.backgroundColor = "#000";
  button.style.font = "small Arial";
  //button.style.border = "1px solid black";
  button.style.padding = "2px";
  button.style.marginBottom = "3px";
  button.style.textAlign = "center";
  button.style.width = "129px";
  button.style.height = "25px";
  button.style.cursor = "pointer";
  button.style.paddingTop = "10px";
  //button.style.backgroundPosition = "5px 5px";
}


function updateRouteLength()
{

	//var routeLengthDiv = document.getElementById("routelengthcontrol");
//	if (routeLengthDiv)
//	{
//		var distanceKm = Math.round(getDistance(latlngs) / 10) /100;
//		var text = distanceKm + " km";
//		routeLengthDiv.innerHTML = text;
		var cell = document.getElementById('totalLength');
		var len=polyline.getLength();
		//cell.innerHTML=text;
		
		cell.innerHTML=(Math.round(len / 10) / 100) + "km";
//	}
	//var cell = document.getElementById('totalLength');
//	if (cell)
//	{
//	    //var distanceKm = Math.round(getDistance(latlngs) / 10) /100;
//		var text = distanceKm + " km";
//		routeLengthDiv.innerHTML = text;
//		cell.innerHTML=text;
//	}
}

// function added to save trip 
function addTrip()
 {
   //polyline = new GPolyline(latlngs, "#ff0000", 7);
     var point= new Array(polyline.getVertexCount());
       for(var j=0; j<polyline.getVertexCount(); j++)
        {
            point[j]=polyline.getVertex(j);
        }
     var lineEncoder = new PolylineEncoder();
     var encodedPolyline=lineEncoder.dpEncodeToGPolyline(point,"#ff0000",3,0.9);
     
    var gStr=createGetString(encodedPolyline);
    gStr=gStr+"&mapCenterLat="+map.getCenter().lat()+"&mapCenterLng="+map.getCenter().lng();
    gStr=gStr+"&tripName="+document.getElementById("tripName").value+"&tripDescription="+document.getElementById("tripDetail").value;
    gStr=gStr+"&tripType="+document.getElementById("tripType").value;
    // code added for testing starts here
//     var pLine = new GPolyline.fromEncoded({
//            
//			color: "#ff0000",
//		    weight: 4,
//            points: encodedPolyline.points,
//            levels: encodedPolyline.levels,
//            zoomFactor: encodedPolyline.zoomFactor,
//            numLevels: encodedPolyline.numLevels,
//        });
//       // document.getElementById("tripDetail").value=gStr;
//        map.clearOverlays();
//        alert('test [points are:'+encodedPolyline.points);
//        alert('test [levels are:'+encodedPolyline.levels);
//        map.addOverlay(pLine);
//        alert('test end');
// code added for testing ends here
        addGMapDB(gStr);
 }
 

 
 function createGetString(encodedPolyline)
 {  
    var gStr="markerCount=0";
    gStr=gStr+"&lineCount=1";
    var col=encodedPolyline.color.split('#');
    
    var pts=encodedPolyline.points;
    var pts1=pts.split("?");
    pts=pts1.join("questionmarkreplacementstring");
    var pts2=pts.split("\\");
    pts=pts2.join("backslashmarkreplacementstring");
    
    var lev=encodedPolyline.levels;
    var lev1=lev.split("?");
    lev=lev1.join("questionmarkreplacementstring");
     var lev2=lev.split("\\");
    lev=lev2.join("backslashmarkreplacementstring");
 
    var i=0;
        gStr=gStr+"&line"+i+"points="+pts+"&line"+i+"levels="+lev;
        gStr=gStr+"&line"+i+"weight="+encodedPolyline.weight+"&line"+i+"opacity="+encodedPolyline.opacity;
        gStr=gStr+"&line"+i+"color="+col[1]+"&line"+i+"numLevels="+encodedPolyline.numLevels;
        gStr=gStr+"&line"+i+"zoomFactor="+encodedPolyline.zoomFactor;
    return gStr;
 }
 
 
function snapActive()
{  
    if(snapOn==0)
        {
        snapOn=1;
        document.getElementById("snap").value="Snap off";
        }
    else
        {
        snapOn=0;
         document.getElementById("snap").value="Snap on";
        }
}
function changeColor()
{
var selectedTrip=document.getElementById("tripType").value;
    if(selectedTrip=="Mountain")
    {
    color="#00FF00";
    }
    else if(selectedTrip=="Race")
    {
     color="#ff0000";
    }
    else
    {
      color="#0000FF";
    }
   refreshPolyline(latlngs,latlngsSnapStatus); 
}
