﻿var map;
var company = getParameter("company");
var coachColor = company == "TL" ? "1" : "2";
var coachXml;
var layer;
var zoomToRoute = getParameter("route");
var firstLoad = true;

function init() {
    var winMap = new MasternautWindows(document.getElementById("divMap"), 0, 0, 560, 350, "Z-INDEX: 0;", null, false, lang["map"], false, false, false, false, false, false, false, 24, false, true);

    var mapMenu = [];
    var mapContextMenu = [{ name: "vehicle", subMenus: {} }, { name: "map", subMenus: { seeAddContact: false}}];
    map = new MasternautMap();
    map.NoMouseOver = true;
    var mapInterface = new MasternautMapInterface(map, winMap, mapMenu, mapContextMenu);

    layer = map.GetShapeLayer(MasternautMapLayer.Locator);
    map.AttachEvent("onlocatorloaded", sortOutPushpins);

    map.AttachEvent("onmouseover", function(shape) {
        raiseError();  // volontary throws error so VE bubble is displayed
    });

    map.ShowVehicleLive(null, null, null, true, false, true, true, true, true, true);

    setTimeout(refreshRouteCombo, 60 * 1000);
}

function sortOutPushpins(xml) {
    coachXml = xml;
    var cmbActiveRoutes = document.getElementById("cmbActiveRoutes");
    var evening = new Date().getHours() >= 12;
    
    for (var i = 0; i < layer.GetShapeCount(); i++) {
        var shape = layer.GetShapeByIndex(i);
        var routeNumber = null;
        for (var j = 0; j < cmbActiveRoutes.options.length; j++) {
            if (shape.GetTitle() == cmbActiveRoutes.options[j].value) {
                routeNumber = cmbActiveRoutes.options[j].text;
            }
        }
        if (routeNumber && (evening || getKilometersBetweenCoords(shape.GetPoints()[0].Latitude, shape.GetPoints()[0].Longitude, 51.50821, -0.12978)>18)) {
            var coach = xml.selectNodes("locator/group/loc[@mcuC=" + shape.MasternautId + "]")[0];
            shape.SetCustomIcon(shape.GetCustomIcon().CustomHTML.replace("_5_", "_" + coachColor + "_").replace("_3_", "_" + coachColor + "_"));
            shape.SetTitle("Route " + routeNumber);
            shape.SetDescription("Last reported location:<br>" + coach.getAttribute("time") + "<br>" + coach.getAttribute("add"));
            
        } else {
            layer.DeleteShape(shape);
            i--;
        }
    }
    if (zoomToRoute) {
        for (var i = 0; i < cmbActiveRoutes.options.length; i++) {
            if (cmbActiveRoutes.options[i].text == zoomToRoute) {
                cmbActiveRoutes.options[i].selected = true;
                changeRoute(cmbActiveRoutes.options[i].value);
            }
        }
    } else if (firstLoad) {
        changeRoute(0);
    }
    zoomToRoute = false;
    firstLoad = false;
}

function changeRoute(mcuName) {
    if (mcuName == 0) {
        if (layer.GetShapeCount() > 0) {
            map.SetMapView(layer.GetBoundingRectangle());
        }
        return;
    }

    var mcuXml = coachXml.selectNodes("locator/group/loc[@mcu='" + mcuName + "']")[0];
    var mcuCode = mcuXml.getAttribute("mcuC");
    var visibleCoach = false;
    for (var i = 0; i < layer.GetShapeCount(); i++) {
        if (layer.GetShapeByIndex(i).MasternautId == mcuCode) {
            visibleCoach = true;
            map.ZoomIn(mcuXml.getAttribute("lat"), mcuXml.getAttribute("lon"), 16);
        }
    }
    if (!visibleCoach) {
        alert("This coach is now inside London and can't be tracked");
    }
}

function refreshRouteCombo() {
    var cmbActiveRoutes = document.getElementById("cmbActiveRoutes");
    addToQueue("map_xml.aspx?mode=loadKFRoutes", 1, false, function(xml) {

        cmbActiveRoutes.options.length = 0;
        cmbActiveRoutes.options.add(new Option("-- All routes --", 0));
        var routeXml = xml.getElementsByTagName("rte");
        for (var i = 0; i < routeXml.length; i++) {
            cmbActiveRoutes.options.add(new Option(routeXml[i].getAttribute("text"), routeXml[i].getAttribute("id")));
        }
        setTimeout(refreshRouteCombo, 60 * 1000);

    });
}

function getKilometersBetweenCoords(lat1, lon1, lat2, lon2) {
    return 6378 * Math.acos(Math.cos(ToRad(lat1)) * Math.cos(ToRad(lat2)) * Math.cos(ToRad(lon2) - ToRad(lon1)) + Math.sin(ToRad(lat1)) * Math.sin(ToRad(lat2)));
}
function ToRad(number) {  // convert degrees to radians
    return number * Math.PI / 180;
}