﻿top.check_address_semaphore = false; // ensures only one execution at a time

function checkAddress( address, opts ) {
/* options: {
	success_callback: function (required)
	error_callback: function (required)
	message_element_id: error messages will be written here (required)
	precision: the minimum precision of the returned address - see gmaps API (optional, default 5)
	country: bias results to a particular country (optional, default ca)
	language: give messages in this language (optional, default en)
*/
	if( top.check_address_semaphore )
		return;

	var lang = (typeof( opts.language ) == 'undefined' ? 'en' : opts.language);
	var message = document.getElementById( opts.message_element_id );
	
	if( typeof( GBrowserIsCompatible ) != 'function' ) {
		message.innerHTML = "GMaps not available.";
		opts.error_callback();
		return;
	} else if( ! GBrowserIsCompatible() ) {
		message.innerHTML = "GMaps not available.";
		opts.error_callback();
		return;
	} else if( address == "" ) {
		if( opts.language == 'fr' ) message.innerHTML = 'Aucune adresse saisie.';
		else message.innerHTML = "No address entered.";
		opts.error_callback();
		return;
	}
	
	top.check_address_semaphore = true;
	
	var precision = (typeof( opts.precision ) == 'undefined' ? 5 : opts.precision);
	var geocoder = new GClientGeocoder();
	geocoder.setBaseCountryCode( (typeof( opts.country ) == 'undefined' ? 'ca' : opts.country) );

        if( lang == 'fr' ) message.innerHTML = "Vérification de l'adresse...";
        else message.innerHTML = "Checking address...";
        
        var address_help = "Please <a target='_blank' href='/index.php/home/addressHelp'>click here</a> if you are having trouble locating an address.";
        
	geocoder.getLocations( address, function( response ) {
		if( ! response || response.Status.code != 200 ) {
			if( lang == 'fr' ) message.innerHTML = "Impossible de trouver l’adresse. "+ address_help;
			else message.innerHTML = "Could not locate address. Please ensure that the address is properly spelt, and press the 'CHECK ADDRESS' button to try again. "+ address_help;
			opts.error_callback();
		} else if( response.Placemark[0].AddressDetails.Accuracy < precision ) {
			if( lang == 'fr' ) message.innerHTML = "L’adresse n’est pas suffisamment précise. "+ address_help;
			message.innerHTML = "Address not accurate enough. "+ address_help;
			opts.error_callback();
		} else {
			if( lang == 'fr' ) message.innerHTML = "Adresse utilisée "+ response.Placemark[0].address +".";
			else message.innerHTML = "Using address "+ response.Placemark[0].address +".";
			opts.success_callback( response );
		}
		
		top.check_address_semaphore = false;
	} );

}

