﻿// JScript File
    //<![CDATA[
    // JScript File
var map;
var points;
var line;
var start_point;
var myStart;
var color = "#FF0000";//"#9900FF"; //red 
var lineThickness = 4;
var finishDrawing;
var coordinates;
var sagPoints;
var punkter;
var mapStartPoint;
var clientID = 'ctl00_ContentPlaceHolder_';
var rightClientID = 'ctl00_RightContentPlaceHolder_'; 
var map = null;

var geocoder = null;
var theLine = null;
var dist = 0;
   

    function showAddress(address) {
    
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
         
            if (!point) {
              alert(address + " blev ikke fundet");
            } else {
              map.setCenter(point, 16);
              
            }
          }
        );
      }
    }

    

    function load(ruteid, allowDraw, address) {

        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 mapMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "OSM");

        
        
        finishDrawing = false;
        if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"), { mapTypes: [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, mapMapnik] }, { draggableCursor: "crosshair" });
        //map.enableScrollWheelZoom();
        mapStartPoint = new GLatLng(56.275,10.569); 
        map.setCenter(mapStartPoint, 7);
        map.setMapType(G_HYBRID_MAP)
        var ov_map = new GOverviewMapControl(new GSize(100,100));
        map.addControl(new GLargeMapControl());
        map.addControl(new GScaleControl());
	    map.addControl(new GMapTypeControl());
        map.addControl(ov_map);
        geocoder = new GClientGeocoder();
              
        line = null; 
        var flag = 1;
        var readOnly = false;
        
        if(ruteid > 0)
        {
            HentRute(ruteid);
            readOnly = true;
        } 
        if(allowDraw)
        {
            
            GEvent.addListener(map,"click",function(overlay,point){
                   if(!isNaN(point.lat()))
                    {
                            if(points == null)
                            {
                                points = new Array(); 
                                myStart = point;
                            }
                            if(point)
                            { 
                                points.push(point); 
                                
                            } 
                            draw();
                    }
            });
        }
        
        if(address != null && address != "")
        {
            showAddress(address);
        }
        
        
   }
      
   
}



    function draw()
    {
        var firstIcon = new GIcon();
        firstIcon.iconSize = new GSize(16, 16);
        firstIcon.iconAnchor = new GPoint(8,8);
        firstIcon.image = "Images/green.png";
        firstIcon.shadowSize = new GSize(22, 20);

        var lastIcon = new GIcon();
        lastIcon.iconSize = new GSize(16, 16);
        lastIcon.iconAnchor = new GPoint(8,8);
        lastIcon.image = "Images/red.png";
        lastIcon.shadowSize = new GSize(22, 20);

        var icon = new GIcon();
        icon.iconSize = new GSize(10, 10);
        icon.iconAnchor = new GPoint(5,5);
        icon.image = "Images/white.png";
        icon.shadowSize = new GSize(22, 20);

        map.clearOverlays(); 
        var startPoint = new GMarker(points[0],firstIcon); 
        map.addOverlay(startPoint); // Start-punkt
        map.addOverlay(new GMarker(points[points.length - 1],lastIcon)); // sidst tegnede punkt
        theLine = new GPolyline(points, color, lineThickness);
        
          
        GEvent.addListener(theLine, "click",function(point){
                    if(point)
                    { 
                        points.push(point); 
                    } 
                    draw();
            });
            
        map.addOverlay(theLine);
        
        // punkter p
        for(i=1; i < points.length-1; i++)
        {
            
            mark = new GMarker(points[i],{icon:icon, draggable: false});
            GEvent.addListener(mark, "dragend", updateRute );

            map.addOverlay(mark);
    
        }
    
        calculateDistance();
        milestoneTest();
        // skriv koordinater
        document.getElementById(clientID + 'Coordinates').value = points;      
           
    }
    
    function reverseRute()
    {
        //points
        for(i=points.length; i >= 0; i--)
        {
                if(points[i] != null)
               {
                points.push(points[i]);
               }
        }

        draw();
    }


    function updateRute()
    {
        alert(123);
    }
    
    function clickPolyline()
    {
        alert('jubii');
    }

    function removeLastPoint()
    {
        if(points.length > 1)
        {
            var p = points[points.length - 1];
            points.pop(p);
        
            draw();
        }
        else
        {
            clearDraw();
        }
    }

    
    function clearDraw()
    {
        if(confirm('Er du sikker på at du vil fjerne hele ruten ?'))
        {
            points = null;
            map.clearOverlays(); 
            try
            {
                document.getElementById(rightClientID + "Distance").innerHTML = "0.0";
                //$get("Distance").value = " Jubii";
            }
            catch(err)
            {
                document.getElementById(clientID + "Distance").value = "0.0";
            }
            document.getElementById(clientID + "DistanceTextbox").value = "0.0";
            document.getElementById(clientID + 'Coordinates').value = "";
            return false;
        }
    }
    
    function doCalculateDistance()
    {
          p1 = null;
            p2 = null;
            j = 1;
            dist = 0;
            for(i = 0;i<points.length;i++)
            {
            if(points.length > j && j <= points.length)
            {
                p1 = points[i];
                p2 = points[j];
                j++;
                dist += p1.distanceFrom(p2);
                }
            }
return dist;
    }
    
    function calculateDistance()
    {
    
        if(points.length > 1)
        {
    
                      
            distKm = doCalculateDistance() / 1000;
            try
            {
                document.getElementById(rightClientID + "Distance").innerHTML = Math.round(distKm * 100) / 100;
                document.getElementById(clientID + "DistanceTextbox").value = document.getElementById(rightClientID + "Distance").innerHTML;
            }
            catch(err)
            {
                document.getElementById(clientID + "Distance").innerHTML = Math.round(distKm * 100) / 100;
                document.getElementById(clientID + "DistanceTextbox").value = document.getElementById(clientID + "Distance").innerHTML;
            }
          }
          else
          {
                try
                  {
                            document.getElementById(rightClientID + "Distance").innerHTML = "0.0";
                            document.getElementById(clientID + "DistanceTextbox").value = document.getElementById(rightClientID + "Distance").innerHTML;
                  }
                  catch(err2)
                  {
                   document.getElementById(clientID + "Distance").innerHTML = "0.0";
                document.getElementById(clientID + "DistanceTextbox").value = document.getElementById(clientID + "Distance").innerHTML;
                  }
              }

              // KJ Beregningen
              CalculteKJ();
    }
    

function HentRute(sagid)
{

    MvcApp.Service.CoorditatesToRute(sagid, drawRute, MyError);
}


function drawRute(result)
{
    
    var icon = new GIcon();
    icon.iconSize = new GSize(10, 10);
    icon.iconAnchor = new GPoint(5,5);
    icon.image = "Images/white.png";
    icon.shadowSize = new GSize(22, 20);

    punkter = result;
    //sagPoints = new Array();
     points = new Array();
           
    for(i=0; i < punkter.length; i++)
    {
    
                LonLat = punkter[i];
                p = new GLatLng(parseFloat(LonLat.Latitude), parseFloat(LonLat.Longitude));
                points.push(p);
                if(i == 0)
                    firstPoint = p; 
                lastPoint = p;
                map.addOverlay(new GMarker(p,{icon:icon}));
    }
    
     // Linie/Plolygon
     if(points.length > 1)
     {
          var firstIcon = new GIcon();
        firstIcon.iconSize = new GSize(16, 16);
        firstIcon.iconAnchor = new GPoint(7,8);
        firstIcon.image = "Images/green.png";
        firstIcon.shadowSize = new GSize(22, 20);

        var lastIcon = new GIcon();
        lastIcon.iconSize = new GSize(16, 16);
        lastIcon.iconAnchor = new GPoint(7,8);
        lastIcon.image = "Images/red.png";
        lastIcon.shadowSize = new GSize(22, 20);


        theLine = new GPolyline(points, color, lineThickness);
        //line = new GPolyline(points,color,lineThickness); //HACK !!
        map.addOverlay(theLine);
                
        sagPoints = null;
        map.addOverlay(new GMarker(lastPoint, lastIcon));
        map.addOverlay(new GMarker(firstPoint, firstIcon));
        map.setCenter(firstPoint, 14);
        
    }
    
    doCalculateDistance();
        milestoneTest()
}

function MyError(result)
{
    alert("Der opstod en fejl. Du er meget velkommen til at kontakte os på post@loeberute.dk  " + result.toString());
}

function loadDelteruter() {
    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 mapMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "OSM");


        finishDrawing = false;
        if (GBrowserIsCompatible()) 
        {
            map = new GMap2(document.getElementById("map"), { mapTypes: [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, mapMapnik] }, { draggableCursor: "crosshair" });
     

            mapStartPoint = new GLatLng(56.275,10.569); 
            map.setCenter(mapStartPoint, 7);
            map.setMapType(G_HYBRID_MAP)
            var ov_map = new GOverviewMapControl(new GSize(100,100));
            map.addControl(new GLargeMapControl());
            map.addControl(new GScaleControl());
            map.addControl(new GMapTypeControl());
            map.addControl(ov_map);
            geocoder = new GClientGeocoder();
              
            line = null; 
            var flag = 1;

            HentRuter();
            readOnly = true;
            
             GEvent.addListener(map, "moveend", function()
        {
            // Hvis kortets centrum flyttes ud over dk's umiddelbare grænser, så skal der returneres til udgangspunktet
            // map.returnToSavedPosition();

            // Hvis zoom-level er på institutionsniveau eller derover hentes der institutioner til det pågældende område
            // Dette gøres hver gang kortet flyttes.

            HentRuter();
        }
    );

          }
      
   
}


function HentRuter()
{
     var commandString = map.getBounds();

     MvcApp.Service.DelteRuter(drawRuterOnMap, MyError);
}

function drawRuterOnMap(result)
{

    for(i=0; i < result.length; i++)
    {
    
        LonLat = result[i];
        p = new GLatLng(parseFloat(LonLat.Latitude), parseFloat(LonLat.Longitude));
        var mark2 = createMarker(p, LonLat.Html);
        map.addOverlay(mark2);

    }
}

function createMarker(point,html)
{
    var marker = new GMarker(point);
 
        GEvent.addListener(marker, "click", function() {

          marker.openInfoWindowHtml(html);

        });

    return marker;
}


function milestoneTest()
{
  
    //poly =  new GPolyline(points); 
    for (var i=0; i<dist; i+=1000) { 
        if(i > 0)
        {
            
            var icon = new GIcon();
            icon.iconSize = new GSize(16, 16);
            icon.iconAnchor = new GPoint(7,8);
            icon.shadowSize = new GSize(22, 20);
            if(i <= 15000)
            {
                icon.image = "Images/Milestones/"+ i +".png";
            }
            else if(i == 20000)
            {
                icon.image = "Images/Milestones/"+ i +".png";
            }
            else
            {
                icon.image = "Images/Milestones/add1.png";
            }
            var point = MyGetPointAtDistance(i, theLine);
            if (point) {
            {
                map.addOverlay(new GMarker(point, icon));
             
            }
            }
        }
    }
}

// === A method which returns a GLatLng of a point a given distance along the path ===
// === Returns null if the path is shorter than the specified distance ===
// === Taken from http://econym.googlepages.com/epoly.htm ====
function MyGetPointAtDistance(metres, poly) {
  // some awkward special cases
  
  if (metres == 0) return poly.getVertex(0);
  if (metres < 0) return null;
  var dist=0;
  var olddist=0;
  for (var i=1; (i < poly.getVertexCount() && dist < metres); i++) {
    olddist = dist;
    dist += poly.getVertex(i).distanceFrom(poly.getVertex(i-1));
    
  }
  if (dist < metres) {return null;}
  var p1= poly.getVertex(i-2);
  var p2= poly.getVertex(i-1);
  var m = (metres-olddist)/(dist-olddist);
  
  return new GLatLng( p1.lat() + (p2.lat()-p1.lat())*m, p1.lng() + (p2.lng()-p1.lng())*m);
}

//************************** CALCULATORS ************************************



function UpdateElevation(data) {

    MvcApp.Service.CoorditatesToRute(data, elevationUpdated, MyError);
}


function elevationUpdated(result) {
}

