var currStep = 1;
var currBookingType = 'corporate';


var school_customShow = false;
var school_surcharge  = 0;
var school_showCount  = 1;
var school_showType   = 'Australian Reptiles';

var birthday_customShow = false;
var birthday_surcharge  = 0;
var birthday_bagCount   = 0;


var eventTrigger = (!$.browser.msie) ? 'change' : 'click';

$(document).ready(function()
{
	// Set size of total canvas.
	$('#formContainer').css('width', $('#formContainer div.step').size() * 500);
	
	// Set height of booking form container.
	setStep(currStep, currStep);
	setType();
	
	// Step one.
	$('div#bookingForm input[name=showType]').bind(eventTrigger, function()
	{
		currBookingType = $(this).val();
		setType();
	});
	
	// Select type click.
	$('div#bookingForm div.selectType area').click(function(e)
	{
		e.preventDefault();
		
		// Select type.
		currBookingType = $(this).attr('href');
		setType();
		
		// Go to next step.
		setStep(currStep, ++currStep);
	});
	
	// Next step click.
	$('div#bookingForm div.nextStep a').click(function(e)
	{
		e.preventDefault();
		
		var isValid = validate(currStep);
		if(isValid)
		{
			// Send an email when going from step 2 to 3.
			if(currStep == 2)
				sendDetails();
			
			setStep(currStep, ++currStep);
		}
	});
	
	$('form#Form_BookingForm').submit(function(e)
	{
		if(currStep == 3 && $(':animated').size() == 0)
		{
			var isValid = validate(currStep);
			if(!isValid)
				e.preventDefault();
			else
			{
				e.preventDefault();
				sendBooking(function()
				{
					var totalStepCount = $('#bookingForm div.step').size();
					if(currStep < totalStepCount)
					{
						// Show invoice in last step.
						var $content = $('div#' + currBookingType + '_Quote .items').clone();
						$('div.step:eq(' + (currStep - 1 + 1) + ') .invoice .items').empty().append($content);
						
						// Show price.
						var totalCost = getTotalCost();
						$('div.step:eq(' + (currStep - 1 + 1) + ') .invoice .totalCost span').html('$' + totalCost);
						
						// Show booking date.
						if($('select[name=' + currBookingType + '_PreferredDateYear]').size() > 0)
						{
							var $bookingYear  = $('select[name=' + currBookingType + '_PreferredDateYear]').val();
							var $bookingMonth = $('select[name=' + currBookingType + '_PreferredDateMonth]').val();
							var $bookingDay   = $('select[name=' + currBookingType + '_PreferredDateDay]').val();
							var bookingDate   = ('0' + $bookingDay).substr(('0' + $bookingDay).length - 2, 2) + ' ' + 
																	$bookingMonth + ' ' + 
																	('000' + $bookingYear).substr(('000' + $bookingYear).length - 4, 4);
							
							$('div.step:eq(' + (currStep - 1 + 1) + ') .invoice .bookingDate').css('display', 'block');
							$('div.step:eq(' + (currStep - 1 + 1) + ') .invoice .bookingDate span').html(bookingDate);
						}
						else
							$('div.step:eq(' + (currStep - 1 + 1) + ') .invoice .bookingDate').css('display', 'none');
						
						// Go to next step.
						setStep(currStep, ++currStep);
					}
					else // Proceed to booking complete form.
						window.location = 'bookingComplete.php';
				});
			}
		}
		else if(currStep == 4)
		{
			
		}
		else
			e.preventDefault();
	});
	
	// Bread crumb click.
	$('div#bookingForm div.breadcrumb a').click(function(e)
	{
		e.preventDefault();
		
		var targetStep;
		try
		{
			targetStep = parseInt($(this).text().substr('Step '.length));
		}
		catch(exc)
		{
			targetStep = 1;
		}
		
		var oldStep = currStep;
		currStep = targetStep;
		setStep(oldStep, targetStep);
	});
	
	// Step 3 for Schools.
	$('input[name=school_DistanceFromCity]').bind(eventTrigger, function()
	{
		var surcharges = {'CBD': 0, '0 to 20': 0, '20 to 50': 20, '50 to 80': 40, 'over 80': 0};
		
		var radioVal = $('input[name=school_DistanceFromCity]:checked').val();
		var surcharge = surcharges[radioVal];
		var custom = (radioVal == 'over 80');
		
		updateSchoolQuote(custom, surcharge, school_showCount, school_showType);
	});
	
	$('input[name=school_SchoolShowCount]').bind(eventTrigger, function()
	{
		var showCount = $('input[name=school_SchoolShowCount]:checked').val();
		// Handle custom show count.
		if(showCount == '7 or more')
		{
			showCount = $('input[name=school_SchoolShowCount_number]').val();
			var regexp = /^[+-]?\d+$/;
			if(!regexp.test(showCount))
				showCount = 7;
		}
		updateSchoolQuote(school_customShow, school_surcharge, showCount, school_showType);
	});
	
	$('input[name=school_SchoolShowCount_number]').blur(function()
	{
		var showCount = $(this).val();
		var regexp = /^[+-]?\d+$/;
		if(!regexp.test(showCount))
			showCount = 7;
		if($('input[name=school_SchoolShowCount]:checked').val() == '7 or more')
			updateSchoolQuote(school_customShow, school_surcharge, showCount, school_showType);
	});
	
	$('input[name=school_SchoolShowType]').bind(eventTrigger, function()
	{
		var showType = $('input[name=school_SchoolShowType]:checked').val();
		updateSchoolQuote(school_customShow, school_surcharge, school_showCount, showType);
	});
	
	// Step 3 for Birthdays.
	$('input[name=birthday_DistanceFromCity]').bind(eventTrigger, function()
	{
		var surcharges = {'CBD': 0, '0 to 20': 0, '20 to 50': 20, '50 to 80': 40, 'over 80': 0};
		
		var radioVal = $('input[name=birthday_DistanceFromCity]:checked').val();
		var surcharge = surcharges[radioVal];
		var custom = (radioVal == 'over 80');
		
		updateBirthdayQuote(custom, surcharge, birthday_bagCount);
	});
	
	$('input[name=birthday_ShowBagQuantity]').blur(function()
	{
		var bagCount = $('input[name=birthday_ShowBagQuantity]').val();
		if(isNaN(bagCount))
		{
			bagCount = 0;
			$('input[name=birthday_ShowBagQuantity]').val(0);
		}
		updateBirthdayQuote(birthday_customShow, birthday_surcharge, bagCount);
	});
	
	// Step 4.
	$('.paypal a.action').click(function(e)
	{
		e.preventDefault();
		
		sendPayment(this);
	});
	
	$('a.action.payLater').click(function(e)
	{
		e.preventDefault();
		
		payLater(this);
	});
	
});

function setHeight()
{
	var heightMin    = 280;
	var heightBuffer = 90;
	var currBookingTypeDefault = 'corporate';
	var height = $('div#bookingForm div.step:nth-child(' + currStep + ') div.' + ((currBookingType != null) ? currBookingType : currBookingTypeDefault)).height() + heightBuffer;
	
	$('div#bookingForm').css('height', (height > heightMin) ? height : heightMin);
	
	// Set heights of outer containers, making sure we get the tiling right.
	var difference = 85; // Between container height and form height.
	var minHeight = 625; // The height the container has to be at least.
	var interval = 26; // Tile height.
	var tilingDiff = interval - ((difference + height) % interval);
	
	var targetHeight = difference + height + tilingDiff;
	targetHeight = (targetHeight < minHeight) ? minHeight : targetHeight;
	
	$('div#contentContain, div#content').css('height', targetHeight);
}

function setType()
{
	$('div#bookingForm div.step div.birthday, div#bookingForm div.step div.school, div#bookingForm div.step div.corporate').css('display', 'none');
	$('div#bookingForm div.step input, div#bookingForm div.step select, div#bookingForm div.step textarea').attr('disabled', true);
	$('div#bookingForm div.step div.' + currBookingType).css('display', 'block');
	$('div#bookingForm div.step div.' + currBookingType + ' input, div#bookingForm div.step div.' + currBookingType + ' select, div#bookingForm div.step div.' + currBookingType + ' textarea').removeAttr('disabled');
}

function setStep(stepFrom, stepTo)
{
	if(stepFrom != stepTo)
	{
		$('div#bookingForm div#formContainer').animate({left: ((stepTo - 1) * -500) + 'px'}, 500, 'linear', function()
		{
			$('div#bookingForm div.step:nth-child(' + stepFrom + ')').css('visibility', 'hidden');
		});
	}
	setHeight();
	
	// Make current step visible.
	$('div#bookingForm div.step').css('visibility', 'hidden');
	$('div#bookingForm div.step:nth-child(' + stepTo + ')').css('visibility', 'visible');
	$('div#bookingForm div.step:nth-child(' + stepFrom + ')').css('visibility', 'visible');
}

// Validation.

function validate(step)
{
	var invalidCount = 0;
	var currFields = $('div#bookingForm div.step:nth-child(' + step + ') input:enabled, div#bookingForm div.step:nth-child(' + step + ') select:enabled, div#bookingForm div.step:nth-child(' + step + ') textarea:enabled');
	
	// Required Fields.
	var requiredFields = currFields.filter('.required').filter(function()
	{
		return $(this).val().length == 0;
	});
	
	// Number Fields.
	var numberFields = currFields.filter('.number').filter(function()
	{
		var regexp = /^[+-]?\d+$/;
		return !regexp.test($(this).val());
	});
	
	// Email Fields.
	var emailFields = currFields.filter('.email').filter(function()
	{
		var regexp = /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,5}$/;
		return !regexp.test($(this).val());
	});
	
	invalidCount = requiredFields.length + numberFields.length + emailFields.length;
	if(invalidCount > 0)
	{
		alert('You have misentered one or more fields.');
		return false;
	}
	return true;
}


function updateSchoolQuote(custom, surcharge, showCount, showType)
{
	school_customShow = custom;
	school_surcharge  = surcharge;
	school_showCount  = showCount;
	school_showType   = showType;
	
//	var showDiscounts = {'1': 0, '2': 5, '3': 10, '4': 15, '5': 20};
//	var showTypes     = {'Australian Reptiles': 260, 'Insects Alive': 260, 'Feathers, Fur & Scales': 300};
	var showTypeID;
	switch (showType) {
		case 'Australian Reptiles' : 
			showTypeID = 0; break;
		case 'Insects Alive' : 
			showTypeID = 1; break;
		case 'Feathers, Fur & Scales' :
			showTypeID = 2; break;
	}

//	var showPrices = new Array (showPriceRep,showPriceIns,showPriceFea);
	var showPriceRep = new Array (260,460,625,760,920,1070);
	var showPriceIns = new Array (260,460,625,760,920,1070);
	var showPriceFea = new Array (300,520,700,845,1010,1170);
	var showPrices = new Array (showPriceRep,showPriceIns,showPriceFea);

	// Calculate show price based on number of shows.
	var showTotal = 0;
	var remainingShowCount = showCount;
	while(remainingShowCount >= 6)
	{
		showTotal += showPrices[showTypeID][5];
		remainingShowCount -= 6;
	}
	if(remainingShowCount > 0)
		showTotal += showPrices[showTypeID][remainingShowCount - 1];
	var showCost = showTotal;

//	var showCost  = ((100 - showDiscounts[showCount]) / 100) * showTypes[showType] * showCount;
	//var showCost  = showPrices[showTypeID][showCount-1];
	var totalCost = surcharge + showCost;
	
	// Shows.
	$('div#school_Quote .qty').text(showCount);
	$('div#school_Quote .type').text(showType);
	$('div#school_Quote .showCost').text('$' + parseFloat(showCost).toFixed(2));
	$('div#school_Quote .labelShow').text((showCount != 1) ? 'shows' : 'show');
	
	// Surcharge.
	$('div#school_Quote .surchargeCost').text('$' + parseFloat(surcharge).toFixed(2));
	
	// Total.
	$('div#school_Quote input[name=school_Quote]').val('$' + parseFloat(totalCost).toFixed(2));
	$('div#school_Quote .totalCost').text('$' + parseFloat(totalCost).toFixed(2));
	
	// Show custom message for custom quotes.
	if(custom)
	{
		$('div#school_Quote').css('display', 'none');
		$('div#school_CustomQuote').css('display', 'block');
	}
	else
	{
		$('div#school_Quote').css('display', 'block');
		$('div#school_CustomQuote').css('display', 'none');
	}
}

function updateBirthdayQuote(custom, surcharge, bagCount)
{
	birthday_customShow = custom;
	birthday_surcharge  = surcharge;
	birthday_bagCount   = bagCount;
		
	var showCost  = 260;
	var bagsCost  = bagCount * 15;
	var totalCost = surcharge + showCost + bagsCost;
	
	// Shows.
	$('div#birthday_Quote .showCost').text('$' + parseFloat(showCost).toFixed(2));
	
	// Show Bags.
	$('div#birthday_Quote .qty').text(bagCount);
	$('div#birthday_Quote .bagsCost').text('$' + parseFloat(bagsCost).toFixed(2));
	$('div#birthday_Quote .labelShow').text((bagCount != 1) ? 'Showbags' : 'Showbag');
	
	// Surcharge.
	$('div#birthday_Quote .surchargeCost').text('$' + parseFloat(surcharge).toFixed(2));
	
	// Total.
	$('div#birthday_Quote input[name=birthday_Quote]').val('$' + parseFloat(totalCost).toFixed(2));
	$('div#birthday_Quote .totalCost').text('$' + parseFloat(totalCost).toFixed(2));
	
	// Show custom message for custom quotes.
	if(custom)
	{
		$('div#birthday_Quote').css('display', 'none');
		$('div#birthday_CustomQuote').css('display', 'block');
	}
	else
	{
		$('div#birthday_Quote').css('display', 'block');
		$('div#birthday_CustomQuote').css('display', 'none');
	}
}


function sendDetails()
{
	var invalidCount = 0;
	var selector = '' + 
		'div#bookingForm div.step:nth-child(2) div.' + currBookingType + ' input[type!=radio][type!=image], ' + 
		'div#bookingForm div.step:nth-child(2) input[type=radio]:enabled:checked, ' + 
		'div#bookingForm div.step:nth-child(2) select:enabled, ' + 
		'div#bookingForm div.step:nth-child(2) textarea:enabled'
	var currFields = $(selector);
	
	var qs = new Object();
	qs['BookingType'] = currBookingType;
	for(var i = 0; i < currFields.length; i++)
	{
		currField = $(currFields.get(i));
		qs[currField.attr('name').substr((currBookingType + '_').length)] = currField.val();
	}
	
	// Send email.
	$.ajax(
	{
		url: 'ajax/details.php', 
		type: 'POST', 
		data: qs
	});
}

function sendBooking(onSuccess)
{
	var invalidCount = 0;
	var selector = '' + 
		'div#bookingForm div.step:nth-child(2) div.' + currBookingType + ' input[type!=radio][type!=image], ' + 
		'div#bookingForm div.step:nth-child(2) input[type=radio]:enabled:checked, ' + 
		'div#bookingForm div.step:nth-child(2) select:enabled, ' + 
		'div#bookingForm div.step:nth-child(2) textarea:enabled, ' + 
		'div#bookingForm div.step:nth-child(3) div.' + currBookingType + ' input[type!=radio][type!=image], ' + 
		'div#bookingForm div.step:nth-child(3) input[type=radio]:enabled:checked, ' + 
		'div#bookingForm div.step:nth-child(3) select:enabled, ' + 
		'div#bookingForm div.step:nth-child(3) textarea:enabled';
	var currFields = $(selector);
	
	var key, currField;
	var qs = new Object();
	qs['BookingType'] = currBookingType;
	for(var i = 0; i < currFields.length; i++)
	{
		// Exceptions.
		currField = $(currFields.get(i));
		key = currField.attr('name').substr((currBookingType + '_').length);
		if(key == 'SchoolShowCount_number') continue;
		
		qs[key] = currField.val();
	}
	
	// Exceptions.
	
	// More than 6 shows for schools.
	if(currBookingType == 'school' && $('input[name=school_SchoolShowCount]:checked').val() == '7 or more')
	{
		var $schoolCountField = $('input[name=school_SchoolShowCount_number]');
		qs['SchoolShowCount'] = $schoolCountField.val();
	}
	
	// Send email.
	$.ajax(
	{
		url: 'ajax/booking.php', 
		type: 'POST', 
		data: qs, 
		
		success: function()
		{
			onSuccess();
		}
	});
}

function sendPayment(trigger)
{
	var $fieldsContainer = $(trigger).parents('.paypal');
	var formAction = $(trigger).attr('href');
	$fieldsContainer.parents('form').attr('action', formAction);
	
	// Disable form elements of previous steps.
	$('#bookingForm div.step:eq(' + (currStep - 1) + ')').css('margin-left', 1500);
	$('#bookingForm div.step:lt(' + (currStep - 1) + ')').css('display', 'none');
	
	// Set derived values.
	if($(trigger).hasClass('full'))
	{
		var totalCost = getTotalCost();
		var itemName = 'Reptile Encounters Events Package - Full Payment';
		
		$fieldsContainer.find('input[name=amount]').attr('value', totalCost);
		$fieldsContainer.find('input[name=item_name]').attr('value', itemName);
	}
	else if($(trigger).hasClass('deposit'))
	{
		var totalCost = getTotalCost();
		totalCost = totalCost / (100 / 20);
		var itemName = 'Reptile Encounters Events Package - 20% Deposit';
		
		$fieldsContainer.find('input[name=amount]').attr('value', totalCost);
		$fieldsContainer.find('input[name=item_name]').attr('value', itemName);
	}
	
	// Submit form.
	$fieldsContainer.parents('form').trigger('submit');
}

function getTotalCost()
{
	if(currBookingType == 'corporate')
		totalCost = $('input[name=' + currBookingType + '_PaymentAmount]').val();
	else
		totalCost = $('div#' + currBookingType + '_Quote .totalCost').text().substr(1);
	return totalCost;
}

function payLater(trigger)
{
	var qs = new Object();
	qs['BookingType']    = currBookingType;
	qs['Name']           = $('input[name=' + currBookingType + '_Name]').val();
	qs['Phone']          = $('input[name=' + currBookingType + '_Phone]').val();
	qs['Email']          = $('input[name=' + currBookingType + '_Email]').val();
	qs['Payment_Amount'] = getTotalCost();
	
	// Send email.
	$.ajax(
	{
		url: 'ajax/payLater.php', 
		type: 'POST', 
		data: qs, 
		
		success: function()
		{
			window.location = 'bookingComplete.php';
		}
	});
}