/**
 * Checkout.js - Van der Kolk checkout form behavior
 * 
 * @author Webstores <info at webstores dot nl>
 *         Copyright (c) Webstores internet totaalbureau <http://www.webstores.nl/>
 */
function CheckoutForm(form) {
	this.form = $(form);
	this.construct();
};

CheckoutForm.prototype = {
	/**
	 * @constructor
	 */
	construct: function() {
		if(this.form.length) {
			switch(this.form.attr('name')) {
				case 'checkout-step1':
					$('#recalc').hide();
					this.initStepOne();
					break;
				case 'checkout-step2':
					this.collapseFields($('#alt-shipping-address').not('.expanded'));
					this.initStepTwo();
					break;
			}
			
			this.form.validate();
		}
	},
	
	/**
	 * Initialize checkout step 1
	 */
	initStepOne: function() {
		var self = this;
		
		$('.quantity-input', this.form).each(function(i, el) {
			new QuantityField(el, {
				min: 1,
				updateDelay: 250,
				onUpdate: function() {
					$.ajax({
						url: '/cart/update/',
						cache: false,
						dataType: 'json',
						type: 'POST',
						data: self.form.serialize(),
						success: function(data) {
							self.updateCheckoutForm(data);
						}
					});
				}
			});
		});
		
		$('.delete', this.form).click(function(e) {
			e.preventDefault();
			self.deleteClickHandler(this);
		});
	},
	
	/**
	 * Initialize checkout step 2
	 */
	initStepTwo: function() {
		var self = this;
		
		$('#alt-shipping-address-toggle').click(function() {
			self.altShippingAddressClickHandler(this);
		});
	},
	
	/**
	 * When a delete link fires onclick
	 * 
	 * @param {Object} el The HTMLAnchorElement
	 */
	deleteClickHandler: function(el) {
		if(confirm('Weet u zeker dat u dit product wilt verwijderen?')) {
			var self = this;
			var row = $(el).parents('tr');
			
			$.ajax({
				url: el.href,
				cache: false,
				dataType: 'json',
				success: function(data) {
					self.deleteProductRow(row);
					self.updateCheckoutForm(data);
				}
			});
		}
	},
	
	/**
	 * Delete a product row from cart
	 * 
	 * @param {Object} row The table row to delete
	 */
	deleteProductRow: function(row) {
		row.fadeOut('fast', function() {
			$(this).remove();
		});
	},
	
	/**
	 * Update checkout form data
	 * 
	 * @param {Object} data The JSON response
	 */
	updateCheckoutForm: function(data) {
		/*
		 * JSON
		 * 
			{
				"subTotals": [
					{
						"productId": "0",
						"subTotal": "&euro; 79,60"
					},
					{
						"productId": "1",
						"subTotal": "&euro; 19,95"
					},
					{
						"productId": "2",
						"subTotal": "&euro; 26,75"
					}
				],
				"grandTotal": "&euro; 206,55"
			}
		 */
		
		for(var i = 0; i < data['subTotals'].length; i++) {
			$('#price-' + data['subTotals'][i].productId).html(data.subTotals[i].subTotal);
		}
		
		$('#grand-total .price').html(data.grandTotal);
	},
	
	/**
	 * When the alt shipping address checkbox fires onclick
	 * 
	 * @param {Object} el The HTMLInputElement
	 */
	altShippingAddressClickHandler: function(el) {
		$(el).is(':checked') ? this.expandFields('#alt-shipping-address') : this.collapseFields('#alt-shipping-address');
	},
	
	/**
	 * Collapse certain form fields by selector
	 * 
	 * @param {String} selector
	 */
	collapseFields: function(selector) {
		$(selector, this.form).removeClass('expanded').addClass('collapsed').find('input, select, textarea').attr('disabled', true);
	},
	
	/**
	 * Expand certain form fields by selector
	 * 
	 * @param {String} selector
	 */
	expandFields: function(selector) {
		$(selector, this.form).removeClass('collapsed').addClass('expanded').find('input, select, textarea').attr('disabled', false);
	}
};

