/**
	Implementation of form control

*/

var
	DONE = 1,
	INCOMPLETE = 2,
	VALID = 3,
	EMPTY = 4,
	ERROR = 5;
	
var 
	submitUrl = config.urlBase + "service/orderSubmit.php",
	forwardUrl = config.urlBase + "result.php?msg=";

var form =
{
	errors : {},
	touchedElements : [],
	
	groupValidation : 
		{
			completePersonalInfo :
				['companyName', 'firstName', 'lastName', 'email',
				 'address', 'zipcode', 'city', 'phoneNr'],
				 
			completePaymentInfo :		 
				['pay_companyName', 'pay_firstName', 'pay_lastName', 'pay_email',
				 'pay_address', 'pay_zipcode', 'pay_city', 'pay_phoneNr'],
				 
			completeBankInfo :
				['bankAccount', 'namedTo', 'bankCity']
		},
	
	elHandler : 
		{
			'companyName' : validator.hasText,
			'firstName' : validator.hasText,
			'lastName' : validator.hasText,
			'email' : validator.isEmail,
			'address' : validator.hasText,
			'zipcode' : validator.isZipCode,
			'city' : validator.hasText,
			'phoneNr' : validator.isPhoneNumber,
			'gender' : validator.any,
			
			'usePayInfo' : validator.any,			
			'pay_companyName' : validator.hasText,
			'pay_firstName' : validator.hasText,
			'pay_lastName' : validator.hasText,
			'pay_gender' : validator.any,
			'pay_email' : validator.isEmail,
			'pay_address' : validator.hasText,
			'pay_zipcode' : validator.isZipCode,
			'pay_city' : validator.hasText,
			'pay_phoneNr' : validator.isPhoneNumber,

			'namedTo' : validator.any,
			'bankCity' : validator.any,
			'bankAccount' : validator.any
		},
	
	/** 
	 *	Reset the errors that are stored.
	 */
	reset : function()
	{
		form.errors = {};
	},
	
	touched : function(el)
	{
		for (var i in form.touchedElements)
		{
			if (form.touchedElements[i] == el)
				return true;
		}
		return false;
	},
	
	/**
	 *	Called when the "to cart" icon is pressed 
	 */
	doAddProduct : function()
	{
		// validation
		product.validateForm();
		form.validate();
		
		// no errors?
		if (form.noErrors())
			product.toCart();
	},
	
	
	/* no errors in form */
	noErrors : function()
	{
		var nErrors = 0;
		for (var i in form.errors)
			++nErrors;
		
		return nErrors == 0;
	}, 
		
	
	/**
	 *	Is all information valid ?
	 */
	validate : function(allElements)
	{
		var state = [];
		var itOver = form.touchedElements;
			
		for (var element in itOver)
		{
			var inputEl = $(itOver[element]);
							
			state[inputEl.attr("id")] = form.elHandler[inputEl.attr("id")](inputEl)
			form.elementState(
				inputEl,
				form.elHandler[inputEl.attr("id")](inputEl));
		}
		return form.setGroupStates(state);
	},
	
	paymentValidation : function()
	{
	},

	/** 
	 *	Validate one group and set proper flags when check is complete
	 */
	validateGroup : function(state, groupName)
	{
		var correct = true;
		
		// check all elements in group 
		for (var key in form.groupValidation[groupName])
		{
			correct &= (state[form.groupValidation[groupName][key]] == VALID);
		}
		
		if (correct)
			form.progress(groupName, DONE);
		else
			form.progress(groupName, INCOMPLETE);

		return correct;
	},
	
	setGroupStates : function(state)
	{
		var infoState = form.validateGroup(state, "completePersonalInfo");
		var correct = infoState;
				
		correct &= form.validateGroup(state, "completeBankInfo");
		
		if (document.getElementById("infoEqual").checked)
		{
			form.progress("completePaymentInfo", infoState ? DONE : INCOMPLETE);
		}
		else
		{
			correct &= form.validateGroup(state, "completePaymentInfo");
		}
		
		correct &= (cart.products.length > 0);
		
		form.progress("completeCart", cart.products.length > 0 ? DONE : INCOMPLETE);
		
		return correct;
	},
	
	preloadTexts : function()
	{
		texts.multiLoad(
			[
				"IN_CART", "PERSONAL_INFO", "PAYMENT_INFO", "BANK_INFO"
			]);
	},
	
	
	/**
	 *	
	 */
	elementState : function(element, state)
	{
		var parent = $(element.parent().get(0));
		
		// remove possible previous elements
		parent.removeClass("form_valid form_empty form_warning");
		
		// set correct state
		if (state == ERROR)
			parent.addClass("form_warning");
		if (state == EMPTY)
			parent.addClass("form_empty");
		if (state == VALID)
			parent.addClass("form_valid");
	},
	
	/**
	 *	Setup the progress arrow in one of the form element progress status thingies
	 */
	progress : function(what, state)
	{
		// reset element classes
		$("#" + what).removeClass("warning");
		$("#" + what).removeClass("complete");

		// done? add "complete" class else add "warning"
		if (state == DONE)
			$("#" + what).addClass("complete");
		
		if (state == INCOMPLETE)
			$("#" + what).addClass("warning");
	},
	
	/**
	 *	Setup a request
	 */
	setupServerRequest : function()
	{
		var 
			reqInfo = {},
			prods = cart.products;
			
		for (var name in form.elHandler)
		{
			reqInfo[name] = $("#" + name).val();
		}	

		return { info : reqInfo, products : prods, affiliate : config.affiliate };		
	},
	
		
	/**
	 *	Check validity, submit request and handle response
	 */
	trySubmit : function()
	{
		// if all elements are correct submit!
		if (form.validate(true))
		{
			// setup information and do a request
			request = form.setupServerRequest();
			$.post(submitUrl,
				{ "reqData" : JSON.stringify(request) }, 
				
				function(data)
				{
					document.location.href = forwardUrl + data.info.response;
				}
				, "json"
			);
		}
		else
		{
			alert("Helaas zijn niet alle gegevens compleet ingevuld");
		}
	}
};
