var map = null;
var clientGeoCoder = new GClientGeocoder();
var mgr = Array;
var lastId = 0;
var openId = 0;

var airport = new GIcon();
airport.iconSize = new GSize(20, 20);
airport.iconAnchor = new GPoint(10, 20);
airport.infoWindowAnchor = new GPoint(10, 2);
airport.infoShadowAnchor = new GPoint(18, 25);
airport.image = "./img/airport.png";


clientGeoCoder.setBaseCountryCode("GB");

var icons = new Array();

var windowOpen = 0;


function wheelevent(e) {
    if (!e){
        e = window.event
    }
    if (e.preventDefault){
        e.preventDefault()
    }
    e.returnValue = false;
}    

function load(searchTerm, lat, lng, zoom) {

    if (zoom == null) {
        zoom = 14;
    }

    for (idx in mgr) {
        if (map) {
            map.removeOverlay(mgr[idx].marker);
            delete mgr[idx];
        }
    }

    if (GBrowserIsCompatible()) {

        map = new GMap2(document.getElementById("map"));         
        GEvent.addListener(map, "load", updatePoints);

        if (lat == "" && lng == "") {

            clientGeoCoder.getLatLng(searchTerm+' UK', function(latLng) {
                if (latLng) {
                    map.setCenter(new GLatLng(latLng.lat(), latLng.lng()), zoom);
                } else {
                    map.setCenter(new GLatLng(53.800651, -4.064941), 6);
                }
                GEvent.addListener(map, "moveend", updatePoints);
            });

        } else {

            map.setCenter(new GLatLng(lat, lng), zoom);
            GEvent.addListener(map, "moveend", updatePoints);

        }

        GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", wheelevent);   

        map.getContainer().onmousewheel = wheelevent; 
        map.enableScrollWheelZoom();

        map.addControl(new GLargeMapControl());
        //map.addOverlay(new GTrafficOverlay());


        var mapControl = new GHierarchicalMapTypeControl();
        
        // Set up map type menu relationships
        mapControl.clearRelationships();
        mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", false);
        //mapControl.addMapType(G_PHYSICAL_MAP);
  
        // Add control after you've specified the relationships
        map.addControl(mapControl);
        map.addMapType(G_PHYSICAL_MAP);
    }
}

function updatePoints() {
    //alert("here");
    // get car parks in the viewport
    var bounds = map.getBounds();
    var displaying = new Array;
    southWest = bounds.getSouthWest();
    northEast = bounds.getNorthEast();
    lastId++;
    $.get("./ajax/get-points.php", {sw: southWest, ne: northEast, last: lastId, zoom: map.getZoom()}, function (json) {

        var myJ = eval('('+json+')');
            
        for (i in myJ.markers) {  
            
            if ($('#chk'+myJ.markers[i].attributes.lookup_carpark_category.id+':checked').length == 1) {
            
                var carparkId = "info"+myJ.markers[i].id;
                
                if (!mgr[carparkId]) {
                    var point = new GLatLng(myJ.markers[i].attributes.lat, myJ.markers[i].attributes.lng);
                    if (!icons[myJ.markers[i].attributes.lookup_carpark_category.id]) {
                        eval(myJ.markers[i].attributes.lookup_carpark_category.attributes.json);
                        icons[myJ.markers[i].attributes.lookup_carpark_category.id] = myPoint;
                    }

                    mgr[carparkId] = myJ.markers[i];
                    mgr[carparkId].marker = new PdMarker(point, {icon:icons[myJ.markers[i].attributes.lookup_carpark_category.id]});            
                    mgr[carparkId].marker.carparkId = carparkId;
                    
                    GEvent.addListener(mgr[carparkId].marker, "mouseover",  function() {
                        windowOpen++;
                        showToolTip(this.carparkId);
                    });
                    
                    GEvent.addListener(mgr[carparkId].marker, "mouseout",  function() {
                        hideToolTip(this.carparkId);                            
                    });

                    if (myJ.markers[i].attributes.type !="Football Stadium") {
                        GEvent.addListener(mgr[carparkId].marker, "click",  function() {
                            openInfoWindow(this.carparkId, windowOpen);
                        });
                    }

                    map.addOverlay(mgr[carparkId].marker);

                    if (mgr[carparkId]) {
                        mgr[carparkId].defaultImage = mgr[carparkId].marker.getIcon().image;
                        mgr[carparkId].marker.elem = document.getElementById(mgr[carparkId].marker.getHtmlElement());
                        mgr[carparkId].marker.width = mgr[carparkId].marker.elem.style.width.replace(/px/, "");  
                        mgr[carparkId].marker.height = mgr[carparkId].marker.elem.style.height.replace(/px/, ""); 
                    }
                }
                displaying[carparkId] = 1;
            } else {
                displaying[carparkId] = 0;
            }
        }
        for (idx in mgr) {
            if ((displaying[idx] != 1) && (openId != idx)) {
                if (mgr[idx]) {
                    map.removeOverlay(mgr[idx].marker);
                    delete mgr[idx];
                }
            }
        }
		updateRightColumn();
    });
}

function updateRightColumn() {
    $('#resultList').html("");
    for (i in mgr) {
        if (mgr[i].attributes) {
            var name = mgr[i].attributes.name;
            var tooltipText = mgr[i].attributes.tooltip_text;
            var icon = mgr[i].attributes.lookup_carpark_category.attributes.icon.source;
            var alt = mgr[i].attributes.lookup_carpark_category.attributes.icon.alt;

            var leftHtml = "<li id=\"carpark"+i+"\" onclick=\"openInfoWindow('"+i+"', "+windowOpen+");\"><a href=\"#info\" style=\"background:url("+icon+") right no-repeat;\"><div class=\"carpark\"><strong>"+name+"</strong><br />";
            leftHtml += tooltipText+"</div></a></li>";

            $('#resultList').append(leftHtml);
            $('#carpark'+i).bind("mouseover", function() {
                var id = this.id.toString().replace(/carpark/, "");
                showToolTip(id);
                mgr[id].marker.setImage(mgr[id].defaultImage+"glow.png");
            });
            $('#carpark'+i).bind("mouseout", function() {
                var id = this.id.toString().replace(/carpark/, "");
                hideToolTip(id);
                mgr[id].marker.setImage(mgr[id].defaultImage);
            });
        }
    }
}

function showToolTip(carparkId) {
      hideToolTip();
      $('#carpark'+carparkId).css("background", "#fc0");

      mgr[carparkId].marker.topMarkerZIndex();

      var CDivPixel = map.fromLatLngToDivPixel(map.getCenter());
      var pointDivPixel = map.fromLatLngToDivPixel(mgr[carparkId].marker.getPoint());
      var fromCenter = subGPoints(pointDivPixel, CDivPixel);
      var left = fromCenter.x + ($('#map').width() / 2) + 10;
      var top = fromCenter.y + ($('#map').height() / 2);
      var name = mgr[carparkId].attributes.name;
      var tooltipText = mgr[carparkId].attributes.tooltip_text;
      
      var tHtml = '<div id="toolTip" style="left:'+left+'px; top:'+top+'px;"><strong>'+name+'</strong>';
      tHtml += '<br />'+tooltipText+'</div>';
      $('#map').append(tHtml);
}
function subGPoints(a,b) {
    return new GPoint(a.x-b.x, a.y-b.y);
}      

function hideToolTip(carparkId) {
    if (carparkId) {
        mgr[carparkId].marker.restoreMarkerZIndex();
    }
    $('#toolTip').remove();
    $('#carpark'+carparkId).css("background", "none");
}

function carparkContact(id) {    
    ajaxMsgBox("", "Enquire about private space", "./ajax/private-space-enquiry.php?spaceId="+id, {"Submit":"carparkContactSubmit('"+id+"');", "Cancel":"closeMsgBox();"})
}
    
function carparkContactSubmit(id) {
    removeHelpers($('#privateSpaceEnquiryForm'));
    $('#privateSpaceEnquiryForm .error').removeClass('error');
    var error = Array();

    if ($('#privateSpaceEnquiryForm input[name="name"]').val() == "") {
        error.push({"id":"privName","msg":"You must supply your name."});
    }

    if (!emailCheck($('#privateSpaceEnquiryForm input[name="from"]').val())) {
        error.push({"id":"privEmail","msg":"You must supply a valid email address."});
    }

    if ($('#privateSpaceEnquiryForm textarea').val().length < 10) {
        error.push({"id":"privBody","msg":"You must supply a message to send to the owner."});
    }
    if (error.length > 0) {
        processErrors(error);
    } else {
        $('#privateSpaceEnquiryForm button[type="submit"]').replaceWith('<img src="./img/indicator.gif" width="16" height="16" alt="loading..." class=" right" id="contactLoading" />');
        var from = $('#from'+id).val();
        $.post("./action.php", {action: "AP2PContactSpace", "id": id, "name":$('#privateSpaceEnquiryForm input[name="name"]').val(), "from": $('#privateSpaceEnquiryForm input[name="from"]').val(), "body": $('#privateSpaceEnquiryForm textarea').val()}, function (returnData) {
            if (returnData == "success") {
                closeMsgBox();
            } else {
                var error = Array();
                if (myJ.body) {
                    error.push({"id":"privBody","msg":myJ.body});
                }
                if (myJ.name) {
                    error.push({"id":"privName","msg":myJ.name});
                }
                if (myJ.email) {
                    error.push({"id":"privEmail","msg":myJ.email});
                }
                processErrors(error);
            }
        });
    }
}

function showTab(id) {
    $('#tabs a.selected').addClass("tab");
    $('#tabs a.selected').removeClass("selected");
    $('#tab'+id).addClass("selected");
    $('#tab'+id).removeClass("tab");
    $('.windowContent').addClass("hidden");
    $('#content'+id).removeClass("hidden");
    map.updateInfoWindow();
}

function openInfoWindow(carparkId, id) {
    openId = carparkId;
    $.get('./ajax/get-info.php?templateName='+mgr[carparkId].templateName+'&elementId='+mgr[carparkId].id, function(content) {
        mgr[carparkId].marker.openInfoWindowHtml(content); 
        map.updateInfoWindow();
    });
}