var routeLink = '';

//adds a marker to the map
function addMarker(lonlat, icon) {
    var marker = new OpenLayers.Marker(lonlat, icon);
    map.markersLayer.addMarker(marker);
    return marker;
}


//removes all the markers from the map
function clearMarkers() {
    map.markersLayer.clearMarkers();
}


//adds a car park marker
function addCarParkMarker(lonlat, carPark, showClickInfo) {   
    var icon;
    var version = 7;
    var size = new OpenLayers.Size(52,56);
    
    //show a png if browser is not IE or IE and above version 5
    if (navigator.appName.toLowerCase().indexOf('microsoft') >= 0)
    { 
        var versionArr = navigator.appVersion.toLowerCase().split("msie ");
        if (versionArr.length > 0){
            version = (versionArr[1].substring(0,1))*1;
        }
        
        if (version < 6)
        {
            icon = new OpenLayers.Icon('images/icon-pin.gif', size);
        }
        else
        {
            icon = new OpenLayers.Icon('images/icon-pin.png', size);
        }
    }
    else
    {
        icon = new OpenLayers.Icon('images/icon-pin.png', size);
    }
    var marker = addMarker(lonlat, icon);
    
    if (showClickInfo)
    {
        marker.events.register("click", marker, carParkClickHandler(marker, carPark, true));
    }
    else
    {
        marker.events.register("click", marker, carParkClickHandler(marker, carPark, false));
    }
    
    marker.events.register("mouseover", marker, markerHoverHandler(marker, carPark));
    marker.events.register("mouseout", marker, markerHoverOutHandler(marker, carPark));
}

//adds a POI to the map
function addPOIMarker(thePoi, id) {
    
    var icon;
    var version = 7;
    var size = new OpenLayers.Size(52,56);
    
    //show a png if browser is not IE or IE and above version 5
    if (navigator.appName.toLowerCase().indexOf('microsoft') >= 0)
    { 
        var versionArr = navigator.appVersion.toLowerCase().split("msie ");
        if (versionArr.length > 0){
            version = (versionArr[1].substring(0,1))*1;
        }
        
        if (version < 6)
        {
            icon = new OpenLayers.Icon('images/icon-place-of-interest.gif', size);
        }
        else
        {
            icon = new OpenLayers.Icon('images/icon-place-of-interest.png', size);
        }
    }
    else
    {
        icon = new OpenLayers.Icon('images/icon-place-of-interest.png', size);
    }
    
    var lonlat=new EMS.LonLat(thePoi.address.coordinates.longitude, thePoi.address.coordinates.latitude);
    var marker = addMarker(lonlat, icon);
    
    marker.events.register("mouseover", marker, poiHoverHandler(marker, thePoi, id));
    marker.events.register("mouseout", marker, poiHoverOutHandler(marker, thePoi, id));
}

//adds a Home icon to the map
function addHomeMarker(lon, lat) {
    
    var icon;
    var version = 7;
    //var size = new OpenLayers.Size(52,56);
    var size = new OpenLayers.Size(42,66);
    
    //show a png if browser is not IE or IE and above version 5
    if (navigator.appName.toLowerCase().indexOf('microsoft') >= 0)
    { 
        var versionArr = navigator.appVersion.toLowerCase().split("msie ");
        if (versionArr.length > 0){
            version = (versionArr[1].substring(0,1))*1;
        }
        
        if (version < 6)
        {
            icon = new OpenLayers.Icon('images/icon-home-address.gif', size);
        }
        else
        {
            icon = new OpenLayers.Icon('images/icon-home-address.png', size);
        }
    }
    else
    {
        icon = new OpenLayers.Icon('images/icon-home-address.png', size);
    }
    
    var lonlat=new EMS.LonLat(lon, lat);
    var marker = addMarker(lonlat, icon);
}


//fires when a user clicks on a marker. Opens a popup if showpopup is true
function carParkClickHandler(marker, carPark, showPopup){
    return function(e){
        //bug - not working
        //map.mouseDefaults.cancelRecenter();
        
        
        switch (mapType.toLowerCase()) {
        
            case "city" :
                document.location.href = "RegionMap.aspx?cityid=" + carPark.identity;
            break;
            
            case "region" :
                routeLink = "route.aspx?carparkid=" + carPark.identity + "&prev=3&cityid=" + carPark.cityid;
                //changed at client request.
                //document.location.href = "CarParkMap.aspx?regionid=" + carPark.identity;
                //now show popup
                if (showPopup) {
                    popup = new EMS.Popup(
                    "popup-div", 
                    this.lonlat,
                    new OpenLayers.Size(273, 233), 
                    GetInfoBoxText(carPark)
                    , 
                    this.icon, 
                    true
                    );
                    map.addPopup(popup, true);
                }
                
            break;
            
            case "carparklist" :
                
                routeLink = "route.aspx?carparkid=" + carPark.identity + "&prev=1&regionid=" + regionid;
                
                if (showPopup) {
                    popup = new EMS.Popup(
                    "popup-div" + carPark.identity, 
                    this.lonlat,
                    new OpenLayers.Size(273, 233), 
                    GetInfoBoxText(carPark)
                    , 
                    this.icon, 
                    true
                    );
                    map.addPopup(popup, true);
                }
            break;
            
            case "carpark" :
                routeLink = "route.aspx?carparkid=" + carPark.identity + "&direction=to&prev=2";
                if (showPopup) {
                    popup = new EMS.Popup(
                    "popup-div" + carPark.identity, 
                    this.lonlat,
                    new OpenLayers.Size(273, 233), 
                    GetInfoBoxText(carPark)
                    , 
                    this.icon, 
                    true
                    );
                    map.addPopup(popup, true);
                }

            break;
            
            case "streetsearch" :
                
                if (showPopup) {
                    popup = new EMS.Popup(
                    "popup-div", 
                    this.lonlat,
                    new OpenLayers.Size(273, 233), 
                    GetInfoBoxText(carPark)
                    , 
                    this.icon, 
                    true
                    );
                    map.addPopup(popup, true);
                }
            break;
        }
    }
}



//fires when a user mouses over a marker.
function markerHoverHandler(marker, carPark){
    return function(e){
        switch (mapType.toLowerCase()) {
        
            case "city" :
            
            //city shows underline on sidebar links
            var sidelinks = $('.citylink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.innerHTML.toLowerCase() == carPark.name.toLowerCase())
                    {
                        $(this).css('text-decoration', 'underline');
                    }
                });
            }
            
            break;
            
            case "region" :
            
            //city shows underline on sidebar links
            var sidelinks = $('.regionlink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.innerHTML.toLowerCase() == carPark.name.toLowerCase())
                    {
                        $(this).css('text-decoration', 'underline');
                    }
                });
            }
            
            addCarParkRollover(carPark);
            
            break;
            
            case "carparklist" :
            
            //city shows underline on sidebar links
            var sidelinks = $('.carparklink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    var cpName = carPark.name.length > 0 ? carPark.name.toLowerCase() : carPark.street.toLowerCase();
                    if (this.innerHTML.toLowerCase() == cpName)
                    {
                        $(this).css('text-decoration', 'underline');
                    }
                });
            }
            
            addCarParkRollover(carPark);
            
            break;
            
            case "carpark" :
                var sidelinkid = 'nearestcarpark' + carPark.identity;
                var sideLink = $('#' + sidelinkid);
                
                if (sideLink) {
                    sideLink.css('text-decoration', 'underline');
                }
                
                if (selectedCarPark.identity != carPark.identity) {
                    //add a popup rollover
                    addCarParkRollover(carPark);
                    
                }
            
            break;
            
            case "streetsearch" :
            
            //city shows underline on sidebar links
            var sidelinks = $('#carParksFoundUl a.streetSearchLink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.id == 'cpa' + carPark.identity)
                    {
                        $(this).css('text-decoration', 'underline');
                    }
                });
            }
            break;
        }
    }
}

//fires when a user mouses out of a marker
function markerHoverOutHandler(marker, carPark){
    return function(e){
        switch (mapType.toLowerCase()) {
        
            case "city" :
            
            $(marker).css('cursor', 'select');
            //city shows underline on sidebar links
            var sidelinks = $('.citylink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.innerHTML.toLowerCase() == carPark.name.toLowerCase())
                    {
                        $(this).css('text-decoration', 'none');
                    }
                });
            }
            break;
            
            case "region" :
            
            $(marker).css('cursor', 'select');
            //city shows underline on sidebar links
            var sidelinks = $('.regionlink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.innerHTML.toLowerCase() == carPark.name.toLowerCase())
                    {
                        $(this).css('text-decoration', 'none');
                    }
                });
            }
            
            removeCarParkRollover();
            
            break;
            
            case "carpark" :
                var sidelinkid = 'nearestcarpark' + carPark.identity;
                var sideLink = $('#' + sidelinkid);
                
                if (sideLink) {
                    $(sideLink).css('text-decoration', 'none');
                }
                
                removeCarParkRollover();
               
            break;
            
            case "carparklist" :
            
            $(marker).css('cursor', 'select');
            //city shows underline on sidebar links
            var sidelinks = $('.carparklink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                var cpName = carPark.name.length > 0 ? carPark.name.toLowerCase() : carPark.street.toLowerCase();
                    if (this.innerHTML.toLowerCase() == cpName)
                    {
                        $(this).css('text-decoration', 'none');
                    }
                });
            }
            
            removeCarParkRollover();
            
            break;
            
            case "streetsearch" :
            
            $(marker).css('cursor', 'hand');
            //city shows underline on sidebar links
            var sidelinks = $('#carParksFoundUl a.streetSearchLink');
            if (sidelinks) {
                jQuery.each(sidelinks, function(i, val) {
                    if (this.id == 'cpa' + carPark.identity)
                    {
                        $(this).css('text-decoration', 'none');
                    }
                });
            }
            break;
        }
    }
}


//fires when a user mouses over a poi.
function poiHoverHandler(marker, poi, id){
    return function(e){
        
        var infoBoxText = "<p class=\"info-note\"><span>" + poi.name + "</span></p>";
        poiPopup = new EMS.Popup(id, this.lonlat, new OpenLayers.Size(150, 50), infoBoxText, this.icon, false);
        map.addPopup(poiPopup, false);
    }
}

//fires when a user mouses out of a poi
function poiHoverOutHandler(marker, poi, id){
    return function(e){
        //need to clear the popup
        if (poiPopup) {
            map.removePopup(poiPopup);
        }
    }
}

//adds a rollover to the map on the specified carpark
function addCarParkRollover(carPark) {
    var title;
    if (carPark.name.length > 0) {
        title = carPark.name;
    }
    else
    {
        title = carPark.street;
    }
    var infoBoxText = "<p class=\"info-note\"><span><strong>" + title + "</strong><br/>Click icon for more details</span></p>";
    var lonLat = new EMS.LonLat(carPark.longitude, carPark.latitude);
    
    removeCarParkRollover();
    
    var width = (title.length * 7) + 20;
    if (width < 150) { width = 150; }
    cpPopup = new EMS.Popup(carPark.identity, lonLat, new OpenLayers.Size(width, 45), infoBoxText, this.icon, false);
    map.addPopup(cpPopup, false);
}

//removes any car park rollovers
function removeCarParkRollover() {
    if (cpPopup) {
        map.removePopup(cpPopup);
    }
}

//gets the text to display in the popup
function GetInfoBoxText(carPark) {
    var infoBoxTxt = "";
    infoBoxTxt += "<div class='info-box'>";
    infoBoxTxt += "              <div class='info-box-inner'>";
    infoBoxTxt += "                  <div class='info-box-inner-inner'>";
    infoBoxTxt += "                     <h2>";
    infoBoxTxt += carPark.name.length > 0 ? carPark.name : carPark.street;
    infoBoxTxt += "                     </h2>";
    infoBoxTxt += "                      <p class='address'>";
    if (carPark.name.length > 0) {
        infoBoxTxt += carPark.street + ", ";
    }
    infoBoxTxt += carPark.suburb + ", ";
    infoBoxTxt += carPark.postcode;
    infoBoxTxt += "                      </p>";
    infoBoxTxt += "                      <p>";
    infoBoxTxt += carPark.specialinstructions;
    infoBoxTxt += "                      </p>";
    infoBoxTxt += "                      <dl class='supplement-box'>";
    
    if (carPark.services != null && carPark.services.length > 0)
    {
        var foundCP = false;
        
        for (var i=0;i<carPark.services.length;i++) {
            var svc = findServiceById(carPark.services[i]); 
            if (svc) {  
                if (foundCP == false) {
                    infoBoxTxt += "                          <dt>Services</dt>";
                    infoBoxTxt += "                          <dd class='contain'>";
                    foundCP = true;
                }
                var tooltipId = "serviceTooltip" + svc.identity.toString();           
                infoBoxTxt += "                                 <img src='CMSImages/services/" + svc.image + "' alt='" + svc.alttext + "' title='" + svc.breif + "' onmouseover='showServiceToolTip(\"" + tooltipId + "\");' onmouseout='hideServiceToolTip(\"" + tooltipId + "\");' />";
                
                infoBoxTxt += "                               <div id='" + tooltipId + "' class='tooltip' style='visibility:hidden;'>";
		        infoBoxTxt += "                                 <h3>" + svc.name + "</h3>";
		        infoBoxTxt += "                                 <p>" + svc.description + "</p>";
		        infoBoxTxt += "                               </div>";
            }
        }
        infoBoxTxt += "                               </dd>";
    }
    infoBoxTxt += "                      </dl>";
    infoBoxTxt += "                      <ul class='type-b'>";
    infoBoxTxt += "                          <li><a href='displaycarpark.aspx?carparkid=" + carPark.identity + "'><strong>View CAR PARK details</strong></a></li>";
    
    if ((typeof routeLink != 'undefined') && (routeLink.length > 0)) {   
        infoBoxTxt += "                          <li><a href='" + routeLink + "&direction=to'>Calculate ROUTE TO here by car</a></li>";
        infoBoxTxt += "                          <li class='last'><a href='" + routeLink + "&direction=from'>Calculate ROUTE FROM here by foot</a></li>";
    }
    
    infoBoxTxt += "                      </ul>";
    infoBoxTxt += "                  </div>";
    infoBoxTxt += "              </div>";
    infoBoxTxt += "          </div>";
    infoBoxTxt += "          <!-- .info-box -->";
    return infoBoxTxt;
}

//adds a pointer to any carpark pins on the map.
//would be better to do this on adding the marker to the map, but it is tied up in the openlayers functionality
function addPointerCursors() {
       //add the rollover cursor
    $('#mapdiv img[src="images/icon-pin.png"]').each(function() {
        $(this).css('cursor','hand');
        $(this).css('cursor','pointer');
    });
}