TBCatering = {
	
	_inCart: {},

	init: function()
	{	
		$( 'noJS' ).hide();
		
		Asset.css( '/Resources/TasteBaguette/Sites/TasteBaguette/CSS/print.css', { media: 'print' } );
	
		$$( ".product" ).each( function( $product ) {
			
			// Add event to quantity input
			$product.getElement( '.quantityInput' ).addEvents({
				'keyup': (function() { TBCatering.toggleInCart( $product ) } )
			});
			
		});
			
		$( 'checkout_print' ).addEvent( 'click', function( e ) {
			
			e.stop();
			
			TBCatering.makePurchase();
			
		});
		
		var cash = $( 'form_payment_cash' );
		var creditCard = $( 'form_payment_creditcard' );
		
		cash.addEvent( 'click', function() {
		
			if ( this.get( 'checked' ) )
				$( 'creditCardOptions' ).hide();
		
		});
		
		creditCard.addEvent( 'click', function() {
		
			if ( this.get( 'checked' ) )
				$( 'creditCardOptions' ).show();
		
		});
		
	},

	toggleInCart: function( $product )
	{
		var itemId = $product.getProperty( 'id' );
		var name = $product.getElement( '.name' ).get( 'text' );
		var price = $product.getElement( '.price' ).get( 'text' ).slice( 2 );
	
		var qty = $product.getElement( '.quantityInput' );
			
		TBCatering._inCart[ itemId ] = { id: itemId, name: name, price: price, $qty: qty };
		
		TBCatering.updateTotals();
		
	},
	
	updateTotals: function()
	{
		$( 'checkout_items_list' ).empty();
	
		var totalItems = 0;
		var totalPrice = 0;
		var totalCost = 0;
		
		for ( var i in TBCatering._inCart )
		{
			var product = TBCatering._inCart[ i ];
			
			if ( !product )
				continue;
			
			// Quantity
			var qty = parseInt( product.$qty.value ) || 0;
			
			if ( isNaN( qty ) )
				qty = 0;
			
			// Check if the quantity is now 0
			if ( !qty || qty == 0 ) {
				$log( 'Quantity is 0' );
			
				TBCatering._inCart[ product.id ] = null;
				TBCatering.updateTotals();
				return;
			}
			
			totalItems += qty;
			
			var qtyPrice = qty * parseFloat( product.price );
			
			if ( !qtyPrice )
				qtyPrice = 0;
			
			totalPrice += qtyPrice;
			
			if ( !$chk( qtyPrice ) )
				return;
							
			// Create list item
			new Element( 'li', { html: qty + ' x ' + product.name + ' - ' + '$' + Number( qtyPrice ).format(2) } ).inject( $( 'checkout_items_list' ) );
			
		}
		
		if ( !totalItems )
			new Element( 'li', { html: '(no items added)' } ).inject( $( 'checkout_items_list' ) );
		
		// Calculate grand total and render
		totalCost = totalPrice;
		
		$( 'checkout_value_total' ).set( 'html', ( totalItems ) ? '$' + Number( totalCost ).format(2) : '0.00' );
		$$( '.checkout_value_total' ).set( 'html', ( totalItems ) ? '$' + Number( totalCost ).format(2) : '0.00' );
		
		return {
			items: totalItems,
			price: totalCost
		};
		
	},
	
	makePurchase: function()
	{
		var data = {
			firstName: $( 'form_firstName' ).value,
			lastName: $( 'form_lastName' ).value,
			email: $( 'form_email' ).value,
			phone: $( 'form_phone' ).value,
			collectionTime: $( 'form_collection_time' ).value,
			collectionDay: $( 'form_collection_day' ).value,
			collectionMonth: $( 'form_collection_month' ).value,
			collectionStore: $( 'form_collect_store' ).value,
			payment: '',
			cardType: '',
			cardNumber: 'XXXX-XXXX-XXXX-XXXX',
			cardName: $( 'form_cardName' ).value,
			cardExpiryMonth: $( 'form_cardExpiryMonth' ).value,
			cardExpiryYear: $( 'form_cardExpiryYear' ).value
		};
		
		if ( $( 'form_payment_creditcard' ).checked )
			data.payment = 'Credit card';
		
		if ( $( 'form_payment_cash' ).checked )
			data.payment = 'Cash';
		
		if ( $( 'form_amex' ).checked )
			data.payment = 'Amex';
		
		if ( $( 'form_mastercard' ).checked )
			data.cardType = 'MasterCard';
		
		if ( $( 'form_visa' ).checked )
			data.cardType = 'VISA';
		
		if ( $( 'form_amex' ).checked )
			data.cardType = 'Amex';
		
		data = TBCatering.FormTools.removeDefaults( data, { firstName: 'first', lastName: 'last' } );
		
		var totals = TBCatering.updateTotals();
		
		if ( !totals.price )
		{
			alert( "Please select something to purchase first." );
			return;
		}
		
		var validateFields = {
			firstName: 'Please enter your first name.',
			lastName: 'Please enter your last name.',
			email: 'Please enter your email address.',
			phone: 'Please enter your phone number.',
			collectionTime: 'Please enter a collection time.',
			collectionDay: 'Please enter a collection day.',
			collectionMonth: 'Please enter a collection month.'
		}
		
		var payingByCard = $( 'form_payment_creditcard' ).get( 'checked' );
		
		if ( payingByCard )
		{
			validateFields.cardNumber = 'Please enter your payment option.';
			validateFields.cardNumber = 'Please enter your card number.';
			validateFields.cardName = 'Please enter your card name.';
			validateFields.cardExpiryMonth = 'Please select your card expiry month number.';
			validateFields.cardExpiryYear = 'Please select your card expiry year.';
		}
		
		if ( !TBCatering.FormTools.validateFields( data, validateFields ) )
			return;
		
		data.name = data.firstName + ' ' + data.lastName + ' - Order for $' + Number( totals.price ).format(2) + ' (' + totals.items + ' item' + ( ( totals.items > 1 ) ? 's' : '' ) + ')' + ' - Collect at ' + data.collectionTime + ' on ' + data.collectionDay + '/' + data.collectionMonth;
		data.amount = totals.price;
		data.purchase = 'Items Purchased:\n';
		
		for ( var i in TBCatering._inCart )
		{
			var product = TBCatering._inCart[ i ];
			
			if ( !product )
				continue;
			
			// Quantity
			var qty = parseInt( product.$qty.value ) || 0;
			
			if ( isNaN( qty ) || !qty )
				continue;
					
			data.purchase += '<ul><li>' + product.name + ' Cost: $' + product.price;
			
			if ( qty > 1 )
				data.purchase += ' (x ' + qty + ' - $' + ( product.price * qty ) + ')';
				
			data.purchase += '</li></ul>';
		}
		
		$( 'checkout_print' ).set( 'disabled', true );
		
		// log the order
		Aurora.callAPI({
		
			key: 'create order',
			
			data: data,
			
			onComplete: function( rtnData ) {
			
				window.print();
				
				TBCatering.purchaseComplete();
				
				$( 'checkout_print' ).set( 'disabled', false );
			}
			
		});
		
	},
	
	purchaseComplete: function()
	{
		$log( 'Purchase is completed.' );
	}
	
}

TBCatering.FormTools = {
	
	removeDefaults: function( data, fields )
	{
		for ( var i in fields )
		{
			if ( data[ i ] == fields[ i ] )
				data[ i ] = '';
		}
		
		return data;
	},
	
	validateFields: function( data, fields )
	{
		var rtn = true;
		
		for ( var i in fields )
		{
			if ( !$chk( data[ i ] ) )
			{
				alert( fields[ i ] );
				rtn = false;
				break;
			}
		}
		
		return rtn;
			
	},
	
	initDefaultValueAsHint: function( field, defaultValue, passwordField )
	{
		var $field = $( field );
		
		if ( !$field )
			return;
		
		if ( !$chk( field.value ) )
			$field.value = defaultValue;
			
		// make sure the default colour is still set
		$field.setStyle( 'color', '#92BDCE' );
		
		$field.addEvent( 'focus', function() {
				
				if ( this.value != defaultValue )
					return;
				
				if ( passwordField )
					this.setProperty( 'type', 'password' );
				
				this.value = '';
								
				this.setStyle( 'color', '#262626' );
			
			})
			.addEvent( 'blur', function() {
				
				if ( !this.value.length )
				{
					if ( passwordField )
						this.setProperty( 'type', 'text' );
					
					this.value = defaultValue;
					
					this.setStyle( 'color', '#92BDCE' );
				}
			
			});
		
		return $field;
	}
	
}

Number.implement({
	format: function( decimals ) {
		
		decimals = $pick( decimals, 2 );
		
		var floatsep = '.'
		var kSep = '';
		
		var parts = this.round(decimals).toString().split('.');
		var integer = parts[0];
		while (integer != (integer = integer.replace(/([0-9])(...($|[^0-9]))/, '$1' + kSep + '$2')));
		if (decimals == 0) return integer;
		return integer + floatsep + ((parts[1] || '') + '0000000000').substr(0, decimals);
	
	}
});

window.addEvent( 'domready', TBCatering.init );