﻿var geocoder;
var map = [];
var bounds = [];
var markers = [];
var infowindow;
var previousMarkerId = null;
var redrawTimer;
var mapinit = false;
var infowindow = null;
var mapId="retailermap";


var x1_;
var y1_;
var x2_;
var y2_;

String.prototype.contains = function(textToFind) { return this.toLowerCase().indexOf(textToFind.toLowerCase()) != -1; };


function selectMarker(dealerItem)
{
    jQuery(".dealerListItem").removeClass("selectedDealer");
    jQuery(dealerItem).addClass("selectedDealer");

    var id = parseInt(jQuery(dealerItem).attr("id").substring(7), 10);
    var dealer = getDealerData(id);
    if(dealer == null)
        return;
}

function getDealerData(id)
{
    for(var i=0;i<dealerData.length;i++)
    {
        var item = dealerData[i];
        if(item.Id == id)
        {
            return item;
        }
    }
    return null;
}

function initialize_map(id) {
    var latlng = new google.maps.LatLng(62.935234870604695, 15.7763671875);
    var myOptions = {
        zoom: 4,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        navigationControl: true,
        mapTypeControl: false,
        scaleControl: false
    }


    map[id] = new google.maps.Map(document.getElementById(id), myOptions);
    bounds[id] = new google.maps.LatLngBounds();
    infowindow = new google.maps.InfoWindow({ content: "" });

    google.maps.event.addListener(map[id], 'bounds_changed', function() {
        jQuery("#noHits").hide();
		clearTimeout(redrawTimer);
		redrawTimer = setTimeout(boundsRedraw, 250);
	});
}

function boundsRedraw(){
	if(!mapinit) return;
	var b = map[mapId].getBounds();
	if(!b) return;
	var sw = b.getSouthWest();
	var ne = b.getNorthEast();
	setBounds((Math.round(sw.lng()*1000)/1000),(Math.round(sw.lat()*1000)/1000),(Math.round(ne.lng()*1000)/1000),(Math.round(ne.lat()*1000)/1000));
	filterVisibleOnMap();
}

function displayClearButton()
{
    var value = jQuery("#mapFilterText").val();
    if(value.length == 0)
    {
        if(!jQuery("#searchInputContainer").hasClass("hideClear"))
        {
            jQuery("#searchInputContainer").addClass("hideClear");
        }
    }
    else
    {
        jQuery("#searchInputContainer").removeClass("hideClear");
    }
}

function filterOnEnter(e) {
    if (e===undefined) e = window.event; // for IE
    var value = jQuery("#mapFilterText").val();
    displayClearButton();
    if (e.keyCode == 13)
    {
        filter(value);
    }
}

function filter(text)
{
    if(infowindow != null)
        infowindow.close()
    jQuery(".dealerListItem").removeClass("selectedDealer");
    var found=[];
    var bounds = new google.maps.LatLngBounds();
    for(var i=0;i<dealerData.length;i++)
    {
        var item = dealerData[i];
        if(item.Name.contains(text) || item.CompleteAddress.contains(text))
        {
            found[found.length] = item;
        }
    }
        
    if(found.length == 0)
    {
        jQuery("#noHits").show();
        return;
    }
    else
    {
        jQuery("#noHits").hide();
        for(var i=0;i<found.length;i++)
        {
            var item = found[i];
            var myLatLng = new google.maps.LatLng(item.Lat, item.Lon);
            bounds.extend(myLatLng);
            map[mapId].fitBounds(bounds);
        }
        if(map[mapId].getZoom() > 11)
        {
            map[mapId].setZoom(11) 
        }
    }
}



function filterVisibleOnMap()
{
    for(var i=0;i<dealerData.length;i++)
    {
        var item = dealerData[i];
        var lat = item.Lat;
		var lng = item.Lon;
        if(lng >= x1_ && lng <= x2_ && lat >= y1_ && lat <= y2_) 
        {
            jQuery("#dealer_" + item.Id).show();
        }
        else
        {
            jQuery("#dealer_" + item.Id).hide();
        }
    }
}


function setBounds(x1,y1,x2,y2) {
	x1_ = x1;
	y1_ = y1;
	x2_ = x2;
	y2_ = y2;
}

function initMarkers(mapId, addressItems) 
{
    for(var i = 0; i < addressItems.length; i++)
    {
        
        var item = addressItems[i];
        var marker = new google.maps.Marker({
                map: map[mapId],
                position: new google.maps.LatLng(item.Lat, item.Lon),
                icon: '/img/retailers/pin.png'
            });

        addMarkerListener(marker, item);
        
        marker.title = item.Name;
        markers[item.Id] = marker;

        var empty = bounds[mapId].isEmpty();

        bounds[mapId].extend(marker.position);
        if (!empty) {
            map[mapId].fitBounds(bounds[mapId]);
        }
        map[mapId].setCenter(bounds[mapId].getCenter());
    }
    mapinit = true;
}

function addMarkerListener(marker, item)
{
    if(infowindow != null)
        infowindow.close()

    infowindow = new google.maps.InfoWindow();

    google.maps.event.addListener(infowindow, 'closeclick', function(){
        jQuery(".dealerListItem").removeClass("selectedDealer");
    });

    google.maps.event.addListener(marker, 'click', function(){
        

        infowindow.setContent(getInfoWindowHtml(item));
        infowindow.open(map[mapId], marker);

        var zoom = map[mapId].getZoom();
        if(zoom < 11)
        {
            map[mapId].setZoom(zoom + 4) 
        }

        map[mapId].setCenter(new google.maps.LatLng(item.Lat, item.Lon))


        selectMarker(jQuery("#dealer_" + item.Id));
    });
}

function getInfoWindowHtml(item)
{
    return "<h4>"+ item.Name + "</h4>" + item.Address.replace( /\n/g, '<br />\n' ) + "<br/>" + item.PostalCode + " " + item.City + "<br/>";
}


