/*
	Provides basic functions for handling of ordered classsets
	© Newsfactory 2009
*/
function klassensatzController(csetIds) {
	
	
	// -------------------------------------------------------------------------------------------------------
	// ------------------------------- PRIVATE OBJECT MEMBERS / FUNCTIONS ------------------------------------
	// -------------------------------------------------------------------------------------------------------

	
	var csetIdFieldName = csetIds;
	var faultyFields = new Array();
	
	
	var getPerformActionField = function() {
		return $("input[name='performAction']");
	}
	
	var getCheckedInputValuesAsArray = function() {
		var checkedValues = new Array();
		var checkedInputs = $("table[class='klassensatz']").find("input:checked");
		if (checkedInputs.size()) {
			checkedInputs.each(function(){
				checkedValues.push($(this).val());
			});
		}		
		return checkedValues;
	}
	
	
	// -------------------------------------------------------------------------------------------------------
	// ------------------------------------- PUBLIC OBJECT FUNCTIONS -----------------------------------------
	// -------------------------------------------------------------------------------------------------------

	
	// -- CLASS LEVEL SELECT "GO" BUTTON CLICK HANDLER
	this.clickGo = function() {
		getPerformActionField().val('changeClassLevel');
		$("select[name='classLevel']")
			.parents('form')
			.get(0).submit();
	}
	
	
	// -- ORDER CLASS SET BUTTON CLICK HANDLER
	this.clickOrder = function(classsetId) {
		if (classsetId == 'continue') {
			getPerformActionField()
				.val('continueWithOrder')
				.parents('form')
				.get(0).submit();
		} else if (classsetId == 'submit') {
			faultyFields = new Array();
			$("input[name='name']").validateString(2);
			$("input[name='phone']").validateString(1);
			$("input[name='cardNo']").validateString(1);
			$("input[name='email']").validateEmail();
			$("input[name='amount']").validateNumber(1);
			$("select[name='library']").validateNumber(1);
			if (faultyFields.length > 0) {
				alert('Bitte korrigieren Sie die folgenden Felder:\n- ' + faultyFields.join('\n- '));
			} else {
				if (confirm('Bitte vergewissern Sie sich, dass alle Daten korrekt eingegeben wurden und klicken Sie auf "OK", wenn Sie die Bestellung abschicken wollen.')) {
					getPerformActionField().val('submitOrder');			
					getPerformActionField()
						.parents('form')
						.get(0).submit();
				}
			}
		} else {
			var csetIds = new Array();
			if (classsetId == 'all') {
				getPerformActionField().val('orderClassSetAll');
				csetIds = getCheckedInputValuesAsArray();
			} else {
				getPerformActionField().val('orderClassSet');
				csetIds.push(classsetId);
			}
					
			$("input[name='"+csetIdFieldName+"']")
				.val(csetIds.join(','))
				.parents('form')
				.get(0).submit();
		}
	}
	
	
	// -- BACK TO CLASS LEVEL / SET LIST
	this.clickBack = function() {
		getPerformActionField().val('backToList')
			.parents('form')
			.get(0).submit();
	}
	
	
	// -- REMOVE CSET FROM "BASKET"
	this.clickRemove = function(confirmQuestion) {
		var performAction = true;
		if (typeof confirmQuestion == 'string' && confirmQuestion.length > 0) {
			performAction = confirm(confirmQuestion);
		}
		
		if (performAction) {
			getPerformActionField().val('removeFromOrder');
			$("input[name='"+csetIdFieldName+"']")
				.val(getCheckedInputValuesAsArray().join(','))
				.parents('form')
				.get(0).submit();
		}
	}
	
	
	// -------------------------------------------------------------------------------------------------------
	// -------------------------------------------- JQUERY ADDONS --------------------------------------------
	// -------------------------------------------------------------------------------------------------------
	
	
	// -- CAUSED BY USAGE OF 1.2.X jQUERY LIB, JQUERY.CLOSEST() FUNCTION
	//		IS PORTED FROM 1.3.X BRANCH
	jQuery.fn.closest = function(expr) {
		var matchingParentElement = $('body');
		$(this).parents().each(function() {
			if ($(this).is(expr)) {
				matchingParentElement = $(this);
				return false;
			}
		});
		return matchingParentElement;
	}
	
	
	jQuery.fn.flagFaultyField = function() {
		return this.each(function() {
			var nodeName = this.nodeName.toLowerCase();
			if (nodeName == 'input' || nodeName == 'textarea' || nodeName == 'select') {
				faultyFields.push(
					$(this)
					.css('border-color', '#f00')
					.closest('tr')
					.find('td.label')
					.css('color', '#f00')
					.text()
					.replace(/\s*[\*]\s*/, '')
				);
			}
		});
	}
	
	
	jQuery.fn.unflagFaultyField = function() {
		$(this)
			.css('border-color', '')
			.closest('tr')
			.find('td.label')
			.css('color', '');
		
	}
	
	
	jQuery.fn.validateString = function(minLength) {
		return this.each(function() {
			if ($(this).val().length <= parseInt(minLength)) {
				$(this).flagFaultyField();
			} else {
				$(this).unflagFaultyField();
			}
		});
	}
	
	
	// 1. argument (optional): minimun
	// 2. argument (optional): maximum
	jQuery.fn.validateNumber = function() { 
		var minNumber = (typeof arguments[0] == 'number' ? arguments[0] : false);
		var maxNumber = (typeof arguments[1] == 'number' ? arguments[1] : false);
		
		return this.each(function() {
			var e = $(this);
			var value = null;
			var nodeName = this.nodeName.toLowerCase();
			switch (nodeName) {
				case 'input':
				case 'textarea':
					value = e.val();
					break;
				case 'select':
					value = e.find('option:selected').get(0).value;
					break;
			}
			
			if (value != null) {
				if (!value.match(/^[0-9]+$/)) {
					e.flagFaultyField();
				} else if (minNumber != false && parseInt(value) < minNumber) {
					e.flagFaultyField();
				} else if (maxNumber != false && parseInt(value) > maxNumber) {
					e.flagFaultyField();
				} else {
					e.unflagFaultyField();
				}
			}
		});
	}
	
	
	jQuery.fn.validateEmail = function() {
		return this.each(function() {
			if(!$(this).val().match(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/)) {
				$(this).flagFaultyField();
			} else {
				$(this).unflagFaultyField();
			}
		});
	}
}