var map=null;
var mapCentreX=null;
var mapCentreY=null;
var mapCentreZoom=null;
var minZoomLevel=null;
var mapSource=null;
var zoom=null;
var layers=null;
var linkAttrib=null;
var urlArray=null;
var gmlUrlArray=null;
var mapMarker=null;
var zoomlength=null;
var resolution=null;
var resolutionArray=null;
var markerCentreX=0;
var markerCentreY=0;
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;

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;
    urlArray=document.getElementById('UrlArray').value.split(',');
    gmlUrlArray=document.getElementById('GMLUrlArray').value.split(',');
    fromDate=document.getElementById('hdnFromDateString').value;
    toDate=document.getElementById('hdnToDateString').value;
    stopMode=document.getElementById(mapId+'stopMode').value;
    resolution=document.getElementById('resolution').value;
    resolutionArray=resolution.toString().split(',');
    zoomlength=resolutionArray.length-1;
    markerCentreX=mapCentreX;
    markerCentreY=mapCentreY;
    
    if(navigator.appVersion.toLowerCase().indexOf('msie 6.')!=-1) format='image/gif';
    
    if(mapSource=='google' || mapSource=='bingve')
    {
        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';
    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});
//            //Overview Map with default options
//            var overview1=new OpenLayers.Control.OverviewMap();
//            map.addControl(overview1);
//            map.setCenter(new OpenLayers.LonLat(mapCentreX,mapCentreY),0);
//            overview1.maximizeControl();

//            //OverView map with non default options
//            var mapOptions={
//                //numZoomLevels:zoomlength,
//                minResolution:60.0,//resolutions:resolutionArray,
//                projection:new OpenLayers.Projection('EPSG:27700'),
//                maxExtent:new OpenLayers.Bounds(0,0,700000,1100000),
//                //maxExtent:new OpenLayers.Bounds(33861,717605,330846,1019656),
//                units:'m'
//            };
//            var controlOptions={mapOptions:mapOptions}
//            var overview2=new OpenLayers.Control.OverviewMap(controlOptions);
//            map.addControl(overview2);
//            map.setCenter(new OpenLayers.LonLat(mapCentreX,mapCentreY),0);
//            overview2.maximizeControl();
            break;
        case 'google':
            baseLayer=new OpenLayers.Layer.Google('Google Streets',{'sphericalMercator':true,MIN_ZOOM_LEVEL:minZoomLevel});
            break;
        case 'bingve':
            baseLayer = new OpenLayers.Layer.VirtualEarth("Bing Shaded Map", {
                sphericalMercator:true,
                MIN_ZOOM_LEVEL:minZoomLevel,
                type: VEMapStyle.Shaded
            });
            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]);
    map.addControl(new OpenLayers.Control.PanZoomBar());
    map.addControl(new OpenLayers.Control.NavToolbar());
    map.addControl(new OpenLayers.Control.MousePosition());
    map.addControl(new OpenLayers.Control.Attribution());
    AddSelectedLayers();
    map.events.register('moveend',map,function(e)
    {
        if(isZoomend)
        {
            isZoomend=false;
            return;
        }
        var obj=getSelectedLayer();
        if(obj!=undefined && obj.value=='naptan')
        {
            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;
            var x=markerCentreX-cxy.lon;
            var y=markerCentreY-cxy.lat;
            var margin=map.layers[0].getResolution()*500*((map.zoom)*(map.zoom)+(map.zoom+1));
            if(!((x<=margin && x>=(margin*-1))&&(y<=margin && y>=(margin*-1))))
            {
                ShowDetails(obj,cxy.lon,cxy.lat);
                markerCentreX=cxy.lon;
                markerCentreY=cxy.lat;
            }
        }
        if(currentPopup!=undefined && currentPopup.map!=undefined && currentPopup.visible())currentPopup.panIntoView();
    });
    map.events.register('zoomend',map,function(e)
    {
        isZoomend=true;
        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;
        mapCentreZ=map.zoom;
        var obj=getSelectedLayer();
        if(obj!=undefined /*&& (obj.value=='naptan'||obj.value=='event'||obj.value=='tl')*/)
            ShowDetails(obj,cxy.lon,cxy.lat);
    });
    centre();
    for(i=map.controls.length-1;i>0;i--)
    {
        if(map.controls[i].CLASS_NAME=='OpenLayers.Control.NavToolbar')map.removeControl(map.controls[i]);
        else if(!(mapSource=='google' || mapSource=='bingve') && map.controls[i].CLASS_NAME=='OpenLayers.Control.MousePosition')map.controls[i].numDigits=0;
        else if(map.controls[i].CLASS_NAME=='OpenLayers.Control.PanZoomBar')map.controls[i].moveZoomBar();
    }
    if(mapCentreZoom==0)
    {
        var obj=getSelectedLayer();
        if(obj!=undefined && !(obj.value=='naptan'||obj.value=='event'))//Get markers for voyager, naptan and event are called by zoomend function
        {
            var cxy=map.center;
            ShowDetails(obj,cxy.lon,cxy.lat);
        }
    }
}
//For PopUps
var layer;
var currentPopup;
OpenLayers.Popup.FramedCloud.prototype.autoSize=false;
var AutoSizeFramedCloud=OpenLayers.Class(OpenLayers.Popup.FramedCloud,{'autoSize':true});
function markerinit(responseTest,isPopup)
{
    if(responseTest!='')
    {
        var cnt=0;
        var markerContent='';
        if(markerLayer!=undefined)markerLayer.destroy();
        markerLayer=new OpenLayers.Layer.Markers('MarkerIcons');
        map.addLayer(markerLayer);
        setLayerIndex();
        responseTest=responseTest.split('*em');
        var cxy=new OpenLayers.LonLat(mapCentreX,mapCentreY);
        if(mapSource=='google' || mapSource=='bingve')cxy.transform(map.displayProjection,map.projection);
        for(cnt=0;cnt<responseTest.length-1;cnt++)
        {
            markerContent=responseTest[cnt].split('*m');
            var coordinates=markerContent[0].split(',');
            var ll,popupClass;
            ll=new OpenLayers.LonLat(coordinates[0],coordinates[1]);
            if(mapSource=='google' || mapSource=='bingve')ll.transform(map.displayProjection,map.projection);
            popupClass=AutoSizeFramedCloud;
            addMarker(ll,popupClass,markerContent[1],markerContent[2],markerContent[3],markerContent[4],markerContent[5],markerContent[6],markerContent[7],markerContent[8],cxy,isPopup);
        }
    }
}
function addMarker(ll,popupClass,layer,popupContentHTML,iconPath,iconSize,scn,mode,toolTip,highlightLink,cxy,isPopup)
{
    var feature=new OpenLayers.Feature(markerLayer,ll);
    iconSize=iconSize.split(',');
    var icon=new OpenLayers.Icon(iconPath,new OpenLayers.Size(iconSize[0],iconSize[1]),new OpenLayers.Pixel(iconSize[0]/-2,iconSize[1]/-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();
    if(isPopup)
    {
        feature.closeBox=true;
        feature.popupClass=popupClass;
        feature.data.popupContentHTML=popupContentHTML;
        this.popup=null;
        var markerClick=function(evt)
        {
            clearPopups();
            feature.popup=null;
            if(feature.popup==null)
            {
                this.closeBox=true;
                this.popup=feature.createPopup(this.closeBox);
                map.addPopup(this.popup);
                if((scn!='')&&(mode!=null)&&((mode.toString().toLowerCase()=='bus')||(mode.toString().toLowerCase()=='tmu')))
                {
                    var obj=getSelectedLayer();
                    if(obj!=undefined && (obj.value=='naptan'))
                    {
                        window.clearInterval(departureTimer);
                        StreetViewApp.MapWebService.GetDeparture(scn,OnGetDepartures,OnGetMarkerFailed);
                        departureTimer=window.setInterval(function()
                        {
                            if(currentPopup!=undefined && currentPopup.visible())
                            {
                                currentPopup.updateSize();
                                StreetViewApp.MapWebService.GetDeparture(scn,OnGetDepartures,OnGetMarkerFailed);
                            }
                            else
                            {
                                window.clearInterval(departureTimer);
                            }
                        },60000);
                    }
                }
                else
                {
                    var divs=this.popup.contentDiv.getElementsByTagName('div')
                    if(divs)
                    for(cnt=0;cnt<divs.length;cnt++)if(divs[cnt].id=='departures')divs[cnt].innerHTML='';
                }
                var summary=document.getElementById('popupSummary');
                if(summary)
                {
                    var table=summary.firstChild;
                    if(table && table.tagName.toLowerCase()=='table' && table.offsetWidth>summary.clientWidth)table.style.width=(summary.clientWidth-3)+'px';
                }
                this.popup.show();
                changeURL();
                markerClicked=true;
            }
            currentPopup=this.popup;
            OpenLayers.Event.stop(evt);
        };
        var markerHover=function(evt)
        {
            var layer=evt.element.getAttribute('layer');
            congestionSCN=scn;
            StreetViewApp.MapWebService.GetGML(scn,layer,onGetGMLSuccess,null,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();
            }
        };
        marker.events.register('mousedown',feature,markerClick);
        if(highlightLink.toLowerCase()=='true')
        {
            marker.events.register('mouseover',feature,markerHover);
            marker.events.register('mouseout',feature,markerLeave);
        }
        //if((document.getElementById('mapCentreX').value==ll.lon) && (document.getElementById('mapCentreY').value==ll.lat))
        if(cxy.lon.toFixed(3)==ll.lon.toFixed(3) && cxy.lat.toFixed(3)==ll.lat.toFixed(3))popupMarker=marker;
    }
    markerLayer.addMarker(marker);
}
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);
}
function clearPopups()
{
    var len=map.popups.length-1;
    for(len;len>=0;len--)map.removePopup(map.popups[len]);
}
function clearPopupsAndLayers()
{
    clearPopups();
    for(var idx=map.layers.length-1;idx>0;idx--)map.layers[idx].destroy();
    itnLayer=null;
    esuLayer=null;
    gmlLayer=null;
    gmlMarkerLayer=null;
    markerLayer=null;
    locationLayer=null;
}
function centre()
{
    switch(mapSource)
    {
        case 'google':
        case 'bingve':
        {
           var centre=new OpenLayers.LonLat(mapCentreX,mapCentreY);
           map.setCenter(centre.transform(map.displayProjection,map.projection),parseInt(mapCentreZoom));
        }
        break;
        default:
            map.setCenter(new OpenLayers.LonLat(mapCentreX,mapCentreY),parseInt(mapCentreZoom));
        break;
    }
}
function SetZoomIn(centerX,centerY)
{
    mapCentreX=centerX;
    mapCentreY=centerY;
    mapCentreZoom=zoomlength;
    centre();
}
function SetCenterandZoom(centerX,centerY,isZoomIn)
{
    mapCentreX=centerX;
    mapCentreY=centerY;
    mapCentreZoom=(isZoomIn==true)?map.zoom+1:map.zoom-1;
    centre();
}
function AddSelectedLayers()
{
    clearPopupsAndLayers();
    layers=document.getElementById(mapId+'mapLayers').value;
    if(mapSource=='google' || mapSource=='bingve')
    {
        if(layers.indexOf('tl')>-1)
        {
            itnLayer=new OpenLayers.Layer.WMS('Cloud Amber WMS',gmlUrlArray,{
                'layers':'itn[JourneyTimes]',
                'format':format,
                'transparent':'true',
                'Type':'sperical'
            },{'buffer':0});
        }
    }
    else
    {
        var layerValue='';
        if(layers.indexOf('tl')>-1)
            layerValue='itn[JourneyTimes]';
////Catrographic
//        var layerArray=layers.split(',');
//        if(layerArray.length<=5)
//        {
//            for(var i=3;i<layerArray.length;i++)
//                layerValue=layerValue+','+layerArray[i];
//
////Cambridgeshire
//            if((layers.indexOf('County')>-1)||(layers.indexOf('District')>-1)||(layers.indexOf('DistrictWards')>-1)||(layers.indexOf('ElectoralDivisions')>-1)||(layers.indexOf('Parish')>-1)||(layers.indexOf('ParliamentaryConstituencies')>-1)||(layers.indexOf('PrimaryCatchment')>-1)||(layers.indexOf('Secondarycatchment')>-1)||(layers.indexOf('Highwayssupervisorboundaries')>-1)||(layers.indexOf('Highwaysdivisionalboundaries')>-1)||(layers.indexOf('Policesection')>-1)||(layers.indexOf('Policedivision')>-1))
//                layerValue='places,'+layerValue;
////Cambridgeshire end
//
////Oxfordshire
////            if((layers.indexOf('District')>-1)||(layers.indexOf('FloodRisk')>-1)||(layers.indexOf('Parish')>-1)||(layers.indexOf('OxonbndLL')>-1)||(layers.indexOf('ParkandRideSites')>-1)||(layers.indexOf('FireStations')>-1)||(layers.indexOf('FloodedRoads')>-1)||(layers.indexOf('GrittingRoutes')>-1))
//            if((layers.indexOf('District')>-1)||(layers.indexOf('FloodRisk')>-1)||(layers.indexOf('Parish')>-1)||(layers.indexOf('OxonbndLL')>-1))
//            {
//                //layerValue='places,'+layerValue;
//                layerValue='itn,places,'+layerValue;
//            }
//            if((layers.indexOf('ParkandRideSites')>-1)||(layers.indexOf('FireStations')>-1)||(layers.indexOf('FloodedRoads')>-1)||(layers.indexOf('GrittingRoutes')>-1)||(layers.indexOf('GrittingRoutes2')>-1)||(layers.indexOf('BusRoutes')>-1)||(layers.indexOf('GrittingRoutes3')>-1))
//            {
//                //layerValue='places,'+layerValue;
//                layerValue='itn,'+layerValue;
//            }
////Oxfordshire end
//        }
//        else
//        {
//            alert('Please select only 3 layers at a time');
//            layerValue='';
//            layers='';
//            var chkbox='';
//            chkbox=document.getElementById('filters').getElementsByTagName('input');
//            for(var i=0;i<chkbox.length;i++)
//            {
//                if(chkbox[i].checked)
//                {
//                    chkbox[i].checked=false;
//                }
//            }
//            return;
//        }
        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 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(mapSource=='google' || mapSource=='bingve')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());
}
function findPostCodeLocation()
{
    var postCode = document.getElementById("txtPostCode").value;
    enableSearch(false);
    StreetViewApp.MapWebService.FindLocation(postCode,"",onGetLocationSuccess,onGetLocationFailed,'postcode');
}
function findLocation()
{
    var postCode = document.getElementById("txtPostCode").value;
    var street = document.getElementById("txtStreet").value;
    var selStreet = document.getElementById('selStreetTown');
    enableSearch(false);
    if(selStreet!=undefined && selStreet.selectedIndex>0)
    {
        street=street+','+selStreet.value;
    }
    //For cheshire
    //StreetViewApp.MapWebService.FindLocation(postCode,street,onGetLocationSuccess,onGetLocationFailed);
    //For Surrey
    StreetViewApp.MapWebService.FindLocation('',street,onGetLocationSuccess,onGetLocationFailed,'street');
}
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)
{
    clearSearch();
    if(method=='postcode') document.getElementById('postCodeError').innerHTML ='Postcode not found';
    else document.getElementById("locationError").innerHTML ='No address found';
}
function clearSearch()
{
    document.getElementById("locationList").innerHTML='';
    document.getElementById("locationError").innerHTML='';
    document.getElementById("postCodeError").innerHTML='';
    document.getElementById("txtPostCode").value='';
    document.getElementById("txtStreet").value='';
    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)
{
    document.getElementById("txtPostCode").disabled=!isEnable;
    document.getElementById("btnLocate").disabled=!isEnable;
    document.getElementById("txtStreet").disabled=!isEnable;
    document.getElementById("btnSearch").disabled=!isEnable;
    document.getElementById("btnClear").disabled=!isEnable;
}
function onGetGMLSuccess(result,ctx)
{
    var isMercator=(mapSource=='google' || mapSource=='bingve');
    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(isMercator)
            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(!mapContainsLayer(gmlMarkerLayer))
        {
            gmlMarkerLayer=new OpenLayers.Layer.Markers("GMLMarkers");
            map.addLayer(gmlMarkerLayer);
            setLayerIndex();
        }
        if(scn==congestionSCN)//still mouse hover
        {
            gmlLayer.addFeatures([lineFeature]);
            var xy=new OpenLayers.LonLat(x,y);
            if(isMercator)xy.transform(map.displayProjection,map.projection);
            if(layer=='roadworks')gmlMarkerLayer.addMarker(new OpenLayers.Marker(xy,new OpenLayers.Icon('icons/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(isMercator)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);
    }
}
function ShowDetails(obj,easting,northing)
{
    window.clearInterval(departureTimer);
    if(obj==undefined)return;
    var layers='itn,places';
    var element='';
    var chkbox='';
    var checked=false;
    var count=0;
    var layerName='';

    if(obj.type=='checkbox')
    {
        chkbox=document.getElementById('filters').getElementsByTagName('input');
        for(var i=0;i<chkbox.length;i++)
        {
            if(chkbox[i].checked)
            {
                count=count+1;
                checked=true;
                element=chkbox[i].nextSibling.innerHTML;
                layerName=document.getElementsByTagName('span')[i+1].value1;
                if(element!=undefined && element.length>0)layers=layers+','+layerName;
            }
        }
    }
    else
    {
        checked=true;
        if(obj.value!=undefined && obj.value.length>0)layers=layers+','+obj.value;
    }
    if(layers.indexOf('accident,incident')>-1||layers.indexOf('ptaccident,ptincident')>-1||layers.indexOf('event')>-1||layers.indexOf('roadworks')>-1||layers.indexOf('section58')>-1)
        displayCalander(true);
    else
        displayCalander(false);
    clearPopupsAndLayers();
    if(checked)
    {
        markerLoading=true;
        document.getElementById('waitImage').style.visibility='visible';
        document.body.style.cursor='wait';
        document.getElementById(mapId+'mapLayers').value=layers;
        if(!(document.getElementById(mapId+"chkTomorrow").checked || document.getElementById(mapId+"chkNext7Days").checked || document.getElementById(mapId+"chkAllDates").checked) && document.getElementById('hdnFromDateString').value.length==0)
            SetStartandEndDates();
        var dateType=-1;
        if(document.getElementById(mapId+'chkAllDates').checked) dateType=0;
        else if(document.getElementById(mapId+'chkTomorrow').checked) dateType=1;
        else if(document.getElementById(mapId+'chkNext7Days').checked) dateType=2;
        var fromDate=document.getElementById('hdnFromDateString').value;
        var toDate=document.getElementById('hdnToDateString').value;
        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,map.layers[0].getResolution(),easting,northing,map.zoom,fromDate,toDate,OnGetMarkerSuccess,OnGetMarkerFailed,obj.value);
        StreetViewApp.MapWebService.GetMarker(layers,easting,northing,dateType,fromDate,toDate,stopMode,media,map.layers[0].getResolution(),map.zoom,OnGetMarkerSuccess,OnGetMarkerFailed,obj.value);
    }
}
function OnGetMarkerSuccess(result,layer)
{
    var obj=getSelectedLayer();
    if(result!=undefined && result.d!=undefined)result=result.d;
    if(result=='Please select End date and time greater than Start date and time.')
    {
        alert(result);
        document.getElementById('waitImage').style.visibility='hidden';
        document.body.style.cursor='default';
    }
    else if(obj!=undefined&&obj.value==layer)
    {
        markerinit(result,true);
        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)
{
    var obj=getSelectedLayer();
    if(obj!=undefined&&obj.value==layer)
    {
        markerLoading=false;
        alert(error.get_message());
        clearPopupsAndLayers();
        if(layerLoading==false)
        {
            document.getElementById('waitImage').style.visibility='hidden';
            document.body.style.cursor='default';
        }
    }
}
function updateSize(obj)
{
    obj.style.height=obj.height+'px';
    obj.style.width=obj.width+'px';
    var summary=document.getElementById('popupSummary');
    if(summary && parseInt(summary.style.width)<obj.width)
    {
        var w=(summary.clientWidth<summary.offsetWidth)?obj.width+21:obj.width;
        summary.style.width=w+'px';
    }
}
function OnGetDepartures(result)
{
    if(result!=undefined && result.d!=undefined)result=result.d;
    if(currentPopup!=undefined && currentPopup.visible())
    {
        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 divs=currentPopup.contentDiv.getElementsByTagName('div')
        if(divs)
        for(cnt=0;cnt<divs.length;cnt++)
        {
            if(divs[cnt].id=='departures')
            {
                divs[cnt].innerHTML='Last refresh time '+dt+'<br>'+result;
                break;
            }
        }
        currentPopup.updateSize();
    }
    else
    {
        window.clearInterval(departureTimer);
    }
}
function ClickDetails()
{
//    document.getElementById('waitImage').style.visibility='visible';
    SetStartandEndDates();
//    var fromDate=document.getElementById('hdnFromDateString').value;
//    var toDate=document.getElementById('hdnToDateString').value;
//    StreetViewApp.MapWebService.GetMarker(layers,map.layers[0].getResolution(),0,0,map.zoom,fromDate,toDate,OnGetMarkerSuccess,OnGetMarkerFailed,obj.id);
    var cxy=map.center;
    var obj=getSelectedLayer();
    ShowDetails(obj,cxy.lon,cxy.lat);
}
var layerLoading=false;
var markerLoading=false;
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 ShowDiv(obj)
{
    var divDetail=obj.parentNode.getElementsByTagName('div')[1];
    if(divDetail.style.display=='none')divDetail.style.display='block';
    else divDetail.style.display='none';
    if(currentPopup!=undefined)
    {
        currentPopup.updateSize();
        currentPopup.panIntoView();
    }
}
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('ClickDate').disabled=!isDisplay;
}
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 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 expandCollapse(obj)
{
    //var filter = obj.parentNode.getElementsByTagName('span')[1];
    //filter.className = (filter.className == 'hide')?'show':'hide';
    //For OSGBMaps
    var filter = obj.parentNode;
    filter.className = (filter.className == 'showFilters')?'hideFilters':'showFilters';
    //For VoyagerMaps
    //var cntDiv=obj.parentNode.getElementsByTagName('div')[1];
    //cntDiv.style.display=(cntDiv.style.display=='none')?'':'none';
}
function txt_KeyDown(e,obj)
{
    if(e.keyCode == 13)
    {
        switch(obj.id)
        {
            case "txtPostCode":
                findPostCodeLocation();
            break;
            case "txtStreet":
                findLocation();
            break;
        }
    }
}
function showContent(obj,id)
{
    var headDivs=obj.parentNode.childNodes;
    for(var i=0;i<headDivs.length;i++)if(headDivs[i].tagName.toLowerCase()=='div')headDivs[i].className='';
    obj.className='selected';
    var content=document.getElementById(id);
    var contentDivs=content.parentNode.childNodes;
    for(var i=0;i<contentDivs.length;i++)if(contentDivs[i].tagName.toLowerCase()=='div')contentDivs[i].className='hideContent';
    content.className='showContent';
    /*if(id=='popupMore')
    {
        var more=document.getElementById('popupMore');
        if(more!=undefined && more.childNodes.length>0)
            if(more.childNodes[0].tagName.toLowerCase()=='table')more.childNodes[0].style.width=more.clientWidth+'px';
    }*/
}
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(mapSource=='google' || mapSource=='bingve')cxy.transform(map.projection,map.displayProjection);
    document.cookie="cx="+cxy.lon+exp;
    document.cookie="cy="+cxy.lat+exp;
}

