﻿var map = null;
var mapSource = null;
var mapCentreX = null;
var mapCentreY = null;
var mapCentreZoom = null;
var minZoomLevel = null;
var zoom = null;
var zoomLength = null;
var layers = null;
var linkAttrib = null;
var isLonLat = false;
var urlArray = null;
var gmlUrlArray = null;
var mapMarker = null;
var locationMapUrl = '';
var reportFaultUrl = '';
var iconURL = '';
var signURL = '';
var apiKey = '';
var resolution = null;
var resolutionArray = null;
var prevCentreX = null;
var prevCentreY = null;
var prevBounds = null;
var vmapBase = null;
var xMax = null;
var xMin = null;
var yMax = null;
var yMin = null;
var fromDate = null;
var toDate = null;
var popupMarker = null;
var markerClicked = null;
var departureTimer = null;
var format = 'image/png';
var media = '';
var congestionSCN = '';
var stopMode = '';
var isZoomend = false;
var baseLayer = null;
var itnLayer = null;
var esuLayer = null;
var gmlLayer = null;
var gmlMarkerLayer = null;
var markerLayer = null;
var locationLayer = null;
var canShowError = false;
var currentPopup = null;
var layerLoading = false;
var markerLoading = false;

/// <summary>
/// Added by Cygnet - 3rd Mar, 2011    
/// Milestone: V5.0.0 - OS GML
/// Ticket No: MAP 2203. Bing Re-Skin and Layer Switcher
///</summary>
var hybrid = null;
var aerial = null;
var activeBaseLayer = null;
var bingLayers = null;
var googleLayers = null;
var liLayerTitle = null;
/// <summary>
/// Ended by Cygnet - 3rd Mar, 2011    
/// Milestone: V5.0.0 - OS GML
/// Ticket No: MAP 2203. Bing Re-Skin and Layer Switcher
///</summary>

/// <summary>
/// Added by Cygnet - 1st Feb, 2011
/// Map will get Auto Refresh after every “x” seconds
/// Milestone: V5.0.0 - OS GML
/// Ticket No: 1929 (ALL – MAP AUTO REFRESH)
/// </summary>
var autoRefreshMode = "0";
var autorefreshobj = null;
var refreshinterval = null;
var autoeasting = 0;
var autonorthing = 0;
var refreshIntervalId = null;
var autoRefreshLayers = '';
//Start
//Cygnet Changes
//Milestone: 5.0.0
//Ticket No: 2673 : Opera ToolTip Issue
var tooltip = function() {
    var id = 'tt';
    var top = 3;
    var left = 3;
    var maxw = 300;
    var speed = 10;
    var timer = 5;
    var endalpha = 95;
    var alpha = 0;
    var tt, t, c, b, h;
    var ie = document.all ? true : false;
    return {
        show: function(v, w) {
            if (tt == null) {
                tt = document.createElement('div');
                tt.setAttribute('id', id);
                t = document.createElement('div');
                t.setAttribute('id', id + 'top');
                c = document.createElement('div');
                c.setAttribute('id', id + 'cont');
                b = document.createElement('div');
                b.setAttribute('id', id + 'bot');
                tt.appendChild(t);
                tt.appendChild(c);
                tt.appendChild(b);
                document.body.appendChild(tt);
                tt.style.opacity = 0;
                tt.style.filter = 'alpha(opacity=0)';
                document.onmousemove = this.pos;
            }
            tt.style.display = 'block';
            c.innerHTML = v;
            tt.style.width = w ? w + 'px' : 'auto';
            if (!w && ie) {
                t.style.display = 'none';
                b.style.display = 'none';
                tt.style.width = tt.offsetWidth;
                t.style.display = 'block';
                b.style.display = 'block';
            }
            if (tt.offsetWidth > maxw) { tt.style.width = maxw + 'px' }
            h = parseInt(tt.offsetHeight) + top;
            clearInterval(tt.timer);
            tt.timer = setInterval(function() { tooltip.fade(1) }, timer);
        },
        pos: function(e) {
            var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY;
            var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX;
            tt.style.top = (u + h - 17) + 'px';
            tt.style.left = (l - left) + 'px';
        },
        fade: function(d) {
            var a = alpha;
            if ((a != endalpha && d == 1) || (a != 0 && d == -1)) {
                var i = speed;
                if (endalpha - a < speed && d == 1) {
                    i = endalpha - a;
                } else if (alpha < speed && d == -1) {
                    i = a;
                }
                alpha = a + (i * d);
                tt.style.opacity = alpha * .01;
                tt.style.filter = 'alpha(opacity=' + alpha + ')';
            } else {
                clearInterval(tt.timer);
                if (d == -1) { tt.style.display = 'none' }
            }
        },
        hide: function() {
            clearInterval(tt.timer);
            tt.timer = setInterval(function() { tooltip.fade(-1) }, timer);
        }
    };
} ();
var operaToolTip = null;
//End
//Cygnet Changes
//Milestone: 5.0.0
//Ticket No: 2673 : Opera ToolTip Issue
function SetAutoRefresh(obj, easting, northing, interval) {
    autorefreshobj = obj;
    autoeasting = easting;
    autonorthing = northing;
    refreshinterval = interval;
    if (refreshIntervalId != undefined) StopAutoRefresh();
    refreshIntervalId = setInterval("AutoRefresh()", interval);
}

function SetAutoRefreshWithSeverity(interval) {
    refreshinterval = interval;
    if (refreshIntervalId != undefined) StopAutoRefresh();
    refreshIntervalId = setInterval("AutoRefreshWithSeverity()", interval);
    //alert(refreshIntervalId);
}
/* Commented : By Abhishek Trivedi : Creted new function to reload page to remove non-referenced objects to reduse memory leakage*/
function AutoRefresh() {
    if (autorefreshobj != undefined) {
        showDetails(autorefreshobj, autoeasting, autonorthing);
        SetLastRefreshTime();
    }
}

function AutoRefreshWithSeverity() {
    showDetailsWithFilter(true);
    SetLastRefreshTime();
}

function ClearLastRefreshTime() {
    /*Commented as we wont have lable to show time on home page : Nilesh : cygnet 21-May-2011
    var lstupdate = getElementById("lastupdate");
    if (lstupdate != undefined && lstupdate != null)
    lstupdate.innerHTML = "";
    */
}

function SetLastRefreshTime() {
    var d = new Date();
    var n;
    var dt = '';

    n = d.getHours();
    dt += ' ' + ((n < 10) ? '0' + n : n);
    n = d.getMinutes();
    dt += ':' + ((n < 10) ? '0' + n : n);
    n = d.getSeconds();
    dt += ':' + ((n < 10) ? '0' + n : n);
    /*Commented as we wont have lable to show time on home page : Nilesh : cygnet 21-May-2011
    var lstupdate = getElementById("lastupdate");
    //alert(dt);
    if (lstupdate != undefined && lstupdate != null && refreshIntervalId != null && refreshIntervalId != undefined)
    lstupdate.innerHTML = "Last refresh time : " + dt;
    */

}

function StopAutoRefresh() {
    if (refreshinterval != undefined && refreshinterval != null && refreshIntervalId != null && refreshIntervalId > 0) {
        window.clearInterval(refreshIntervalId);
        refreshIntervalId = null;
    }
}


function init() {
    media = document.getElementById(mapId + 'media').value;
    mapCentreX = parseFloat(document.getElementById(mapId + 'mapCentreX').value);
    mapCentreY = parseFloat(document.getElementById(mapId + 'mapCentreY').value);
    mapCentreZoom = parseInt(document.getElementById(mapId + 'mapCentreZoom').value);
    minZoomLevel = parseInt(document.getElementById('minZoomLevel').value);
    mapSource = document.getElementById('mapSource').value.toLowerCase();
    layers = document.getElementById(mapId + 'mapLayers').value;
    linkAttrib = document.getElementById('linkAttrib').value;
    xMax = document.getElementById('xMax').value;
    xMin = document.getElementById('xMin').value;
    yMax = document.getElementById('yMax').value;
    yMin = document.getElementById('yMin').value;
    reportFaultUrl = document.getElementById('reportFaultUrl').value;
    urlArray = document.getElementById('UrlArray').value.split(',');
    gmlUrlArray = document.getElementById('GMLUrlArray').value.split(',');
    locationMapUrl = document.getElementById('locationMapUrl').value;
    iconURL = document.getElementById('iconURL').value;
    signURL = document.getElementById('signURL').value;
    apiKey = document.getElementById(mapId + 'apiKey').value;
    fromDate = document.getElementById('hdnFromDateString').value;
    toDate = document.getElementById('hdnToDateString').value;
    stopMode = document.getElementById(mapId + 'stopMode').value;
    resolutionArray = document.getElementById('resolution').value.split(',');
    zoomLength = resolutionArray.length - 1;
    //Start Ticket No : 2203 *MileStone - 5.0.0
    googleLayers = getValueById('googleLayers');
    bingLayers = getValueById('bingLayers');
    //End Ticket No : 2203  *MileStone - 5.0.0
    autoRefreshLayers = getValueById('hdnAutoRefreshLayers');
    refreshmap = getElementById('hdnRefreshMap');
    if (navigator.appVersion.toLowerCase().indexOf('msie 6.') != -1) format = 'image/gif';
    isLonLat = (mapSource == 'google' || mapSource == 'bingve');

    if (isLonLat) {
        zoomLength = 17 - minZoomLevel;
        map = new OpenLayers.Map('map', {
            tileSize: new OpenLayers.Size(256, 256),
            projection: new OpenLayers.Projection('EPSG:900913'),
            displayProjection: new OpenLayers.Projection('EPSG:4326'),
            units: 'm',
            numZoomLevels: zoomLength + 1,
            maxResolution: 156543.0339,
            maxExtent: new OpenLayers.Bounds(xMin, yMin, xMax, yMax),
            restrictedExtent: new OpenLayers.Bounds(xMin, yMin, xMax, yMax),
            controls: [new OpenLayers.Control.MouseDefaults()]
        });
    }
    else {
        map = new OpenLayers.Map('map', {
            tileSize: new OpenLayers.Size(256, 256),
            numZoomLevels: zoomLength,
            resolutions: resolutionArray,
            minResolution: 1.0,
            maxResolution: 'auto',
            projection: new OpenLayers.Projection('EPSG:27700'),
            maxExtent: new OpenLayers.Bounds(xMin, yMin, xMax, yMax),
            restrictedExtent: new OpenLayers.Bounds(xMin, yMin, xMax, yMax),
            units: 'degrees',
            controls: [new OpenLayers.Control.MouseDefaults()]
        });
    }
    //avoid pink tiles
    OpenLayers.IMAGE_RELOAD_ATTEMPTS = 2;
    OpenLayers.Util.onImageLoadErrorColor = 'transparent';
    OpenLayers.Popup.FramedCloud.prototype.autoSize = true;
    switch (mapSource) {
        case 'oxford':
            baseLayer = new OpenLayers.Layer.WMS('Oxford OSGB', ['http://mymaps.oxfordshire.gov.uk//arcgis/services/UTMC150pc/MapServer/WMSServer?SERVICENAME=UTMC150pc', 'http://mymaps.oxfordshire.gov.uk//arcgis/services/UTMC250pc/MapServer/WMSServer?SERVICENAME=UTMC250pc'], {
                'layers': '0,1,2,3,4,5,6',
                'srs': 'epsg:27700',
                'format': 'image/png',
                'transparent': 'false'
            }, { 'attribution': linkAttrib, buffer: 0 });
            break;
        case 'cheshire':
            baseLayer = new OpenLayers.Layer.WMS('Cheshire OSGB', ['http://merry/wmsconnector/com.esri.wms.Esrimap?'], {
                'version': '1.1.1',
                'SERVICENAME': 'os_rasters_WMS',
                'layers': 'OS250,OS50,OSSV,OS10',
                'srs': 'epsg:27700',
                'format': 'image/png',
                'transparent': 'false'
            }, { 'attribution': linkAttrib, buffer: 0 });
            break;
        case 'voyager_osgb':
            baseLayer = new OpenLayers.Layer.WMS('OSGB', urlArray, {
                'layers': layers,
                'srs': 'EPSG:27700',
                'format': 'image/jpeg',
                'transparent': 'false'
            }, { 'attribution': linkAttrib, 'buffer': 0 });
            break;
        case 'google':
            baseLayer = new OpenLayers.Layer.Google('Google Streets', { 'sphericalMercator': true, MIN_ZOOM_LEVEL: minZoomLevel });
            //Start Ticket No: 2203
            hybrid = new OpenLayers.Layer.Google('Hybrid', { 'sphericalMercator': true, MIN_ZOOM_LEVEL: minZoomLevel, 'type': G_HYBRID_MAP });
            aerial = new OpenLayers.Layer.Google('Satellite', { 'sphericalMercator': true, MIN_ZOOM_LEVEL: minZoomLevel, 'type': G_SATELLITE_MAP });
            //End Ticket No: 2203
            break;
        case 'bingve':
            baseLayer = new OpenLayers.Layer.VirtualEarth('Bing Shaded Map', {
                sphericalMercator: true,
                MIN_ZOOM_LEVEL: minZoomLevel,
                type: VEMapStyle.Shaded
            });
            //Start Ticket No: 2203
            hybrid = new OpenLayers.Layer.VirtualEarth('Hybrid', {
                sphericalMercator: true,
                MIN_ZOOM_LEVEL: minZoomLevel,
                type: VEMapStyle.Hybrid
            });

            aerial = new OpenLayers.Layer.VirtualEarth('Aerial', {
                sphericalMercator: true,
                MIN_ZOOM_LEVEL: minZoomLevel,
                type: VEMapStyle.Aerial
            });
            //End Ticket No: 2203
            break;
        default:
            baseLayer = new OpenLayers.Layer.WMS('Cloud Amber WMS', urlArray, {
                'layers': layers,
                'version': '1.3.0',
                'CRS': 'EPSG:4326',
                'format': 'image/png',
                'transparent': 'false'
            }, { 'attribution': '© Crown copyright. All rights reserved 100030252 (2008).' },
            {
                'isBaseLayer': true,
                'maxExtent': new OpenLayers.Bounds(0, 0, 700000, 1100000),
                'maxResolution': 1000,
                'projection': 'EPSG:27700'
            }, { 'buffer': 0 });
            break;
    }
    map.addLayers([baseLayer]);
    //Start Ticket No : 2203    
    if (mapSource == 'google') {
        if (googleLayers.indexOf("hybrid") != -1)
            map.addLayer(hybrid);
        if (googleLayers.indexOf("satellite") != -1)
            map.addLayer(aerial);
    }
    else if (mapSource == 'bingve') {
        if (bingLayers.indexOf("hybrid") != -1)
            map.addLayer(hybrid);
        if (bingLayers.indexOf("aerial") != -1)
            map.addLayer(aerial);
    }
    activeBaseLayer = baseLayer;
    SetMapBaseLayer(activeBaseLayer);

    //Start Ticket No : 2203
    if (mapSource == 'bingve') {
        var shadedHeader = getElementById('lblShadedHeader');
        if (shadedHeader != null && mapSource == 'bingve') {
            getElementById('lnkLayers').innerHTML = shadedHeader.innerHTML;
        }
        //Added for jquery slider control for map zoom operations
        $("#slider-id").slider({
            min: 0,
            max: map.numZoomLevels - 1,
            orientation: 'vertical',
            value: 0,
            animate: false,
            //            slide: function(e, ui) {
            //                map.zoomTo(ui.value);
            //            },
            change: function(e, ui) {
                map.zoomTo(ui.value);
                //window.setTimeout('map.zoomTo(' + ui.value + ')', 30);
            }
        });
    }
    else {
        map.addControl(new OpenLayers.Control.PanZoomBar());
    }
    //End Ticket No : 2203

    //map.addControl(new OpenLayers.Control.PanZoomBar());
    map.addControl(new OpenLayers.Control.MousePosition());
    map.addControl(new OpenLayers.Control.Attribution());
    for (var i = map.controls.length - 1; i >= 0; i--) {
        if (map.controls[i].CLASS_NAME == 'OpenLayers.Control.NavToolbar') map.removeControl(map.controls[i]);
        else if (map.controls[i].CLASS_NAME == 'OpenLayers.Control.MousePosition') {
            if (!isLonLat) map.controls[i].numDigits = 0;
            map.controls[i].redraw();
        }
        else if (map.controls[i].CLASS_NAME == 'OpenLayers.Control.PanZoomBar') map.controls[i].moveZoomBar();
    }
    document.getElementById('map').onselectstart = function() { return false; }
    centre();
    addSelectedLayers();
    map.events.register('moveend', map, function(e) {
        if (isZoomend) isZoomend = false;
        else {
            //        Commented By Cygnet during Merging
            //var bounds=map.getExtent();
            //if(prevBounds==undefined||prevBounds.left>bounds.left||prevBounds.bottom>bounds.bottom||prevBounds.right<bounds.right||prevBounds.top<bounds.top)
            //{
            //    showDetails(false);
            //}
            var obj = getSelectedLayer();
            if (obj != undefined) {
                var margin = 0;
                var cxy = new OpenLayers.LonLat(map.center.lon, map.center.lat); //this.center;
                if (mapSource == 'google' || mapSource == 'bingve') {
                    //to lonlat
                    cxy.transform(map.projection, map.displayProjection);
                    margin = map.layers[0].getResolution() / 700;
                }
                else {
                    margin = map.layers[0].getResolution() * 500;
                }
                mapCentreX = cxy.lon;
                mapCentreY = cxy.lat;
                mapCentreZoom = map.zoom;
                var x = Math.abs(prevCentreX - mapCentreX);
                var y = Math.abs(prevCentreY - mapCentreY);

                if (x >= margin || y >= margin) {
                    showDetails(obj, cxy.lon, cxy.lat);
                    prevCentreX = cxy.lon;
                    prevCentreY = cxy.lat;
                }
            }
        }
    });
    map.events.register('zoomend', map, function(e) {
        isZoomend = true;
        //showDetails(false);
        //Start Ticket No : 2203
        if (mapSource == 'bingve') $("#slider-id").slider('value', map.getZoom());
        //End Ticket No : 2203
        var cxy = new OpenLayers.LonLat(map.center.lon, map.center.lat); //this.center;
        if (mapSource == 'google' || mapSource == 'bingve') cxy.transform(map.projection, map.displayProjection); //to lonlat
        mapCentreX = cxy.lon;
        mapCentreY = cxy.lat;
        mapCentreZoom = map.zoom;
        prevCentreX = mapCentreX;
        prevCentreY = mapCentreY;
        var obj = getSelectedLayer();
        if (obj != undefined) {
            var easting = cxy.lon;
            var northing = cxy.lat;

            //Started: Added By Jibu Samuel : Cygnet : Mapping V5.1.0, Ticket No: 1491 : Split Map option Filters by Severity
            showDetails(obj, cxy.lon, cxy.lat)
            //showDetailsWithFilter(true);
            //End: Added By Jibu Samuel : Cygnet : Mapping V5.1.0, Ticket No: 1491 : Split Map option Filters by Severity
            if (autoRefreshMode == "1") {
                SetAutoRefresh(obj, easting, northing, refreshinterval);
            }
            else {
                refreshinterval = 0;
            }
        }
        //if (obj != undefined) showDetails(obj, cxy.lon, cxy.lat);
    });
    //if(mapCentreZoom==0)
    //showDetails(true);
    centre();
    if (mapCentreZoom == 0) {
        var obj = getSelectedLayer();
        if (obj != undefined) {
            var cxy = map.center;
            if (mapSource == 'google' || mapSource == 'bingve') cxy.transform(map.projection, map.displayProjection);
            showDetails(obj, cxy.lon, cxy.lat);
            
            //if (mapSource == 'bingve')
            //{
                //document.getElementById('hdnIsDataLoaded').value = '1';
                ////$("#slider-id").slider('value', map.getZoom());
             //}
        }
    }


    document.getElementById('map').onselectstart = function() { return false; }
}
/*Centre and zoom functions*/
function centre() {
    var cxy = new OpenLayers.LonLat(mapCentreX, mapCentreY);
    if (isLonLat) cxy.transform(map.displayProjection, map.projection);
    mapCentreZoom = (mapCentreZoom < 0) ? 0 : (mapCentreZoom > zoomLength) ? zoomLength : mapCentreZoom;
    map.setCenter(cxy, parseInt(mapCentreZoom));
}
function setZoomIn(centerX, centerY) {
    mapCentreX = centerX;
    mapCentreY = centerY;
    mapCentreZoom = zoomLength;
    centre();
}
function setCentreAndZoom(centerX, centerY, isZoomIn) {
    mapCentreX = centerX;
    mapCentreY = centerY;
    mapCentreZoom = (isZoomIn == true) ? map.zoom + 1 : map.zoom - 1;
    centre();
}
/*Layer functionalities*/
function registerEvents(layer) {
    if (layer == undefined) return;
    layer.events.register('loadstart', layer, function() {
        layerLoading = true;
        document.getElementById('waitImage').style.visibility = 'visible';
        document.body.style.cursor = 'wait';
    });
    layer.events.register('loadcancel', layer, function() { alert('end') });
    layer.events.register('loadend', layer, isLayerLoading);
}
function isLayerLoading() {
    for (var i = 1; i < map.layers.length; i++) //not for base layer
    {
        if (map.layers[i].numLoadingTiles != undefined && map.layers[i].numLoadingTiles > 0) return;
    }
    layerLoading = false;
    if (markerLoading == false) {
        document.getElementById('waitImage').style.visibility = 'hidden';
        document.body.style.cursor = 'default';
    }
}
function getSelectedLayer() {
    var layerGroups = document.getElementsByName('cbLayerGroups');
    for (var i = 0; i < layerGroups.length; i++) if (layerGroups[i].checked) return layerGroups[i];
}
function mapContainsLayer(layer) {
    if (layer != undefined) for (var i = 0; i < map.layers.length; i++) if (map.layers[i].name == layer.name) return true;
    return false;
}
function setLayerIndex() {
    var i = 1;
    if (itnLayer != undefined) map.setLayerIndex(itnLayer, i++);
    if (esuLayer != undefined) map.setLayerIndex(esuLayer, i++);
    if (gmlLayer != undefined) map.setLayerIndex(gmlLayer, i++);
    if (gmlMarkerLayer != undefined) map.setLayerIndex(gmlMarkerLayer, i++);
    if (markerLayer != undefined) map.setLayerIndex(markerLayer, i++);
    if (locationLayer != undefined) map.setLayerIndex(locationLayer, i);
}
/*Filter functionalities*/
function clickDetails() {
    SetStartandEndDates();
    //showDetails(false);
    var cxy = map.center;
    var obj = getSelectedLayer();
    showDetails(obj, cxy.lon, cxy.lat);
}
function addSelectedLayers() {
    //clearLayer();
    clearPopupsAndLayers();
    var layers = document.getElementById(mapId + 'mapLayers').value;
    var layersArray = layers.split(',');
    if (isLonLat) {
        for (var i = 0; i < layersArray.length; i++) {
            if (layersArray[i] == 'tl' || layersArray[i] == 'tr') {
                itnLayer = new OpenLayers.Layer.WMS('Cloud Amber WMS', gmlUrlArray, {
                    'layers': 'itn[JourneyTimes]',
                    'format': format,
                    'transparent': 'true',
                    'Type': 'sperical'
                }, { 'buffer': 0 });
                break;
            }
        }
    }
    else {
        // Process only one layer at a time. Redesign required if more than one layer is required.
        var layerValue = '';
        for (var i = 0; i < layersArray.length; i++) {
            switch (layersArray[i]) {
                case 'tl':
                case 'tr':
                    layerValue = 'itn[JourneyTimes]';
                    break;
                //For Cambridgeshire       
                case 'County':
                case 'District':
                case 'DistrictWards':
                case 'ElectoralDivisions':
                case 'Parish':
                case 'ParliamentaryConstituencies':
                case 'PrimaryCatchment':
                case 'Secondarycatchment':
                case 'Highwayssupervisorboundaries':
                case 'Highwaysdivisionalboundaries':
                case 'Policesection':
                case 'Policedivision':
                    layerValue = 'places,' + layersArray[i];
                    break;
                //For Cambridgeshire end       
                //For Oxfordshire       
                case 'District':
                case 'FloodRisk':
                case 'Parish':
                case 'OxonbndLL':
                    layerValue = 'itn,places,' + layersArray[i];
                    break;
                case 'ParkandRideSites':
                case 'FireStations':
                case 'FloodedRoads':
                case 'GrittingRoutes':
                case 'GrittingRoutesPriority':
                case 'GrittingRoutes2':
                case 'GrittingRoutes3':
                case 'BusRoutes':
                    layerValue = 'itn,' + layersArray[i];
                    break;
                case 'A31 DIVERSION ROUTE_polyline':
                case 'Dorset_lanes':
                case 'Dorset_offset':
                case 'Dorset_official':
                case 'Dorset_partlink':
                case 'Dorset_paths':
                case 'Dorset_advisory':
                    layerValue = 'itn,' + layersArray[i];
                    break;
                case 'A31 DIVERSION ROUTE_region':
                case 'A31 DIVERSION ROUTE_point':
                case 'Dorset_points':
                    layerValue = layersArray[i];
                    break;
                //For Oxfordshire end       
            }
            if (layerValue != '') break;
        }
        if (layerValue != undefined && layerValue.length > 0) {
            itnLayer = new OpenLayers.Layer.WMS('Cloud Amber WMS', gmlUrlArray, {
                'layers': layerValue,
                'format': format,
                'transparent': 'true'
            }, { 'buffer': 0 });
        }
    }
    if (itnLayer != undefined) {
        map.addLayer(itnLayer);
        setLayerIndex();
        registerEvents(itnLayer);
    }
}

function showDetails(obj, easting, northing) {
    window.clearInterval(departureTimer);
    if (obj == undefined) return;
    var layers = '';
    var dateType = -1;
    var fromDate = '';
    var toDate = '';
    if (obj.value != undefined && obj.value.length > 0) layers = obj.value;
    if (layers == 'accident,incident' || layers == 'ptaccident,ptincident' || layers == 'event' || layers == 'roadworks' || layers == 'section58') {
        displayCalander(true);
        if (!(document.getElementById(mapId + 'chkTomorrow').checked || document.getElementById(mapId + 'chkNext7Days').checked || document.getElementById(mapId + 'chkAllDates').checked) && document.getElementById('hdnFromDateString').value.length == 0)
            SetStartandEndDates();
        if (document.getElementById(mapId + 'chkTomorrow').checked) dateType = 1;
        else if (document.getElementById(mapId + 'chkNext7Days').checked) dateType = 2;
        else if (document.getElementById(mapId + 'chkAllDates').checked) dateType = 3;
        else dateType = 0;
        fromDate = document.getElementById('hdnFromDateString').value;
        toDate = document.getElementById('hdnToDateString').value;
    } else displayCalander(false);
    clearPopupsAndLayers();
    markerLoading = true;
    document.getElementById('waitImage').style.visibility = 'visible';
    document.body.style.cursor = 'wait';
    document.getElementById(mapId + 'mapLayers').value = layers;
    if (easting == undefined || easting == '0') {
        easting = mapCentreX;
        northing = mapCentreY;
    }
    addSelectedLayers();
    //For Cheshire
    //if(layers.indexOf('roadworks')>-1||layers.indexOf('section58')>-1)
    //{
    //    StreetViewApp.MapWebService.GetGML('','esu',onGetGMLSuccess,null,'esu');
    //}
    StreetViewApp.MapWebService.GetMarker(layers, easting, northing, dateType, fromDate, toDate, stopMode, media, map.layers[0].getResolution(), map.zoom, onGetMarkerSuccess, onGetMarkerFailed, obj.value);
    //StreetViewApp.MapWebService.GetMarker(layers,map.layers[0].getResolution(),easting,northing,map.zoom,fromDate,toDate,onGetMarkerSuccess,onGetMarkerFailed,obj.value);
}

function showDetails(isLayerChanged) {
    window.clearInterval(departureTimer);
    var obj = getSelectedLayer();
    if (obj == undefined) return;
    var layers = '';
    var dateType = 0;
    var fromDate = '';
    var toDate = '';
    if (obj.value != undefined && obj.value.length > 0) layers = obj.value;
    if (stopMode != undefined && stopMode.length > 0 && layers.indexOf('naptan') == 0) layers = stopMode;
    if (layers == 'accident,incident' || layers == 'ptaccident,ptincident' || layers == 'event' || layers == 'roadworks' || layers == 'section58' || layers == 'majorscheme') {
        displayCalander(true);
        if (!(document.getElementById(mapId + 'chkTomorrow').checked || document.getElementById(mapId + 'chkNext7Days').checked || document.getElementById(mapId + 'chkAllDates').checked) && document.getElementById('hdnFromDateString').value.length == 0)
            SetStartandEndDates();
        if (document.getElementById(mapId + 'chkTomorrow').checked) dateType = 2;
        else if (document.getElementById(mapId + 'chkNext7Days').checked) dateType = 3;
        else if (document.getElementById(mapId + 'chkAllDates').checked) dateType = 4;
        else {
            dateType = 1;
            fromDate = getValueById('hdnFromDateString');
            toDate = getValueById('hdnToDateString');
            var dtFrom = getDateDDMMYYY(fromDate);
            var dtTo = getDateDDMMYYY(toDate);
            if (dtFrom == undefined || dtTo == undefined || dtFrom > dtTo) {
                alert('Please select End date and time greater than Start date and time.');
                return;
            }
        }
    } else displayCalander(false);
    clearPopupsAndLayers();
    markerLoading = true;
    document.getElementById('waitImage').style.visibility = 'visible';
    document.body.style.cursor = 'wait';
    document.getElementById(mapId + 'mapLayers').value = layers;
    //For Cheshire
    //if(layers.indexOf('roadworks')>-1||layers.indexOf('section58')>-1)
    //{
    //    StreetViewApp.MapWebService.GetGML('','esu',onGetGMLSuccess,null,'esu');
    //}
    //StreetViewApp.MapWebService.GetMarker(layers,easting,northing,dateType,fromDate,toDate,stopMode,media,map.layers[0].getResolution(),map.zoom,onGetMarkerSuccess,onGetMarkerFailed,obj.value);

    var resolution = map.layers[0].getResolution();
    var bounds = map.getExtent();
    var tolarance = resolution * 200;
    bounds = new OpenLayers.Bounds(bounds.left - tolarance, bounds.bottom - tolarance, bounds.right + tolarance, bounds.top + tolarance);
    prevBounds = bounds.clone();
    if (isLonLat) bounds.transform(map.projection, map.displayProjection);
    addSelectedLayers();
    refreshWMS();
    //layers=layers.replace('tr,','');if(layers==''){clearMarkersAndPopups();markerLoading=false;}else //For TW
    StreetViewApp.MapWebService.GetMarker(layers, dateType, fromDate, toDate, resolution, bounds.left, bounds.bottom, bounds.right, bounds.top, isLonLat, onGetMarkerSuccess, onGetMarkerFailed, obj.value);
    //if (isLayerChanged) addSelectedLayers();
}
function onGetMarkerSuccess(result, layer) {
    var obj = getSelectedLayer();
    clearMarkersAndPopups();
    if (result != undefined && result.d != undefined) result = result.d;
    if (result != undefined && obj != undefined && obj.value == layer) {
        popupMarker = null;
        if (markerLayer != undefined) markerLayer.destroy();
        markerLayer = new OpenLayers.Layer.Markers('MarkerIcons');
        map.addLayer(markerLayer);
        setLayerIndex();
        var cxy = new OpenLayers.LonLat(map.center.lon, map.center.lat);
        for (var i = 0; i < result.length; i++) {
            var mapLayer = result[i];
            if (mapLayer.Clusters != undefined && mapLayer.Clusters.length > 0) {
                for (var j = 0; j < mapLayer.Clusters.length; j++) {
                    var cluster = mapLayer.Clusters[j];
                    if (cluster.Markers.length == 1) addSingleMarker(mapLayer, cluster.Markers[0], cxy);
                    else {
                        var content = '<div id=\'popupDiv\'>';
                        var cleasting = 0, clnorthing = 0;
                        if (isLonLat) {
                            cleasting = cluster.Lon;
                            clnorthing = cluster.Lat;
                        }
                        else {
                            cleasting = cluster.Easting;
                            clnorthing = cluster.Northing;
                        }
                        if (map.zoom >= zoomLength) {
                            var imgs = '', popupData = '';
                            for (var index = 0; index < cluster.Markers.length; index++) {
                                var marker = cluster.Markers[index];
                                imgs += '<img src=\'' + iconURL + marker.IconName + '\' alt=\'' + marker.ToolTip + '\' title=\'' + marker.ToolTip;
                                imgs += '\' class=\'handCursor\' onclick=\'showPopupData(' + index + ')\' ';
                                imgs += 'style=\'vertical-align:top;width:' + (marker.IconWidth * 0.75) + 'px;height:' + (marker.IconHeight * 0.75) + 'px;border:0;\'/><br>';
                                popupData += '<div index=\'' + index + '\' ';
                                if (index > 0) popupData += 'style=\'display:none\'';
                                popupData += '>';
                                var easting = marker.Easting, northing = marker.Northing;
                                if (isLonLat) {
                                    easting = marker.Lon;
                                    northing = marker.Lat;
                                }
                                popupData += createMarkerPopup(mapLayer.Name, marker.Scn, easting, northing, marker.Summary, marker.Severity, marker.IconName, mapLayer.ReportFault, mapLayer.ViewDocument);
                                popupData += '</div>';
                                if (index > 8) {
                                    imgs += '...<br>';
                                    break;
                                }
                            }
                            content += '<div class=\'popupCluster\'>';
                            content += '<table><tr><td valign=\'top\' align=\'left\' style=\'padding:0px !important;\'>' + imgs;
                            content += '</td><td id=\'popupDataList\' valign=\'top\' align=\'left\' style=\'padding:0px;\'>';
                            content += popupData + '</td></tr></table></div>';
                        }
                        else if (cluster.Count <= 10) {
                            //Added By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior
                            var sbIcons = '', sbPopupData = '';
                            var myIndex;
                            myIndex = 0;
                            //alert(mapLayer.UseConcatenationBehavior);
                            //Added By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior

                            for (var index = 0; index < cluster.Markers.length; index++) {
                                var marker = cluster.Markers[index];
                                var easting = marker.Easting, northing = marker.Northing;
                                if (isLonLat) {
                                    easting = marker.Lon;
                                    northing = marker.Lat;
                                }
                                //Modified By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior
                                if (mapLayer.UseConcatenationBehavior) {
                                    //sbIcons += '<img src=\'' + iconURL + marker.IconName + '\' alt=\'' + marker.ToolTip + '\' title=\'' + marker.ToolTip + '\' class=\'handCursor\' onclick=\'showConcatenationPopupData(' + myIndex + ');\' style=\'width:' + (marker.IconWidth * 0.50) + 'px;height:' + (marker.IconHeight * 0.50) + 'px;border:0;text-align:center;\'/> <a class=\'link\' href=\'#\' onclick=\'showConcatenationPopupData(' + myIndex + ');\'><label index=\'hideMeLink\' class=\'handCursor\'>' + marker.Summary[0] + '</label></a><div></div>';
                                    sbIcons += '<img src=\'' + iconURL + marker.IconName + '\' alt=\'' + marker.ToolTip + '\' title=\'' + marker.ToolTip + '\' class=\'handCursor\'';
                                    sbIcons += 'onclick=\'showConcatenationPopupData(' + myIndex + ');\' style=\'width:' + (marker.IconWidth * 0.50) + 'px;height:' + (marker.IconHeight * 0.50) + 'px;border:0;text-align:center;\'/> <a class=\'link\'';
                                    sbIcons += 'href=\'#\' onclick=\'showConcatenationPopupData(' + myIndex + ');\'><label index=\'hideMeLink\' class=\'handCursor\'>' + marker.Summary[1] + '</label></a><div></div>';
                                    sbPopupData += '<div index=\'' + myIndex + '\' style=\'display:none;\'>';
                                    sbPopupData += createMarkerPopup(mapLayer.Name, marker.Scn, easting, northing, marker.Summary, marker.Severity, marker.IconName, mapLayer.ReportFault, mapLayer.ViewDocument);
                                    sbPopupData += '</div>'
                                    myIndex += 1;
                                }
                                else {
                                    content += '<div><a class=\'noLink\' href=\'javascript:setZoomIn(' + easting + ',' + northing + ');\'>';
                                    content += '<img src=\'' + iconURL + marker.IconName + '\' alt=\'' + marker.ToolTip + '\' title=\'' + marker.ToolTip + '\' style=\'width:20px;height:20px;border:0;\'/>';
                                    content += marker.Summary[1] + '</a></div>';
                                }
                                //Modified By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior
                            }
                            //Modified By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior
                            if (mapLayer.UseConcatenationBehavior) {
                                content += '<table style=\'width:auto;\'><tr><td id=\'itemLinks\' align=\'left\' style=\'vertical-align:top; padding:0px !important;\'>' + sbIcons + '</td><td id=\'popupDataList\' valign=\'top\' align=\'left\' style=\'padding:0px;\'>' + sbPopupData + '</td></tr></table>';
                            }
                            else {
                                content += '<div style=\'padding-top:3px;text-align:center\'><a class=\'link\' title=\'Zoom out to overview\' href=\'javascript:setCentreAndZoom('
                                content += cleasting + ',' + clnorthing + ',false);\'>Zoom map out</a> &middot; ';
                                content += '<a class=\'link\' title=\'Zoom in for closer view\' href=\'javascript:setCentreAndZoom(' + cleasting + ',' + clnorthing + ',true)\'>Zoom map in</a></div>';
                            }
                            //Modified By Nilesh Thakkar : Cygnet : Mapping V5.0.0, Ticket No: 2697 : TW – Concatenation Behavior
                        }
                        else {
                            content += createClusterPopup(mapLayer.Name, cluster.Count, cleasting, clnorthing);
                        }

                        content += '</div>';
                        var ll = new OpenLayers.LonLat(cleasting, clnorthing);
                        if (isLonLat) ll.transform(map.displayProjection, map.projection);
                        var toolTip = createClusterToolTip(mapLayer.Name, cluster.Count);
                        addMarker(ll, mapLayer.Name, content, cluster.IconName, cluster.IconWidth, cluster.IconHeight, '', toolTip, false, cxy);
                    }
                }
            }
            else if (mapLayer.Markers != undefined && mapLayer.Markers.length > 0) {
                for (var j = 0; j < mapLayer.Markers.length; j++) {
                    addSingleMarker(mapLayer, mapLayer.Markers[j], cxy);
                }
            }
        }
        if (popupMarker != undefined) {
            popupMarker.events.triggerEvent('mousedown', null);
            popupMarker = null;
        }
        markerLoading = false;
        isLayerLoading();
        if (layerLoading == false) {
            document.getElementById('waitImage').style.visibility = 'hidden';
            document.body.style.cursor = 'default';
        }
    }
}
function onGetMarkerFailed(error, layer) {
    if (canShowError) alert(error.get_message());
    var obj = getSelectedLayer();
    if (obj != undefined && obj.value == layer) {
        markerLoading = false;
        clearMarkersAndPopups();
        if (layerLoading == false) {
            document.getElementById('waitImage').style.visibility = 'hidden';
            document.body.style.cursor = 'default';
        }
    }
}
function onGetGMLSuccess(result, ctx) {
    ctx = ctx.split(',');
    var scn = ctx[0];
    var layer = ctx[1];
    if (result != undefined && result.d != undefined) result = result.d;
    if (scn == congestionSCN && result != undefined && result.length > 0) {
        var pointList = [];
        if (isLonLat)
            for (var i = 0; i < result.length - 3; i++) pointList.push(new OpenLayers.Geometry.Point(result[i], result[++i]).transform(map.displayProjection, map.projection));
        else
            for (var i = 0; i < result.length - 3; i++) pointList.push(new OpenLayers.Geometry.Point(result[i], result[++i]));
        var x = result[result.length - 2];
        var y = result[result.length - 1];
        var colour = '#0000FF';
        if (layer == 'roadworks') colour = '#009900';
        var lineStyle = {
            fillOpacity: 0.8,
            fillColor: colour,
            strokeColor: colour,
            strokeWidth: 4,
            pointRadius: 7
        };
        var lineFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList), null, lineStyle);
        if (!mapContainsLayer(gmlLayer)) {
            gmlLayer = new OpenLayers.Layer.Vector('GML');
            map.addLayer(gmlLayer);
            setLayerIndex();
        }
        if (scn == congestionSCN)//still mouse hover
        {
            gmlLayer.addFeatures([lineFeature]);
            if (layer == 'roadworks') {
                if (!mapContainsLayer(gmlMarkerLayer)) {
                    gmlMarkerLayer = new OpenLayers.Layer.Markers('GMLMarkers');
                    map.addLayer(gmlMarkerLayer);
                    setLayerIndex();
                }
                var x = result[result.length - 2];
                var y = result[result.length - 1];
                var xy = new OpenLayers.LonLat(x, y);
                if (isLonLat) xy.transform(map.displayProjection, map.projection);
                gmlMarkerLayer.addMarker(new OpenLayers.Marker(xy, new OpenLayers.Icon(iconURL + 'Diversion.gif', new OpenLayers.Size(65, 39), new OpenLayers.Pixel(65 / -2, 39 / -2))));
            }
        }
    }
    else if (scn == 'esu' && result != undefined && result.length > 0) {
        var colour = '#0000FF';
        var lineStyle = {
            fillOpacity: 0.8,
            fillColor: colour,
            strokeColor: colour,
            strokeWidth: 4,
            pointRadius: 7
        };
        var lineFeatures = [];
        for (var i = 0; i < result.length; i++) {
            var gml = result[i].split(' ');
            var pointList = [];
            for (var j = 0; j < gml.length; j++) {
                var en = gml[j].split(',');
                if (en.length == 2) {
                    if (isLonLat) pointList.push(new OpenLayers.Geometry.Point(en[0], en[1]).transform(map.displayProjection, map.projection));
                    else pointList.push(new OpenLayers.Geometry.Point(en[0], en[1]));
                }
            }
            lineFeatures.push(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList), null, lineStyle));
        }
        esuLayer = new OpenLayers.Layer.Vector('ESULinks');
        map.addLayer(esuLayer);
        setLayerIndex();
        esuLayer.addFeatures(lineFeatures);
    }
    //Start Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
    if (operaToolTip != null && operaToolTip != undefined && navigator.appName.toLowerCase() == 'opera') {
        var str = (operaToolTip).replace(/^\s+/, '').replace(/\s+$/, '');
        tooltip.show(str);
        window.status = str;
    }
    //End Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
}
function displayCalander(isDisplay) {
    document.getElementById(mapId + 'txtFromDate').disabled = !isDisplay;
    document.getElementById(mapId + 'txtToDate').disabled = !isDisplay;
    //document.getElementById(mapId + 'sltFromHour').disabled = !isDisplay;
    //document.getElementById(mapId + 'sltToHour').disabled = !isDisplay;
    document.getElementById(mapId + 'chkTomorrow').disabled = !isDisplay;
    document.getElementById(mapId + 'chkNext7Days').disabled = !isDisplay;
    document.getElementById(mapId + 'chkAllDates').disabled = !isDisplay;
    document.getElementById(mapId + 'ClickDate').disabled = !isDisplay;
}
function getDateDDMMYYY(dateString) {
    var dateParts = dateString.split('/');
    //Modified By Nilesh Thakkar : Cygnet : 08-Apr-2011 as JS was converting 8 and 9 to 0 if we are not giving base in parseInt
    //var dd = parseInt(dateParts[0]);
    //var mm = parseInt(dateParts[1]);
    var dd = parseInt(dateParts[0], 10);
    var mm = parseInt(dateParts[1], 10);
    dateParts = dateParts[2].split(' ');
    var yy = parseInt(dateParts[0]);
    var maxDt = (((mm < 8) ? mm : mm - 1) % 2) + 30;
    if (mm == 2) maxDt = ((yy % 400 == 0) || ((yy % 100 != 0) && (yy % 4 == 0))) ? 29 : 28;
    if (dd > 0 && dd <= maxDt && mm > 0 && mm < 13 && yy > 2000 && yy <= 2100) {
        dateParts = dateParts[1].split(':');
        return new Date(yy, mm - 1, dd, dateParts[0], dateParts[1], 0);
    }
    return null;
}
function expandCollapseSubTitle(obj) {
    var filter = obj.parentNode;
    filter.className = (filter.className == 'showFilters') ? 'hideFilters' : 'showFilters';
}
function expandCollapse(obj) {
    if (obj != undefined && obj.parentNode != undefined) {
        var childs = obj.parentNode.children;
        if (childs != undefined && childs.length > 0) {
            for (var i = 0; i < childs.length; i++) {
                switch (childs[i].className) {
                    case 'boxHeader':
                        if (childs[i].children != undefined) childs[i].children[0].className = (childs[i].children[0].className == 'show') ? 'hide' : 'show';
                        break;
                    case 'boxContent':
                        childs[i].style.display = (childs[i].style.display == 'none') ? '' : 'none';
                        break;
                    case 'boxFooter':
                        childs[i].className = 'boxFooterHide';
                        break;
                    case 'boxFooterHide':
                        childs[i].className = 'boxFooter';
                        break;
                }
            }
        }
    }
}
/*Popup*/
function addMarker(ll, layer, popupContentHTML, iconName, iconWidth, iconHeight, scn, toolTip, highlightLink, cxy) {
    var feature = new OpenLayers.Feature(markerLayer, ll);
    var icon = new OpenLayers.Icon(iconURL + iconName, new OpenLayers.Size(iconWidth, iconHeight), new OpenLayers.Pixel(iconWidth / -2, iconHeight / -2));
    icon.imageDiv.style.cursor = 'pointer'; //For firefox
    icon.imageDiv.style.cursor = 'hand'; //For IE
    icon.imageDiv.title = toolTip;
    icon.imageDiv.setAttribute('layer', layer);
    feature.data.icon = icon;

    var marker = feature.createMarker();
    feature.closeBox = true;
    feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, { 'autoSize': true });
    feature.data.popupContentHTML = popupContentHTML;
    this.popup = null;
    var markerClick = function(evt) {
        currentPopup = null;
        clearPopups();
        feature.popup = null;
        if (feature.popup == null) {
            this.closeBox = true;
            this.popup = feature.createPopup(this.closeBox);
            map.addPopup(this.popup);
            this.popup.show();
            changeURL();
        }
        currentPopup = this.popup;
        showDepartures();
        removeHScrollbar();
        window.setTimeout('removeHScrollbar()', 1000);
        //currentPopup.updateSize();
        OpenLayers.Event.stop(evt);
    };
    var markerHover = function(evt) {
        //Start Cygnet Changes Ticket No: 2673 : Opera ToolTip Issue Milestone 5.0.0
        operaToolTip = toolTip;
        //End Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
        var layer = evt.element.getAttribute('layer');
        if (layer != undefined) {
            congestionSCN = scn;
            StreetViewApp.MapWebService.GetGML(scn, layer, onGetGMLSuccess, onGetMarkerFailed, scn + ',' + layer);
        }
    };
    var markerLeave = function(evt) {
        congestionSCN = '';
        if (gmlLayer != undefined && gmlLayer.features != undefined) gmlLayer.destroyFeatures();
        if (gmlMarkerLayer != undefined && gmlMarkerLayer.markers != undefined) {
            for (var i = gmlMarkerLayer.markers.length - 1; i >= 0; i--)
                gmlMarkerLayer.removeMarker(gmlMarkerLayer.markers[i]);
            gmlMarkerLayer.clearMarkers();
        }
        //Start Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
        if (operaToolTip != null && operaToolTip != undefined && navigator.appName.toLowerCase() == 'opera') {
            tooltip.hide();
            window.status = '';
        }
        //End Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
    };
    marker.events.register('mousedown', feature, markerClick);
    if (highlightLink == true) {
        marker.events.register('mouseover', feature, markerHover);
        marker.events.register('mouseout', feature, markerLeave);
    }
    if (cxy.lon.toFixed(3) == ll.lon.toFixed(3) && cxy.lat.toFixed(3) == ll.lat.toFixed(3)) popupMarker = marker;
    markerLayer.addMarker(marker);
}
function clearPopups() {
    currentPopup = null;
    var len = map.popups.length - 1;
    for (len; len >= 0; len--) {
        var p = map.popups[len];
        map.removePopup(p);
        p.destroy();
    }
}
function clearMarkersAndPopups() {
    clearPopups();
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (!(map.layers[idx].name == 'location' || map.layers[idx].name == 'Cloud Amber WMS' || map.layers[idx].name.toLowerCase() == "aerial" || map.layers[idx].name.toLowerCase() == "hybrid" || map.layers[idx].name.toLowerCase() == "shaded" || map.layers[idx].name.toLowerCase() == "satellite" || map.layers[idx].name.toLowerCase() == "google streets"))
            map.layers[idx].destroy();
    }
    esuLayer = null;
    gmlLayer = null;
    gmlMarkerLayer = null;
    markerLayer = null;
}
function clearLayer() {
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name == 'Cloud Amber WMS')
            map.layers[idx].destroy();
    }
    itnLayer = null;
}
function clearPopupsAndLayers() {
    clearPopups();
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name != 'location' && map.layers[idx].name.toLowerCase() != "aerial" && map.layers[idx].name.toLowerCase() != "hybrid" && map.layers[idx].name.toLowerCase() != "shaded" && map.layers[idx].name.toLowerCase() != "satellite" && map.layers[idx].name.toLowerCase() != "google streets")
            map.layers[idx].destroy();
    }
    itnLayer = null;
    esuLayer = null;
    gmlLayer = null;
    gmlMarkerLayer = null;
    markerLayer = null;
}
//Start
//Changes by Nilesh Thakkar
//Milestone: 5.0.0
//Ticket No: 2697 : TW – Concatenation Behavior
function showConcatenationPopupData(index) {
    var list1 = document.getElementById('itemLinks');
    if (list1 != undefined) {
        var childs1 = list1.children;
        if (childs1 != undefined && childs1.length > 0) {
            //alert(' childs1.Length - ' + childs1.length);
            for (var i = 0; i < childs1.length; i++) {
                //alert(' childs1[i].innerHTML - ' + childs1[i].innerHTML);
                var childs2 = childs1[i].children;
                if (childs2 != undefined && childs2.length > 0) {
                    //alert(' childs2.Length - ' + childs2.length);
                    for (var j = 0; j < childs2.length; j++) {
                        //alert(' childs2[j].innerHTML - ' + childs2[j].innerHTML);
                        if ((childs2[j].getAttribute('index') == 'hideMeLink')) {
                            if (childs2[j].style.display == '') childs2[j].style.display = 'none';
                            //else if (childs2[j].style.display == 'none') childs2[j].style.display = '';
                        }
                    }
                }

            }
        }
    }
    var list = document.getElementById('popupDataList');
    if (list != undefined) {
        var childs = list.children;
        if (childs != undefined && childs.length > 0) {
            for (var i = 0; i < childs.length; i++) {
                if (childs[i].getAttribute('index') == index) {
                    if (childs[i].style.display == 'none') childs[i].style.display = '';
                    //if (childs[i].style.display == '') childs[i].style.display = 'none';
                    //else if (childs[i].style.display == 'none') childs[i].style.display = '';
                }
                else if (childs[i].style.display == '') childs[i].style.display = 'none';
            }
        }
        showDepartures();
        removeHScrollbar();
        currentPopup.updateSize();
        currentPopup.panIntoView();
    }
}

//End
function createClusterToolTip(layer, count) {
    var toolTip = '';
    switch (layer) {
        case 'tl':
        case 'tr':
            toolTip = 'Multiple links in this area';
            break;
        case 'accident':
        case 'ptaccident':
            toolTip = count + ' accidents in this area';
            break;
        case 'incident':
        case 'ptincident':
            toolTip = count + ' incidents in this area';
            break;
        case 'roadworks':
            toolTip = count + ' roadworks in this area';
            break;
        case 'event':
            toolTip = count + ' events in this area';
            break;
        case 'majorscheme':
            toolTip = count + ' major schemes in this area';
            break;
        case 'carpark':
            toolTip = count + ' car parks in this area';
            break;
        case 'naptanbus':
        case 'naptantmu':
            toolTip = count + ' stops in this area';
            break;
        case 'naptanrail':
            toolTip = count + ' rail stations in this area';
            break;
        case 'trafficsignal':
            toolTip = count + ' traffic signals in this area';
            break;
        case 'portabletrafficsignal':
            toolTip = count + ' portable traffic signals in this area';
            break;
        case 'vms':
            toolTip = count + ' information signs in this area';
            break;
        case 'cctv':
            toolTip = count + ' cctv in this area';
            break;
        case 'meteorological':
            toolTip = count + ' meteorological in this area';
            break;
        case 'detector':
            toolTip = count + ' detectors in this area';
            break;
    }
    return toolTip;
}
function createClusterPopup(layer, count, easting, northing) {
    var result = '<div class=\'popupCluster\'>';
    switch (layer) {
        case 'tl':
        case 'tr':
            result += '<span class=\'heading\'>Multiple links in this area, zoom in to find your congestion.</span>';
            break;
        case 'accident':
        case 'ptaccident':
            result += '<span class=\'heading\'>' + count + ' accidents in this area, zoom in to find your accident.</span>';
            break;
        case 'incident':
        case 'ptincident':
            result += '<span class=\'heading\'>' + count + ' incidents in this area, zoom in to find your incident.</span>';
            break;
        case 'roadworks':
            result += '<span class=\'heading\'>' + count + ' roadworks in this area, zoom in to find your roadwork.</span>';
            break;
        case 'event':
            result += '<span class=\'heading\'>' + count + ' events in this area, zoom in to find your event.</span>';
            break;
        case 'majorscheme':
            result += '<span class=\'heading\'>' + count + ' major schemes in this area, zoom in to find your major scheme.</span>';
            break;
        case 'carpark':
            result += '<span class=\'heading\'>' + count + ' car parks in this area, zoom in to find your car park.</span>';
            break;
        case 'naptanbus':
        case 'naptantmu':
            result += '<span class=\'heading\'>' + count + ' stops in this area, zoom in to find your stop.</span>';
            break;
        case 'naptanrail':
            result += '<span class=\'heading\'>' + count + ' rail stations in this area, zoom in to find your rail station.</span>';
            break;
        case 'trafficsignal':
            result += '<span class=\'heading\'>' + count + ' traffic signals in this area, zoom in to find your traffic signal.</span>';
            break;
        case 'portabletrafficsignal':
            result += '<span class=\'heading\'>' + count + ' portable traffic signals in this area, zoom in to find your portable traffic signal.</span>';
            break;
        case 'vms':
            result += '<span class=\'heading\'>' + count + ' information signs in this area, zoom in to find your information sign.</span>';
            break;
        case 'cctv':
            result += '<span class=\'heading\'>' + count + ' cctv in this area, zoom in to find your cctv.</span>';
            break;
        case 'meteorological':
            result += '<span class=\'heading\'>' + count + ' meteorological in this area, zoom in to find your meteorological.</span>';
            break;
        case 'detector':
            result += '<span class=\'heading\'>' + count + ' detector in this area, zoom in to find your detector.</span>';
            break;
    }
    result += '<div style=\'padding-top:3px;text-align:center\'><a class=\'link\' title=\'Zoom out to overview\' href=\'javascript:setCentreAndZoom(' + easting + ',' + northing + ',false);\'>Zoom map out</a> &middot; <a class=\'link\' title=\'Zoom in for closer view\' href=\'javascript:setCentreAndZoom(' + easting + ',' + northing + ',true)\'>Zoom map in</a></div>';
    result += '</div>';
    return result;
}
function addSingleMarker(mapLayer, marker, cxy) {
    var easting = marker.Easting, northing = marker.Northing;
    if (isLonLat) {
        easting = marker.Lon;
        northing = marker.Lat;
    }
    var ll = new OpenLayers.LonLat(easting, northing);
    if (isLonLat) ll.transform(map.displayProjection, map.projection);
    var content = '<div id=\'popupDiv\'>' + createMarkerPopup(mapLayer.Name, marker.Scn, easting, northing, marker.Summary, marker.Severity, marker.IconName, mapLayer.ReportFault, mapLayer.ViewDocument) + '</div>';
    addMarker(ll, mapLayer.Name, content, marker.IconName, marker.IconWidth, marker.IconHeight, marker.Scn, marker.ToolTip, mapLayer.HighlightLink, cxy);
}
function createMarkerPopup(layer, scn, easting, northing, summary, severity, markerIcon, reportFault, showDocuments) {
    var url = '', result = '';
    var imgWidth = 310, imgHeight = 200;
    var cntWidth = 310, cntHeight = 200;
    if (layer == 'carpark') {
        cntHeight = 265;
        imgHeight = 265;
    }
    else if (layer == 'vms') {
        cntWidth = 350;
        cntHeight = 210;
        imgWidth = 350;
        imgHeight = 210;
    }
    else if (layer == 'cctv') {
        cntWidth = 350;
        cntHeight = 250;
        imgWidth = 350;
        imgHeight = 250;
    }
    result += '<div class=\'popup\' layer=\'' + layer + '\' scn=\'' + scn + '\' minWidth=\'' + cntWidth + '\'>';
    result += '<div class=\'popupHeader\'>';
    result += '<div class=\'selected\' onclick="showContent(this,\'popupSummary\')">Summary</div>';
    result += '<div onclick="showContent(this,\'popupLocation\')">Location</div>';
    if (layer == 'carpark') result += '<div onclick="showContent(this,\'popupMore\')">More...</div>';
    result += '</div>';
    result += '<div class=\'popupContent\'>';
    result += '<div tab=\'popupSummary\' class=\'showContent\' style=\'width:' + cntWidth + 'px;height:' + cntHeight + 'px;\'>';
    result += createSummary(layer, scn, summary, severity, showDocuments);
    result += '</div>';
    if (mapSource == 'google' && apiKey != undefined && apiKey.length > 0) url = 'http://maps.google.com/staticmap?center=' + northing + ',' + easting + '&zoom=13&size=' + imgWidth + 'x' + imgHeight + '&key=' + apiKey + '&markers=' + northing + ',' + easting + ',blue';
    else if (mapSource == 'bingve' && apiKey != undefined && apiKey.length > 0) url = 'http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/' + northing + ',' + easting + '/15?mapSize=' + imgWidth + ',' + imgHeight + '&pp=' + northing + ',' + easting + ';21&key=' + apiKey;
    else url = locationMapUrl + '?X=' + easting + '&Y=' + northing + '&width=' + imgWidth + '&height=' + imgHeight + '&icon=' + markerIcon;
    result += '<div tab=\'popupLocation\' class=\'hideContent\' style=\'height:' + cntHeight + 'px;width:' + imgWidth + 'px;text-align:center;background:url(' + url + ') 0 0;\'>';
    result += '</div>';
    result += '<div tab=\'popupMore\' class=\'hideContent\' style=\'height:' + cntHeight + 'px;\'>';
    if (layer == 'carpark') result += createCarParkSummary(summary, showDocuments);
    result += '</div>';
    result += '</div>';
    result += '<div style=\'padding-top:3px;text-align:center\'><a class=\'link\' title=\'Zoom out to overview\' href=\'javascript:setCentreAndZoom(' + easting + ',' + northing + ',false);\'>Zoom map out</a> &middot; <a class=\'link\' title=\'Zoom in for closer view\' href=\'javascript:setCentreAndZoom(' + easting + ',' + northing + ',true)\'>Zoom map in</a>' + getReportFault(layer, scn, reportFault) + '</div>';
    result += '</div>';
    return result;
}
function getReportFault(layer, scn, showFault) {
    if (mapSource == 'oxford' && showFault == true) return ' &middot; <a href=\'http://www.oxfordshirehighways.org/reporting\' class=\'link\' title=\'Report fault\'>Report fault</a>';
    else if (showFault == true && reportFaultUrl != undefined && reportFaultUrl != '') {
        var pt = '';
        switch (layer) {
            case 'tl':
            case 'tr':
                pt = 'CF';
                break;
            case 'accident':
                pt = 'AF';
                break;
            case 'incident':
                pt = 'IF';
                break;
            case 'ptaccident':
                pt = 'PAF';
                break;
            case 'ptincident':
                pt = 'PIF';
                break;
            case 'roadworks':
                pt = 'RF';
                break;
            case 'event':
                pt = 'EF';
                break;
            case 'majorscheme':
                pt = 'MS';
                break;
            case 'carpark':
                pt = 'CPF';
                break;
            case 'naptanbus':
            case 'naptantmu':
            case 'naptanrail':
                pt = 'NF';
                break;
            case 'trafficsignal':
                pt = 'TF';
                break;
            case 'portabletrafficsignal':
                pt = 'PTF';
                break;
            case 'vms':
                pt = 'VMSF';
                break;
            case 'cctv':
                pt = 'CCTVF';
                break;
            case 'meteorological':
                pt = 'MF';
                break;
            case 'detector':
                pt = 'DF';
                break;
        }
        var mediaParam = '';
        if (media != undefined) mediaParam = 'mode=' + media + '&';
        return ' &middot; <a href=\'' + reportFaultUrl + '?' + mediaParam + 'r=' + scn + '&PT=' + pt + '\' class=\'link\' title=\'Report fault\'>Report fault</a>';
    }
    return '';
}
function createSummary(layer, scn, summary, severity, showDocuments) {
    switch (layer) {
        case 'tl':
        case 'tr':
            return createCongestionSummary(layer, summary, showDocuments);
            break;
        case 'accident':
        case 'incident':
        case 'ptaccident':
        case 'ptincident':
        case 'roadworks':
        case 'event':
        case 'section58':
            return createDisruptionSummary(layer, summary, severity, showDocuments);
            break;
        case 'majorscheme':
            return createMajorSchemeSummary(summary, showDocuments);
            break;
        case 'carpark':
            var title = summary[0] + ' - Capacity ' + summary[2] + ', Spaces ' + summary[8] + ', Status ' + summary[9];
            return '<div class=\'popupImageDiv\'><img src=\'' + signURL + '?layer=' + layer + '&scn=' + scn + '\' alt=\'' + title + '\' title=\'' + title + '\'/></div>';
            break;
        case 'naptanbus':
        case 'naptantmu':
        case 'naptanrail':
            return createNaptanSummary(layer, summary, showDocuments);
            break;
        case 'trafficsignal':
        case 'portabletrafficsignal':
            return createTrafficSignalSummary(layer, summary, showDocuments);
            break;
        case 'vms':
            var vmsSummary = '<div class=\'popupImageDiv\'><img src=\'' + signURL + '?layer=' + layer + '&scn=' + scn + '\' alt=\'' + summary[2] + '\' title=\'' + summary[2] + '\'/></div>';
            var docs = getDocuments(summary, showDocuments, 3);
            if (docs != '') {
                vmsSummary = '<table style=\'width:100%;height:100%\'><tr><td colspan=\'2\' style=\'padding:0px !important;\'>' + vmsSummary + '</td></tr>' + docs + '</table>';
            }
            return vmsSummary;
            break;
        case 'cctv':
            var detail = '<table style=\'width:330px;height:100%\'>';
            detail += '<tr><td colspan=\'2\' style=\'padding:0px !important;width:330px;height:248px;\'><img width=\'330px\' height=\'248px\' src=\'' + signURL + '?layer=' + layer + '&scn=' + scn + '\' alt=\'CCTV camera\' title=\'CCTV camera\'/></td></tr>';
            if (!(summary[2] != undefined && summary[2].length == 1 && (summary[2] == 'n' || summary[2] == 'N'))) detail += '<tr><th>Image captured time</th><td>' + summary[3] + '</td></tr>';
            detail += getDocuments(summary, showDocuments, 3);
            detail += '</table>';
            return detail;
            break;
        case 'meteorological':
            return createMeteorologicalSummary(summary, showDocuments);
            break;
        case 'detector':
            return createDetectorSummary(summary, showDocuments);
            break;
    }
}
function createCongestionSummary(layer, summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 4) {
        layer = layer.toLowerCase();
        table += '<table style=\'width:100%;height:100%\'>';
        //table+='<tr><th>Description</th><td>'+summary[1]+'</td></tr>';//For TW
        table += '<tr><th>Short description</th><td>' + summary[0] + '</td></tr>'; //For Others
        table += '<tr><th>Long description</th><td>' + summary[1] + '</td></tr>'; //For Others
        if (layer == 'tr') {
            if (summary[2] != undefined && summary[2].length > 0) table += '<tr><th>Current journey time</th><td>' + summary[2] + '</td></tr>';
            else table += '<tr><th>Current speed</th><td>' + summary[3] + '</td></tr>';
            table += getDocuments(summary, showDocuments, 4);
        }
        else if (summary.length >= 6) {
            if (summary[2] != undefined && summary[2].length > 0 && summary[3] != undefined && summary[3].length > 0) {
                table += '<tr><th>Current journey time</th><td>' + summary[2] + '</td></tr>';
                //table+='<tr><th>Average peak journey time</th><td>'+summary[3]+'</td></tr>';//For Oxford & Dorset
                table += '<tr><th>Average journey time</th><td>' + summary[3] + '</td></tr>'; //For Others
            }
            else {
                table += '<tr><th>Current speed</th><td>' + summary[4] + '</td></tr>';
                //table+='<tr><th>Normal peak speed</th><td>'+summary[5]+'</td></tr>';//For Oxford & Dorset
                table += '<tr><th>Normal speed</th><td>' + summary[5] + '</td></tr>';
            }
            table += getDocuments(summary, showDocuments, 6);
        }
        table += '</table>';
    }
    return table;
}
function createDisruptionSummary(layer, summary, severity, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 9) {
        var startText = 'Start date';
        var endText = 'End date';
        layer = layer.toLowerCase();
        if (layer == 'accident' || layer == 'ptaccident') startText = 'Accident time';
        else if (layer == 'incident' || layer == 'ptincident') startText = 'Incident time';
        else if (layer == 'roadworks' || layer == 'section58' || layer == 'event') {
            startText = 'Planned start';
            endText = 'Planned end';
        }
        table += '<table style=\'width:100%;height:100%\'>';
        //table+='<tr><th>Description</th><td>'+summary[2]+'</td></tr>';      //For TW
        table += '<tr><th>Name</th><td>' + summary[0] + '</td></tr>';               //For Others
        table += '<tr><th>Short description</th><td>' + summary[1] + '</td></tr>';  //For Others
        table += '<tr><th>Long description</th><td>' + summary[2] + '</td></tr>';   //For Others
        if (summary[3] != undefined && summary[3].length > 0) table += '<tr><th>Type</th><td>' + summary[3] + '</td></tr>';
        table += '<tr><th>Location description</th><td>' + summary[4] + '</td></tr>';
        table += '<tr><th>' + startText + '</th><td>' + summary[5] + '</td></tr>';
        table += '<tr><th>' + endText + '</th><td>' + summary[6] + '</td></tr>';
        table += '<tr><th>Severity</th><td>' + severity + '</td></tr>';
        table += '<tr><th>Diversion in force</th><td>' + summary[7] + '</td></tr>';
        table += '<tr><th>Diversion route</th><td>' + summary[8] + '</td></tr>';
        var idx = 9;
        if (layer == 'roadworks' || layer == 'section58' && summary.length >= 10) {
            table += '<tr><th>Contractor</th><td>' + summary[9] + '</td></tr>';
            idx = 10;
        }
        else if (layer == 'event' && summary.length >= 11) {
            table += '<tr><th>Organiser</th><td>' + summary[9] + '</td></tr>';
            table += '<tr><th>Venue</th><td>' + summary[10] + '</td></tr>';
            idx = 11;
        }
        table += getDocuments(summary, showDocuments, idx);
        table += '</table>';
    }
    return table;
}
function createMajorSchemeSummary(summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 4) {
        table += '<table style=\'width:100%;height:100%\'><tr><th>Long description</th><td>' + summary[1] + '</td></tr>';
        table += '<tr><th>Planned start</th><td>' + summary[2] + '</td></tr>';
        table += '<tr><th>Planned end</th><td>' + summary[3] + '</td></tr>';
        table += getDocuments(summary, showDocuments, 4);
        table += '</table>';
    }
    return table;
}
function createCarParkSummary(summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 12) {
        table += '<table style=\'width:100%;height:100%\'>';
        table += '<tr><th>Short description</th><td>' + summary[0] + '</td></tr>';
        table += '<tr><th>Long description</th><td>' + summary[1] + '</td></tr>';
        table += '<tr><th>Capacity</th><td>' + summary[2] + '</td></tr>';
        table += '<tr><th>Disabled capacity</th><td>' + summary[3] + '</td></tr>';
        table += '<tr><th>Time period</th><td>' + summary[4] + '</td></tr>';
        table += '<tr><th>Cost</th><td>' + summary[5] + '</td></tr>';
        table += '<tr><th>Opening time</th><td>' + summary[6] + '</td></tr>';
        table += '<tr><th>State</th><td>' + summary[7] + '</td></tr>';
        table += '<tr><th>Spaces</th><td>' + summary[8] + '</td></tr>';
        table += '<tr><th>Occupancy percentage</th><td>' + summary[10] + '</td></tr>';
        table += '<tr><th>Occupancy trend</th><td>' + summary[11] + '</td></tr>';
        table += getDocuments(summary, showDocuments, 12);
        table += '</table>';
    }
    return table;
}
function createNaptanSummary(layer, summary, showDocuments) {
    var table = '';
    layer = layer.toLowerCase();
    if (summary != undefined && summary.length >= 2) {
        table += '<table style=\'width:100%;height:100%\'>';
        if (layer != 'naptanrail') table += '<tr><th>SMS Number</th><td>' + summary[0] + '</td></tr>';
        table += '<tr><th>Stop Name</th><td>' + summary[1] + '</td></tr>';
        table += getDocuments(summary, showDocuments, 2);
        if (layer == 'naptanrail') {
            //var target = '';
            var target = ' target=\'_blank\' '; //For TW
            table += '<tr><td colspan=\'2\'>';
            table += '<a href=\'http://realtime.nationalrail.co.uk/ldb/station.aspx?T=' + summary[0] + '\' title=\'Stop named ' + summary[1] + ' departures\'' + target + '>View departure board</a>';
            table += ' &middot; <a href=\'http://www.nationalrail.co.uk/stations/' + summary[0] + '/details.html\' title=\'Stop named ' + summary[1] + ' details\'' + target + '>View station details</a>';
            table += '</td></tr>';
        }
        else table += '<tr><td colspan=\'2\' departures=\'true\'>Loading departure details...</td></tr>';
        table += '</table>';
    }
    return table;
}
function createTrafficSignalSummary(layer, summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 3) {
        table += '<table style=\'width:100%;height:100%\'>';
        table += '<tr><th>Short description</th><td>' + summary[0] + '</td></tr>';
        table += '<tr><th>Long description</th><td>' + summary[1] + '</td></tr>';
        table += '<tr><th>Type</th><td>' + summary[2] + '</td></tr>';
        if (layer == 'portabletrafficsignal' && summary.length >= 5) {
            table += '<tr><th>Emergency name</th><td>' + summary[3] + '</td></tr>';
            table += '<tr><th>Phone</th><td>' + summary[4] + '</td></tr>';
            table += getDocuments(summary, showDocuments, 5);
        }
        else table += getDocuments(summary, showDocuments, 3);
        table += '</table>';
    }
    return table;
}
function createMeteorologicalSummary(summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 5) {
        table += '<table style=\'width:100%;height:100%\'>';
        table += '<tr><th>Short description</th><td>' + summary[0] + '</td></tr>';
        table += '<tr><th>Long description</th><td>' + summary[1] + '</td></tr>';
        table += '<tr><th>Description</th><td>' + summary[2] + '</td></tr>';
        table += '<tr><th>Start date</th><td>' + summary[3] + '</td></tr>';
        table += '<tr><th>End date</th><td>' + summary[4] + '</td></tr>';
        table += getDocuments(summary, showDocuments, 5);
        table += '</table>';
    }
    return table;
}
function createDetectorSummary(summary, showDocuments) {
    var table = '';
    if (summary != undefined && summary.length >= 7) {
        table += '<table style=\'width:100%;height:100%\'>';
        table += '<tr><th>Short description</th><td>' + summary[0] + '</td></tr>';
        table += '<tr><th>Long description</th><td>' + summary[1] + '</td></tr>';
        table += '<tr><th>Type</th><td>' + summary[2] + '</td></tr>';
        table += '<tr><th>Total flow</th><td>' + summary[3] + '</td></tr>';
        table += '<tr><th>Flow interval</th><td>' + summary[4] + '</td></tr>';
        table += '<tr><th>Speed</th><td>' + summary[5] + '</td></tr>';
        table += '<tr><th>Headway</th><td>' + summary[6] + '</td></tr>';
        table += getDocuments(summary, showDocuments, 7);
        table += '</table>';
    }
    return table;
}
function getDocuments(summary, showDocuments, index) {
    if (showDocuments) {
        var documents = 'No documents available';
        if (summary.length > index && summary[index] != undefined && summary[index].length > 0) documents = summary[index];
        return '<tr><th>Documents</th><td>' + documents + '</td></tr>';
    }
    return '';
}
function showContent(obj, tabId) {
    var popupHeader = obj.parentNode;
    if (popupHeader != undefined && tabId != undefined) {
        var headDivs = popupHeader.children;
        if (headDivs != undefined) for (var i = 0; i < headDivs.length; i++) if (headDivs[i].tagName.toLowerCase() == 'div') headDivs[i].className = '';
        obj.className = 'selected';
        var popupDiv = popupHeader.parentNode;
        if (popupDiv != undefined && popupDiv.children != undefined && popupDiv.children.length > 1) {
            var contentDivs = popupDiv.children[1].children;
            if (contentDivs != undefined) {
                for (var i = 0; i < contentDivs.length; i++) {
                    var tab = contentDivs[i].getAttribute('tab');
                    if (tab != undefined) if (tab == tabId) contentDivs[i].className = 'showContent'; else contentDivs[i].className = 'hideContent';
                }
                removeHScrollbar();
            }
        }
    }
}
function showPopupData(index) {
    var list = document.getElementById('popupDataList');
    if (list != undefined) {
        var childs = list.children;
        if (childs != undefined && childs.length > 0)
            for (var i = 0; i < childs.length; i++)
            if (childs[i].getAttribute('index') == index) childs[i].style.display = '';
        else if (childs[i].style.display == '') childs[i].style.display = 'none';
        showDepartures();
        removeHScrollbar();
    }
}
function getPopupElement() {
    if (currentPopup != undefined && currentPopup.visible()) {
        var popupList = document.getElementById('popupDataList');
        if (popupList != undefined && popupList.children.length > 0) {
            var childDivs = popupList.children;
            for (var i = 0; i < childDivs.length; i++) {
                if (childDivs[i].style.display != 'none' && childDivs[i].children.length > 0) return childDivs[i].children[0];
            }
        }
        else {
            var popupDiv = document.getElementById('popupDiv');
            if (popupDiv != undefined && popupDiv.children.length > 0) return popupDiv.children[0];
        }
    }
    return null;
}
function removeHScrollbar() {
    var popupDetail = getPopupElement();
    if (popupDetail != undefined) {
        if (popupDetail.children.length > 1) {
            var layer = popupDetail.getAttribute('layer');
            if (layer == 'cctv') return;
            var popupContents = popupDetail.children[1].children;
            var minWidth = parseInt(popupDetail.getAttribute('minWidth'));
            if (popupContents != undefined && popupContents.length > 0)
                for (var i = 0; i < popupContents.length; i++)
                if (popupContents[i].className == 'showContent' && popupContents[i].children.length > 0 && popupContents[i].children[0].tagName.toLowerCase() == 'table') {
                var activeContent = popupContents[i];
                var table = activeContent.children[0];
                if (layer == 'naptanbus' || layer == 'naptantmu' || layer == 'naptanrail') {
                    table.style.width = '';
                    var w = table.clientWidth; //IE 7 fix
                    w = ((table.offsetWidth > minWidth) ? table.offsetWidth : minWidth) + 'px';
                    activeContent.style.width = w;
                    table.style.width = w;
                    var cntDiff = activeContent.offsetWidth - activeContent.clientWidth;
                    if (cntDiff > 0) activeContent.style.width = (table.offsetWidth + cntDiff) + 'px';
                    currentPopup.updateSize();
                }
                else {
                    var w = table.clientWidth; //IE 7 fix
                    var diff = activeContent.offsetWidth - activeContent.clientWidth;
                    w = ((activeContent.offsetWidth > minWidth) ? minWidth : activeContent.offsetWidth) - diff;
                    table.style.width = w + 'px';
                }
            }
        }
    }
}
function showDepartures() {
    if (departureTimer != undefined) window.clearInterval(departureTimer);
    var obj = getSelectedLayer();
    if (obj != undefined) {
        var popupDetail = getPopupElement();
        if (popupDetail != undefined) {
            var scn = popupDetail.getAttribute('scn');
            var layer = popupDetail.getAttribute('layer');
            if (scn != undefined && scn != '' && layer != undefined && (layer == 'naptanbus' || layer == 'naptantmu')) {
                StreetViewApp.MapWebService.GetDeparture(scn, onGetDepartures, onGetMarkerFailed, scn + ',' + layer);
                departureTimer = window.setInterval(function() {
                    if (currentPopup != undefined && currentPopup.visible()) {
                        StreetViewApp.MapWebService.GetDeparture(scn, onGetDepartures, onGetMarkerFailed, scn + ',' + layer);
                    }
                    else {
                        window.clearInterval(departureTimer);
                    }
                }, 60000);
            }
        }
    }
}
function onGetDepartures(result, method) {
    if (result != undefined && result.d != undefined) result = result.d;
    var popupDetail = getPopupElement();
    if (popupDetail != undefined && method != undefined) {
        var scn = popupDetail.getAttribute('scn');
        var layer = popupDetail.getAttribute('layer');
        method = method.split(',');
        if (method.length > 1 && scn == method[0] && layer == method[1]) {
            var d = new Date();
            var n;
            var dt = '';
            n = d.getHours();
            dt += ' ' + ((n < 10) ? '0' + n : n);
            n = d.getMinutes();
            dt += ':' + ((n < 10) ? '0' + n : n);
            n = d.getSeconds();
            dt += ':' + ((n < 10) ? '0' + n : n);

            if (result == '') result = ' No current  departures available';
            else result = 'Real time shown in mins, timetable in 24hr clock' + result;
            var tdTags = popupDetail.getElementsByTagName('td');
            if (tdTags != undefined && tdTags.length > 0) {
                for (var i = 0; i < tdTags.length; i++) {
                    if (tdTags[i].getAttribute('departures') == 'true') {
                        tdTags[i].innerHTML = 'Last refresh time ' + dt + '<br>' + result;
                        break;
                    }
                }
            }
            removeHScrollbar();
        }
    }
    else {
        window.clearInterval(departureTimer);
    }
}
function showDocuments(obj, scn) {
    var left = screen.width / 2 - 420;
    var top = screen.height / 2 - 220;
    var path = document.getElementById('viewDocuments').value;
    var docWindow = window.open(path + '?o=' + obj + '&r=' + scn, 'Documents', 'Width=840,Height=500,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=yes,top=' + top + 'px,left=' + left + 'px');
    docWindow.focus();
    return false;
}
function updateSize(obj) {
    return;
    obj.style.height = obj.height + 'px';
    obj.style.width = obj.width + 'px';
    var summary = document.getElementById('popupSummary');
    if (summary != undefined && parseInt(summary.style.width) < obj.width) {
        var w = (summary.clientWidth < summary.offsetWidth) ? obj.width + 21 : obj.width;
        summary.style.width = w + 'px';
    }
}
/*Find Location*/
function txt_KeyDown(e, obj) {
    if (e.keyCode == 13) {
        switch (obj.id) {
            case 'txtPostCode':
                findPostCodeLocation();
                break;
            case 'txtStreet':
                findLocation();
                break;
        }
    }
}
function findPostCodeLocation() {
    var postCode = document.getElementById('txtPostCode').value.replace(/^\s+|\s+$/g, '');
    if (postCode != '') {
        enableSearch(false);
        StreetViewApp.MapWebService.FindLocation(postCode, '', onGetLocationSuccess, onGetLocationFailed, 'postcode');
    }
}
function findLocation() {
    var postCode = document.getElementById('txtPostCode').value.replace(/^\s+|\s+$/g, '');
    var street = document.getElementById('txtStreet').value.replace(/^\s+|\s+$/g, '');
    var selStreet = document.getElementById('selStreetTown');
    if (selStreet != undefined && selStreet.selectedIndex > 0) street = street + ',' + selStreet.value.replace(/^\s+|\s+$/g, '');
    if (mapSource == 'cheshire') postCode = '';
    if (postCode != '' || street != '') {
        enableSearch(false);
        StreetViewApp.MapWebService.FindLocation(postCode, street, onGetLocationSuccess, onGetLocationFailed, 'street');
    }
}

function findGazetteerLocation() {
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name == 'location')
            map.layers[idx].destroy();
    }
    locationLayer = null;

    var street = getValueById('txtLocation');
    if (street != '') {
        enableSearch(false);
        StreetViewApp.MapWebService.FindGazetteerLocation(street, onGetGazetteerLocationSuccess, onGetGazetteerLocationFailed, 'street');
    }
}

function findGazetteerPostCode() {
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name == 'location')
            map.layers[idx].destroy();
    }
    locationLayer = null;

    var street = getValueById('txtPostCode');
    if (street != '') {
        enableSearch(false);
        StreetViewApp.MapWebService.FindGazetteerPostCode(street, onGetGazetteerLocationSuccess, onGetGazetteerLocationFailed, 'postcode');
    }
}


function onGetGazetteerLocationSuccess(result, method) {
    enableSearch(true);
    clearSearch();
    if (result != undefined && result.d != undefined) result = result.d;
    if (result == '') {
        if (method == 'postcode') setInnerHTML('postCodeError', 'Postcode not found');
        else setInnerHTML('locationError', 'No address found');
    }
    else if (result.indexOf('moveMapToXY(') == 0) {
        eval(result);
    }
    else
        setInnerHTML('locationList', result);
}
function onGetGazetteerLocationFailed(error, method) {
    if (canShowError) alert(error.get_message());
    clearSearch();
    if (method == 'postcode') setInnerHTML('postCodeError', 'Postcode not found');
    else setInnerHTML('locationError', 'No address found');
}

function onGetLocationSuccess(result, method) {
    enableSearch(true);
    clearSearch();
    if (result != undefined && result.d != undefined) result = result.d;
    if (result == '') {
        if (method == 'postcode') document.getElementById('postCodeError').innerHTML = 'Postcode not found';
        else document.getElementById('locationError').innerHTML = 'No address found';
    }
    else if (result.indexOf('moveMapToXY(') == 0) eval(result);
    else document.getElementById('locationList').innerHTML = result;
}
function onGetLocationFailed(error, method) {
    if (canShowError) alert(error.get_message());
    clearSearch();
    if (method == 'postcode') document.getElementById('postCodeError').innerHTML = 'Postcode not found';
    else document.getElementById('locationError').innerHTML = 'No address found';
}
function clearSearch() {
    setInnerHTML('locationList', '');
    setInnerHTML('locationError', '');
    setInnerHTML('postCodeError', '');
    setValue('txtPostCode', '');
    setValue('txtStreet', '');
    setValue('txtLocation', '');

    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name == 'location')
            map.layers[idx].destroy();
    }
    locationLayer = null;

    //    if (locationLayer != undefined) {
    //        locationLayer.destroy();
    //        locationLayer = null;
    //        /*var len=locationLayer.markers.length-1;
    //        for(len;len>=0;len--)
    //        {
    //        var m=locationLayer.markers[len];
    //        locationLayer.removeMarker(m);
    //        m.destroy();    
    //        m=null;
    //        }*/
    //    }
}
function enableSearch(isEnable) {
    setDisabled('txtPostCode', isEnable);
    setDisabled('btnLocate', isEnable);
    setDisabled('txtStreet', isEnable);
    setDisabled('txtLocation', isEnable);
    setDisabled('btnSearch', isEnable);
    setDisabled('btnClear', isEnable);
}
function moveMapTo(obj) {
    if (obj != undefined) {
        if (obj.value != undefined && obj.value != '') {
            var ne = obj.value.split(',');
            moveMapToXY(ne[0], ne[1]);
        }
        var objTown = document.getElementById('selTown');
        var objDistrict = document.getElementById('selDistrict');
        if (objTown != obj) objTown.selectedIndex = 0;
        else if (objDistrict != obj) objDistrict.selectedIndex = 0;
        document.getElementById('txtPostCode').value = '';
    }
}
function moveMapToXY(centerX, centerY, toolTip) {
    mapCentreX = centerX;
    mapCentreY = centerY;
    if (map.zoom < 8) mapCentreZoom = 8;
    else mapCentreZoom = map.zoom;
    centre();
    showLocation(centerX, centerY, toolTip);
}
function showLocation(centerX, centerY, toolTip) {
    if (locationLayer == undefined) {
        locationLayer = new OpenLayers.Layer.Markers('location');
        map.addLayer(locationLayer);
    }
    setLayerIndex();
    var cxy = new OpenLayers.LonLat(centerX, centerY);
    if (isLonLat) cxy.transform(map.displayProjection, map.projection);
    var feature = new OpenLayers.Feature(locationLayer, cxy);
    var icon = new OpenLayers.Icon('Images/location_pin.png', new OpenLayers.Size(60, 59), new OpenLayers.Pixel(-48, -50));
    if (toolTip != undefined) icon.imageDiv.title = toolTip;
    feature.data.icon = icon;
    locationLayer.addMarker(feature.createMarker());
}
/*Remember location*/
function rememberLocation() {
    var dt = new Date();
    dt.setMonth(dt.getMonth() + 1);
    var exp = ';expires=' + dt.toGMTString() + ';';
    document.cookie = 'zoom=' + map.zoom + exp;
    var obj = getSelectedLayer();
    if (obj != undefined && obj.value != undefined) document.cookie = 'layer=' + escape(obj.value) + exp;
    else document.cookie = 'layer=;expires=23/09/2000 13:24:00';
    var cxy = new OpenLayers.LonLat(map.center.lon, map.center.lat);
    if (isLonLat) cxy.transform(map.projection, map.displayProjection);
    document.cookie = 'cx=' + cxy.lon + exp;
    document.cookie = 'cy=' + cxy.lat + exp;
}
/*General*/
function changeURL() {
    if (location.href.indexOf('yorkshirevoyager.com') > -1) {
        var anchor = document.getElementsByTagName('a');
        for (i = 0; i < anchor.length; i++) {
            if (anchor[i].href.indexOf('gettheresooner.travelsouthyorkshire.com')) {
                var re = /gettheresooner.travelsouthyorkshire/i;
                anchor[i].href = anchor[i].href.replace(re, 'www.yorkshirevoyager');
            }
        }
    }
}

function createTag(tagName, value) {
    var tag = document.createElement(tagName);
    if (value != undefined) tag.innerHTML = value;
    return tag;
}

/// <summary>
/// Added by Cygnet - 3rd Mar, 2011    
/// Milestone: V5.0.0 - OS GML
/// Ticket No: MAP 2203. Bing Re-Skin and Layer Switcher
///</summary>


function SetMapBaseLayer(strBaseLayer) {
    if (strBaseLayer != null && strBaseLayer != '' && mapSource == 'bingve') {
        if (strBaseLayer == baseLayer && document.getElementById('lnkLayers') != null && document.getElementById('lblShadedHeader') != null) {
            document.getElementById('lnkLayers').innerHTML = document.getElementById('lblShadedHeader').innerHTML;
            alert('baseLayer called' + strBaseLayer);
        }
        else if (strBaseLayer == hybrid && document.getElementById('lnkLayers') != null && document.getElementById('lblHybridHeader') != null) {
            document.getElementById('lnkLayers').innerHTML = document.getElementById('lblHybridHeader').innerHTML;
            alert('hybrid called' + strBaseLayer);
        }
        else if (strBaseLayer == aerial && document.getElementById('lnkLayers') != null && document.getElementById('lblAerialHeader') != null) {
            alert('aerial called' + strBaseLayer);
            document.getElementById('lnkLayers').innerHTML = document.getElementById('lblAerialHeader').innerHTML;
        }

        map.setBaseLayer(strBaseLayer);
    }
    else
        map.setBaseLayer(baseLayer);
}


function ZoomMapIn(evt) {
    if (evt.preventDefault)
        evt.preventDefault();
    else
        evt.returnValue = false;

    if (map != null) {
        map.zoomIn();
    }
}

function ZoomMapOut(evt) {
    if (evt.preventDefault)
        evt.preventDefault();
    else
        evt.returnValue = false;

    if (map != null) {
        map.zoomOut();
    }
}

function MoveMap(evt, direction) {
    var slideFactor = 50;
    var slideRatio = null;

    if (evt.preventDefault)
        evt.preventDefault();
    else
        evt.returnValue = false;

    if (direction != '' && map != null) {
        switch (direction) {
            case 'NORTH':
                map.pan(0, -slideFactor);
                break;
            case 'SOUTH':
                map.pan(0, slideFactor);
                break;
            case 'WEST':
                map.pan(-slideFactor, 0);
                break;
            case 'EAST':
                map.pan(slideFactor, 0);
                break;
        }
    }
    return;
}

function add_li(list, text) {
    var list = document.getElementById(list);
    if (list != null) {
        var li = document.createElement("li");
        li.innerHTML = text;
        list.appendChild(li);
    }
}

function ClearLayerMenu() {
    $("#ulOptions").empty();
    return false;
}

function AddMenuLayers() {
    ClearLayerMenu();
    if (mapSource.toLowerCase() == 'bingve' && bingLayers.indexOf("hybrid") == -1 && bingLayers.indexOf("aerial") == -1) {
        document.getElementById('ulMenu').style.display = 'none';
        return;
    }
    else if (mapSource.toLowerCase() == 'google' && googleLayers.indexOf("hybrid") == -1 && googleLayers.indexOf("satellite") == -1) {
        document.getElementById('ulMenu').style.display = 'none';
        return;
    }
    else {
        document.getElementById('ulMenu').style.display = 'block';
    }

    if (map != null && baseLayer != null) {
        if (mapSource.toLowerCase() == 'bingve') {
            add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(baseLayer, event);\'><span class="title">Shaded</span></a>');
            if (bingLayers.indexOf("hybrid") != -1) {
                add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(hybrid, event);\'><span class="title">Hybrid</span></a>');
            }
            if (bingLayers.indexOf("aerial") != -1) {
                add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(aerial, event);\'><span class="title">Aerial</span></a>');
            }
        }
        else if (mapSource.toLowerCase() == 'google') {
            add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(baseLayer, event);\'><span class="title">Google Streets</span></a>');
            if (googleLayers.indexOf("hybrid") != -1) {
                add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(hybrid, event);\'><span class="title">Hybrid</span></a>');
            }
            if (googleLayers.indexOf("satellite") != -1) {
                add_li('ulOptions', '<a href=# onclick=\'ChangeBaseLayer(aerial, event);\'><span class="title">Satellite</span></a>');
            }
        }
    }
}

function ShowLayers() {
    var list = document.getElementById('ulMenu');
    list.style.display == 'block';
}

function HideLayers() {
    document.getElementById('ulMenu').style.display = 'none';
}

function ChangeBaseLayer(layer, evt) {
    SetMapBaseLayer(layer);
    if (evt.preventDefault)
        evt.preventDefault();
    else
        evt.returnValue = false;
}

function ShowSlider() {
    var slider = document.getElementById('slider-id');
    var sliderContent = document.getElementById('sliderContent');
    if (slider != null && sliderContent != null)
        slider.style.visibility = sliderContent.style.visibility = 'visible';
}

function HideSlider() {
    var slider = document.getElementById('slider-id');
    var sliderContent = document.getElementById('sliderContent');

    if (slider != null && sliderContent != null)
        slider.style.visibility = sliderContent.style.visibility = 'hidden';

    //Start Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
    if (operaToolTip != null && operaToolTip != undefined && navigator.appName.toLowerCase() == 'opera') {
        tooltip.hide();
    }
    //End Cygnet Changes Milestone:5.0.0 Ticket No:2673 : Opera ToolTip Issue
}

function getElementById(id) {
    var obj = document.getElementById(id);
    if (obj == undefined) obj = document.getElementById(mapId + id);
    return obj;
}
function getValueById(id) {
    var obj = getElementById(id);
    if (obj != undefined) return obj.value;
    else return '';
}
function getCheckStatusById(id) {
    var obj = getElementById(id);
    if (obj != undefined) return obj.checked;
    return false;
}
function setDisabled(id, isEnable) {
    var obj = getElementById(id);
    if (obj != undefined) obj.disabled = !isEnable;
}
function setInnerHTML(id, innerHtml) {
    var obj = getElementById(id);
    if (obj != undefined) obj.innerHTML = innerHtml;
}
function setValue(id, value) {
    var obj = getElementById(id);
    if (obj != undefined) obj.value = value;
}


/// Started Ticket No: MAP 2700.  TW RESET MAP BUTTON 
function resetmap(zoomlevel) {
    if (map.getZoom() != parseInt(zoomlevel)) {
        StopAutoRefresh();
        //Clear Last updated lable
        //        var lstupdate = getElementById("lastupdate");
        //        if (lstupdate != undefined && lstupdate != null)
        //            lstupdate.innerHTML = "";

                refreshIntervalId = null;

        if (zoomlevel != null) {
            mapCentreX = parseFloat(getValueById('mapCentreX'));
            mapCentreY = parseFloat(getValueById('mapCentreY'));
            mapCentreZoom = parseInt(zoomlevel, 10);
            centre();
            //map.zoomTo(parseInt(zoomlevel));
        }
        //else
        //map.zoomTo(0);
    }

}
/// Ended Ticket No: MAP 2700.  TW RESET MAP BUTTON
function CheckDatesDtPick() {
    if ((getElementById("chkTomorrow").checked || getElementById("chkNext7Days").checked || getElementById("chkAllDates").checked)) {
        getElementById("txtFromDate").disabled = true;
        getElementById("txtToDate").disabled = true;
    }
}

function refreshWMS() {
    //alert('refresh WMS');
    for (var idx = map.layers.length - 1; idx > 0; idx--) {
        if (map.layers[idx].name == 'Cloud Amber WMS' && baseLayer != null) {
            //alert('refresh WMS');
            map.layers[idx].redraw(true);
            break;
        }
    }
}
