/**
* jsfest[at]gmail[dot]com - 01/2008
*/

var MSSG_ERR_EMPTY="ce champ est requis pour la validation";
var MSSG_ERR_BADFORMAT_EMAIL="le format de l'email saisi est incorrect";
var MSSG_ERR_MINLENGTH="Le nombre minimum de caract&egrave;res n'est pas atteint : ";
var MSSG_ERR_MAXLENGTH="Le nombre de caract&egrave;res maximum de ce champ est depass&eacute; : ";
var MSSG_ERR_ALPHANUM="Les signes non alphanum&eacute;riques sont interdits";
var MSSG_ERR_ALPHA="Les signes non alphab&eacute;tiques sont interdits";
var MSSG_ERR_NUM="Les signes non num&eacute;riques sont interdits";
var MSSG_ERR_DATE="La date doit &ecirc;tre du format : dd/mm/YYYY";
var MSSG_ERR_BADFORMAT_CPFR="Le code postal n'a pas le bon format";
var MSSG_ERR_PASSWORD = "Le mot de passe n'est pas au bon format";
var MSSG_ERR_CB = "Le num&eacute;ro de la carte de paiement n'est pas au bon format";
var MSSG_ERR_PHONEFR = "Le num&eacute;ro de t&eacute;l&eacute;phone n'est pas au bon format";
var MSSG_ERR_CPFR = "Le code postal n'est pas au bon format";
var MSSG_ERR_DEFAULT = "Ce champ n'est pas correctement rempli";

var defaultRules = {
    /* patterns */
	email:{flag:/\brule:email\b/,test:function( cn, fv, o, fa ) {return /^[\w-_]+(\.[\w-_]+)*@([\w-_]+\.)+[a-zA-Z]{2,7}$/.test(fv);},err:MSSG_ERR_BADFORMAT_EMAIL,handlers:["blur","change","focus","keyup"]},
	alphanum:{flag:/\brule:alphanum\b/,test:function( cn, fv, o, fa ) { if ( ! /^([\w\s_\. \- 'ÀÂÇÈÉÊËÎ@\\ÔÙÛàâçèéêëîôùû])+$/.test(fv) ) return false;else return true; },err:MSSG_ERR_ALPHANUM},
	num:{flag:/\brule:num\b/,test:function( cn, fv, o, fa ) {if (! /^[0-9 ]+$/.test(fv) ) return false;else return true;},err:MSSG_ERR_NUM},
	alpha:{flag:/\brule:alpha\b/,test:function( cn, fv, o, fa ) {if (! /^[a-zA-Z ]+$/.test(fv) ) return false;else return true;},err:MSSG_ERR_ALPHA},	
	date:{flag:/\brule:date\b/,test:function( cn, fv, o, fa ) {if( ! /^(((0[1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|(1[0-2]))\/(\d{4})(((([[:space:]]?)(([0-1][0-9])|([2][0-3]))(:[0-5][0-9]))((:[0-5][0-9])?))?))$/.test(fv)) return false;else return true;},err:MSSG_ERR_DATE},
	cpfr:{flag:/\brule:cpfr\b/,test:function( cn, fv, o, fa ) {if (! /^(2[ab]|0[1-9]|[1-9][0-9])[0-9]{3}$/.test(fv) ) return false;else return true;},err:MSSG_ERR_CPFR},
	password:{flag:/\brule:password\b/,test:function( cn, fv, o, fa ) {if ( ! /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,8}$/.test(fv) ) return false;else return true;},err:MSSG_ERR_PASSWORD},
	creditcard:{flag:/\brule:creditcard\b/,test:function( cn, fv, o, fa ) {if (! /^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$/.test(fv) ) return false;else return true;},err:MSSG_ERR_CB},
	phonefr:{flag:/\brule:phonefr\b/,test:function( cn, fv, o, fa ) {if (! /^(\(\+[0-9]{2}\))? ?0[1-68][0-9 ]+$/.test(fv) ) return false;else return true;},err:MSSG_ERR_PHONEFR},
	/* functions */
	minlength:{flag:/\brule:minlength:([0-9]+)\b/,test:function( cn, fv, o, fa ) {v = fa['flag'].exec(cn);if ( fv.length<v[1] ) {o.err[o.err.length]=fa['err']+fv.length+' / '+v[1];}return true;},err:MSSG_ERR_MINLENGTH},
	maxlength:{flag:/\brule:maxlength:([0-9]+)\b/,test:function( cn, fv, o, fa ) {v = fa['flag'].exec(cn);if ( fv.length>v[1] ) {o.err[o.err.length]=fa['err']+fv.length+' / '+v[1];}return true;},err:MSSG_ERR_MAXLENGTH},
	/* filters */
	capitalize:{flag:/\brule:capitalize\b/,test:function( cn, fv, o, fa, f ){f.value = f.value.toUpperCase();return true;},err:MSSG_ERR_MAXLENGTH}
};

var formChecker = Class.create({
	feh: [], err: [], aaq: [], checkPattern: [], checkFunc: [], fields2check: [],rules: [], fbn: [], fx: [],
    initialize: function( IDform ) {
		this.IDform = IDform;
        this.element = $(IDform);
        this.element.observe( 'submit',  this.submitform.bindAsEventListener(this.element, this) );
		if(defaultRules){this.loadDefaultRules(defaultRules);}
		this.init();
    },
	init: function() {
		this.fields2check = $$('#'+this.IDform+' .check');
        for (var i=0; i<this.fields2check.length; i++) {
            if ( ! this.fbn[this.fields2check[i].name] ) {
                this.fbn[this.fields2check[i].name] = this.fields2check[i];
                this.fx[this.fields2check[i].name] = this.onFieldEvent.bindAsEventListener(this.fields2check[i], this);
                this.fields2check[i].observe('change', this.fx[this.fields2check[i].name]);
                this.fields2check[i].observe('click',this.onFieldClick );
            }
        }
	},
    onFieldClick: function(e) {var f=e.element(); f.focus(); },
    submitform: function( e, o ) {
        if (!e) { o = this; }
        var ne = 0;
        for (var i=0; i<o.fields2check.length; i++) {ne+=o.checkField(o.fields2check[i], o); }
        if( ne > 0 ) {if (!e){ return false;}else { Event.stop(e); }} 
		else {if (!e){ $(this.IDform).submit();return false; }}
    },
    onFieldEvent: function( e, o ) {var f = e.element(); o.checkField( f, o, e.type ); },
    checkForm: function(o) {
        if (!o) {o=this;}
        var ne = 0;
        for (var i=0; i<o.fields2check.length; i++) {ne+=o.checkField(o.fields2check[i], o); }
        return ne;
    },
    checkFieldsByName: function(fn) {
        this.checkField(fbn[fn],this);
    },
    checkField: function( f, o, et ) {
        fv = f.getValue();
        if( fv == null ) { fv=""; }
        else { fv = fv.strip(); }
        if(f.type == "radio" || f.type == "checkbox"){
            fms = $(o.element);
            fvs = fms[f.name];
            for(var i=0;i<fvs.length;i++) { if(fvs[i].checked) {fv=fvs[i].value;} }
        }
		var cn = f.className;
		var mandatoryrule = /\brule:mandatory\b/;
        var ajaxrule = /\brule:ajax\b/;
		
        if( mandatoryrule.test(cn) && fv == ""  ) { o.err[o.err.length] = MSSG_ERR_EMPTY; }
        if( et != "keyup" && et != "keydown" && et != "blur" && et != "click" && ajaxrule.test(cn) ) {o.ajaxRequest( f, fv, o );}		
		this.checkRules( cn, fv, et, o, f );
        return o.checkErrors( f, o );
    },
	addRule: function( r, n ) {
		index = this.rules.length;
		this.rules[ index ] = new Array;
		this.rules[index]["flag"] = r.flag;
		this.rules[index]["test"] = r.test;
		this.rules[index]["name"] = n;
		this.rules[index]["err"] = r.err || MSSG_ERR_DEFAULT;
	},
	loadDefaultRules: function( dr ) {
		for ( var r in dr ) { this.addRule( dr[r], r); }
	},
	checkRules: function( cn, fv, et, o, f ) {
		for( var i=0;i<o.rules.length;i++ ) {
			if( fv != "" && o.rules[i]['flag'].test(cn) ) {
				if( ! o.rules[i]['test'](  cn, fv, o, o.rules[i], f )  ) { o.err[o.err.length] = o.rules[i]['err'];}
			}
		}
	},
    checkErrors: function( f, o ) {
        if ( o.err.length > 0 ) {
            if ( !o.feh[f.name] ) {
                o.feh[f.name] = o.onFieldEvent.bindAsEventListener( f, o );
                f.observe('keyup', o.feh[f.name] );
                f.observe('blur', o.feh[f.name] );
            }
            o.setError( f, o );
            return 1;
        } else {
            o.setSuccess( f );
            return 0;
        }
    },
    addAjaxQuery: function( fn, url, expected, errtxt, extra ) {
		if( !this.aaq[fn] ) { this.aaq[fn] = new Array; }
		var index = this.aaq[fn].length;
        this.aaq[fn][index] = new Array;
        this.aaq[fn][index]['url'] = url;
        this.aaq[fn][index]['exp'] = expected;
        this.aaq[fn][index]['errtxt'] = errtxt;
        this.aaq[fn][index]['extra'] = extra;
    },
    ajaxRequest: function( f, fv, o ) {
        if( o.aaq[f.name] ) {
			for(var i=0;i<o.aaq[f.name].length;i++){
				var url = o.aaq[f.name][i]['url']+fv;
				if( o.aaq[f.name][i]['extra'] ) {
					fms = $(o.element);
					for ( var htmlname in o.aaq[f.name][i]['extra'] ) {
					   fvs = fms[htmlname];
					   url = url+"&"+o.aaq[f.name][i]['extra'][htmlname]+"="+fvs.value;
					}
				}
				new Ajax.Request(url, {
					method: 'get',asynchronous: false,
					onComplete: function(transport) {
						if (transport.responseText != o.aaq[f.name][i]['exp']) {o.err[o.err.length] = o.aaq[f.name][i]['errtxt'];}
					}
				});
			}
        }
    },
    setError: function( f, o ) {
        err_div = $("error_for_"+f.name);
        f.removeClassName("form-success");
        f.addClassName("form-error");
		var nb=o.err.length;
		if ( nb > 1 ) {
		var nb=nb-1;
		}
		
        if( err_div ) {
            mssg = '';
            for(var i=0;i<nb;i++) {
                mssg += "&darr;&nbsp;"+o.err[i]+"&nbsp;&darr;<br />";
            }
            $("error_for_"+f.name).style.visibility='visible';
            $("error_for_"+f.name).update( mssg );
        }
        o.err.clear();
    },
    setSuccess: function ( f ) {
        err_div = $("error_for_"+f.name);
        if( err_div ) {err_div.style.visibility='hidden';}
        f.removeClassName("form-error");
        f.addClassName("form-success");
        if( err_div ) {$("error_for_"+f.name).update("");}
    }
});

