function chr (codePt) {
    if (codePt > 0xFFFF) { 
		codePt -= 0x10000;
        return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF));
    }
    else {
        return String.fromCharCode(codePt);
    }
}

function langtrans(data) {
	return $.ajax({ url: "/services/langtrans.php?text="+data, async: false }).responseText;
}

function showRetailers(data) {
	// Add retailer count	
	$("h4#retailersFound").html(data.length == 1 ? "1 " + langtrans("Retailer Found") : data.length + " " + langtrans("Retailers 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].realDistanceUnit = data[dirn.index].realDistance.substring(amploc+6); // &nbsp;
			data[dirn.index].realDistance = data[dirn.index].realDistance.substring(0, amploc);
			
			data[dirn.index].distanceComplete = true;
		});
		
		if($("#search_type").val() == 'city') {
			var fromAddress = $("select#citySelect").val()+", "+$("select#provinceSelect").val()+", "+$("select#countrySelect").val();
		} else {
			var fromAddress = $("#postalCodeField").val();	
		}
		
		if(retailer.zippost) {
			var toAddress = retailer.zippost;
		} else {
			var toAddress = retailer.address+" "+retailer.city+', '+retailer.province+' '+retailer.country;
		}
		
		//if(retailer.email == 'hobbybv@mediom.qc.ca') {
		//	alert("from: " + fromAddress + " to: " + toAddress + " : " + retailer.zippost);
		//}
			
		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) {

	// sort retailers by distance
	var retailers = data.sort(function(a, b) {
		if(!a.realDistance) a.realDistance = 0; // handle undefined values
		if(!b.realDistance) b.realDistance = 0; // handle undefined values
		
		var aDist = a.realDistance;
		var bDist = b.realDistance;
		
		if(a.realDistanceUnit == 'm') aDist = aDist / 1000;	
		if(b.realDistanceUnit == 'm') bDist = bDist / 1000;	
		
		if(a.tier > b.tier) {
			return 1;
		} else if (a.tier < b.tier) {
			return -1;	
		} else {
			return (aDist - bDist);				   
		}
	});
		
	// 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) {
		// Marker content
		
		var markerContent = "<p><strong><a href=\"#\" onclick=\"highlightMarker('"+retailer.id+"');\">"+retailer.name+"</a></strong></p>"+
			"<p>";
			if(retailer.tier == 1) markerContent += "<b>";
			markerContent += retailer.address+"<br />"+
				retailer.city+', '+
				retailer.province+'<br />'+retailer.country+' '+retailer.zippost.toUpperCase();
			if(retailer.tier == 1) markerContent += "</b>";	
			markerContent += "</p>";
		
		markerContent += "<p>";
		if (retailer.tier == 1) markerContent += "<b>";
		if (retailer.website)   markerContent += "Web: <a href=\""+retailer.website+"\" target=\"_blank\">"+retailer.website.replace('http://', '').replace('www.', '')+"</a><br />";
		if (retailer.email)	    markerContent += "E-mail: <a href=\"mailto:"+retailer.email+"\">"+retailer.email+"</a><br />";
		if (retailer.phone)	    markerContent += "Phone: "+retailer.phone+"<br />";
		if (retailer.fax)	    markerContent += "FAX: "+retailer.fax+"<br />";
		if (retailer.tier == 1) markerContent += "</b>";
		
		markerContent += "</p>";
		
		//if (retailer.distance) markerContent += "<p>Distance: "+retailer.distance+" km</p>";
		if (retailer.realDistance) markerContent += "<p>Distance: "+retailer.realDistance+" "+retailer.realDistanceUnit+"</p>";
			
		// Add map marker
		addMarker(retailer.id, new GLatLng(retailer.latitude, retailer.longitude), retailer.marker, markerContent);
		
		// Add retailer info to list
		$("ul#retailers").append("<li style=\"background-image: url('/template/markers/red_Marker"+retailer.marker+".gif')\">"+markerContent+"</li>");
	});
	
	
	if($("#search_type").val() == 'city') {
		if(data.length == 1) {
			// Center on retailer,
			// Fixes odd Mill Bay problems
			centerOnLocation(data[0].zippost+" "+$("select#citySelect").val()+", "+$("select#provinceSelect").val()+", "+$("select#countrySelect").val());	
		} else {
			// Center on selected city
			centerOnLocation($("select#citySelect").val()+", "+$("select#provinceSelect").val()+", "+$("select#countrySelect").val());	
		}
	} else if($("#search_type").val() == 'postal') {
		centerOnLocation($("input#postalCodeField").val());
	}
	

}

function clearSearch() {
	// Hide results, show form
	$("div#foundRetailers").hide();
	$("div#findRetailerFormContainer").fadeIn();
	
	clearMarkers();
	resetMap();
	
	return false;
}

function selectCountry() {
	// Clear province and city selects
	$("select#provinceSelect").html("");
	$("select#citySelect").html("");
	
	
	if ($("select#countrySelect").val()) {
		// Fetch province list
		$.get("/services/cities.json.php/provinces?country="+$("select#countrySelect").val(),
			function(data) {
				$("select#provinceSelect").empty();
				$("select#provinceSelect").append(data);
			}
		);
	}
	
	$("p#cityFieldContainer").hide();
	$("p#provinceFieldContainer").show();
}

function selectProvince() {
	// Clear city select
	$("select#citySelect").html("");
	
	if ($("select#provinceSelect").val()) {
		// Fetch city list
		$.get("/services/cities.json.php/cities?province="+$("select#provinceSelect").val()+"&country="+$("select#countrySelect").val(),
			function(data) {
				$("select#citySelect").html(data);
			}
		);
	}
	
	$("p#cityFieldContainer").show();
}

function searchCity() {
	if ($("select#citySelect").val()) {
		$("#search_type").val('city');
		// Fetch retailers
		$.getJSON("/services/retailers.json.php?city="+$("select#citySelect").val()+"&province="+$("select#provinceSelect").val(), showRetailers);
		
	}
}

function searchPostalCode() {
	if ($("input#postalCodeField").val()) {
		// Center on postal code
		centerOnLocation($("input#postalCodeField").val());

		$("#search_type").val('postal');
		// Fetch retailers
		$.getJSON("/services/retailers.json.php?postal_code="+$("input#postalCodeField").val(), showRetailers);
		
	}
}