﻿//Function to initialise map inside specified <div> tag to correct zoom level and location
function initialize_departure_map(map_canvas_id, map_zoom_level, init_lat, init_lon, trains_only) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(map_canvas_id));
        map.setCenter(new GLatLng(init_lat, init_lon), map_zoom_level);

        map.setMapType(G_NORMAL_MAP);
        map.addControl(new GLargeMapControl());
        
        //When the map is moved, redraw markers
        //And reload noticeboard page based on new Lat/Lon
        GEvent.addListener(map, "dragend", function() {
            dropmarkers_naptan(map, trains_only);
            //reload_noticeboard(map);
            //reload_whatson(map);
        });
        GEvent.addListener(map, "zoomend", function() {
            dropmarkers_naptan(map, trains_only);
            //reload_noticeboard(map);
            //reload_whatson(map);
        });
//        GEvent.addListener(map, "moveend", function() {
//        reload_noticeboard(map);
//        reload_whatson(map);
//        });

        return map;
    }
}

var journeyplanner_map_showmarkers = true;
function initialize_journeyplanner_map(map_canvas_id, map_zoom_level, init_lat, init_lon) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(map_canvas_id));
        map.setCenter(new GLatLng(init_lat, init_lon), map_zoom_level);

        map.setMapType(G_NORMAL_MAP);
        map.addControl(new GLargeMapControl());

        //When the map is moved, redraw markers
        //And reload noticeboard page based on new Lat/Lon
        GEvent.addListener(map, "dragend", function () {
            if (journeyplanner_map_showmarkers == true) {
                dropmarkers_journeyplan(map);
            }
            //reload_noticeboard(map);
            //reload_whatson(map);
        });
        GEvent.addListener(map, "zoomend", function() {
            if (journeyplanner_map_showmarkers == true) {
                dropmarkers_journeyplan(map);
            }
            //reload_noticeboard(map);
            //reload_whatson(map);
        });
//        GEvent.addListener(map, "moveend", function() {
//            reload_noticeboard(map);
//            reload_whatson(map);
//        });

        return map;
    }
}

//Function to initialise map inside specified <div> tag to correct zoom level and location
function initialize_county_map(map_canvas_id, map_zoom_level, init_lat, init_lon) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(map_canvas_id));
        map.setCenter(new GLatLng(init_lat, init_lon), map_zoom_level);

        map.setMapType(G_NORMAL_MAP);
        map.addControl(new GLargeMapControl());

        return map;
    }
}
function initialize_regional_map(map_canvas_id, map_zoom_level, init_lat, init_lon) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(map_canvas_id));
        map.setCenter(new GLatLng(init_lat, init_lon), map_zoom_level);

        map.setMapType(G_NORMAL_MAP);
        map.addControl(new GLargeMapControl());

        return map;
    }
}

//Function to reload noticeboard based on new map location
var xmlHttp_reload_container_noticeboard = null;
function reload_noticeboard(map_object) {
    var mapCenter = map_object.getCenter();
    var latitude = mapCenter.lat()
    var longitude = mapCenter.lng()
    reload_container_map('/controls/local-noticeboard-ajaxwrapper-latlon.aspx?Latitude=' + latitude + '&Longitude=' + longitude + '&UseCache=True', document.getElementById('LocalNoticeBoardContainer'), xmlHttp_reload_container_noticeboard);
}

//Function to reload whatson based on new map location
var xmlHttp_reload_container_whatson = null;
function reload_whatson(map_object) {
    var mapCenter = map_object.getCenter();
    var latitude = mapCenter.lat()
    var longitude = mapCenter.lng()
    reload_container_map('/controls/whatson-ajaxwrapper-latlon.aspx?Latitude=' + latitude + '&Longitude=' + longitude + '&UseCache=True', document.getElementById('WhatsOnContainer'), xmlHttp_reload_container_whatson);
}

//Function to drop Naptan markers onto specified map
var xmlHttp_dropmarkers_naptan = null;
function dropmarkers_naptan(map_object, trains_only) {
    if (xmlHttp_dropmarkers_naptan) {
        xmlHttp_dropmarkers_naptan.abort();
    }
    
    var xmlDoc = null;
    //Get the current map boundaries
    var bounds = map_object.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    //Calculate centre lat/lon and range values
    var latitude = ((northEast.lat() + southWest.lat()) / 2)
    var longitude = ((northEast.lng() + southWest.lng()) / 2)
    var range = ((northEast.lng() - southWest.lng()) / 2)
    // Create xmlHttp Object
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp_dropmarkers_naptan = new XMLHttpRequest();
    }
    catch (e) {
        try {
            // Internet Explorer
            xmlHttp_dropmarkers_naptan = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp_dropmarkers_naptan = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    // Event Handler - EventListener
    xmlHttp_dropmarkers_naptan.onreadystatechange = function () {
        if (xmlHttp_dropmarkers_naptan.readyState == 4) // 4: The Request is complete
        {
            xmlDoc = xmlHttp_dropmarkers_naptan.responseXML; // Response
            //Clear all markers before drawing new ones
            map_object.clearOverlays();
            //Get content by looping through XML returned by ContentStream
            x = xmlDoc.getElementsByTagName("NaptanLocation");
            for (i = 0; i <= x.length - 1; i++) {
                try {
                    AtcoCode = xmlDoc.getElementsByTagName("AtcoCode")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    AtcoCode = "";
                }
                try {
                    NaptanCode = xmlDoc.getElementsByTagName("NaptanCode")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    NaptanCode = "";
                }
                NaptanLocationLatitude = xmlDoc.getElementsByTagName("Latitude")[i].childNodes[0].nodeValue;
                NaptanLocationLongitude = xmlDoc.getElementsByTagName("Longitude")[i].childNodes[0].nodeValue;
                CommonName = xmlDoc.getElementsByTagName("CommonName")[i].childNodes[0].nodeValue;
                try {
                    Street = xmlDoc.getElementsByTagName("Street")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    Street = "";
                }
                try {
                    Indicator = xmlDoc.getElementsByTagName("Indicator")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    Indicator = "";
                }
                try {
                    Bearing = xmlDoc.getElementsByTagName("Bearing")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    Bearing = "";
                }
                StopType = xmlDoc.getElementsByTagName("StopType")[i].childNodes[0].nodeValue;
                //Drop marker on Map (only drop stations if flag is set)
                if (trains_only == '1') {
                    if (StopType == 'RLY' || StopType == 'MET') {
                        marker_naptan(map_object, StopType, NaptanLocationLatitude, NaptanLocationLongitude, CommonName, Street, Indicator, Bearing, AtcoCode, NaptanCode, trains_only);
                    }
                }
                else {
                    marker_naptan(map_object, StopType, NaptanLocationLatitude, NaptanLocationLongitude, CommonName, Street, Indicator, Bearing, AtcoCode, NaptanCode, trains_only);
                }

                //If this is the first marker (closest to centre) then open an info window
                if (i == 0) {
                    if (StopType == 'RLY' || StopType == 'MET') {
                        //                        map_object.openInfoWindowHtml(new GLatLng(NaptanLocationLatitude, NaptanLocationLongitude),
                        //                                                    "<b>" + CommonName + "</b><br /><small>Station</small><br />" +
                        //                                                    "<a href=\"javascript:naptan_times_refresh('" + AtcoCode + "', '" + CommonName + "', '" + StopType + "', 1);\"><small>Click here to display departure times below</small></a>");
                        //document.getElementById("LocationPlaceNameDeparturesPanel").innerHTML = '<img src="/images/travel-train.gif" alt="Travel by train" align="left" class="imgpadd" />' + CommonName + '<br /><span class="greysmall">Station - departure times shown below map</span>';
                    }
                    else if (StopType == 'BCT' || StopType == 'BCS') {
                        //                        map_object.openInfoWindowHtml(new GLatLng(NaptanLocationLatitude, NaptanLocationLongitude),
                        //                                                    "<b>" + Street + "</b><br />" +
                        //                                                    Indicator + " " + CommonName + "<br /><small>Bus Stop</small><br />" +
                        //                                                    "<small>Heading: " + Bearing + "</small><br />" +
                        //                                                    "<a href=\"javascript:naptan_times_refresh('" + AtcoCode + "', '" + Street + " (" + CommonName + "/" + Indicator + ")', '" + StopType + "', 1);\"><small>Click here to display departure times below</small></a>");
                        //document.getElementById("LocationPlaceNameDeparturesPanel").innerHTML = '<img src="/images/travel-bus.gif" alt="Travel by bus" align="left" class="imgpadd" />' + Street + ' <small>(' + CommonName + '/' + Indicator + ')</small><br /><span class="greysmall">Bus Stop - departure times shown below map</span>';
                    }
                }
            }
            xmlDoc = null;
            xmlHttp_dropmarkers_naptan = null;
        }
    }
    // Request to Send
    var myRand = parseInt(Math.random() * 999999);
    if (trains_only == '1') {
        xmlHttp_dropmarkers_naptan.open("GET", "/ws-internal/client_side/travelfor.asmx/GetStationsByLocation?MaxResults=100&Range=" + range + "&Latitude=" + latitude + "&Longitude=" + longitude + "&rand=" + myRand, true);
    }
    else {
        xmlHttp_dropmarkers_naptan.open("GET", "/ws-internal/client_side/travelfor.asmx/GetNaptanByLocation?MaxResults=100&Range=" + range + "&Latitude=" + latitude + "&Longitude=" + longitude + "&rand=" + myRand, true);
    }
    xmlHttp_dropmarkers_naptan.send(null);
    return true;
}

//Function to drop naptan marker on map
function marker_naptan(map_object, StopType, Latitude, Longitude, CommonName, Street, Indicator, Bearing, AtcoCode, NaptanCode, trains_only) {
    var markerIcon = new GIcon(G_DEFAULT_ICON);
    if (StopType == 'RLY' || StopType == 'MET') {
        markerIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=train|0088FF";
        markerText = CommonName;
    }
    else if (StopType == 'BCT' || StopType == 'BCS') {
    markerIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=bus|FF8800";
        markerText = Street + " (" + CommonName + "/" + Indicator + ")";
    }

    markerOptions = { icon: markerIcon, title: markerText };

    var point = new GLatLng(Latitude, Longitude);
    var marker = new GMarker(point, markerOptions);
    map_object.addOverlay(marker);
    //When a marker is clicked, pan map to marker. Pause before reloading markers to allow centre to update.
    GEvent.addListener(marker, "click", function () {
        map_object.panTo(point);
        window.setTimeout(function () { dropmarkers_naptan(map_object, trains_only); }, 10000);

        if (StopType == 'RLY' || StopType == 'MET') {
            naptan_times_refresh(AtcoCode, CommonName, StopType, 1)
            //document.getElementById("LocationPlaceNameDeparturesPanel").innerHTML = '<img src="/images/travel-train.gif" alt="Travel by train" align="left" class="imgpadd" />' + CommonName + '<br /><span class="greysmall">Station - <a target="_mytrainticket" rel="nofollow" href="/handlers/externalclick.aspx?label=timetables_train&amp;url=http%3A%2F%2Fwww.awin1.com%2Fcread.php%3Fawinmid%3D2927%26awinaffid%3D104479%26clickref%3Dtimetables_train%26p%3D">Buy tickets from this station</a></span>';
            document.getElementById("LocationPlaceNameDeparturesPanel").innerHTML = '<img src="/images/travel-train.gif" alt="Travel by train" align="left" class="imgpadd" />' + CommonName + '<br /><span class="greysmall">Station - <a href="javascript: reload_container(\'/controls/signup-promo-ajaxwrapper.aspx?Origin=' + CommonName.replace(' Rail Station', '') + '&TrainsOnly=1\', document.getElementById(\'SignupPromoContainer\'));">Buy tickets from this station</a></span>';
            
            map_object.openInfoWindowHtml(point,
                                        "<b>" + CommonName + "</b><br /><small>Station</small><br />" +
                                        "<small><b>Departure times displayed above</b></small>");
        }
        else if (StopType == 'BCT' || StopType == 'BCS') {
            naptan_times_refresh(AtcoCode, Street + ' (' + CommonName + '/' + Indicator + ')', StopType, 1)
            document.getElementById("LocationPlaceNameDeparturesPanel").innerHTML = '<img src="/images/travel-bus.gif" alt="Travel by bus" align="left" class="imgpadd" />' + Street + ' <small>(' + CommonName + '/' + Indicator + ')</small><br /><span class="greysmall">Bus Stop</span>';

            map_object.openInfoWindowHtml(point,
                                        "<b>" + Street + "</b><br />" +
                                        Indicator + " " + CommonName + "<br /><small>Bus Stop - Heading: " + Bearing + "</small><br />" +
                                        "<small><b>Departure times displayed above</b></small>");
        }
    });
}

//Function to drop Journey Plan Location markers onto specified map
var xmlHttp_dropmarkers_journeyplan = null;
function dropmarkers_journeyplan(map_object) {
    if (xmlHttp_dropmarkers_journeyplan) {
        xmlHttp_dropmarkers_journeyplan.abort();
    }

    var xmlDoc = null;
    //Get the current map boundaries
    var bounds = map_object.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    //Calculate centre lat/lon and range values
    var latitude = ((northEast.lat() + southWest.lat()) / 2)
    var longitude = ((northEast.lng() + southWest.lng()) / 2)
    var range = ((northEast.lng() - southWest.lng()) / 2)
    // Create xmlHttp Object
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp_dropmarkers_journeyplan = new XMLHttpRequest();
    }
    catch (e) {
        try {
            // Internet Explorer
            xmlHttp_dropmarkers_journeyplan = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp_dropmarkers_journeyplan = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    // Event Handler - EventListener
    xmlHttp_dropmarkers_journeyplan.onreadystatechange = function() {
    if (xmlHttp_dropmarkers_journeyplan.readyState == 4) // 4: The Request is complete
        {
            xmlDoc = xmlHttp_dropmarkers_journeyplan.responseXML; // Response
            //Clear all markers before drawing new ones
            map_object.clearOverlays();
            //Get content by looping through XML returned by ContentStream
            x = xmlDoc.getElementsByTagName("JourneyPlanLocation");
            for (i = 0; i <= x.length - 1; i++) {
                try {
                    LocationID = xmlDoc.getElementsByTagName("LocationID")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    LocationID = "";
                }
                try {
                    LocationName = xmlDoc.getElementsByTagName("LocationName")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    LocationName = "";
                }
                JourneyPlanLocationLatitude = xmlDoc.getElementsByTagName("Latitude")[i].childNodes[0].nodeValue;
                JourneyPlanLocationLongitude = xmlDoc.getElementsByTagName("Longitude")[i].childNodes[0].nodeValue;

                //Drop marker on Map
                marker_journeyplan(map_object, JourneyPlanLocationLatitude, JourneyPlanLocationLongitude, LocationID, LocationName);
            }
            xmlDoc = null;
            xmlHttp_dropmarkers_journeyplan = null;
        }
    }
    // Request to Send
    var myRand = parseInt(Math.random() * 999999);
    xmlHttp_dropmarkers_journeyplan.open("GET", "/ws-internal/client_side/travelfor.asmx/GetJourneyPlanLocationsByLocation?MaxResults=100&Range=" + range + "&Latitude=" + latitude + "&Longitude=" + longitude + "&rand=" + myRand, true);
    xmlHttp_dropmarkers_journeyplan.send(null);
    //return true;
}

//Function to drop journey plan marker on map
function marker_journeyplan(map_object, Latitude, Longitude, LocationID, LocationName) {
    var markerIcon = new GIcon(G_DEFAULT_ICON);
    markerIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=flag|FF8800";
    markerText = LocationName;

    markerOptions = { icon: markerIcon, title: markerText };

    var point = new GLatLng(Latitude, Longitude);
    var marker = new GMarker(point, markerOptions);
    map_object.addOverlay(marker);
    //When a marker is clicked, pan map to marker and set from/to value. Pause before reloading markers to allow centre to update.
        GEvent.addListener(marker, "click", function() {
            map_object.panTo(point);
            marker_journeyplan_click(LocationID, LocationName);
            window.setTimeout(function() { dropmarkers_journeyplan(map_object); }, 1000);
        });
}

//Function to show array of journey plan locations on map
var latlngbounds;
function map_journeyplan(map_object, location_array) {
    //Clear all markers before drawing new ones
    map_object.clearOverlays();

    //Initialise a new bounds object for markers
    latlngbounds = new GLatLngBounds();

    for (i = 0; i <= location_array.length - 1; i++) {
        //Drop marker for each location in the array
        map_journeyplan_dropmarker(map_object, location_array[i]);
    }

    //Zoom map to fit all markers - wait until all markers are dropped
    setTimeout('zoom_to_fit(map_planner, latlngbounds)', 2000);

    //Fix map so that it doesn't redrawer markers on move
    journeyplanner_map_showmarkers = false;
}

function zoom_to_fit(map_object, bounds) {
    map_object.setZoom(map_object.getBoundsZoomLevel(bounds));
    map_object.setCenter(bounds.getCenter());
}

//Function to drop journey plan markers for journey
function map_journeyplan_dropmarker(map_object, location_id) {

    var xmlHttp_map_journeyplan_dropmarker = null;
    var xmlDoc = null;
    // Create xmlHttp Object
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp_map_journeyplan_dropmarker = new XMLHttpRequest();
    }
    catch (e) {
        try {
            // Internet Explorer
            xmlHttp_map_journeyplan_dropmarker = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp_map_journeyplan_dropmarker = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    // Event Handler - EventListener
    xmlHttp_map_journeyplan_dropmarker.onreadystatechange = function () {
        if (xmlHttp_map_journeyplan_dropmarker.readyState == 4) // 4: The Request is complete
        {
            xmlDoc = xmlHttp_map_journeyplan_dropmarker.responseXML; // Response

            //Get content by looping through XML returned by ContentStream
            x = xmlDoc.getElementsByTagName("Location");
            for (i = 0; i <= x.length - 1; i++) {
                try {
                    LocationID = xmlDoc.getElementsByTagName("LocationID")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    LocationID = "";
                }
                try {
                    LocationName = xmlDoc.getElementsByTagName("LocationName")[i].childNodes[0].nodeValue;
                }
                catch (e) {
                    LocationName = "";
                }
                JourneyPlanLocationLatitude = xmlDoc.getElementsByTagName("Latitude")[i].childNodes[0].nodeValue;
                JourneyPlanLocationLongitude = xmlDoc.getElementsByTagName("Longitude")[i].childNodes[0].nodeValue;

                //Drop marker on Map
                marker_map_journeyplan(map_object, JourneyPlanLocationLatitude, JourneyPlanLocationLongitude, LocationID, LocationName);

                //Extend bounds to include this marker
                latlngbounds.extend(new GLatLng(JourneyPlanLocationLatitude, JourneyPlanLocationLongitude));
            }

            xmlDoc = null;
            xmlHttp_map_journeyplan_dropmarker = null;
        }
    }
    // Request to Send
    var myRand = parseInt(Math.random() * 999999);
    xmlHttp_map_journeyplan_dropmarker.open("GET", "/ws-internal/client_side/travelfor.asmx/GetJourneyPlannerLocation?LocationID=" + location_id + "&rand=" + myRand, true);
    xmlHttp_map_journeyplan_dropmarker.send(null);
    //return true;
}

//Function to drop journey plan marker on map
function marker_map_journeyplan(map_object, Latitude, Longitude, LocationID, LocationName) {
    var markerIcon = new GIcon(G_DEFAULT_ICON);
    markerIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=flag|FF0000";
    markerText = LocationName;

    markerOptions = { icon: markerIcon, title: markerText };

    var point = new GLatLng(Latitude, Longitude);
    var marker = new GMarker(point, markerOptions);
    map_object.addOverlay(marker);
}


//Function to center journey plan on position
function centre_journeyplan(map_object, location_id) {

    var xmlDoc = null;
    // Create xmlHttp Object
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp_centre_journeyplan = new XMLHttpRequest();
    }
    catch (e) {
        try {
            // Internet Explorer
            xmlHttp_centre_journeyplan = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp_centre_journeyplan = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    // Event Handler - EventListener
    xmlHttp_centre_journeyplan.onreadystatechange = function() {
        if (xmlHttp_centre_journeyplan.readyState == 4) // 4: The Request is complete
        {
            xmlDoc = xmlHttp_centre_journeyplan.responseXML; // Response
            //Get content by looping through XML returned by ContentStream
            x = xmlDoc.getElementsByTagName("Location");
            for (i = 0; i <= x.length - 1; i++) {
                JourneyPlanLocationLatitude = xmlDoc.getElementsByTagName("Latitude")[i].childNodes[0].nodeValue;
                JourneyPlanLocationLongitude = xmlDoc.getElementsByTagName("Longitude")[i].childNodes[0].nodeValue;

                var point = new GLatLng(JourneyPlanLocationLatitude, JourneyPlanLocationLongitude);
                map_object.panTo(point);
                map_object.setZoom(15);
                dropmarkers_journeyplan(map_object);
            }
            xmlDoc = null;
            xmlHttp_centre_journeyplan = null;
        }
    }
    // Request to Send
    var myRand = parseInt(Math.random() * 999999);
    xmlHttp_centre_journeyplan.open("GET", "/ws-internal/client_side/travelfor.asmx/GetJourneyPlannerLocation?LocationID=" + location_id + "&rand=" + myRand, true);
    xmlHttp_centre_journeyplan.send(null);
    //return true;
}

function getQuerystring(key, default_) {
    if (default_ == null) default_ = "";
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(window.location.href);
    if (qs == null)
        return default_;
    else
        return qs[1];
}        



