﻿// JScript File
var debug = true;

var divMap;
var divMapOptions;
var divMapOptionsHeader;
var divMapOptionsBody;

var divUserInfo;
var divUserInfoHeader;
var divUserInfoBody;

var divTrack;
var divTrackBody;

var divLocation;

var centerpushpin;

var UserCode;
var UserCodeSelected = 0;
//var map = null;

//var polyk;
var users;
var mousedown = false;

var XMLHTTP = null;
var resptext;

var loadedtrack;

var myWidth, myHeight;

// Map center in VeLatLon
var center;

// Found map locations
//var locations = null;
var prevlocationmatch = "";

var findresults = "";
var findresultsstring = "";
var findindex = 0;
var findwhat;
var findwhere;

//window.onload = OnLoad();
//window.onresize = OnResize();

function User(icode, ilogin, ilat, ilon, ialt, ispeed, icourse, iposdate)
{
    this.code = icode;
    this.login = ilogin;
    this.lat = ilat;
    this.lon = ilon;
    this.alt - ialt;
    this.speed = ispeed;
    this.course = icourse;
    this.posdate = new Date(0);
    
    var dateutc = new Date(Date.parse(iposdate)); 
    this.posdate.setTime(dateutc.getTime() - this.posdate.getTimezoneOffset()*60*1000);
}

function CreatePushpin(pinid, lat, lon, speed)
{
    var pin = document.createElement("div");
    var img = document.createElement("img");
    
    if(parseFloat(speed) > 0)
    {
        img.src = "images/icons/3.gif";
    }
    else
    {
        img.src = "images/icons/4.gif";
    }
    
    pin.appendChild(img);
    
    var ll = new VELatLong(lat, lon);    
    var pincenter = map.LatLongToPixel(ll);
    
    pin.id = pinid + "pin";
    
    pin.style.top = (parseInt(pincenter.y) - 12) + "px";
    pin.style.left = (parseInt(pincenter.x) - 12) + "px";
    pin.style.width = "25px";
    pin.style.height = "25px";
    pin.style.position = "absolute";
    pin.style.zIndex = "14";
    pin.style.cursor = "hand";
    
    pin.onclick = function() {        
        map.SetCenter(GetPinVELatLong(this.id));
    }
    
    pin.onmouseover = function() {        
        UserCodeSelected = parseInt(this.id);
        SetUserInfo();
    }
       
    divMap.appendChild(pin);   
    
    delete img;
    img = null;
    delete pin;
    pin = null; 
    delete ll;
    ll = null;
    delete pincenter;
    pincenter = null;
}

function SetUserInfo()
{
    var str;
    
    for(i = 0; i < users.length; i++)
    {
        if(users[i].code == parseInt(UserCodeSelected))
        {
            str = "Lat: " + users[i].lat + "<br>Lon: " + users[i].lon + "<br>Speed: " + users[i].speed + " Km/h<br>Date: " + users[i].posdate.toLocaleString()
            divUserInfoBody.innerHTML = str;
            divUserInfoHeader.innerHTML = "Selected User: " + users[i].login;   
            
            delete str;
            str = null;         
        }
    }
}

function GetPinVELatLong(id)
{
    for(i = 0; i < users.length; i++)
    {
        if(users[i].code == parseInt(id))
        {
            return new VELatLong(users[i].lat, users[i].lon);
        }
    }
}

function OnMouseMove()
{
    if(mousedown == true)
    {
        center = map.GetCenter();
        
        UpdatePushpins();
        CenterPushpin();

        //if (debug) 
        {
            ShowCenterCoordinates();
        }
    }
}

function ShowCenterCoordinates() 
{
    var str = "";

    if (debug) 
    {
        str += "Lat: " + center.Latitude.toFixed(4) + " Lon: " + center.Longitude.toFixed(4);
        
        str += " X-tile: " + (Math.round(LongitudeToXAtZoom(center.Longitude, 19) / 256));
        str += " Y-tile: " + (Math.round(LatitudeToYAtZoom(center.Latitude, 19) / 256));
    }
    
    divLocation.innerHTML = str + "<br>";
}

function GetFindLocationsResults(locations) 
{    
    var s = "";    
    
    if (locations) 
    {
        s = locations[0].Name;
        
        /*for (var i = 0; i < locations.length; i++) 
        {
            if (prevlocationmatch != locations[i].Name && locations[i].Name != "") 
            {
                s += "<br>" + locations[i].Name;
            }
            
            prevlocationmatch = locations[i].Name;
        }*/

        divLocation.innerHTML += s;
    }
}
    
function GetMyCookie(sName)
{
 var sRE = "(?:; )?" + sName + "=([^;]*);?";
    var oRE = new RegExp(sRE);
    
    if(oRE.test(document.cookie))
    {
        return decodeURIComponent(RegExp["$1"]);
    }
    else
    {
        return null;
    }
}   

function LoadTracks(usercode)
{
    var opt;
    var posdate; 
    var dateutc;
    
    var tracks = GetTracks(usercode);
    
    if(tracks != "ERROR")
    {
        if(tracks != "0")
        {
            var tss = tracks.split("_");
            
            if(tss.length > 1)
            {
                var selTracks = document.getElementById("selTracks");
                
                for(i = selTracks.options.length-1; i >= 1; i--)
                {                
                    selTracks.remove(i);
                }          
            
                for(i = 0; tss[i] != ""; i += 3)
                {
                    posdate = new Date(0);    
                    dateutc = new Date(Date.parse(tss[i+2])); 
                    posdate.setTime(dateutc.getTime() - posdate.getTimezoneOffset()*60*1000);                   
                    
                    opt = document.createElement("option");
                    opt.appendChild(document.createTextNode(tss[i+1] + " (" + posdate.toLocaleString() + ")"));
                    opt.setAttribute("value", tss[i]);
                    
                    selTracks.appendChild(opt);
                    
                    delete opt;
                    opt = null;
                }        
            }
        }   
        else
        {
            var selTracks = document.getElementById("selTracks");
                
            for(i = selTracks.options.length-1; i >= 1; i--)
            {                
                selTracks.remove(i);
            }          
                    
            opt = document.createElement("option");
            opt.appendChild(document.createTextNode("no tracks"));
            opt.setAttribute("value", "-1");
            
            selTracks.appendChild(opt);
            
            delete opt;
            opt = null;       
        } 
    }
}

function LoadTrack(trackcode)
{
    var track = GetTrack(trackcode);
    
    if(track != "ERROR" && track != "0")
    {
        var tss = track.split("_");
        
        if(tss.length > 1)
        {
            delete loadedtrack;
            loadedtrack = null; 
            
            loadedtrack = new Array();
            
            for(i = 0, j = 0; tss[i] != ""; i += 2, j++)
            {
                //loadedtrack[i] = parseFloat(tss[i]);
                loadedtrack[j] = new VELatLong(tss[i], tss[i+1], 0, VEAltitudeMode.RelativeToGround);
            }
            
            return true;
        }
    }
    
    return false;
}

function OnTrackChange()
{
    var selTracks = document.getElementById("selTracks");
    
    if(parseInt(selTracks.value) > 0)
    {
        map.DeleteAllPolylines();
        if(LoadTrack(selTracks.value) == true)
        {
            DrawPoly("track1", loadedtrack, 2, new VEColor(0,0,0,1.0));
            map.SetMapView(loadedtrack);
        }
    }
    else
    {
        
    }
    
    delete selTracks;
    selTracks = null;
}
    
function OnLoad()
{     
    GetMap();
    
    // Get UserCode from cookie    
    UserCode = GetMyCookie("usercode");
       
    //CreatePushpin("100", 60.03535, 30.41368, 0);

    if (debug) 
    {
        //divMapOptions.style.visibility = "visible";
    }
                
    if(UserCode != null && UserCode != 0)
    {      
        users = new Array();
        
        if(divUserInfo != null)
        {
            divUserInfo.style.visibility = "visible";            
        }        
        if(divTrack != null)
        {
            divTrack.style.visibility = "visible";
            // DEBUG
            //divTrack.style.visibility = "hidden";
        }
        
        // Load user tracks
        LoadTracks(UserCode);       
        
        OnTimer();
        setInterval("OnTimer()", 5000);
    }
    else
    {
        if(divUserInfo != null)
        {
            divUserInfo.style.visibility = "hidden";
        }        
        if(divTrack != null)
        {
            divTrack.style.visibility = "hidden";
        }
    }
}

function UpdatePushpins()
{
    var ll;
    var pincenter;
    var pin;
    
    for(var i = 0; i < divMap.childNodes.length; i++)
    {                
        pin = divMap.childNodes[i];
        
        if(pin.id.indexOf("pin") > 0)
        {                
            for(var j = 0; j < users.length; j++)
            {
                if(users[j].code == parseInt(pin.id))
                {
                    ll = new VELatLong(users[j].lat, users[j].lon);    
                    pincenter = map.LatLongToPixel(ll);
                    
                    pin.style.top = (parseInt(pincenter.y) - 12) + "px";
                    pin.style.left = (parseInt(pincenter.x) - 12) + "px";
                    
                    delete pincenter;
                    pincenter = null;
                    delete ll;
                    ll = null;
                }
            }          
        }
        
        delete pin;
        pin = null;
    }
}

function OnTimer()
{     
    var ss;
    var coords;   
   
    if(UserCode > 0)
    {      
        coords = GetUserCoordinates(UserCode);
        
        if(coords != "ERROR" && coords != "" && coords != "0")
        {             
            ss = coords.split("_");
            
            if(ss.length > 7)
            {                        
                var pin;  
                
                for(i = 0; i < divMap.childNodes.length; i++)
                {                
                    pin = divMap.childNodes[i];
                    
                    if(pin.id.indexOf("pin") > 0)
                    {                
                        divMap.removeChild(pin);
                    }
                    
                    delete pin;
                    pin = null;
                }
                
                for(i = 0; i < users.length; i++)
                {
                    delete users[i];
                    users[i] = null;
                }
                
                delete users;
                users = null;
                
                users = new Array();            
                
                var oUser;
                
                for(i = 0; ss[i] != "" && ss[i+7] != "" && ss[i] != null && ss[i+7] != null; i += 8)
                {
                    oUser = new User(ss[i], ss[i+1], ss[i+2], ss[i+3], ss[i+4], ss[i+5], ss[i+6], ss[i+7]);
                    users.push(oUser);     
                    delete oUser;
                    oUser = null; 
                }
                   
               SetUserInfo();
               
               for(i = 0; i < users.length; i++)
               {              
                   CreatePushpin(users[i].code, users[i].lat, users[i].lon, users[i].speed); 
               }
                
                delete coords;
                coords = null;
                
                delete ss;
                ss = null;
                
                // Add connecting polylines
                /*if(i != 0)
                { 
                    cbMapOptionsShowDistances = document.getElementById("cbMapOptionsShowDistances");   
                    
                    if(cbMapOptionsShowDistances.checked == true)
                    {                        
                        for(j = i; j > 0; j -= 8)
                        {
                            DrawPoly(polyk, [new VELatLong(ss[j+2-7],ss[j+3-7]), new VELatLong(ss[i+2],ss[i+3])], 2, new VEColor(250,250,50,1.0));
                            polyk++;
                        }
                    }
                }*/
                
                /*try
                {
                    var coord1 = new VELatLong(ss[i+2], ss[i+3]);
                    var coord2 = new VELatLong(ss[i+2+7], ss[i+3+7]);
                    map.GetRoute(coord1, coord2);
                }
                catch(exeption)
                {
                
                }*/
            }
        }         
    }    
}
  
function DrawPoly(id,points,width,color)
{    
    /*var poly = new VEShape(VEShapeType.Polygon, points);
    var poly = map.AddShape(poly);   
    poly.SetTitle(id);
    poly.SetLineWidth(width);
    poly.SetLineColor(color);*/
    //map.AddShape(poly);    
    
    // Old style
    poly = new VEPolyline(id,points);
    poly.SetWidth(width);
    poly.SetColor(color);
    map.AddPolyline(poly);
}

  
function GetMap()
{
     SetDiv();
     
     try
     {
        map = new VEMap('divMap');
        
        var rlat = Math.random() * 90.0;
        var rlon = Math.random() * 90.0;
        var rzoom = Math.random() * 12+4;
        
        //map.LoadMap(new VELatLong(rlat, rlon), parseInt(rzoom), 'r', false, VEMapMode.Mode2D, false);
        //map.LoadMap(new VELatLong(45.0, 0.0), 2, 'r', false, VEMapMode.Mode2D, false);
        map.LoadMap();
        
        map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);
        
        if(document.URL.indexOf("map.aspx") > 0)
        {
            map.ShowDashboard();
            //map.ShowMiniMap();
        }
        else
        {
            map.HideDashboard();
            //map.HideMiniMap();
        }

        center = new VELatLong();
        center = map.GetCenter();

        // Show center pushpin
        CenterPushpin();
     }
     catch(exeption)
     {
     
     }  
     
     //divMap.onmousemove = OnMouseMove();
     
     map.AttachEvent('onclick', OnMapClick); 
     map.AttachEvent('oncontextmenu', OnMapRightClick);
     map.AttachEvent('onmousedown', OnMapMouseDown);
     map.AttachEvent('onmouseup', OnMapMouseUp);
     map.AttachEvent('onendzoom', OnEndZoom);
     map.AttachEvent('onendcontinuouspan', OnEndContinuousPan);
     //map.ShowFindControl();

     //centerpushpin.AttachEvent('onmousedown', OnCenterClick);

     findwhat = "Casino";
     findwhere = "Las Vegas";
     //FindLoc2();
 } 

function CenterPushpin() 
{
    if (centerpushpin == null) 
    {
        centerpushpin = new VEShape(VEShapeType.Pushpin, center);
        centerpushpin.SetCustomIcon("<div><img src='images/icons/centerpushpin.gif'></div>");
       
        //centerpushpin.SetTitle("Center");
        //centerpushpin.SetDescription("Center Position");

        //map.DeleteAllShapes();
        map.AddShape(centerpushpin);

        centerpushpin.Show();
        centerpushpin.ShowIcon();
    }
    else 
    {
        centerpushpin.SetPoints(center);        
    }
}
  
function OnMapClick(e)
{        
    //map.SetCenter(e.view.LatLong);
    
    // DEBUG 
    //InitGLib();
}

function OnMapRightClick(e)
{
   
}

function OnMapMouseDown(e)
{
    mousedown = true;
}

function OnMapMouseUp(e)
{
    mousedown = false;

    // Find location street address
    map.FindLocations(center, GetFindLocationsResults);

    if (debug) 
    {
        // Find all location businesses
        /*findwhat = "Park";
        findwhere = "Las Vegas";
        //FindLoc();*/        
    }
}

// Show locations
function FindLoc2() 
{
    findresults = null;
    findresultsstring = "";
    findindex = 0;
    map.Find(findwhat, findwhere, VEFindType.Businesses, null, findindex, 20, true, true, false, true, GetFindResults2);
}

function GetFindResults2(layer, resultsArray, places, hasMore, veErrorMessage) 
{
    if (resultsArray) 
    {
        findindex += resultsArray.length;
    }

    if (hasMore) 
    {
        map.Find(findwhat, findwhere, VEFindType.Businesses, null, findindex, 20, true, true, false, true, GetFindResults2);
    }   
}

// Dont show locations, update database
function FindLoc() 
{
    findresults = null;
    findresultsstring = "";
    findindex = 0;
    map.Find(findwhat, findwhere, VEFindType.Businesses, null, findindex, 20, false, false, false, true, GetFindResults);
}

function GetFindResults(layer, resultsArray, places, hasMore, veErrorMessage) 
{
    if (resultsArray) 
    {
        for (var i = 0; i < resultsArray.length; i++) 
        {            
            //findresults += resultsArray[i];
            //findresultsstring += resultsArray[i].Name + "<br>";

            var resp = AddGeocode(resultsArray[i].LatLong.Latitude, resultsArray[i].LatLong.Longitude, resultsArray[i].Name, resultsArray[i].Description, resultsArray[i].Phone);

            if (resp == "ERROR") 
            {
                divMapOptionsBody.innerHTML += "ERROR";
                return;
            }
        }

        findindex += resultsArray.length;
    }    
    
    if (hasMore) 
    {
        map.Find(findwhat, findwhere, VEFindType.Businesses, null, findindex, 20, false, false, false, true, GetFindResults);       
    }
    else 
    {
        /*for (var i = 0; findresults.length; i++) 
        {
            findresultsstring += findresults[i].Name + "<br>";
        }*/

        //divMapOptionsBody.innerHTML += findresultsstring;
        divMapOptionsBody.innerHTML += "Geocode database updated: " + (findindex + resultsArray.length);  
    }
}

function AddGeocode(lat, lon, name, desc, phone) 
{
    try 
    {
        if (XMLHTTP == null) 
        {
            XMLHTTP = getXMLHTTP();
        }

        if (XMLHTTP != null) 
        {
            // Remove & char
            name = name.replace(" & ", " and ");
            name = name.replace("& ", "and ");
            name = name.replace("&", "and");           
            
            XMLHTTP.open("get", "i.aspx?a=addgeo&lat=" + lat + "&lon=" + lon + "&name=" + name + "&desc=" + desc + "&phone=" + phone + "&what=" + findwhat, false);
            XMLHTTP.send(null);
            resptext = XMLHTTP.responseText;
            return resptext;
        }
    }
    catch (exeption) 
    {
        return "ERROR";
    }
}

function OnEndZoom(e)
{
    UpdatePushpins();
}

function OnEndContinuousPan(e)
{
    UpdatePushpins();
}
  
function SetDiv()
{
    GetBrowserSize();
    
    divMap = document.getElementById("divMap");
    divMap.style.width = (myWidth-0) + "px";
    divMap.style.height = (myHeight-60-40) + "px";
    divMap.style.position = "absolute";

    var divHeader = document.getElementById("divHeader");
    divHeader.style.width = (myWidth-0) + "px";
    divHeader.style.position = "absolute";

    //var divBody = document.getElementById("divBody");                                
    //divBody.style.top = parseInt(divHeader.style.height) + "px";
    //divBody.style.position = "absolute";
    //divBody.style.background = "transparent";

    var divFooter = document.getElementById("divFooter");                
    divFooter.style.width = (myWidth-0) + "px";
    divFooter.style.top = (myHeight - parseInt(divFooter.style.height)) + "px";
    divFooter.style.position = "absolute";

    //divBody.style.height = parseInt(divFooter.style.top) - parseInt(divHeader.style.height) + "px";    

   // Set map options position
    try
    {
        divMapOptions = document.getElementById("divMapOptions");
        divMapOptions.style.top = parseInt(divHeader.style.height) + "px";
        divMapOptions.style.left = myWidth - parseInt(divMapOptions.style.width) + "px";   
        
        divMapOptionsHeader = document.getElementById("divMapOptionsHeader");          
        divMapOptionsBody = document.getElementById("divMapOptionsBody");             
    }
    catch(exeption)
    {
    
    }        
    
    // Set user info position
    try
    {
        divUserInfo = document.getElementById("divUserInfo");
        divUserInfo.style.top = parseInt(divHeader.style.height) + "px";
        divUserInfo.style.left = myWidth - parseInt(divUserInfo.style.width) + "px";
        
        divUserInfoHeader = document.getElementById("divUserInfoHeader");          
        divUserInfoBody = document.getElementById("divUserInfoBody");
    }
    catch(exeption)
    {
    
    }   
    
    // Set Track panel position
    try
    {
        divTrack = document.getElementById("divTrack");
        divTrack.style.top = (parseInt(divUserInfo.style.top) + parseInt(divUserInfo.style.height)) + "px";
        divTrack.style.left = myWidth-0 - parseInt(divTrack.style.width) + "px";
    
        divTrackBody = document.getElementById("divTrackBody");
    }
    catch(exeption)
    {

    }

    // Set Location panel position
    try 
    {
        divLocation = document.getElementById("divLocation");
        divLocation.style.width = 500 + "px";
        divLocation.style.top = (myHeight - parseInt(divFooter.style.height) - parseInt(divLocation.style.height)) + "px";
        divLocation.style.left = Math.round(((myWidth - parseInt(divLocation.style.width)) / 2)) + "px";

        divLocation = document.getElementById("divLocation");
    }
    catch (exeption) 
    {

    }   
}
    
function OnResize()
{           
    SetDiv();
    //GetMap();
    try
    {            
        map.Resize(parseInt(divMap.style.width, 10), parseInt(divMap.style.height, 10));
    }
    catch(exeption)
    {
    
    }
}

function getXMLHTTP()
{
    if(typeof XMLHttpRequest != "undefined")
    {        
        return new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {    
        var aVersions = ["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];
        
        for(var i = 0; i < aVersions.length; i++)
        {
            try
            {
                var oXmlHttp = new ActiveXObject(aVersions[i]);
                return oXmlHttp;
            }
            catch(oError)
            {
                
            }            
        }
    }
    
    return null;
}

function GetUserCoordinates(usercode)
{
    try
    {                
        if(XMLHTTP == null)
        { 
            XMLHTTP = getXMLHTTP();       
        }
        
        if(XMLHTTP != null)
        {            
            XMLHTTP.open("get", "i.aspx?a=g&ver=17&c=" + usercode, false);            
            XMLHTTP.send(null);            
            resptext = XMLHTTP.responseText;
            return resptext;
        }
    }
    catch(exeption)
    {
        return "ERROR";
    }
}

function GetTracks(usercode)
{
    try
    {
        if(XMLHTTP == null)
        { 
            XMLHTTP = getXMLHTTP();       
        }
        
        if(XMLHTTP != null)
        {            
            XMLHTTP.open("get", "i.aspx?a=gts&ver=17&c=" + usercode, false);
            XMLHTTP.send(null);            
            resptext = XMLHTTP.responseText;
            return resptext;
        }
    }
    catch(exeption)
    {
        return "ERROR";
    }
}

function GetTrack(trackcode)
{
    try
    {       
        if(XMLHTTP == null)
        { 
            XMLHTTP = getXMLHTTP();       
        }
        
        if(XMLHTTP != null)
        {            
            XMLHTTP.open("get", "i.aspx?a=gt&ver=17&t=" + trackcode, false);
            XMLHTTP.send(null);            
            resptext = XMLHTTP.responseText;
            return resptext;
        }
    }
    catch(exeption)
    {
        return "ERROR";
    }
}

function InitGLib()
{
    var jg = new jsGraphics("divMap");
    //var jg = new jsGraphics();
    
    var Xpoints = new Array(10,285,493,60);
    var Ypoints = new Array(50,210,405,87);
    
    jg.setPrintable(false);
    jg.setStroke(3);
    
    jg.setColor("#ff0000"); 
    jg.drawPolyline(Xpoints,Ypoints);
    //jg.drawLine(10, 113, 220, 55);
    jg.paint();
}

function GetBrowserSize() 
{  
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
}

var earthRadius = 6378137.0;
var earthCircum = earthRadius * 2.0 * 3.1415926;
var earthHalfCirc = earthCircum / 2;

function LatitudeToYAtZoom(lat, zoom)
{
    var arc = earthCircum / ((1 << zoom) * 256);
    var sinLat = Math.sin(DegToRad(lat));
    var metersY = earthRadius / 2 * Math.log((1 + sinLat) / (1 - sinLat));
    var y = Math.round((earthHalfCirc - metersY) / arc);
    return y;
}

function LongitudeToXAtZoom(lon, zoom)
{
    var arc = earthCircum / ((1 << zoom) * 256);
    var metersX = earthRadius * DegToRad(lon);
    var x = Math.round((earthHalfCirc + metersX) / arc);
    return x;
}

function DegToRad(d)
{
    return d * 3.1415926 / 180.0;
}

function RadToDeg(r)
{
    return r * 180.0 / 3.1415926;
}