﻿/// <reference path="jquery-1.3.2-vsdoc2.js" />

var ByBoxNearestSite = function(imagesRoot) {

    this.Initialise = function() {
        $(document).ajaxStart(function() {
            $('#ajaxBusy').show();
        }).ajaxStop(function() {
            $('#ajaxBusy').hide();
        });

        $(".find form").submit(function(event) {
            event.preventDefault();
            ByBoxNearestSite.getResults();
        });

        if ($("#searchLocation").val().length > 0) {
            ByBoxNearestSite.getResults();
        }
    }
}

ByBoxNearestSite.getResults = function() {
    ByBoxNearestSite.hideError();
    ByBoxNearestSite.uri = "/Integration/NearestConsumerSites";

    var location = $("#searchLocation").val();
    if (location == "") {
        ByBoxNearestSite.displayError("Please enter a town, address or postcode");
        return false;
    }

    if (ByBoxNearestSite.isPostcode(location)) {
        var searchCriteria = { Postcode: location };
        ByBoxNearestSite.postSearchCriteria(searchCriteria);
    }
    else {
        var geo = new GClientGeocoder();
        geo.setBaseCountryCode("uk");
        geo.getLatLng(location, ByBoxNearestSite.geocodeComplete);
    }
    return false;
}

ByBoxNearestSite.isPostcode = function(location) {
    return /^([A-PR-UWYZ][A-HK-Y0-9][A-HJKSTUW0-9]?[ABEHMNPRVWXY0-9]?) *[0-9][ABD-HJLN-UW-Z]{2}\b/i.test(location);
}

ByBoxNearestSite.geocodeComplete = function(latLng) {
    if (latLng == null) {
        ByBoxNearestSite.displayError("We were unable to find your location");
        return false;
    }
    var searchCriteria = { Latitude: latLng.lat(), Longitude: latLng.lng() };
    ByBoxNearestSite.postSearchCriteria(searchCriteria);
}

ByBoxNearestSite.postSearchCriteria = function(searchCriteria) {
    $.post(ByBoxNearestSite.uri,
        searchCriteria,
        ByBoxNearestSite.displayResult,
        "json");
}

ByBoxNearestSite.displayResult = function(sitesResult) {
    $("ul.list-step").text("");

    var addAddressElement = ByBoxNearestSite.addAddressElement;
    var addListItem = ByBoxNearestSite.addListItem;
    var roundNumber = ByBoxNearestSite.roundNumber;

    if (sitesResult.Error == null) {
        bbs = new ByBoxNearestSiteResults('googleMapCanvas', sitesResult.originLatitude, sitesResult.originLongitude);
        $.each(sitesResult.sites, function(i) {
            var siteHeader = addAddressElement(this.siteName, ", ") +
                            addAddressElement(this.postalCode, " ") +
                            "(" + roundNumber(this.distance, 2) + "km)";
            var siteDetails = "<ul>" + addListItem(this.address1) +
                            addListItem(this.address2) +
                            addListItem(this.town) +
                            addListItem(this.region) +
                            addListItem(this.postalCode) +
                            addListItem(this.locationDescription) + "</ul>";

            var siteIdentifier = this.siteIdentifier;

            $("ul.list-step").append('<li id="' + i + '"><span>' +
                            '<a href="#">' + siteHeader + '</a></span>' +
                            '<div class="siteDetail">' + siteDetails + '<a href="#" class="select"><span>Select</span></a></div></li>');
            $("li#" + i + " span a").click(function() { return bbs.SiteClicked(i); });
            $("li#" + i + " div a").click(function() { return bbs.SelectSite(siteIdentifier); });

            if (this.latitude != 0 && this.longitude != 0) {
                bbs.AddSiteMarker(i, this.latitude, this.longitude);
            }
        });
        bbs.SiteClicked(0);
    }
    else {
        ByBoxNearestSite.displayError(sitesResult.Error);
    }
}

ByBoxNearestSite.displayError = function(error) {
    $("#Error blockquote").text(error);
    $("#Error").fadeIn("slow");
}

ByBoxNearestSite.hideError = function(error) {
    $("#Error blockquote").text("");
    $("#Error").hide();
}

ByBoxNearestSite.addAddressElement = function(element, separator) {
    if (element != null && element.length > 0) {
        return element + separator;
    }
    else {
        return "";
    }
}

ByBoxNearestSite.addListItem = function(element) {
    if (element != null && element.length > 0) {
        return "<li>" + element + "</li>";
    }
    else {
        return "";
    }
}

ByBoxNearestSite.roundNumber = function(num, dec) {
    var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
    return result;
}

function ByBoxNearestSiteResults(canvasId, originLatitude, originLongitude)
{
    var googleMap;
    var googleIconByBox;
    var googleMarkers = [];
    var googleMarkerPoints = [];

    $(document).ready(function() {
        $("#" + canvasId).show();
        var mapDiv = document.getElementById(canvasId);

        if (GBrowserIsCompatible()) {
            var zoomLevel = 11;
            var origin = new GLatLng(originLatitude, originLongitude);

            googleMap = new GMap2(mapDiv);
            googleMap.setCenter(origin, zoomLevel);
            var marker = new GMarker(origin);
            googleMap.addOverlay(marker);

            googleMap.addControl(new GLargeMapControl());
            googleMap.addControl(new GOverviewMapControl());
            googleMap.enableContinuousZoom();

            googleIconByBox = new GIcon();
            googleIconByBox.image = "http://www.bybox.com/images/ByBox04/MapMarker.png";
            googleIconByBox.shadow = "http://www.bybox.com/images/ByBox04/MapMarkerShadow.png";
            googleIconByBox.iconSize = new GSize(20, 34);
            googleIconByBox.shadowSize = new GSize(37, 34);
            googleIconByBox.iconAnchor = new GPoint(9, 34);
            googleIconByBox.infoWindowAnchor = new GPoint(9, 2);
            googleIconByBox.infoShadowAnchor = new GPoint(18, 25);
        }
    });

    this.SiteClicked = function(index) {
        var listItem = $("#" + index);
        var siteDetail = $("#" + index + " .siteDetail");

        if (siteDetail.is(":hidden")) {
            $("li").stop()
                .removeClass("Selected")
                .css("backgroundColor", "");

            listItem.addClass("Selected")
                .animate({ backgroundColor: "#C0C0C0" }, 400)
                .animate({ backgroundColor: "#FFFFFF" }, 400);

            $(".siteDetail:visible").slideUp("normal");
            siteDetail.slideDown("normal");
        }
        setTimeout('bbs.MoveToMarker(' + index + ');', 500);
        return false;
    }
    
    this.MoveToMarker = function(id) {
        googleMap.panTo(googleMarkerPoints[id]);
    }

    this.SelectSite = function(siteIdentifier) {
        $(siteIdentifierID).val(siteIdentifier);
        $(SearchLocationID).val($("#searchLocation").val());
        $("form")[1].submit();
        return false;
    }

    this.AddSiteMarker = function(index, latitude, longitude)
    {
        var prevScope = this;
        if (googleMap)
        {
            googleMarkerPoints[index] = new GLatLng(latitude, longitude);
            googleMarkers[index] = new GMarker(googleMarkerPoints[index], {icon: googleIconByBox});
            GEvent.addListener(googleMarkers[index], "click", function() { prevScope.SiteClicked(index) });
            googleMap.addOverlay(googleMarkers[index]);
        }
    }
}