//------------------------------------
//	RESTAURANT.JS
//	Author: 	Engage Interactive
//				Will Blackmore
//				Neil Charlton
//	Requires:	jquery 1.3.2
//				global.js
//				cufon.js
//				gazz.js
//------------------------------------

$(function(){
//BEGIN jQuery

	////////////////////////	
	// SEACH DROPDOWN
	//
	
	// VARIABLES
	$.data( $('#searchterm').get(0), "postcode", { postcode: '', dd: 'unset' } );
	$.data( $('#searchterm').get(0), "oryoucouldtry", { isset: false } );
	
	mooseBan = false;
	topText = $('#searchterm').attr('value');
	anError = false;
	method = 'default';
	firstLoad = true;

	
	// INITIAL CLICK
	
	$('#search input.top').click(function(){
		if($('#search').hasClass('loading') != true){
			$(this).removeAttr('value');
			$('#search').addClass('active');
			list('show');
		}
	});
	
	
	// IF SEARCHING
	
	$('#search input.top').keypress(function(){
		$('#search button.go').fadeIn();
		method = 'search';
	});

	
	// SUBMIT
	
	$('#search').submit(function(){
		$('#searchterm').blur();
		$('#search').addClass('loading');
		list('hide');
		searchResults('hide');
		return false;
	});
	
	
	// LIST CLICK SUBMIT
	
	$('#dropdown ul li a').click(function(){
		$('#searchterm').attr( 'value', $(this).text() );
		
		$.data( $('#searchterm').get(0), "postcode", { postcode: $(this).attr( "title" ), dd: 'true' } );
		
		$('#search').children('input.top').blur();
		$('#search').addClass('loading');
		list('hide');
		
		// GET RESTAURANT ID AND FIRE FUNCTION
		id = $( this ).attr( "href" ).substr( $( this ).attr( 'href' ).indexOf( '#' ) + 1 );
		loadRestaurant(id);
		
		method = 'direct';
		
		return false;
	});
	
	
	// PREDEFINED SEARCHES & SEARHCH RESULTS CLICK
	
	$('#search_results a').live('click', function(){

		if($(this).parent('li').hasClass('popular') || $(this).parent('li').hasClass('predefined') && mooseBan == false){

			$('#searchterm').attr('value',$(this).children('span').text());
			$('#search').submit();
			
			method = 'search';
			
		}else if(mooseBan == false){
			
			id = $(this).attr('href').substr($(this).attr('href').indexOf('#')+1);
			loadRestaurant(id);
			
			$('#searchterm').attr('value',$(this).children('span').text());
			
			method = 'direct';
			
		}
		return false;

	});
	

	// SHOW/HIDE LIST
	
	function list(action){
		if(action == 'show'){
			$('#dropdown').stop([]).animate({height:240},200,'easeInOutExpo',function(){
				$(this).children('ul').css({overflow:'auto'});
			});
		}else if(action == 'hide'){
			$('#dropdown').children('ul').css({overflow:'hidden'});
			$('#dropdown').stop([]).animate({height:0},200,'easeInOutExpo',function(){
				$('#search').removeClass('active');
				if($('#searchterm').attr('value') == '' || $('#searchterm').attr('value') == topText){
					$('#searchterm').attr('value',topText);
				}
			});
		}
	}
	
	
	// HIDE ON MOUSE OUT
	
	$('#help').css({display:'block', opacity:0});
	
	$('#restaurant_finder').mouseleave(function(){
		list('hide');
		$('#searchterm').blur();
	});
	
	$('#searchterm, #dropdown').mouseover(function(){
		$('#help').stop([]).animate({opacity:1, right:16},200);
	});
	$('#searchterm, #dropdown').mouseout(function(){
		$('#help').stop([]).animate({opacity:0, right:22},200);
	});
	
	
	// SHOW/HIDE SEARCH RESULTS
		
	function searchResults(action){
		
		mooseBan = true;
		
		if(anError == true){
		
			$('#error').animate({opacity:0},function(){
				$(this).hide();
				findMyNearest( $('#searchterm').attr('value')  );
			});
			
			anError = false;
		
		}else{
		
			var searchDelay = {};
			
			i = 0;
			
			if(action == 'show'){
				
				o1 = 0.3;
				o2 = 1;
				
				$('#search_results li').show().css({opacity:0});
				
				// Set title based on method
				if(method == 'search'){
					changeTitle('Your nearest restaurants...');
				}else if(method == 'direct'){
					changeTitle('Or you could try...');
				}
				
			}else if(action == 'hide'){
				o1 = 0.7;
				o2 = 0;
			}
			
			function onebyone(i){
				$('#search_results li:eq('+i+')').animate({opacity:o1},30,function(){
	
					// Run it again!
					i = i + 1;
					if(i<4){
						onebyone(i);
					}
					
					// Finish the animation
					$(this).animate({opacity:o2},70,function(){
						if(i==4){
							if(action == 'show'){
								$('#search').removeClass('loading');
							}else if(action == 'hide'){
								findMyNearest( $('#searchterm').attr('value') );
							}
							mooseBan = false;
						}
					});
	
				});
			}
			searchDelay = $.timer(300,function(){
				onebyone(i);
			});
		}
	}


	// CHANGE THE TITLE ABOVE SEARCH RESULTS
	
	function changeTitle(t){
		if(t!=$('#results_title').text()){
			$('#results_title').animate({opacity:0},150,function(){
				$(this).text(t);
				Cufon.refresh('h3');
				$(this).animate({opacity:1},150);
			});
		}
	}


	////////////////////////	
	// SHOW/HIDE RESTAURANT
	//

	speed = 1000;
	
	function loadRestaurant(restaurant){
		mooseBan = true;
		// FADE EXISTING
		$('#loading').fadeIn(function(){
			ajax();
		});
		
		if(anError == true){
			anError = false;
			$('#error').animate({opacity:0},function(){
				$(this).hide();
				searchResults('show');
			});
		}
		
		function ajax(){
			$( "#restaurant" ).load( "/restaurants/getone/" + restaurant, function(){
				Cufon.refresh();
				
				h = $('#restaurant').height();
				$('#restaurant_container').removeClass('initial').animate({height:h},1000,function(){
					$('#loading').fadeOut();
					$('#search').removeClass('loading');
					mooseBan = false;
					
					targetBlank($('#restaurant a.external'));
					
					// Find the nearest alternatives
					$('#search').submit();
					$.data( $('#searchterm').get(0), "oryoucouldtry", { isset: true } );
					method = 'direct';
				});
			});
		}
	}
	
	//Replacement for target="_blank"
	function targetBlank(target){
		$(target).attr('target','_blank');
	}
	
	
	////////////////////////	
	// FIND MY NEAREST
	//
	
	// VARIABLES
	var ourLocs = [];
	var ourLocsCompleted = false;
	var geocoder = "";
	var latlng = null;
	var loglat = "";
	var loglng = "";
	var defaults = {
		//dataSource		:	"http://webservices.engageinteractive.co.uk/proxy.php?brand=none&action=giraffeLocations&callback=?",
		dataSource		:	"/restaurants/locationsJsonList",
		searchTotal		:	4,
		logger			:	true
	};
	
	var settings = $.extend({}, defaults);
	
	
	// CHECK DATA
	queryDataSource = function(){
		// Get the locations json from the webservice
		$.getJSON( settings.dataSource.replace( '&amp;', '&' ), function(data){
			//console.log(data);
			if( !data ) errorMessage('We could not connect, please try again!');
			$.each(data.items, function(i,item){
				ourLocs[item.id] = new Array( item.lng, item.lat, item.name, item.id, item.location_id );
			});
			ourLocsCompleted = true;
		});
	
		return true;
	}
	var bDs = queryDataSource();
	
	// CHECK THE DATA EXISTS
	checkInputs = function() { return ( settings.dataSource == '' ) }

	// GET RESULTS AND PUT THEM INTO HTML LAYOUT
	getResults = function( id, name, dist ){
		var km = (parseFloat(dist / 1000)).toFixed(1) + "km";
		var miles = (parseFloat(dist / 1609)).toFixed(1) + " miles away";
		return '<li><a href="#' + name.replace( / /, '-') + '" title="Click for full details about this GIRAFFE restaurant"><span>' + name + '</span><em>' + miles + '</em></a></li>';
	}
	
	// IF THERE IS AN ERROR
	errorMessage = function(msg){
		
		$('#error').show().css({opacity:0}).animate({opacity:1});
		$('#search').removeClass('loading');
		$('#search button.go').hide();
		
		changeTitle('Oh noes! Something has gone awry...');
		
		if(msg){
			// Error message
			$('#error .custom').show().siblings().hide();
			$('#error .custom p').text(msg);
		}else{
			// Default error
			$('#error .default').show().siblings().hide();
		}
		
		anError = true;
	}

	// SEARCH FUNCTION
	var findMyNearest = function(searchTerm){
	
		if( !bDs ){
			var sFmn = findMyNearest( searchTerm );
			setTimeout( sFmn, 1000 );
			return;
		}
		
		// some exceptions to search terms
		if( searchTerm.toLowerCase() == 'victoria' ) searchTerm = "London Victoria";
		if( searchTerm.toLowerCase() == 'harrods' ) searchTerm = "Harrods, London";
		if( searchTerm.toLowerCase() == 'selfridges' ) searchTerm = "Selfridges, London";
		if( searchTerm.toLowerCase() == 'waterloo' ) searchTerm = "Waterloo Station, London";

		if( $.data( $('#searchterm').get(0), "postcode" ).dd != 'unset' )
		{
			searchTerm = searchTerm + ", " + $.data( $('#searchterm').get(0), "postcode" ).postcode;
		}
		
		if( searchTerm.match( /Manchester Trafford/ ) ) searchTerm = "Trafford Center, M17 8EQ";
	
		var places = [];
		
		if(GBrowserIsCompatible()){
			geocoder = new GClientGeocoder();
		}

		geocoder.getLatLng( searchTerm + ",uk", function( point ){
			if( !point ){
				errorMessage();
			}else{
				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 );
						var name = this[2];
						var id = this[4];
						places.push( { latlng:latlng , name:name, id:id } );
					}
				});
				// HOW FAR IS IT FROM THE ORIGINAL SEARCH
				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 = 0;
				var sOut = '';
				if( $.data( $('#searchterm').get(0), "postcode" ).dd != 'unset' || $.data( $('#searchterm').get(0), "oryoucouldtry" ).isset )
				{
					places.shift();
					$.data( $('#searchterm').get(0), "postcode", { postcode: '', dd: 'unset' } );
					$.data( $('#searchterm').get(0), "oryoucouldtry", { isset: false } );
				}
				
				for ( var key in places ) {
					if( iCnt < settings.searchTotal ){
						sOut += getResults( places[key].id, places[key].name, places[key].dist );
					}
					iCnt++;
				}
			
				
				
				// RESULTS FOUND, LOAD THEM IN AND ANIMATE
				if( places.length > 1 ){
					
					$('#search_results li').remove();
					
					$('#search_results').append( sOut + "" );
					
					// Log the results so that we can build fav list
					if( settings.logger ){
						$.post( "/restaurants/logfindmynearestsearch", { brand: "giraffe", term: searchTerm, lng: loglng, lat: loglat }, function(data){
							// posted callback
						});
					}
					
					// SHOW THE RESULTS					
					searchResults('show');
					$('#search button.go').fadeOut();
				}

			}

		});
		return false;

	}
	
	
//END jQuery
});