// global variables
var map;
var lats = [];
var longs = [];
var points = [];
var hoursTabs = [];
var locationTabs = [];
var gmarkers = [];
var gmarkershtml = []; 
var htmlDescrip = []; 
var addresses = []; 
var plotAllBounds = new GLatLngBounds();     
var totalPoints;
var totalLats = 0;
var totalLongs = 0;
var listHTML = "";
var geocoder = new GClientGeocoder();
var directionsPanel;  
var directions; 
var fromPoint;
var toPoint; 
var fromAddress = ""; 
var toAddress = ""; 
var dir = ""; 

function initialize() {
  if (GBrowserIsCompatible()) {
   
    map = new GMap2(document.getElementById("map_canvas"));
    totalPoints = points.length;    
    initMap();
  
    // center the map based on location string; if null then leave default centering    
    var loc = gup('loc');    
    if (loc != '') {
      loc=loc.replace(/%20/g,' ');
      showAddress(loc);
    }    
  }
}

function initMap() {
    var totalLats = 0;
    var totalLongs = 0;
            
    // center the map and find the closest authorized zoom level that displays all points
    for(var i=0; i<totalPoints; i++) {        
        totalLats = totalLats + lats[i];
        totalLongs = totalLongs + longs[i]
        plotAllBounds.extend(points[i]);
    }
    // by default center the map based on all points
    var avgLat = totalLats / totalPoints;
    var avgLong = totalLongs / totalPoints;   
    var plotallzoom = map.getBoundsZoomLevel(plotAllBounds) - 1;  // zoom out 1 more step to catch outliers
    var mapCenter = new GLatLng(avgLat, avgLong);
    map.setCenter(mapCenter, plotallzoom); 
        
    // add map controls     
    map.addControl(new GSmallMapControl());    
    
    //plot all the points
    for(var j=0; j<totalPoints; j++) {       
        var infoTabs = [
            new GInfoWindowTab("Location", locationTabs[j]),
            new GInfoWindowTab("Hours",  hoursTabs[j])
	    ];			    
	   gmarkershtml[j] = infoTabs;    
       createMarker(points[j], j);      
    }    
}

function resetMap() {
    if (directions) {
        directions.clear();
        document.getElementById("googleList").style.display = "block";
        document.getElementById("drivingDirections").style.display = "none";
        document.getElementById("printButton").style.display = "none";
    }
    
    initMap();
} 

function createMarker(point, theIndex) {
    var icon = new GIcon();
    icon.image = mapIcon;
    icon.shadow = "";
    icon.iconSize = new GSize(29, 39);
    icon.shadowSize = new GSize(0, 0);
    icon.iconAnchor = new GPoint(15, 39);
    icon.infoWindowAnchor = new GPoint(12, 12);
    icon.infoShadowAnchor = new GPoint(0, 0);
                   
    var marker = new GMarker(point,  icon);
    
    GEvent.addListener(marker, 'click', function() {
        map.closeInfoWindow();
        marker.openInfoWindowTabsHtml(gmarkershtml[theIndex]);
    });
    
    gmarkers[theIndex] = marker; 
    map.addOverlay(marker);
}
 
         
function listClick(listClickLat,listClickLong,listClickIndex){
	// Close any open popup info balloons
	map.closeInfoWindow();
	// Center Map on location's lat/long
	map.setCenter(new GLatLng(parseFloat(listClickLat), parseFloat(listClickLong)), 14);
	// Open the pop up balloon for the clicked location.
	gmarkers[listClickIndex].openInfoWindowTabsHtml(gmarkershtml[listClickIndex]);
}

function showAddress(address) {
    geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + " not found");
        document.getElementById('ctl00_ContentPlaceHolder1_locatorSearch_locatorFields_location_input').focus();
      }
       else {
        map.setCenter(point, 11);
                              
        var distances = [];
        for (var i=0; i<totalPoints; i++) {
            distances[i] = points[i].distanceFrom(point);
        }
        
        var allPointData = [];
        for (i=0; i<totalPoints; i++) {
            allPointData[i] = {Distance: distances[i], HTMLDesc: htmlDescrip[i]};
        }

        allPointData.sort(sortByDistance);     
         
        var theHtml = "";
        for (i=0; i<totalPoints; i++) {
            theHtml += allPointData[i].HTMLDesc;
        }
        
        document.getElementById("googleList").innerHTML = theHtml;
        document.getElementById("googleList").style.display = "block";
        
      }
    }
  );
}

function sortByDistance(a, b) {
    var x = a.Distance;
    var y = b.Distance;
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

// functions for Driving Directions

function showToBox() { 
    document.getElementById("toFromBox").style.display = "block";
    document.getElementById("endAddress").style.display = "block";
    document.getElementById("startAddress").style.display = "none";
    document.getElementById("fromHereLink").style.textDecoration = "none";
    document.getElementById("toHereLink").style.textDecoration = "underline";
    document.getElementById("theAddress").focus();
    dir = "fromHere";
}
function showFromBox() {
    document.getElementById("toFromBox").style.display = "block";
    document.getElementById("startAddress").style.display = "block";
    document.getElementById("endAddress").style.display = "none";
    document.getElementById("toHereLink").style.textDecoration = "none";
    document.getElementById("fromHereLink").style.textDecoration = "underline";
    document.getElementById("theAddress").focus();
    dir = "toHere";
}
function getDirections(index) {
    var inputAddress = document.forms[0].elements["theAddress"].value;
    if (inputAddress == '') {
        alert("Please enter an address");
    } else {
        if (directions) { directions.clear();}
        document.getElementById("googleList").style.display = "none";
        document.getElementById("drivingDirections").style.display = "block";
        document.getElementById("printButton").style.display = "block";
        var currentAddress = addresses[index];
        var addressString;
        directionsPanel = document.getElementById("googleDirections");
        directions = new GDirections(map, directionsPanel);
        var thisPoint = lats[index] + "," + longs[index];
        
        directions.clear();
        map.closeInfoWindow();
        if (dir == "toHere") {
            fromPoint = inputAddress;
            fromAddress = inputAddress;
            toPoint = thisPoint;
            toAddress = currentAddress;
            addressString  = '<div class="addressLabel">To: &nbsp;</div>';
            addressString += '<div class="addressColumn">' + currentAddress + '</div><div class="clear"/>';
        } else {
            fromPoint = thisPoint;
            fromAddress = currentAddress;
            toPoint = inputAddress;
            toAddress = inputAddress;
            addressString  = '<div class="addressLabel">From: &nbsp;</div>';
            addressString += '<div class="addressColumn">' + currentAddress + '</div><div class="clear"/>';
        }
        directions.load(fromPoint + " to " + toPoint);
        document.getElementById("locationAddress").innerHTML = addressString;
    }
}

function printDirections() {
    var cleanedFromAddress = fromAddress.replace('<p>', '');
    cleanedFromAddress = cleanedFromAddress.replace('</p>', '');
    cleanedFromAddress = cleanedFromAddress.replace('<br />', '\n');
    cleanedFromAddress = escape(cleanedFromAddress);
    
    var cleanedToAddress = toAddress.replace('<p>', '');
    cleanedToAddress = cleanedToAddress.replace('</p>', '');
    cleanedToAddress = cleanedToAddress.replace('<br />', '\n');
    cleanedToAddress = escape(cleanedToAddress);
    
    var url  = "../pages/printDirections.aspx?from=" + fromPoint + "&to=" + toPoint;
        url += "&fromAdd=" + cleanedFromAddress + "&toAdd=" + cleanedToAddress;
    window.open(url, 'printFriendly', 'width=600,height=600,resizable=yes,menubar=yes,toolbar=yes,scrollbars=yes,addressbar=no,statusbar=no');
}

function initPrintPage() {
    var printMap = new GMap2(document.getElementById("drivingMap"));
    var printDirectionsPanel = document.getElementById("directions");
    var printDirections = new GDirections(printMap,printDirectionsPanel);
    var from = unescape(gup('from')); 
    var to = unescape(gup('to')); 
    var fromAddress = unescape(gup('fromAdd'));
    var toAddress = unescape(gup('toAdd'));
    var address1 = fromAddress.replace('\n','<br />');
    var address2 = toAddress.replace('\n','<br />');
    
    var addressesText  = '<div class="addressLabel">From: &nbsp;</div><div class="addressColumn">' + address1 + '</div>';
        addressesText += '<div class="addressLabel">To: &nbsp;</div><div class="addressColumn">' + address2 + '</div>';
        addressesText += '<div class="clear" />';
        
    document.getElementById('drivingAddress').innerHTML = addressesText;
    printDirections.load(from + " to " + to);
}



