/**
 * This library will add JS based validation to forms being submitted through AJAX, as well
 * as provide a standard framework for form submission through AJAX 	
 *
 * Look for a form configuration object for the form.
 *
**/

$(document).ready(function(){
	enableFormValidation();
})

function validateMandatory(){
	if ($(this).is(":checkbox")){
		return $(this).attr('checked');
	} else {
		if ($(this).val()){
			return true;
		} else {
			return false;
		}
	}
}

function checkCondition(obj){
	var condition = $(obj).attr('condition');
	var conditionResult = false;
	if (condition){
		conditionResult = eval(condition);
	}
	return conditionResult;
}

function validateConditionalMandatory(){
	if (checkCondition(this)){
		if ($(this).is(":checkbox")){
			return $(this).attr('checked');
		} else {
			if ($(this).val()){
				return true;
			} else {
				return false;
			}
		}
	} else {
		return true;
	}
}

function validateEmail(){
	var val = $(this).val();
	if (this.validateMandatory){
		var reqVal = this.validateMandatory();
		if (!reqVal){
			return false;
		}
	}
	if (val.indexOf("@")>0 && val.indexOf(".")>0){
		return true;
	} else {
		return false;
	}
}

function enableFormValidation(){
	$('form.validatable').each(function(){
		//attach the validate method to the form
		$.extend(this,{validate: validateForm, validateWhat: new Array()})
		
		//attach the validate methods inside a "validatable" form
		$(this).find('.validate').each(function(){
			if ($(this).is('.mandatory')){
				$.extend(this,{validateMandatory: validateMandatory});
			} 
			if ($(this).is('.email')){
				$.extend(this,{validateEmail: validateEmail});
			}
			if ($(this).is('.conditionalMandatory')){
				$.extend(this,{validateMandatory: validateConditionalMandatory});
			}
			$.extend(this, {validate: validateField});
			var form = $(this).parents('form');
			$(form)[0].validateWhat.push({
				field: this, 
				errorMsg: getErrorMessageFromField(this)
			});
		});
	});
}

function getErrorMessageFromField(field){
	if ($(field).attr('errorMessage')){
		return $(field).attr('errorMessage');
	} else {
		return 'Error validating ' + field.name;
	}
}

function validateField(){
	if (this.validateMandatory){
		if (this.validateEmail){
			return this.validateMandatory() && this.validateEmail();
		} else {
			return this.validateMandatory();
		}
	} else {
		if (this.validateEmail){
			return this.validateEmail();
		} else {
			return true;
		}
	}
}

function validateForm(){
	var errorMessages = new Array();
	for (var i=0; i<this.validateWhat.length; i++){
		var fld = this.validateWhat[i].field;
		var isFieldValid = fld.validate();
		if (!isFieldValid){
			errorMessages.push(this.validateWhat[i].errorMsg);
		}
	}

	return errorMessages;
}

function checkValid(formName){
	var form = $(formName);
	var errors = $(form)[0].validate();
	for (var i=0; i<errors.length; i++){
		alert(i + ":" + errors[i]);
	}
}
