var METERS_TO_MILES = 0.000621371192 ;
var RATES = {
	prius:{
		rate:2.35, 
		grat:0.15, 
		time_rate:50, 
		min:20
	}, 
	towncar:{
		rate:2.50,
		grat:0.15, 
		time_rate:55,
		min:30
	}, 
	limo:{
		rate:3.40,
		grat:.20, 
		time_rate:75, 
		min:95
	}
};

var TOP_CUTOFF = 33.0;
var BOTTOM_CUTOFF = 20;
var DISCOUNT = 0.6;
var Toad = {
	
	geocoder: null,
	default_field_text : 'Airport name or address',
	from:{
		coordinates: null,
		address: ''
	},
	to:{
		coordinates: null,
		address: ''		
	},
	GDir: {
		results:{leg1:null, leg2:null, instance:null},
		instance : null,
		leg1 : null,
		leg2 : null,
		allLoaded :0,
		called:false,

		handleLeg1: function(){
			Toad.GDir.allLoaded += 1;
			Toad.GDir.results.leg1 = this ;
			//alert("leg1: "+this.getDistance().meters+" loaded:"+			Toad.GDir.allLoaded);

			if( Toad.GDir.allLoaded == 3) Toad.calculatePrice();
		},
		handleLeg2: function(){
			Toad.GDir.allLoaded += 1;
			Toad.GDir.results.leg2 = this ;
		//	alert("leg2: "+this.getDistance().meters+" loaded:"+			Toad.GDir.allLoaded);
			if( Toad.GDir.allLoaded == 3) Toad.calculatePrice();
		},
		handleLoad: function(){
			// $('distance').value = this.getDistance().meters ;			
			// $('travel_time').value = this.getDuration().seconds ;			
			// 
			Toad.GDir.allLoaded += 1;
		//	alert("distance: "+this.getDistance().meters+" loaded:"+			Toad.GDir.allLoaded);
			
			Toad.GDir.results.instance = this ; 

			if( Toad.GDir.allLoaded >= 3) Toad.calculatePrice();

		},
		handleError: function(){
			//Element.show('flash_error');
			alert('Error Finding your addresses!')
			return false;			
		}
	},
	init: function(){
		
		//load google maps API		
		if( GBrowserIsCompatible() ) {
			Toad.geocoder = new GClientGeocoder( );
			Toad.GDir.instance = new GDirections( );
			Toad.GDir.leg1 = new GDirections() ;
			Toad.GDir.leg2 = new GDirections() ;
			Toad.from.coordinates = Toad.to.coordinates = null ;
			if( $('#from').val() != Toad.default_field_text ) { Toad.handleFieldOnBlur( $('#from') ) }
			if( $('#to').val() != Toad.default_field_text.replace('Pick up', 'Drop off') ) { Toad.handleFieldOnBlur( $('#to') ) }
			GEvent.addListener( Toad.GDir.instance,'load', Toad.GDir.handleLoad );
			GEvent.addListener( Toad.GDir.leg1,'load', Toad.GDir.handleLeg1 );
			GEvent.addListener( Toad.GDir.leg2,'load', Toad.GDir.handleLeg2 );
	
			GEvent.addListener( Toad.GDir.instance,'error', Toad.GDir.handleError );			
			GEvent.addListener( Toad.GDir.leg1,'error', Toad.GDir.handleError );			
			GEvent.addListener( Toad.GDir.leg2,'error', Toad.GDir.handleError );			
		}
	},
	runErrands: function(){
		Toad.GDir.instance.loadFromWaypoints( [Toad.from.coordinates, Toad.to.coordinates] ) ;		
		Toad.GDir.leg1.load( "from: 4790 scenic ave livermore ca to: "+$('#from').val());
		Toad.GDir.leg2.load( "from: "+$('#to').val() + " to: 4790 scenic ave livermore ca");	
		Toad.GDir.called = false;
		Toad.GDir.allLoaded = 0;
			
	},
	handleFieldOnBlur: function( field ){
		var search_text = field.val() ;
	//	alert(search_text);
		if( search_text == '' ){ 
			field.removeClass('success').addClass('error');	
			return ; 
		}else if( search_text == Toad.default_field_text){
			return ;
		}
		
		Toad.geocoder.getLocations( search_text, 
			function( response ){
				if( !response || response.Status.code != 200 ){
					Toad[field.attr("id")].coordinates = null ;
					field.removeClass('success').addClass('error');					
					return false;
				} else {
			
					var coordinates = response.Placemark[0] ;

					// if(coordinates)
					// 	field.val(coordinates.address.gsub(/\s*\d*\s*, USA/,''));
					field.removeClass('error').addClass('success');
					Toad[field.attr('id')].coordinates = new GLatLng(coordinates.Point.coordinates[1],
													 														coordinates.Point.coordinates[0]);
					if( Toad.from.coordinates && Toad.to.coordinates ) { 		
						Toad.runErrands();
					}
													
				}
			});
	},
	calculatePriceHelper: function(cand){
		var distance = METERS_TO_MILES * Toad.GDir.results.instance.getDistance().meters ;
		var leg1 = METERS_TO_MILES * Toad.GDir.results.leg1.getDistance().meters ;
		var leg2 = METERS_TO_MILES * Toad.GDir.results.leg2.getDistance().meters ;
		var total_time = (Toad.GDir.results.leg1.getDuration().seconds + Toad.GDir.results.leg2.getDuration().seconds + Toad.GDir.results.instance.getDuration().seconds)/60 ;
		return Toad.toHtml(Toad.testHelper(leg1, leg2, distance, total_time, cand), cand) ;
	},
	testHelper:function(leg1, leg2, distance, total_time, cand){
		var rate = RATES[cand]['rate'] ;
		var over = ((leg1 + leg2 - 22) - distance) * 0.70 ;
//		alert('leg1: ' + leg1+' leg2: '+leg2+' dist:'+distance+' over:'+over);		
//		alert('empty1: ' + Toad.GDir.results.leg1.getDuration().seconds/60 +' empty2: '+Toad.GDir.results.leg2.getDuration().seconds/60+' driving :'+Toad.GDir.results.instance.getDuration().seconds/60);		
		
		if(distance > TOP_CUTOFF)
			var price =  TOP_CUTOFF * rate + Math.abs(TOP_CUTOFF - distance) * (rate - rate*DISCOUNT);
			//40 mile base  + discounted by 20%
		else
			var price =  distance * rate ;	
		if(over > 0) price+= over;
		
		//alert('Time: '+total_time);
		if( total_time >= 95 ){
			total_time -= 12;
		}
		var time_price = (total_time * RATES[cand]['time_rate']/60 ).toFixed(2);
	//	alert("distance Price: "+price +" Time Price:"+ time_price);
		price = Math.max(time_price, RATES[cand]['min']);


		return price ;
	},
	calculatePrice: function(){
		//var distance = Toad.GDir.results.instance; 
		
		if(!Toad.GDir.called) {
			$('#prius-quote').html( Toad.calculatePriceHelper('prius') );																											
			$('#towncar-quote').html(Toad.calculatePriceHelper('towncar' )) ;
			$('#limo-quote').html(Toad.calculatePriceHelper('limo' )) ;					
			$('#price-quote').show();
		}
		Toad.GDir.called = true;
	},
	toHtml:function(price, cand){
		price = parseFloat(price);		
		return '<b>$' + Math.ceil(price) +'</b> (<b>$' + Math.ceil(price+price*RATES[cand]['grat']) + '</b> all inclusive)' ;// + RATES[cand]['grat']*100+' % gratuity)';		
	},
	handleSubmit:function(){		
		if( !Toad.from.coordinates || !Toad.to.coordinates ) { 
			if( !Toad.from.coordinates && !Toad.to.coordinates) 
				alert('We had trouble finding one or both addresses! Please check the spelling. If you are having trouble, call us at (866) 558-0222'); //Element.show('flash_error') ;		
			return false ; 
		}	else{
			Toad.runErrands();
			//setTimeout("; return true;", 1000);		
			//document.forms.new_referral.submit() ;
			return true;			
		}	
	}
};

window.onload = Toad.init ;
window.onunload = GUnload;

jQuery(document).ready(function() {
	$('#nav > a[class="active"]').removeClass('active');
});

var DummyInstance = function(distance){
	this.getDistance = function(){
		return {meters: distance}
	}
}

function testRates(){
	//no dead miles
	trh(Toad.testHelper(0, 0, 25, 'towncar' ) );
	//negligible dead miles
	trh( Toad.testHelper(2, 4, 25, 'towncar' ) );
	//More than 40
	trh( Toad.testHelper(0, 0, 45, 'towncar' ) );
	trh( Toad.testHelper(0, 0, 25, 'towncar' ) );
				
}

function trh(price){
	alert('$'+price.toFixed(2));
}

function assert(test){
	if( test === false ){
		throw new Error("Assertion failed");
	}
	return true;
}