/*---------------
 * jQuery Findmynearest Plugin by Engage Interactive
 * Copyright (c) 2009 Engage Interactive
 * Author: Neil Charlton
 * Version: 1.0
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Requires: 
 	1. jQuery v1.3 or later
 	2. Google Maps API v2
	3. A locations datasource containing id, name, latitude and longtitude
---------------*/
	
(function($) {

	findmynearest = function( searchTerm, options ){
	
		var iQueue = 0, geocoder = "", latlng = null, loglat = "", loglng = "", ourLocs = [], places = [], results = [];
		
		var defaults = {
			dataSource: "/locations/locationsJsonList",
			searchTotal: 5,
			logger: true,
			loggerUrl: "/locations/logfindmynearest",
			onError: function(error) {
				alert(error);	
			},
			onLondon: function() {},
			onNoResult: function() {},
			onResult: function(results) {}
		};

		var settings = $.extend( {}, defaults, options );

		if( iQueue < 1 ){
			iQueue = iQueue + 1;
		}

		if( !GBrowserIsCompatible() ) {
			settings.onError('Google Geocoder error');
			return false;
		}

		if( searchTerm.toLowerCase() == 'london' ) {
			settings.onLondon();
			return false;
		}

		$.getJSON( settings.dataSource, function(data) {
												 
			if( !data ) {
				settings.onError('dataSource error');
				return false;
			}

			$.each( data.items, function(i, item) {
				ourLocs[item.id] = new Array( item.lng, item.lat, item.name, item.slug, item.image, item.intro );
			});
			
			// reset data
			data = "";
		
			geocoder = new GClientGeocoder();

			geocoder.getLatLng( searchTerm + ",uk", function( point ){ 
				
				if( point ) {
					
					var centerpoint = new GLatLng( point.lat(), point.lng() );

					loglat = point.lat();
					loglng = point.lng();

					$.each( ourLocs, function(i,n) { 

						if( this[2] != undefined )
						{
							var lat = parseFloat( this[1] );
							var lng = parseFloat( this[0] );
							var latlng = new GLatLng( lat, lng );
							if( !isNaN( lat ) ){
								places.push( { latlng:latlng, name:this[2], slug:this[3], image:this[4], intro:this[5] } );
							}
						}
						
					});

					/* Calculate the distances */
					for (i = 0; i < places.length; i ++) {
						places[i].dist = places[i].latlng.distanceFrom( centerpoint );
					}

					places.sort(function(a,b) {return (a.dist - b.dist)});

					var iCnt = 1;
					
					for ( var key in places ) {
						
						if( iCnt > settings.searchTotal ) break;
						
						var miles = (parseFloat(places[key].dist / 1609)).toFixed(1);
							
						results.push( { name:places[key].name, slug:places[key].slug, image:places[key].image, intro:places[key].intro, miles:miles } );
						
						iCnt ++;
					}

					if( results.length > 1 && iQueue ==1 ) {

						settings.onResult(results);

						if( settings.logger ) {
							$.post( settings.loggerUrl, { term: searchTerm, lng: loglng, lat: loglat });
						}
						
						iQueue = 0;
					}
					
				}
				else {
					
					settings.onNoResult();
					
				}
				
				return false;
			});
		});
		
	};

})(jQuery);
