﻿var le = 0;
var map = null;
var pinid = 1;
var shapeStart = null;
var shapeEnd = null;
var LayerUsed = 1;
var MapChanged = false;
var RoutesOnMap = new Array();
var mapmode;
var index = 0;
var results = null;


function GetMap()
{    
    var head = document.getElementsByTagName("head")[0];
    var s = document.createElement('script');
    var localisationName = "en-US"
    if (typeof (Sys) != 'undefined') {
        if (Sys.CultureInfo.CurrentCulture.name.indexOf('de') > -1) localisationName = "de-DE";
    }
    s.id = 'VEScript';    
    s.type = 'text/javascript';
    s.src = "http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=" + localisationName;    
    head.appendChild(s);    
    DelayGetMap();    
    //alert('map is initialized');
}

function DelayGetMap()
{
    try 
    {
        MessageBox(true, "loading map....", 3000); 
        map = new VEMap('myMap');
        document.getElementById('myMap').style.display = "block";
        ResizeMap();
        map.LoadMap(new VELatLong(UserLat, UserLong), UserZoom, VEMapStyle.Shaded, false, VEMapMode.Mode2D, true, 1);
        map.SetShapesAccuracy(VEShapeAccuracy.Pushpin);
        map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers); 
        InitializeGlobalVariables();
        InitializeVariables();
        mapmode = "2D";
        map.AttachEvent("onendzoom", GetStuffInArea);
        map.AttachEvent("onendpan", GetStuffInArea);
        map.AttachEvent("oninitmode", ClearAndReinit);
        setTimeout("GetStuffInArea()", 500);
        MapChanged = true;
    }
    catch(error)
    {
        if (le < 30)
        {
                le++;
                setTimeout("DelayGetMap()", 500);
        }else
        {
            alert('Server busy. Please wait a few seconds...');
        }
    }   
}

function ResizeMap()
{

    //alert('Windowhight: '+GetWindowHeight());
    //alert('Resize Map: line 58');
    document.getElementById('myMap').style.width = (GetWindowWidth()-314)+'px';
    //alert('Resize Map: line 60: '+document.getElementById('myMap').style.width);
    document.getElementById('myMap').style.height = (GetWindowHeight()-100)+'px';
    //alert('Resize Map: line 62: '+ document.getElementById('myMap').style.height);    
    document.getElementById('RouteResultList').style.height = (GetWindowHeight()-328);
    //alert('Resize Map ___ line 64: '+document.getElementById('RouteResultList').style.height);
}

function InitializeVariables()
{
    for (var i = 1; i < 13; i++)
    {
        layer = "layer" + i;
        layer = new VEShapeLayer();
        map.AddShapeLayer(layer);
    }
    // Layer 0 = the Map, Layers 1-5 for Routes, 6 RoutePins, 7 PicturesPins, 8 POIPins, 9 Wiki, 10 Weather, 11 HighlightPins, 12 LocationSearch
}

function ClearAndReinit()
{
    ClearAllRoutesAndPins();
    GetStuffInArea();
}

function GetStuffInArea()
{
    switch (map.GetMapMode())
    {
        case VEMapMode.Mode2D:
            mapmode = "2D";
            break;
        case VEMapMode.Mode3D:
            mapmode = "3D";
            break;    
    }
    var style = map.GetMapStyle();
    if ((style == VEMapStyle.Birdseye) || (style == VEMapStyle.Oblique) || (style == VEMapStyle.BirdseyeHybrid))
    {   return;     }
    if (mapmode == "3D")
    {
        if ((map.GetHeading() < 350) && (map.GetHeading() > 190))
        {  return;  }
        if ((map.GetHeading() > 10) && (map.GetHeading() < 170))
        {  return;  }
    }
    var pixel  = new VEPixel(0, 0);
    var y = 0; var x = 0;
    var NWLatLong = null;
    var SELatLong = null;
    var i = 0;
    while (NWLatLong == null)
    {
        if (i > 100)
        { return; }
        pixel = new VEPixel(x, y);
        try { NWLatLong = new VELatLong(map.PixelToLatLong(pixel).Latitude, map.PixelToLatLong(pixel).Longitude); }
        catch(error) { NWLatLong = null; }
        y = y + 10; x = x + 5;
        i++;
    }
    var mapBox = Sys.UI.DomElement.getBounds($get("myMap"));
    pixel = new VEPixel(mapBox.width, mapBox.height);
    try {
    SELatLong = new VELatLong(map.PixelToLatLong(pixel).Latitude, map.PixelToLatLong(pixel).Longitude);
    }
    catch(error) { return; }
    var QueryParameters = new LYT.BusinessLogic.AJAXMapRequest();
    
    QueryParameters.TrackType = document.getElementById('ctl00_MainContent_SelectActivityType_SelectedActivityId').value;
    QueryParameters.TrackCategory = 0;
    if (mapmode == "3D")
    {
        if ((map.GetHeading() < 190) && (map.GetHeading() > 170))
        {
            QueryParameters.NWLat = SELatLong.Latitude;
            QueryParameters.NWLong = SELatLong.Longitude;
            QueryParameters.SELat = NWLatLong.Latitude;
            QueryParameters.SELong = NWLatLong.Longitude;
        }
        else
        {
            QueryParameters.NWLat = NWLatLong.Latitude;
            QueryParameters.NWLong = NWLatLong.Longitude;
            QueryParameters.SELat = SELatLong.Latitude;
            QueryParameters.SELong = SELatLong.Longitude;
        }
     }
     else
     {
        QueryParameters.NWLat = NWLatLong.Latitude;
        QueryParameters.NWLong = NWLatLong.Longitude;
        QueryParameters.SELat = SELatLong.Latitude;
        QueryParameters.SELong = SELatLong.Longitude;
     }
    
    if ((document.getElementById('ctl00_MainContent_cbShowRoutePins').checked) | (document.getElementById('ctl00_MainContent_cbShowPictures').checked) | (document.getElementById('ctl00_MainContent_cbShowPois').checked))
        MessageBox(true, "getting data....", 2000); 
    
    if (document.getElementById('ctl00_MainContent_cbShowRoutePins').checked)
        LeaveYourTracks.com.WSAjax.AJAXSvc.GetRoutesInArea(QueryParameters, OnGetRoutesComplete, OnCallError);
    if (document.getElementById('ctl00_MainContent_cbShowPictures').checked)
        LeaveYourTracks.com.WSAjax.AJAXSvc.GetPicturesInArea(QueryParameters, OnGetPicturesComplete, OnCallError);
    if (document.getElementById('ctl00_MainContent_cbShowPois').checked)
        LeaveYourTracks.com.WSAjax.AJAXSvc.GetPOIsInArea(QueryParameters, OnGetPOIsComplete, OnCallError);
}

function ItemsToShowClicked(itemchanged)
{
    switch (itemchanged)
    {
        case 1: //routes
            if (document.getElementById('ctl00_MainContent_cbShowRoutePins').checked == false)
            {
                layer = map.GetShapeLayerByIndex(6);
                layer.Hide();
                ClearAllRoutes();
                MapChanged = false;
            }
            else
            {
                layer = map.GetShapeLayerByIndex(6);
                layer.Show();
                if (MapChanged == true) GetStuffInArea();
            }
            break;
        case 2: //Pics
            if (document.getElementById('ctl00_MainContent_cbShowPictures').checked == false)
            {
                layer = map.GetShapeLayerByIndex(7);
                layer.Hide();
            }
            else
            {
                layer = map.GetShapeLayerByIndex(7);
                layer.Show();
                if (MapChanged == true) GetStuffInArea();
            }
            break;
        case 3: // POIs
            //alert('Show pois called');
            
            if (document.getElementById('ctl00_MainContent_cbShowPois') == undefined || document.getElementById('ctl00_MainContent_cbShowPois').checked == false)
            {
                layer = map.GetShapeLayerByIndex(8);
                layer.Hide();
            }
            else
            {
                layer = map.GetShapeLayerByIndex(8);
                layer.Show();
                if (MapChanged == true) GetStuffInArea();
            }
            break;
        case 4: // Tracktypes
            ClearAllRoutesAndPins();
            GetStuffInArea();
            break;
        case 5: // Tracks
            GetTracksForRoutesOnMap();
            break;    
    }
}
function OnGetRoutesComplete(result) 
{
    layer = map.GetShapeLayerByIndex(6);
    layer.DeleteAllShapes();
    if (result.length == 0)
    {   document.getElementById('RouteResultList').innerHTML = "Keine Touren gefunden!"; }
    else    
    {   document.getElementById('RouteResultList').innerHTML = ""; }
    for(i = 0; i < result.length; i++)
    {
        var RouteItem = result[i];
        var rli = CreateRouteResultListItem();
        document.getElementById('RouteResultList').innerHTML += String.format(rli, RouteItem.Name, RouteItem.Length, RouteItem.HeightDiff, RouteItem.DurationTravel, RouteItem.RouteTypeID, RouteItem.StartLat, RouteItem.StartLong, RouteItem.ID);
        RoutesOnMap[i] = RouteItem.ID;
        AddRoutePins(RouteItem);
    }
    
    /*if (document.getElementById('ctl00_MainContent_cbShowRoutes').checked)
    {
        var routes = 0;
        for(i = 0; i < result.length; i++)
        {
            var onMap = false;
            var RouteItem = result[i];
            for (a = 0; a < RoutesOnMap.length; a++)
            {
                if (RoutesOnMap[i] == RouteItem.ID)
                {
                    onMap = true;
                }
            }
            if (onMap == false)
            {
                MessageBox(true, "getting Track data....", 3000); 
                LoadRoute(RouteItem.ID);
                RoutesOnMap[routes] = RouteItem.ID;
                routes++;
            }
        }
    }*/
    gotRoutes = true;
    MessageBox(false, "", 1); 
}

function GetTracksForRoutesOnMap()
{
    for (var i = 1; i < 6; i++)
    {
        layer = map.GetShapeLayerByIndex(i);
        layer.DeleteAllShapes();
    }
    for(i = 0; i < RoutesOnMap.length; i++)
    {
        LoadRoute(RoutesOnMap[i]);
    }
}

function OnGetPicturesComplete(result)
{
    layer = map.GetShapeLayerByIndex(7);
    layer.DeleteAllShapes();
    for(i = 0; i < result.length; i++)
    {
        var PicItem = result[i];
        AddPicPins(PicItem);
    }
    gotPics = true;
    MessageBox(false, "", 1); 
}

function OnGetPOIsComplete(result) 
{
    layer = map.GetShapeLayerByIndex(8);
    layer.DeleteAllShapes();
    for(i = 0; i < result.length; i++)
    {
        var POIItem = result[i];
        AddPOIPins(POIItem);
    }
    gotPOIs = true;
    MessageBox(false, "", 1); 
}

function AddPicPins(PicItem)
{   
    shapePic = "shapePic" + pinid;
    var description = CreatePicturePopup();
    description = String.format(description, PicItem.ID, PicItem.Caption, PicItem.ImageURL, PicItem.Description, PicItem.CreatedByUserAvatarURL, PicItem.CreatedByUserID, PicItem.CreatedByUserName,  formatDate(PicItem.DateTimeTaken, "d. NNN. yyyy"));
    shapePic = new VEShape(VEShapeType.Pushpin, new VELatLong(PicItem.Latitude, PicItem.Longitude));
    shapePic.SetAltitude(0.0, VEAltitudeMode.RelativeToGround);
    layer = map.GetShapeLayerByIndex(7);
    shapePic.SetCustomIcon(SetPinIcon('picture', 'gr', mapmode)); 
    shapePic.SetTitle("");
    shapePic.SetDescription(description);
    shapePic.SetPhotoURL = PicItem.ImageURL;
    layer.AddShape(shapePic);
    pinid++;
}

function AddPOIPins(POIItem)
{   
    shapePOI = "shapePOI" + pinid;
    var description = "";
    if (POIItem.ShowGroupAsOwner)
    {   description = CreatePOIPopup(); }
    else
    {   description = CreatePOIPopupGroup(); }
    description = String.format(description, String.format("/App_Themes/CWDefault/PoiIcons/POIIcon-{0}.png", POIItem.POIType), POIItem.ID, POIItem.Name, POIItem.POIPicturePath, POIItem.Description, POIItem.CreatedByUserAvatarURL, POIItem.CreatedByUserID, POIItem.CreatedByUserName, formatDate(POIItem.DateLastUpdated, "d. NNN. yyyy"), "none");
    shapePOI = new VEShape(VEShapeType.Pushpin, new VELatLong(POIItem.Latitude, POIItem.Longitude));
    shapePOI.SetAltitude(0.0, VEAltitudeMode.RelativeToGround);
    layer = map.GetShapeLayerByIndex(8);
    shapePOI.SetCustomIcon(SetPOIIcon(POIItem.POIType, 'kl', mapmode));     
    shapePOI.SetTitle("");
    shapePOI.SetDescription(description);
    layer.AddShape(shapePOI);
    pinid++;
}

function AddRoutePins(RouteItem)
{   
    shapeStart = "shapeStart" + pinid;
    var description = CreateRoutePopup();
    description = String.format(description, RouteItem.Name, RouteItem.Location, RouteItem.MainPicturePath, RouteItem.RouteTypeID, RouteItem.Length, RouteItem.HeightDiff, RouteItem.DurationTravel, RouteItem.UserAvatarImage, RouteItem.CreatedByUserID, RouteItem.CreatedByUserName, formatDate(RouteItem.DateStart, "d. NNN. yyyy"), RouteItem.Summary, RouteItem.ID);
    shapeStart = new VEShape(VEShapeType.Pushpin, new VELatLong(RouteItem.StartLat, RouteItem.StartLong, 0, VEAltitudeMode.RelativeToGround));  
    layer = map.GetShapeLayerByIndex(6);
    map.SetInfoBoxStyles();
    if (RouteItem.IsRoundTrip == true)
    {
        shapeStart.SetCustomIcon(SetPinIcon('startend', 'gr', mapmode));
        shapeStart.SetTitle("");
        shapeStart.SetDescription(description);
        layer.AddShape(shapeStart);
        pinid++;
    }
    else
    {
        shapeStart.SetCustomIcon(SetPinIcon('start', 'gr', mapmode)); 
        shapeStart.SetTitle("");
        shapeStart.SetDescription(description);
        layer.AddShape(shapeStart);
        pinid++;
        shapeEnd = "shapeEnd" + pinid;
        shapeEnd = new VEShape(VEShapeType.Pushpin, new VELatLong(RouteItem.EndLat, RouteItem.EndLong, 0, VEAltitudeMode.RelativeToGround));  
        shapeEnd.SetCustomIcon(SetPinIcon('end', 'gr', mapmode)); 
        shapeEnd.SetTitle("");
        shapeEnd.SetDescription(description);
        layer.AddShape(shapeEnd);
        pinid++;
    }
} 
function OnCallError(error, userContext, methodName) 
{
    if(error !== null) 
    {
        alert('Error Type:\n' + error.get_exceptionType() + '\n\nError:\n' + error.get_message() + '\n\nStack Trace:\n' + error.get_stackTrace());
    }
}

function LoadRoute(routeid)
{
    LeaveYourTracks.com.WSAjax.AJAXSvc.GetRoutePolyLine(routeid, OnGetRouteRequestComplete, OnCallError);
}

function OnGetRouteRequestComplete(result)
{ 
    if (result == undefined)
    {
        alert("result == undefined");
        return false;
    }
    if (result.length == 0)
    {
       DebugPrint("empty");
       return false;
    }
      
    var points = new Array; 
    var points3D = new Array;
    var routemode;
    if (result[0].Ele == 0)
    {    routemode = "2D";}
    else
    {    routemode = "3D";}
    for(i = 0; i < result.length; i=i+1)
    {
        var objItem = result[i]; 
        var p; 
        if ((routemode == "3D") && (mapmode = "3D"))
        { 
            var p3D = new VELatLong(objItem.Lat, objItem.Lon, objItem.Ele, VEAltitudeMode.Absolute); 
            points3D.push(p3D);
        }
        p = new VELatLong(objItem.Lat, objItem.Lon); 
        points.push(p);
        
    }
    MessageBox(true, "adding tracks to map....", 1000); 
    layer = map.GetShapeLayerByIndex(LayerUsed);
    var shapeRoute = new VEShape(VEShapeType.Polyline, points);
    shapeRoute.HideIcon();
    shapeRoute.SetFillColor(new VEColor(0,0,0,0));
    shapeRoute.SetLineWidth(4);
    shapeRoute.SetLineColor(LYTColors[LayerUsed]);
    layer.AddShape(shapeRoute);
    if ((routemode == "3D") && (mapmode = "3D"))
    {
        var shapeRoute3D = new VEShape(VEShapeType.Polyline, points3D);
        shapeRoute3D.HideIcon();
        shapeRoute3D.SetFillColor(new VEColor(0,0,0,0));
        shapeRoute3D.SetLineWidth(4);
        shapeRoute.SetLineWidth(2);
        shapeRoute.SetLineColor(new VEColor(150,150,150,0.8));
        shapeRoute3D.SetLineColor(LYTColors[LayerUsed]);
        layer.AddShape(shapeRoute3D);
    }
    LayerUsed++;
    if (LayerUsed == 6)
        LayerUsed = 1;
}

function ClearAllRoutes()
{
    for (var i = 1; i < 6; i++)
    {
        layer = map.GetShapeLayerByIndex(i);
        layer.DeleteAllShapes();
    }
    RoutesOnMap = new Array();
}

function ClearAllRoutesAndPins()
{
    for (var i = 1; i < 6; i++)
    {
        layer = map.GetShapeLayerByIndex(i);
        layer.DeleteAllShapes();
    }
    RoutesOnMap = new Array();
    layer = map.GetShapeLayerByIndex(6);
    layer.DeleteAllShapes();
}

function ClearMap()
{
    for (var i = 1; i < 6; i++)
    {
        layer = map.GetShapeLayerByIndex(i);
        layer.DeleteAllShapes();
    }
    layer = map.GetShapeLayerByIndex(6);
    layer.DeleteAllShapes();
    layer = map.GetShapeLayerByIndex(7);
    layer.DeleteAllShapes();
    layer = map.GetShapeLayerByIndex(8);
    layer.DeleteAllShapes();
    layer = map.GetShapeLayerByIndex(9);
    layer.DeleteAllShapes();
    layer = map.GetShapeLayerByIndex(10);
    layer.DeleteAllShapes();
    layer = map.GetShapeLayerByIndex(11);
    layer.DeleteAllShapes();
    document.getElementById('ctl00_MainContent_cbShowRoutePins').checked = false;
    document.getElementById('ctl00_MainContent_cbShowPictures').checked = false;
    document.getElementById('ctl00_MainContent_cbShowPois').checked = false;
    RoutesOnMap = new Array();
}

function HighlightRoute(routeid, lat, lon)
{
    shapeHighlight = new VEShape(VEShapeType.Pushpin, new VELatLong(lat, lon, 0, VEAltitudeMode.RelativeToGround));
    shapeHighlight.SetCustomIcon(SetPinIcon('highlight', 'gr', mapmode));
    shapeHighlight.SetTitle("");
    shapeHighlight.SetDescription("");
    layer = map.GetShapeLayerByIndex(11);
    layer.AddShape(shapeHighlight);
}

function RemoveHighlightRoute(routeid)
{
    layer = map.GetShapeLayerByIndex(11);
    layer.DeleteAllShapes();
}

function RouteDetailsClick(routeid)
{
    window.location = String.format("/RouteDetails.aspx?RouteID={0}", routeid);
}

function MessageBox(show, message, timeout) 
{ 
    var balloon = $get('messageBalloon'); 
    if (!show) 
        balloon.style.display = 'none'; 
    else 
    { 
        balloon.style.display = 'block'; 
        balloon.innerHTML = message; 
        if (timeout) 
            setTimeout('MessageBox(false)', timeout); 
    } 
}

function MoveMap()
{
    try        
    {   
        layer = map.GetShapeLayerByIndex(12);
        layer.DeleteAllShapes();         
        //map.Find(null, document.getElementById('ctl00_MainContent_tbGoTo').value);  
        results = map.Find(null,
                          document.getElementById('ctl00_MainContent_tbGoTo').value,
                          null,
                          null,
                          index,
                          20,
                          false,
                          false,
                          false,
                          null,
                          callback);  
        //index = parseInt(index) + 19;                    
    }         
    catch(e)         
    {            
        alert(e.message);         
    }
    
 
    //shapeLoc = "shapePOI" + pinid;
    //var description = "";
    //shapeLoc = new VEShape(VEShapeType.Pushpin, c[x].LatLong);
    //shapeLoc.SetAltitude(0.0, VEAltitudeMode.RelativeToGround);
    //layer = map.GetShapeLayerByIndex(12);
    //shapeLoc.SetCustomIcon(SetPinIcon('start', 'gr', mapmode));     
    //shapeLoc.SetTitle("");
    //shapeLoc.SetDescription(description);
    //layer.AddShape(shapeLoc);
    //pinid++;
    
}

function callback(a,b,c,d,e)      
{
    var results = "";
    if (c != null && c.length > 1)         
    {
        results="<div style='font-size:13px; background-color:#eeeeee; color:#666666; padding:3px;'>More than one location was retruned. <br>Please select the location you were looking for:</div><br><br>";            
        for (x = 0; x < c.length; x++)            
        {               
            results+="<a href='javascript:map.Find(null, \"" +c[x].Name + "\");'>" + c[x].Name + "</a><br>";    
            shapeLoc = "shapeLoc" + pinid;
            var description = c[x].Name;
            shapeLoc = new VEShape(VEShapeType.Pushpin, c[x].LatLong);
            shapeLoc.SetAltitude(0.0, VEAltitudeMode.RelativeToGround);
            layer = map.GetShapeLayerByIndex(12);
            shapeLoc.SetCustomIcon(SetPinIcon('poi', 'gr', mapmode));     
            shapeLoc.SetTitle("");
            shapeLoc.SetDescription(description);
            layer.AddShape(shapeLoc);
            pinid++;        
        }
        results+="<br><br><a href='javascript:CloseSearch()' style='color:#ffcc33;'>Close this window </a>";
        document.getElementById('resultDiv').innerHTML = results;   
        document.getElementById('resultDiv').style.display = "block";                 
    }
    else if (c != null && c.length == 1) 
    {
        document.getElementById('resultDiv').style.display = "none";
        shapeLoc = "shapeLoc" + pinid;
        var description = c[0].Name;
        shapeLoc = new VEShape(VEShapeType.Pushpin, c[0].LatLong);
        shapeLoc.SetAltitude(0.0, VEAltitudeMode.RelativeToGround);
        layer = map.GetShapeLayerByIndex(12);
        shapeLoc.SetCustomIcon(SetPinIcon('poi', 'gr', mapmode));     
        shapeLoc.SetTitle("");
        shapeLoc.SetDescription(description);
        layer.AddShape(shapeLoc);
        pinid++;
    }
    else
    {
        results="<div style='font-size:13px; color:#666666; padding:3px;'>No Location was found. <br>Try adding the state or crountryname seperated by colons!</div><br>";            
        results+="<br><br><a href='javascript:CloseSearch()' style='color:#ffcc33;'>Close this window </a>";
        document.getElementById('resultDiv').innerHTML = results;
        document.getElementById('resultDiv').style.display = "block";
        layer = map.GetShapeLayerByIndex(12);
        layer.DeleteAllShapes();
    }
}

function CloseSearch()
{
    document.getElementById('resultDiv').innerHTML = "";
    document.getElementById('resultDiv').style.display = "none";
    layer = map.GetShapeLayerByIndex(12);
    layer.DeleteAllShapes();     
}
