var Validate = Class.create();
Validate.prototype = {

	errors: null,
	reqire_fields: null,
	emailReg: /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{2,4})$/,
	defaultErrors: {empty: 'cannot be empty', invalid_email: 'Invalid email', bad_format: 'Bad format'},


	initialize: function(options)
	{
		if ($$('form.validate_form')) {
			if(options && options.require_fields) this.reqire_fields = options.require_fields;
			var form = $$('form.validate_form');
			this.form = form[0];
			var btn = $$('form.validate_form a.btn_submit');
			this.btn_submit = btn[0];
			/*if ($$('span.important'))
			{
				if($$('span.important')[0]) $$('span.important')[0].style.display = 'none';
			}*/
			if ($('container').select('[class="valid"]') != null && $('container').select('[class="valid"]').length > 0) {		
				if ($$('span.important')) {
					$$('span.important')[0].style.display = 'block';
				}
			} else {		
				if ($$('span.important')) {
					$$('span.important')[0].style.display	 = 'none';
				}	
			}
		}
	},

	check_form: function ()
	{
        this.errors = {};
		var span_selector = '#' + this.in_form + ' span.valid';
		$$(span_selector).invoke('remove');
		for(method in this.reqire_fields){
			for(i in this.reqire_fields[method]){
				this[method](i, this.reqire_fields[method][i]);
			}
		}

		for(element_id in this.errors)
		{
			var msg = this.errors[element_id];
			element_id = $(element_id).parentNode.parentNode;
			var span = (new Element('span', {'class': 'valid'})).update(msg);
			$(element_id).insert(span);
		}

		if(Object.values(this.errors) == ""){
			
			if ($$('span.important'))
			{
				$$('span.important')[0].style.display	 = 'none';
			}
			if(Object.isFunction(this.submit_form)) {
                this.submit_form();
			} else {
                this.form.submit();
            }
			
		}else{
			
			if ($$('span.important'))
			{
				$$('span.important')[0].style.display = 'block';
			}
		}
	},

	presence_of: function (element_id, options)
	{

		if(!Object.isString(options) && options.message != ""){
			var message = options.message;
		}else{
			var message = element_id+' '+this.defaultErrors.empty;
		}

		if($(element_id) && !$F(element_id)){
			this.errors[element_id] = message;
		}

	},


	format_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var theReg = (options.use == "email") ? this.emailReg : options.use;
			var message = options.message;
		}
		else
		{
			var theReg = (options == "email") ? this.emailReg : options;
			var message = this.defaultErrors.bad_format;
		}

		if($(element_id) && !theReg.test($F(element_id))){
			this.errors[element_id] = message;
		}
	},


	confirm_mail_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.invalid_email;
		}
		
		if($(element_id) && $(options.checkWith) && $F(element_id) != $F(options.checkWith)){
			this.errors[element_id] = message;
		}
	},


	radio_presence_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.empty;
		}
		
		if($(element_id) && $(options.checkWith) && !($F(element_id) || $F(options.checkWith))){
			this.errors[element_id] = message;
		}
	},


	format_date_fr_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.bad_format;
		}
		
		var theDate = $F(element_id);
		var DateOk = false;
		
		// Cette fonction permet de v�rifier la validit� d'une date au format jj/mm/aa ou jj/mm/aaaa

		if ($(element_id) && theDate != "") { // si la variable est vide on retourne faux

			var e = /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/;

			if (e.test(theDate)) { // On teste l'expression r�guli�re pour valider la forme de la date

				// On s�pare la date en 3 variables pour v�rification, parseInt() converti du texte en entier
				j = parseInt(theDate.split("/")[0], 10); // jour
				m = parseInt(theDate.split("/")[1], 10); // mois
				a = parseInt(theDate.split("/")[2], 10); // ann�e

				// Si l'ann�e n'est compos�e que de 2 chiffres on compl�te automatiquement
				if (a < 1000) {
					if (a < 89)  a+=2000; // Si a < 89 alors on ajoute 2000 sinon on ajoute 1900
					else a+=1900;
				}

				// D�finition du dernier jour de f�vrier
				// Ann�e bissextile si annn�e divisible par 4 et que ce n'est pas un si�cle, ou bien si divisible par 400
				var fev = 28;
				if (a%4 == 0 && a%100 !=0 || a%400 == 0)
					fev = 29;
				// Nombre de jours pour chaque mois
				nbJours = new Array(31,fev,31,30,31,30,31,31,30,31,30,31);
				
				// Enfin, retourne vrai si le jour est bien entre 1 et le bon nombre de jours, idem pour les mois, sinon retourn faux
				DateOk = ( m >= 1 && m <=12 && j >= 1 && j <= nbJours[m-1] );
				
			}
		}
				
		if (!DateOk) {
			this.errors[element_id] = message;
		}
	},
	
	format_time_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.bad_format;
		}
		
		
		var theTime = $F(element_id);
		var TimeOk = false;
		
		if ($(element_id) && theTime != "") {
		
			var e = /^[0-9]{1,2}:[0,9]{1,2}$/;
			
			if (e.test(theTime)) {
				h = parseInt(theTime.split(":")[0], 10); // Heure
				min = parseInt(theTime.split(":")[1], 10); // Minute
				
				TimeOk = (h>=0 && h<24 && min>=0 && min<60);
			}
		}
				
		if (!TimeOk) {
			this.errors[element_id] = message;
		}
	},
	
	at_least_one_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.empty;
		}
		
		var nbElem = 0;
		
		if (options.tabElem && (nbElem = options.tabElem.length) > 0) {
			var atLeastOne = false;
			
			for (var iFor = 0; iFor < nbElem; iFor++) {
				if ($F(options.tabElem[iFor]) != null && $F(options.tabElem[iFor]) != "")
				{
					atLeastOne = true;
					break;
				}
			}
			if (!atLeastOne) {
				this.errors[element_id] = message;
			}
		}
	},
	
	input_file_document_type_of: function (element_id, options)
	{
		if(!Object.isString(options)){
			var message = options.message;
		}
		else
		{
			var message = this.defaultErrors.bad_format;
		}
		
		if ($(element_id) && $(element_id).type.toLowerCase() == 'file')
		{
			var valid = false;
			
			for (var iFor = 0, max = options.extensions.length; iFor < max; iFor++)
			{
				var extReg = new RegExp("\." + options.extensions[iFor] + "$");
				if(extReg.test($F(element_id))) {
					valid = true;
					break;
				}
			}
			
			if (!valid) {
				this.errors[element_id] = message;
			}
		
		}
		
	}

};
