/*-----------------------------------------------------------------------------------------------*/
//
// formVerif.js v2.0
//
// Copyright (c) 2008 Agence Clark (http://www.agence-clark.com)
//
/*-----------------------------------------------------------------------------------------------*/

var formVerif = function(frm_name,arr_control,arr_param) {
	//-- Récupération des variables optionnelles --//
	var options = Object.extend({frm_name:frm_name,arr_control:arr_control,arr_param:arr_param}, arguments[3] || {});
	if (!options.errorMessage) 			options.errorMessage = '';
	if (!options.idMsgGlobal) 			options.idMsgGlobal = 'msgGlobal';
	if (!options.titreMessage) 			options.titreMessage = 'Veuillez corriger les erreurs suivantes';
	if (!options.titreAttention) 		options.titreAttention = 'Attention !!!';
	var errorMessage = 	options.errorMessage;
	var idMsgGlobal = options.idMsgGlobal;
	
    //-- Verification ID formulaire --//
	if (!document.forms[frm_name]) {
        alert('Vérifiez l\'ID du formulaire');
        die();
    }
	var myForm = document.forms[frm_name];
	
	//-- Variables d'erreurs --//
    var divErrorCss = 'divError';
    var inputErrorCss = 'inputError';
	var labelErrorCss = 'labelError';
    var oneError = false;
    var focusinput = false;
	
	//-- Parametres d'alerte --//
		//-- Les differents types d'avertissement --//
		//mep = 'modalbox'; // Overlay ModalBox
		//mep = 'msg_global'; // Message d'erreur global
		//mep = 'msg_champ'; //Message d'erreur sous chaque champ
		
    var mep = arr_param['mep'];
	var autoScroll = arr_param['autoScroll'] == true ? true : false;
    var action = arr_param['action'] ? arr_param['action'] : 'submit';
   
    //-- Propriete du champ --//
    for (var property in arr_control) {
		var nom_champ = property;
		var type = arr_control[property]['type'];
		var minchar = ( arr_control[property]['minchar'] > 0 ? arr_control[property]['minchar'] : false );
		var alerte = '<p>'+arr_control[property]['alerte'].stripScripts()+'</p>';
		var divErrorCssCustom = divErrorCss;
		
		var reg_expression;
		var matched = false;
		var alerte_sup = ''; // Alerte spécifique pour 2nd email
		
		if (!myForm[nom_champ] && !myForm[nom_champ+'[]']) {
			alert('Champ HTML absent : "'+nom_champ+'"');
			die();
		}
		var input_element = ( myForm[nom_champ] ? myForm[nom_champ] : myForm[nom_champ+'[]'] );
		
		var input_element_p = input_element;
		var input_element_d = input_element;
		if (input_element[0] && input_element[0].nodeName.toLowerCase() != 'option') { // Si input type radio|check > array
			input_element_p = input_element[0]; // Premier element
			input_element_d = input_element[(input_element.length-1)]; // Dernier element
		}
		
		var input_element_tag = input_element_p.nodeName.toLowerCase(); // 'textarea' | 'input' | ...
		var input_type_area = '';
		
		switch(input_element_tag) {
            case 'textarea': input_type_area = 'text'; // Astuce > fait passer textarea pour input "text"
            case 'input':
              var input_type = (input_type_area ? input_type_area : input_element_p.getAttribute('type'));
              input_type = input_type.toLowerCase();
              switch(input_type) {
                  case 'password':
						if (input_element.value == '') break;
						else if(input_element.hasClassName('focusInput') && input_element.value == input_element.defaultValue) break;						
						else if (minchar && input_element.value.length < minchar) {
							 break;
						}
						else matched = true;
						
						// Mot de passe
						if (matched && myForm[nom_champ+'_2']) {
                            if (myForm[nom_champ+'_2'].value != myForm[nom_champ].value) alerte_sup = 'second_mdp_erreur';
                            else alerte_sup = 'second_mdp_ok';
                        }
						
                  case 'text':
                  case 'hidden':
				  case 'file':
						if (input_element.value == '') break;
						else if(input_element.hasClassName('focusInput') && input_element.value == input_element.defaultValue) break;						
						else if (minchar && input_element.value.length < minchar) {
							 break;
						}
                        switch(type) {
                            case 'tel_fr' :      reg_expression = /^0([1-6]|8|9)([. -\/]?)\d{2}(\2\d{2}) {3}$/; break;
                            case 'tel' :         reg_expression = /^[0-9]{10}$/; break;
                            case 'chiffre' :     reg_expression = /^[0-9]{1,}$/; break;
                            case 'mel' :         reg_expression = /^[A-Za-z0-9._-]+@[A-Za-z0-9.\-]{2,}[.][A-Za-z]{2,4}$/; break;
                            case 'url' :         reg_expression = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; break;
                            case 'date' : break;
                            default : reg_expression = /^(.+)[\r\n]|$/; break; // Valide text non vide
                        }
                        if (type == 'date') { // Valide jj/mm/aa(aa)
                            if (checkDate(input_element.value)) matched = true;
                        }
                        else if (input_element.value.match(reg_expression)) matched = true;
                        else if (type == 'mel') alerte = alerte; //'L\'email ne semble pas correcte';
                        // Si type "mel" check if "mel_2" exist et si identique
                        if (matched && type == 'mel' && myForm[nom_champ+'_2']) {
                            if (myForm[nom_champ+'_2'].value != myForm[nom_champ].value) alerte_sup = 'second_email_erreur';
                            else alerte_sup = 'second_email_ok';
                        }
                        break;
                  /*case 'file':
                        if (input_element.value != '') {
                            var fichier = baseName(input_element.value);
                            if (type != '') {
                                exts = type.split('|');
                                for (i=0; i<exts.length; i++) if (fichier.match(exts[i])) matched = true;
                            }
                            else if (fichier) matched = true;
                        }
                        break;*/
                  case 'checkbox':
                  case 'radio':
                     input_element_tag = 'radio';
                     if (input_element.length) {
                         for (var j=0; j<input_element.length; j++) { if (input_element[j].checked) matched = true; }
                     }
                     else if (input_element.checked) matched = true;
                  	break;
              }
          break;
          case 'select':     
              if (input_element.options[input_element.selectedIndex].value != '') matched = true;
          break;
        }
        if (!matched) {
            oneError = true;
            if (mep == 'msg_champ') {
                if ($('div_error_'+nom_champ)) {
                    $('div_error_'+nom_champ).update(alerte);
                    $('div_error_'+nom_champ).addClassName(divErrorCssCustom);
                    $('div_error_'+nom_champ).show();
                }
                else {
                    if ($(nom_champ+'_erreur')) $(nom_champ+'_erreur').show();
                    else{
						new Insertion.Bottom(input_element_d.parentNode,'<div class="'+divErrorCssCustom+'" id="'+nom_champ+'_erreur" style="display:none;">'+alerte+'</div>');
						Effect.Appear($(nom_champ+'_erreur'),{duration:0.3});
					}
                    Element.addClassName($(nom_champ), inputErrorCss);
                }
				
				Element.addClassName($$('label[for='+nom_champ+']')[0], labelErrorCss);
            }
            else{
				Element.addClassName($(nom_champ), inputErrorCss);
				Element.addClassName($$('label[for='+nom_champ+']')[0], labelErrorCss);				
				errorMessage += alerte;
			}

            if (!focusinput) { // Focus la première erreur
                focusinput = true;
                input_element_p.focus();
            }
        }
        else {
            Element.removeClassName(input_element_p, inputErrorCss);
            if ($('div_error_'+nom_champ)) $('div_error_'+nom_champ).hide();
            else if ($(nom_champ+'_erreur')) $(nom_champ+'_erreur').hide();
			
			Element.removeClassName($$('label[for='+nom_champ+']')[0], labelErrorCss);
        }
		
        if (alerte_sup != '') {
            switch(alerte_sup) {
                case 'second_email_erreur' : case 'second_mdp_erreur' :
                    oneError = true;
                    if(alerte_sup == 'second_email_erreur') alerte = '<p>Les deux e-mails ne sont pas identiques</p>';
					else alerte = '<p>Les deux mots de passe ne sont pas identiques</p>';                    
					nom_champ = nom_champ+'_2'; // Envois alert input "mel" sur "mel_2"
                    if (mep == 'msg_champ') {
                        if ($(nom_champ+'_erreur')) $(nom_champ+'_erreur').show();
                        else{
							new Insertion.Bottom($(nom_champ).parentNode,'<div class="'+divErrorCssCustom+'" id="'+nom_champ+'_erreur" style="display:none;">'+alerte+'</div>');
							Effect.Appear($(nom_champ+'_erreur'),{duration:0.3});
						}
                        Element.addClassName($(nom_champ), inputErrorCss);
                    }
                    else{
						Element.addClassName($(nom_champ), inputErrorCss);
						errorMessage += alerte;
					}
                   
                   if (!focusinput) { // Focus la première erreur
                        focusinput = true;
                        $(nom_champ).focus();
                    }
                break;
                case 'second_email_ok' : case 'second_mdp_ok' :
                    nom_champ = nom_champ+'_2'; // Envois alert input "mel" sur "mel_2"
                    if (mep == 'msg_champ') {
                        Element.removeClassName($(nom_champ), inputErrorCss)
                        if ($('div_error_'+nom_champ)) $('div_error_'+nom_champ).hide();
                        else if ($(nom_champ+'_erreur')) $(nom_champ+'_erreur').hide();
                    }
					else Element.removeClassName($(nom_champ), inputErrorCss)
                break;
				
            }
        }
    }

    // SUBMIT
    if (!oneError && errorMessage == '') return true;
    else {		
		if (autoScroll) new Effect.ScrollTo(myForm, {offset: -16});
		switch(mep){
			case 'msg_global' :
				if(!$(idMsgGlobal))	alert('Attention, il n\'y a pas le '+idMsgGlobal);
				else{
					errorMessage = '<h1>'+options.titreMessage+'</h1>'+errorMessage;
					$(idMsgGlobal).update(errorMessage);
					Effect.Appear($(idMsgGlobal),{duration:0.5});
				}
			
			break;
			case 'modalbox' : 
				if(!$('domNode'))	alert('Attention, il n\'y a pas le domNode');
				else{
					errorMessage = '<h1>'+options.titreMessage+'</h1>'+errorMessage;
					$('domNode').update(errorMessage);
					if(autoScroll) setTimeout(Modalbox.show($('domNode'), {title: options.titreAttention, width: 600}),1000);
					else Modalbox.show($('domNode'), {title: options.titreAttention, width: 600});
				}
			break;
		}
		
		return false;
    }
};
