/**
 * jQuery.form
 * 
 * @version 0.3
 * - move displayError and hideError form debug to form
 * 
 * @version 0.2.1
 * - tipValue does not overwrite value=""
 * 
 * @version 0.2.0
 * 
 * Params for validator object :
 * required : Boolean
 * type : String ('string', 'email', 'int', 'float', 'phone', 'mobile')
 * rangeLength : Array ([minLength:Number, maxLength:Number])
 * minLength : Number
 * maxLength : Number
 * equalTo : Number, String
 * rangeValue : Array ([minValue:Number, maxValue:Number])
 * minValue : Number
 * maxValue : Number
 * tipValue : Number, String
 * defaultValue : Number, String
 * errorMessage : String
 * errorContainer : String
 * 
 * Params not yet implemented :
 * lengthEqualTo : Number
 */

jQuery.form = {};

jQuery.form.formArray = Array();

/**
 * getFormManager
 * @param name
 * @return Array
 */
jQuery.form.getFormManager = function (formSelector) {
	name = formSelector.attr('name');
	
	if (jQuery.form.formArray[name] === undefined) {
		jQuery.form.formArray[name] = Array();
	}
	
	return(jQuery.form.formArray[name]);
};

/****************************************************************************************************
 * INIT
 ****************************************************************************************************/

/**
 * initField
 * @param name
 * @param value
 */
jQuery.form.initField = function (formSelector, name, value) {
	var o = formSelector.find('[name=' + name + ']');	
	o.val(value);
};

/**
 * tipField
 * @param name
 * @param value
 */
jQuery.form.tipField = function (formSelector, name, value) {
	var o = formSelector.find('[name=' + name + ']');
	if (!jQuery.string.exists(o.val())) {
		o.val(value);
	}
	o.focus(function(){
		if (o.val() == value) {
			o.val('');
		}
	});
	o.blur(function(){
		if (o.val() === '') {
			o.val(value);
		}
	});
};

/**
 * initSelect
 * @param name
 * @param value
 */
jQuery.form.initSelect = function (formSelector, name, value) {
	var o = formSelector.find('select[name=' + name + '] option[value=' + value + ']');
	o[0].selected = true;
};

/**
 * initRadio
 * @param name
 * @param value
 */
jQuery.form.initRadio = function (formSelector, name, value) {
	var o = formSelector.find('input[name=' + name + '][value=' + value + ']');
	o[0].checked = true;
};

/****************************************************************************************************
 * ADD FIELDS
 ****************************************************************************************************/

/**
 * addField
 * @param name_form
 * @param name
 * @param validator
 */
jQuery.form.addField = function (formSelector, name, validator) {
	validator = jQuery.extend({
		required:false,
		type:'string',
		errorMessage:'Veuillez saisir ce champ correctement.',
		errorContainer:undefined,
		tipValue:'',
		defaultValue:''
	}, validator);
	
	jQuery.form.tipField(formSelector, name, validator.tipValue);
	if (validator.defaultValue !== '') {
		jQuery.form.initField(formSelector, name, validator.defaultValue);
	}
	
	var formManager = jQuery.form.getFormManager(formSelector);
	formManager[name] = Array();
	formManager[name]['type'] = 'field';
	formManager[name]['validator'] = validator;
};

/**
 * addSelect
 * @param name_form
 * @param name
 * @param validator
 */
jQuery.form.addSelect = function (formSelector, name, validator) {
	validator = jQuery.extend({
		required:false,
		type:'string',
		errorMessage:'Veuillez saisir ce champ correctement.',
		errorContainer:undefined,
		tipValue:'',
		defaultValue:''
	}, validator);
	
	jQuery.form.initSelect(formSelector, name, validator.tipValue);
	jQuery.form.initSelect(formSelector, name, validator.defaultValue);
	
	var formManager = jQuery.form.getFormManager(formSelector);
	formManager[name] = Array();
	formManager[name]['type'] = 'field';
	formManager[name]['validator'] = validator;
};

/**
 * addRadio
 * @param name_form
 * @param name
 * @param validator
 */
jQuery.form.addRadio = function (formSelector, name, validator) {
	validator = jQuery.extend({
		required:false,
		type:'string',
		errorMessage:'Veuillez saisir ce champ correctement.',
		errorContainer:undefined,
		defaultValue:''
	}, validator);
	
	if (validator.defaultValue) {
		jQuery.form.initRadio(name, validator.defaultValue);
	}
	
	var formManager = jQuery.form.getFormManager(formSelector);
	formManager[name] = Array();
	formManager[name]['type'] = 'radio';
	formManager[name]['validator'] = validator;
};

/**
 * addRule
 * @param name_form
 * @param name
 * @param rule
 * @param validator
 */
jQuery.form.addRule = function (formSelector, name, rule, validator) {
	validator = jQuery.extend({
		required:false,
		type:'string',
		errorMessage:'Veuillez saisir ce champ correctement.',
		errorContainer:undefined,
		defaultValue:'',
		rule : rule
	}, validator);
	
	var formManager = jQuery.form.getFormManager(formSelector);
	formManager[name] = Array();
	formManager[name]['type'] = 'rule';
	formManager[name]['validator'] = validator;
};

/****************************************************************************************************
 * CHECK
 ****************************************************************************************************/

/**
 * checkForm
 * @param name
 */
jQuery.form.checkForm = function (formSelector) {
	jQuery.form.hideError();
	
	var formManager = jQuery.form.getFormManager(formSelector);
	for (var field in formManager) {
		switch (formManager[field]['type']) {
			case 'field':
				if (!jQuery.form.checkField(formSelector, field)) {
					var jField 		= formSelector.find('[name=' + field + ']');
					var validator 	= formManager[field]['validator'];
					jQuery.form.displayError(validator.errorMessage, validator.errorContainer);
					jField.focus();
					jField.select();
					return(false);
				}
				break;
				
			case 'radio':
				if (!jQuery.form.checkRadio(formSelector, field)) {
					var jField 		= formSelector.find('[name=' + field + ']');
					var validator 	= formManager[field]['validator'];
					jQuery.form.displayError(validator.errorMessage, validator.errorContainer);
					jField.focus();
					return(false);
				}
				break;
				
			case 'rule':
				var validator = formManager[field]['validator'];
				if (!validator.rule()) {
					var jField 		= formSelector.find('[name=' + field + ']');
					jQuery.form.displayError(validator.errorMessage, validator.errorContainer);
					jField.focus();
					return(false);
				}
				break;
		}
	}
	
	return(true);
};

/**
 * check
 * @param value
 * @param validator
 */
jQuery.form.check = function (value, validator) {
	if (validator.required && !jQuery.string.exists(value) ) {
		return(false);
	}
	
	if (!validator.required && !jQuery.string.exists(value) ) {
		return(true);
	}
	
	for (var property in validator) {
		switch (property) {
			case 'type':
				switch (validator[property]) {
					case 'int':
						if (!jQuery.number.isInt(value)) {
							return(false);
						}
						break;
					case 'float':
						if (!jQuery.number.isFloat(value)) {
							return(false);
						}
						break;
					case 'phone':
						if (!jQuery.number.isPhoneNumber(value)) {
							return(false);
						}
						break;
					case 'mobile':
						if (!jQuery.number.isMobileNumber(value)) {
							return(false);
						}
						break;
					case 'email':
						if (!jQuery.string.isEmail(jQuery.string.cleanEmail(value))) {
							return(false);
						}
						break;
				}
				break;
			case 'rangeLength':
				if (!jQuery.string.rangeLength(value, validator[property])) {
					return(false);
				}
				break;
			case 'minLength':
				if ( value.length < validator[property] ) {
					return(false);
				}
				break;
			case 'maxLength':
				if ( value.length > validator[property] ) {
					return(false);
				}
				break;
			case 'equalTo':
				if (value != validator[property]) {
					return(false);
				}
				break;
			case 'minValue':
				if ( value < validator[property] ) {
					return(false);
				}
				break;
			case 'maxValue':
				if ( value > validator[property] ) {
					return(false);
				}
				break;
			case 'rangeValue':
				if (!jQuery.number.rangeValue(value, validator[property])) {
					return(false);
				}
				break;
			case 'tipValue':
				if (value == validator[property]) {
					return(false);
				}
				break;
		}
	}
	
	return(true);
};

/**
 * checkField
 * @param name_form
 * @param name
 */
jQuery.form.checkField = function (formSelector, name) {
	var formManager 	= jQuery.form.getFormManager(formSelector);
	var validator 		= formManager[name]['validator'];
	var value 			= formSelector.find('[name=' + name + ']').val();
	
	var r = jQuery.form.check(value, validator);
	
	if (r && (validator.type == 'email')) {
		formSelector.find('[name=' + name + ']').val(jQuery.string.cleanEmail(value));
	}
	
	return (r);
};

/**
 * checkCheckbox
 * @param name_form
 * @param name
 */
jQuery.form.checkRadio = function (formSelector, name) {
	var formManager 	= jQuery.form.getFormManager(formSelector);
	var validator 		= formManager[name]['validator'];
	var o 				= formSelector.find('[name=' + name + '][checked]');
	
	if (validator.required && o.length != 1) {
		return false;
	}
	else {
		var value = o.val();
		return(jQuery.form.check(value, validator));
	}
};

/****************************************************************************************************
 * DISPLAY
 ****************************************************************************************************/

/**
 * displayError
 * @param message
 * @param id
 */
jQuery.form.displayError = function (message, id) {
	if (id === undefined || jQuery('#' + id).length == 0) {
		alert(message);
	}
	else {
		jQuery('#' + id).html(message).show(200);
	}
};

/**
 * hideError
 * @param id
 */
jQuery.form.hideError = function (id) {
	if (id === undefined) {
		jQuery('.error').hide(200);
	}
	else {
		jQuery('#' + id).hide(200);
	}
};
