var mapZoom = 5;
var centerCanada = false;
var displayLocationsList = true;

function chr (codePt) {
    if (codePt > 0xFFFF) { 
		codePt -= 0x10000;
        return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF));
    }
    else {
        return String.fromCharCode(codePt);
    }
}

function showRetailers(data) {
	// Add retailer count
	$("#retailersFound").html(data.length == 1 ? "1 Location Found" : data.length + " Locations Found");
	
	// Hide form, show results
	//$("div#findRetailerFormContainer").hide();
	$("div#foundRetailers").fadeIn();
	
	$("ul#retailers").html("");
	
	// load distances for all retailers
	$.each(data, function(i, retailer) {			  
		var dirn = new GDirections();
		dirn.index = i;

		GEvent.addListener(dirn,"error", function() {
			data[dirn.index].distanceComplete = true;
		});
		
		GEvent.addListener(dirn,"load", function() {
			data[dirn.index].realDistance = dirn.getDistance().html;
			
			// remove the '&nbsp;km'
			var amploc = data[dirn.index].realDistance.indexOf('&');
			data[dirn.index].realDistance = data[dirn.index].realDistance.substring(0, amploc);
			
			data[dirn.index].distanceComplete = true;
		});
		

		var fromAddress = $("select#provinceSelect").val()+",Canada";
		var toAddress = retailer.address+" "+retailer.city+', '+retailer.province+' '+retailer.country;
		
		dirn.load("from: " + fromAddress + " to: " + toAddress, { "locale": 'en_US' });	
		
	});
	
	// wait for distances to finish loading
	waitFinishedLoadingDistances(data);

}

function waitFinishedLoadingDistances(retailers) {
	for(var i in retailers) {
		if(!retailers[i].distanceComplete) {
			// wait a few milliseconds then try again... 
			setTimeout(function(){waitFinishedLoadingDistances(retailers)}, 100);
			return false;
		}
	}
	
	// Display our results
	finishShowingRetailers(retailers);
}

function finishShowingRetailers(data) {
	clearMarkers();

	// sort retailers by distance
	var retailers = data.sort(function(a, b) {
		if(a.name<b.name) {
			return -1;
		} else {
			return -0;
		}

	});
		
	// reset our markers (so they show up A-Z after re-sorting them)
	var curmarker = 65;
	for(var i in retailers) {
		if(curmarker == 90) curmarker = 65;
		retailers[i].marker = chr(curmarker);
		curmarker++;
	}

	// output results
	$.each(retailers, function(i, retailer) {
		// List item contents
		var listItemContents = "<h4><a href=\"#\" onclick=\"highlightMarker('"+retailer.id+"');\">"+retailer.name+"</a></h4>"+
			"<p>";
			listItemContents += retailer.address+"<br />"+
			retailer.city+', '+	retailer.province+'<br />'+retailer.country;
			markerContent += "</p>";
		listItemContents += "<p>";
			if (retailer.website) listItemContents += "<a href=\""+retailer.website+"\" target=\"_blank\">Website</a><br />";
			if (retailer.email)	  listItemContents += "<a href=\"mailto:"+retailer.email+"\">E-mail</a><br />";
			if (retailer.phone)	  listItemContents += "Phone: "+retailer.phone+"<br />";
			if (retailer.fax)	  listItemContents += "FAX: "+retailer.fax+"<br />";
		listItemContents += "</p>";			
			
		//marker content			
		var markerContent = "<h3 style=\"font-weight: bold; text-transform: none; margin:0; padding:0;\">"+retailer.name+"</h3>"+
			"<p>";
			markerContent += retailer.address+"<br />"+
			retailer.city+', '+	retailer.province+'<br />'+retailer.country;
			markerContent += "</p>";	
		markerContent += "<p>";		
			if (retailer.website) markerContent += "<a href=\""+retailer.website+"\" target=\"_blank\">Website</a><br />";
			if (retailer.email)	  markerContent += "<a href=\"mailto:"+retailer.email+"\">E-mail</a><br />";
			if (retailer.phone)	  markerContent += "Phone: "+retailer.phone+"<br />";
			if (retailer.fax)	  markerContent += "FAX: "+retailer.fax+"<br />";	
		markerContent += "<p>";		
	
		// Add map marker
		addMarker(retailer.id, new GLatLng(retailer.latitude, retailer.longitude), retailer.marker, markerContent);
		
		// Add retailer info to list
		if(displayLocationsList) $("ul#retailers").append("<li style=\"background: url('/templates/markers/red_Marker"+retailer.marker+".gif') top left no-repeat;\">"+listItemContents+"</li>");
	});
	

	//centerOnLocation($("select#provinceSelect").val()+", Canada", 5);	
	if(centerCanada) {
		centerOnLocation("Canada", mapZoom);	
	} else {
		centerOnLocation(retailers[0].address+", Canada", mapZoom);	
	}
}


function selectProvince(prov) {
	// Fetch retailers
	if(prov=='All Locations') {
		mapZoom = 3;
		centerCanada = true;
		displayLocationsList = false;
		$.getJSON("http://www.tranecanadaco.com/services/retailers.json.php", showRetailers);
	} else {
		mapZoom = 5; 
		centerCanada = false;
		displayLocationsList = true;
		$.getJSON("http://www.tranecanadaco.com/services/retailers.json.php?province="+prov, showRetailers);	
	}
}

