﻿var mapMarkers = [];
var map;
var icon;

var lat;
var lon;

var accuracyToZoomLevel = [
    1,  // 0 - Unknown location
    5,  // 1 - Country
    6,  // 2 - Region (state, province, prefecture, etc.)
    8,  // 3 - Sub-region (county, municipality, etc.)
    11, // 4 - Town (city, village)
    13, // 5 - Post code (zip code)
    15, // 6 - Street
    16, // 7 - Intersection
    17 // 8 - Address
];

$(document).ready(function() {
    $(".companyUrl").live("click", function(ev) {
        //        document.location.href = $(this)[0].href;
        window.open($(this)[0].href);
        return false;
    });

    var addy = $.query.get('address');
    if (addy != '') {
        $("#txtAddress").val(addy);
        geocode();
    }
});

function initMap() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        map.setCenter(new GLatLng(38, -97), 4);
        map.enableScrollWheelZoom();
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
    }
}

// Clear map points
function clearMap() {
    mapPoints = [];
    map.clearOverlays();
}

function createMapMarker(point, counter) {
    var myLabel = counter + 1 + '';
    var newIcon = MapIconMaker.createLabeledMarkerIcon({ label: myLabel, primaryColor: "#0096E9" });
    $("#company" + counter + " .icon").attr("src", newIcon.image);
    var marker = new GMarker(point, { icon: newIcon });
    GEvent.addListener(marker, "click", function() {
        var opts = { pixelOffset: new GSize(32, 5), maxWidth: 280 };
        marker.openInfoWindowHtml(point.name, opts);
    });
    return marker;
}

function loadMapLocations() {
    //var ajaxParms = generateRequestArgs();
    // Make Ajax request to get Hotel data using Google Maps GDownloardUrl()
    GDownloadUrl("ServiceCalls/getCompaniesBasic.aspx?Lat=" + lat + "&Lon=" + lon + "&Distance=" + $("#distance").val(), function(data, responseCode) {
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("Company");
        if (markers.length == 0) {
            alert("Your query returned no results. Please broaden your search criteria and try again.");
        } else {

            var myDiv = $("#stickHere");
            for (var i = 0; i < markers.length; i++) {
                if (i == 0) {
                    myDiv = $("#company").clone(true).attr('id', 'company' + i).appendTo(myDiv);
                } else {
                    myDiv = $("#company").clone(true).attr('id', 'company' + i).insertAfter(myDiv);
                }

                var myMarker = markers[i];
                var parent = "#company" + i;
                $(parent).show();

                var point = new GLatLng(parseFloat(myMarker.getElementsByTagName("Latitude")[0].firstChild.nodeValue),
                            parseFloat(myMarker.getElementsByTagName("Longitude")[0].firstChild.nodeValue));

                var companyName = myMarker.childNodes[1].firstChild.nodeValue;
                $(parent + ' .companyNameLabel').text(companyName);
                var url = parseXML("Url", myMarker);
                if (url === undefined) {
                    // remove the href
                    $(parent + " a.companyUrl").removeAttr("href");
                } else {
                                $(parent + " a.companyUrl").attr("href", "http://" + url);
                    //$("a.companyURL").attr({ title: "http://" + url });
                    //$(parent + " a.companyUrl").html($(parent + " a.companyUrl").html() + "<wbr>");
                    //$(parent + " a.companyUrl").attr({ href: "http://" + url });
                    //$(parent + " a.companyUrl").html($(parent + " a.companyUrl").html().replace(/<wbr>$/i, ""));
                }

                var distance = myMarker.childNodes[4].firstChild.nodeValue;
                $(parent + ' .distanceLabel').text(distance);

                var address = myMarker.childNodes[8].firstChild.nodeValue;
                $(parent + ' .addressLabel').text(address);

                if (null === myMarker.childNodes[9].firstChild) {
                    $(parent + ' .address2').hide();
                } else {
                    var address2 = myMarker.childNodes[9].firstChild.nodeValue;
                    $(parent + ' .address2Label').text(address2);
                }

                var addressCity = myMarker.childNodes[10].firstChild.nodeValue;
                $(parent + ' .addressCityLabel').text(addressCity);

                renderList(parent, "Phone", myMarker, "phone");
                renderList(parent, "Fax", myMarker, "fax");
                renderList(parent, "Email", myMarker, "email");
                renderList(parent, "Url", myMarker, "url");
                renderList(parent, "Locations", myMarker, "locations");
                renderList(parent, "Affiliations", myMarker, "affiliations");
                renderList(parent, "Training", myMarker, "training");
                renderList(parent, "ProductsServiced", myMarker, "productsServiced");

                var moeLogo = myMarker.getElementsByTagName("MoeLogo")[0].firstChild.nodeValue;
                if (moeLogo == 'N') {
                    $(parent + " img.moeLogo").hide();
                }

                var dtvLogo = myMarker.getElementsByTagName("DtvLogo")[0].firstChild.nodeValue;
                if (dtvLogo == 'N') {
                    $(parent + " img.dtvLogo").hide();
                }
                var serviceCodes = myMarker.getElementsByTagName("Service")
                var serviceCodeList = $(parent + " .serviceCodeLI");
                for (var j = 0; j < serviceCodes.length; j++) {
                    serviceCodeList = $(serviceCodeList).clone(true).insertAfter(serviceCodeList).text(serviceCodes[j].firstChild.nodeValue);
                    $(serviceCodeList).attr("id", "listItem" + j).show();
                }

                point.name = "<div><b>" + companyName + "</b><br/><table><tr></table><br/></div>";
                var list = document.getElementById("list");

                mapMarkers.push(createMapMarker(point, i));
            }
            $("#company").hide();
            showMap();
        }
    });
}

function renderList(parent, element, marker, className) {
    var field = parseXML(element, marker);
    if (field === undefined) {
        $(parent + " ." + className).hide();
    }
    $(parent + " ." + className + "Label").text(field);
}

function parseXML(element, marker) {
    var elementList = marker.getElementsByTagName(element);
    if (elementList.length > 0) {
        var elementValue = marker.getElementsByTagName(element)[0].firstChild.nodeValue;
        return elementValue;
    }
}

// Show Google map with hotel data
function showMap() {

    // Find boundary points of hotel location
    var bounds = new GLatLngBounds();
    for (var i = 0; i < mapMarkers.length; i++) {
        map.addOverlay(mapMarkers[i]);
        bounds.extend(mapMarkers[i].getPoint());
    }

    // Reset center and zoom level based on queried hotel locations
    map.setCenter(bounds.getCenter());
    map.setZoom(map.getBoundsZoomLevel(bounds));
    $("#info").hide();
}

function showHotels() {
    loadMapLocations();
}

// This geocodes the passed in address/zip and puts it on the map
function geocodeComplete(result) {
    if (result.Status.code != 200) {
        alert('Could not geocode "' + result.name + '"');
        return;
    }
    var placemark = result.Placemark[0]; // Only use first result
    var accuracy = placemark.AddressDetails.Accuracy;
    var zoomLevel = accuracyToZoomLevel[accuracy] || 1;
    lon = placemark.Point.coordinates[0];
    lat = placemark.Point.coordinates[1];



    var point = new GLatLng(lat, lon);
    point.name = placemark.address;

    // Create marker icon              
    icon = new GIcon();
    icon.image = "redStar.png";
    icon.iconSize = new GSize(50, 50);
    icon.iconAnchor = new GPoint(24, 50);
    // Create a marker
    marker = new GMarker(point, icon); // when , icon is added openInfoWindowHtml stops working
    map.addOverlay(marker);
    GEvent.addListener(marker, "click", function() {
        var opts = { pixelOffset: new GSize(32, 5), maxWidth: 280 };
        marker.openInfoWindowHtml(point.name, opts);
    });

    // Add the marker to map
    loadMapLocations();
}

function geocode() {
    $("#info").show();
    initMap();
    clearMap();
    clearResultsList();
    var location = document.getElementById("txtAddress").value;
    geocoder = new GClientGeocoder();
    geocoder.getLocations(location, geocodeComplete);
}

function clearResultsList() {
    $("#stickHere > *").remove();
}

