/**
* BBCMS - Black Bear CMS
* (c)2009 by Olivier Blais (contact@bbcms.fr)
* 
* Licensed under the terms of the GNU Lesser General Public License:
* http://www.opensource.org/licenses/lgpl-3.0.html
* 
* For further information visit:
* http://www.bbcms.fr
*/

var jsvalidator = Class.create({ 
	
	initialize: function(formId) {
	    this.formId  = formId;
	    this.elt  = [];
	    this.msgError = '';
	},
 
 	/**
	* Fonction pour ajouter les différents champs à vérifier
	* @param field champ à vérifier
	* @param rule règle à appliquer sur le champ
	* @param msg message d'erreur à afficher
	* @param param paramètres supplémentaires
	* @return nothing
 	*/
	addElt: function (field,rule,msg,param) {
		this.elt.push(arguments['0'] = new Array(arguments['0'],arguments['1'],arguments['2'],arguments['3']));
	},
	
	validateField: function () {
		var i;
    for (i=0; i < this.elt.length; i++) {       
       this.checkField(this.elt[i]);  
    }
    
    if (this.msgError.length>0) {
	    $('messageContent').innerHTML = this.msgError;
	    $('message').removeClassName('success');
	    $('message').addClassName('error');
	    $('message').show();
	    return false;
	  } else {
	  	return true;
	  }
	},
	
	checkField: function (fieldId) {
		switch(fieldId[1])
		{
			case "required":
				var regex = /[^.*]/;
				if(!regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "alpha": //seulement des lettres
				var regex = /^[a-z ._\-]+$/i;
				if($F(fieldId[0]) && !regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "alphanum": //seulement des chiffres et des lettres
				var regex = /^[a-z0-9 ._\-]+$/i;
				if($F(fieldId[0]) && !regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "email":
				var regex = /^[a-z0-9._%\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$/i;
				if($F(fieldId[0]) && !regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "equal":
				if ($F(fieldId[0]) != $F(fieldId[3])) {  	
					this.setError(fieldId[0],fieldId[2]);
					$(fieldId[3]).addClassName('elt-error');
				}
			break
			case "more":
				if ($F(fieldId[0]).length < fieldId[3]) {  	
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "less":
				if ($F(fieldId[0]).length > fieldId[3]) {  	
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "higher":
				if ($F(fieldId[0]) > fieldId[3]) {  	
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "lower":
				if ($F(fieldId[0]) < fieldId[3]) {  	
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "datehigher":
				var startDateValue = Date.parse($F(fieldId[0]));
				var endDateValue = Date.parse($F(fieldId[3]));
				if( endDateValue-startDateValue < 0 ){
					this.setError(fieldId[0],fieldId[2]);
					$(fieldId[3]).addClassName('elt-error');
				}
			break
			case "regex":
				var regex = fieldId[3];
				if($F(fieldId[0]) && !regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break
			case "ajax":
				new Ajax.Request(fieldId[3], {
		    asynchronous: false,
		    method: 'post',
		    parameters: 'form='+this.formId+'&'+Form.serialize($(this.formId)),
		    onSuccess: function(requester) {
		        if (requester.responseText == 'false') {
		          this.setError(fieldId[0],fieldId[2]);
		        }
		      }.bindAsEventListener(this)
		    });
			break
			case "checkbox":
				var i = 1;
				var checked = false;
				while($(fieldId[0]+i)) {
					if($(fieldId[0]+i).checked) {
						checked = true;
					}
					i++;
				}			
				if (!checked) {  	
					this.msgError += fieldId[2];
				}	
			break
			default:
				var regex = /[^.*]/;
				if(!regex.test($F(fieldId[0]))) {
					this.setError(fieldId[0],fieldId[2]);
				}
			break;
		}
	},
	
	setError: function (field,msg) {
		$(field).addClassName('elt-error');
    this.msgError += msg;
	},
	
	removeEltError: function () {
		$$('.elt-error').each(
			function (elt)
			{
				elt.removeClassName('elt-error');
			}
		)
	}

});
