﻿var map = null;
var userMarker = null;
var movLis = null;
var startIndex = 0;
var gmarkers = [];
var i = 0;
var MarkerDealerHash = new Object();

function InitializeMap(mapControl,radius,zip,contactId,coords) {
    map = new GMap2(document.getElementById(mapControl));

    //restrict min/max zoom
    G_NORMAL_MAP.getMinimumResolution = function() { return 8 };
    G_NORMAL_MAP.getMaximumResolution = function() { return 12 };
    G_SATELLITE_MAP.getMinimumResolution = function() { return 8 };
    G_SATELLITE_MAP.getMaximumResolution = function() { return 12 };
    G_HYBRID_MAP.getMinimumResolution = function() { return 8 };
    G_HYBRID_MAP.getMaximumResolution = function() { return 12 };

    //add map controls
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    //map.addControl(new GScaleControl());

    movLis = GEvent.bind(this.map, 'moveend', this, this.mapMoved);

    GEvent.addListener(map, 'zoomend', function() {
        //alert(map.getZoom());
        setDropdownZoomValue(map.getZoom());
        //ddlRadius.SelectedValue = map.getZoom();
    });

    geoCode(radius, zip, contactId,coords);
}
function getDistanceToCenter(point2Lat, point2Long) {
    if (userMarker != null
        && point2Lat != null
        && point2Long != null) {
        var centerLatLng = userMarker.getLatLng();
        var point2LatLng = new GLatLng(point2Lat, point2Long);

        var distance = centerLatLng.distanceFrom(point2LatLng); //returns value in meters
        distance = distance + (distance / 7);  //add fudge factor, driving isn't a straight line - compare maps.google.com distances
        distance = distance / 1609.344; //convert miles to meters

        return distance.toFixed(1);
    }
    else
        return 0;

	return centerLatLng.distanceFrom(point2LatLng);
}
function zoomMap(loc, radius) {

    GEvent.removeListener(movLis);
    
    map.setCenter(new GLatLng(loc.lat, loc.lng), radius);

    //add map events
    movLis = GEvent.bind(this.map, 'moveend', this, this.mapMoved);
}
function geoCode(radius, zip, contactId,coords) {
    var url = '/services/GeoLocator.ashx'
    var httpOb = XmlHttp.create();
    httpOb.open('POST', url, true);
    httpOb.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    httpOb.onreadystatechange = function() {
        if (httpOb.readyState == 4) {
            var data = eval(httpOb.responseText);
            if (data[0].err != 'Not Found') {
                var loc = new locationSettings();
                loc.lat = data[0].Lat;
                loc.lng = data[0].Long;

                zoomMap(loc, radius);
                setUserMarker(loc,zip);
                
                getMarkers(radius, zip, contactId);
            }
        }
    }
    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();

    if (zip != '')
        httpOb.send('zip=' + zip + '&contactid=' + contactId + '&coords=' + coords);
    else 
    {
        if (coords == null) {
            var center = map.getCenter()
            coords = center.x + ';' + center.y;
            
        }
        httpOb.send('contactid=' + contactId + '&coords=' + coords);
    }
}

function getMarkers(radius, zip, contactId) {
    var url = '/services/GeoLocator.ashx'
    var httpOb = XmlHttp.create();
    httpOb.open('POST', url, true);
    httpOb.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    httpOb.onreadystatechange = function() {
        if (httpOb.readyState == 4) {
            var data = eval(httpOb.responseText);
            if (data[0].err != 'Not Found') {
                var loc = new locationSettings();
                loc.lat = data[0].Lat;
                loc.lng = data[0].Long;

                for (var i = 0; i < data.length; i++) {
                    markAddress(data[i],zip);
                }

                onMapLoaded.fire(this, { type: 'Initialized', dealers: data });
            }
        }
    }
    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();

    if (zip != '')
        httpOb.send('zip=' + zip + '&contactid=' + contactId + '&north=' + ne.lat() + '&south=' + sw.lat() + '&west=' + sw.lng() + '&east=' + ne.lng());
    else {
        httpOb.send('contactid=' + contactId + '&north=' + ne.lat() + '&south=' + sw.lat() + '&west=' + sw.lng() + '&east=' + ne.lng());
    }
}

function markAddress(loc,address) {
    var mOptions = new Object();
    var myIcon;

    switch (loc.DealerType) {
        case 'e':  
            myIcon = new GIcon(G_DEFAULT_ICON, "/images/ezgo-icon.png"); 
            break;
        case 'c':  
            myIcon = new GIcon(G_DEFAULT_ICON, "/images/EZGO-Cushman-ICON.png"); 
            break;
        case 'b':  
            myIcon = new GIcon(G_DEFAULT_ICON, "/images/EZGO-BOTH-ICON.png"); 
            break;
        default:  
            myIcon = new GIcon(G_DEFAULT_ICON, "/images/ezgo-icon.png");
    }
    myIcon.iconSize = new GSize(50, 32);
    mOptions.icon = myIcon;     
    
    mOptions.title = loc.Name;
    var tabs = new Array();
    var getDir = "<br/><br/><a href='http://maps.google.com/maps?q=" + loc.Lat + "," + loc.Long + "(" + loc.Street + ' ' + loc.CityStateZip + ")' target='_blank'>Get Directions</a>";

    if (address != '')
        getDir = "<br/><br/><a href='http://maps.google.com/maps?saddr=(" + address + ")&daddr=" + loc.DealerLat + "," + loc.DealerLong + "(" + loc.Street + ' ' + loc.CityStateZip + ")' target='_blank'>Get Directions</a>";
    
    var tab = new GInfoWindowTab("Dealer Info", "<b>" + loc.Name + "</b><br/>" + loc.Street + "<br/>" + loc.CityStateZip + "<br/>" + loc.Phone + "<br/><a href=\"http://" + loc.URL + "\" target=\"blank\">" + loc.URL + "</a>" + getDir);
    
    tabs[0] = tab;

    if (loc.AddInfo != null && loc.AddInfo != '') {
        tab = new GInfoWindowTab("Additional Info", loc.AddInfo);
        tabs[1] = tab;
    }
    
    var marker = new GMarker(new GLatLng(loc.DealerLat, loc.DealerLong), mOptions);
    marker.bindInfoWindowTabs(tabs);
    map.addOverlay(marker);

    MarkerDealerHash[loc.DealerId] = i; //treat object like an associative array
    gmarkers[i] = marker;
    i++;
    
    GEvent.bind(marker, 'click', this, function() { markerClicked(loc.DealerId); });    
}

function setUserMarker(loc,SearchText) {

    var mOptions = new Object();
    mOptions.iconSize = new GSize(50, 50);
    mOptions.icon = new GIcon(G_DEFAULT_ICON, "/images/ezgoArrow.png");  //Get image from bo
    mOptions.title = SearchText;
    
    //Remove existing marker
    if (userMarker != null)
        map.removeOverlay(userMarker);

    if (SearchText != '') {
        var marker = new GMarker(new GLatLng(loc.lat, loc.lng),mOptions);
        map.addOverlay(marker);
        userMarker = marker;
    }
}

//Event Handlers
function mapMoved() {
    if(onMapMoved!=null)
        onMapMoved.fire('MapMoved');
}
function markerClicked(dealerId) {
    showSelectedDealer(dealerId);
}

//Events
var MapLoaded = function() {
    this.eventName = arguments[0];
    var mEventName = this.eventName;
    var dealers;
    var eventAction = new Array(0);
    this.subscribe = function(fn) {
        if (eventAction.length == 0)
            eventAction[0] = fn;
        else
            eventAction[eventAction.length] = fn;
    }
    this.fire = function(sender, eventArgs) {
        this.eventName = 'eventName2';
        if (eventAction.length > 0) {
            for (i = 0; i < eventAction.length; i++) {
                eventAction[i](sender, eventArgs);
            }
        }
    }
};
var MapMoved = function() {
    this.eventName = arguments[0];
    var mEventName = this.eventName;
    var eventAction = new Array(0);
    this.subscribe = function(fn) {
        if (eventAction.length == 0)
            eventAction[0] = fn;
        else
            eventAction[eventAction.length] = fn;
    }
    this.fire = function(sender, eventArgs) {
        this.eventName = 'eventName2';
        if (eventAction.length > 0) {
            for (i = 0; i < eventAction.length; i++) {
                eventAction[i](sender, eventArgs);
            }
        }
    }
};
var onMapMoved = new MapMoved('MapMovedEventHandler');
var onMapLoaded = new MapLoaded('MapLoadedEventHandler');

//Object to hold Location Settings
function locationSettings()
{
    this.lat;
    this.lng;
}

function openInfoWindow(dealerId) {

    GEvent.trigger(gmarkers[MarkerDealerHash[dealerId]], "click");
}







