// etre compatible avec MSIE...
if ('undefined' == typeof Node)
    Node = { ELEMENT_NODE: 1, TEXT_NODE: 3 };
		
function addListener(element, baseName, handler) {
    if (element.addEventListener)
        element.addEventListener(baseName, handler, false);
    else if (element.attachEvent)
        element.attachEvent('on' + baseName, handler);
} // addListener


//FORM VALIDATION
REGEX_AUTO_FIELD = /^[^_]+(_Req)?(_(Int|Dbl|Date|Mail)(_[0-9.]+){0,2})?$/;
REGEX_BLANK = /^\s*$/;
REGEX_DAY = /^(0?[1-9]|[1-2][0-9]|3[01])$/;
REGEX_MONTH = /^(0?[1-9]|1[0-2])$/;
// Les multiples groupes vont nous d�couper l'ID tout seuls...
REGEX_TYPED_FIELD = /_(Int|Dbl|Date|Mail)(_([0-9.]+))?(_([0-9.]+))?$/;
REGEX_YEAR = /^[0-9]{2,4}$/;
MSG_BLANK = ' doit être renseigné.';
MSG_NOT_A_DATE = ' n\'est pas une date.';
MSG_NOT_A_DOUBLE = ' n\'est pas un nombre.';
MSG_NOT_AN_INTEGER = ' n\'est pas un nombre entier.';
MSG_NOT_A_VALID_MAIL = ' n\'est pas une adresse e-mail valide.';
MSG_TOO_LOW = ' est trop petit(e).';
MSG_TOO_HIGH = ' est trop grand(e).';

function addFormChecks() {
	//alert('formcheck');
	var forms = document.forms;
    for (var index = 0; index < forms.length; ++index) {
        var form = document.forms[index];
        addListener(form, 'submit', checkForm);
		addListener(form, 'reset', resetForm);
		//addListener(form, 'keypress', checkFormForKeyboard);
    }
	decorateLabels();
} // addFormChecks

function decorateLabels() {
	var labels = document.getElementsByTagName('label');
	for (var index=0; index < labels.length; ++index) {
		var label = labels[index];
		/*if (label.accessKey) {
			var ak = label.accessKey.toUpperCase();
		}*/
		if (label.htmlFor) {
			var elt=document.getElementById(label.htmlFor);
			if (!elt)
				continue;
			if (elt.id.match(/_Req/)) {
				label.className='required';
				label.innerHTML +=' *'
			}
		}
	}
}

function checkForm(e) {
	if (document.getElementById('contentText_Req')) {
		tinyMCE.execCommand('mceFocus', false, "contentText_Req");
		tinyMCE.triggerSave();
	}
	else if (document.getElementById('contentText')) {
		tinyMCE.execCommand('mceFocus', false, "contentText");
		tinyMCE.triggerSave();
	}
	
	// Compatibilité MSIE / les autres...
    e = e || window.event;
    var form = e.target || e.srcElement;
	if (!form) {
		form=document.getElementById(e);
	}
	var errors = '';
    var faulty = null;
   
	for (var index = 0; index < form.elements.length; ++index) {
        var field = form.elements.item(index);
        var emptyField=false;
		// Vérification de syntaxe
        if (!field.id.match(REGEX_AUTO_FIELD))
            continue;
        var value = getFieldValue(field);
        // Champ requis ?
        if (field.id.match(/_Req/) && value.match(REGEX_BLANK)) {
            var clearName = getFieldName(field);
			clearName = clearName.replace('*','');
			errors += '- '+clearName + MSG_BLANK + '<br />';
            faulty = faulty || field;
			emptyField=true;
            continue;
        }
		else
			emptyField=true;
		// Champ typé ?
		var match = field.id.match(REGEX_TYPED_FIELD);
		if (match) {
			if (!field.id.match(/_Req/) && value.match(REGEX_BLANK)) {
			}
			else {
				var type = match[1];
				var min = match[3];
				var max = match[5];
				var error = checkTypedField(value, type, min, max);
				if (error) {
					var clearName = getFieldName(field);
					clearName = clearName.replace('*','');
					errors += '- '+clearName + error + '<br />';
					faulty = faulty || field;
				}
			}
		}
    }
    if (!faulty)
	{
		stopEvent(e);
		execFormCommand(form);
	}
    else
	{		
		stopEvent(e);
		displayFormErrors(form.id, errors);
		faulty.focus();
	}
} // checkForm


function resetForm(e)
{
	// Compatibilité MSIE / les autres...
    e = e || window.event;
    var form = e.target || e.srcElement;
	switch (form.getAttribute('id'))
	{
		default:
			stopEvent(e);
			toggleBlindUp('returnField');
			Form.reset(form);
		break;
	}
}

function execFormCommand(form) {
    var params="";
    params = Form.serialize(form);
    switch (form.getAttribute('id')) {
        case "contactForm":
            var console = document.getElementById('formConsole');
            var ERRORS_TEMPLATE = "<div class=\"formConsole_loading\"><div style=\"padding:4px;\"><strong>Envoi en cours...</strong></div>";
            console.innerHTML=ERRORS_TEMPLATE;
            if (console.style.display == 'none')
		    {
		       new Effect.BlindDown(console,
		       {
		           duration: 0.5,
		           afterFinish : function(effect) {
		                new Ajax.Updater('formHiddenConsole', 'library/plugins/form/formContact.php',
			            {
			                method:'post',
			                parameters:'section=sendMail&'+params,
			                onComplete: function(requester) {
			                    var caseMail = 'sendMailSuccess';
			                    if (!requester.responseText.match(/Success/)) {
			                        caseMail = 'sendMailError';
			                    }
			                    else {
			                      form.reset();
		   	                      $('name_Req').clear();
                                  $('firstname_Req').clear();
                                  if ($('email_Req_Mail')) {
									$('email_Req_Mail').clear();
								  }
								  else {
									$('email_Mail_Req').clear();
								  }
                                  $('subject_Req').clear();
                                  $('message_Req').clear();
								  if ($('societe')) {
                                    $('societe').clear();
								  }
								  if ($('telephone')) {
                                    $('telephone').clear();
								  }
								  if ($('telecopie')) {
									$('telecopie').clear();
								  }
			                    }
			                    new Ajax.Updater('formConsole', 'library/plugins/form/formContact.php',
	                               {
	                                   method:'post',
	                                   parameters:'section='+caseMail+''
	                               });     
			                }
			            });
		           }
		       });
		    }
        break;
        
        default:
            form.submit();
        break;
    }
}

function displayFormErrors(formId, errors)
{
	//alert('formerror');
	var target="formConsole";
	/*if (document.getElementById('returnField_'+formId))
		target='returnField_'+formId;
	else if (document.getElementById('returnField_secBody'))
		target='returnField_secBody';*/
	
	var ERRORS_TEMPLATE = "<div class=\"formConsole_error\"><div class=\"button_close\"><a href=\"javascript:void(0);\" onclick=\"toggleBlindUp('"+target+"');\" title=\"Fermer\"><span>Fermer</span></a></div><div style=\"padding:4px;\"><strong>Les éléments suivants nécéssitent votre attention avant de continuer :</strong><div style=\"margin:0 0 0 35px;\">%textContent%</div></div></div>";
	if (ERRORS_TEMPLATE != '')
	{
		var msg = ERRORS_TEMPLATE.replace(/%textContent%/, errors);
	}
	else
	{
		var msg = errors;
	}
	document.getElementById(target).innerHTML=msg;
	//document.getElementById(target).style.display = "block";
	toggleBlindDown(target);
}
function checkFormForKeyboard(e) {	
	if (e.keyCode==13) // Touche Enter
		{
			if (document.getElementById('contentText_Req')) {
				tinyMCE.execCommand('mceFocus', false, "contentText_Req");
				tinyMCE.triggerSave();
			}
			else if (document.getElementById('contentText')) {
				tinyMCE.execCommand('mceFocus', false, "contentText");
				tinyMCE.triggerSave();
			}
			var form = Event.findElement(e, 'form');
			var errors = '';
			var faulty = null;
			for (var index = 0; index < form.elements.length; ++index) {
				var emptyField=false;
				var field = form.elements.item(index);
				// Verification de syntaxe
				if (!field.id.match(REGEX_AUTO_FIELD))
						continue;
				var value = getFieldValue(field);
				// Champ requis ?
				if (field.id.match(/_Req/) && value.match(REGEX_BLANK)) {
					var clearName = getFieldName(field);
					clearName = clearName.replace('*','');
					errors += '- '+clearName + MSG_BLANK + '<br />';
					faulty = faulty || field;
					emptyField=true;
					continue;
				}
				else
					emptyField=true;
				// Champ type ?
				var match = field.id.match(REGEX_TYPED_FIELD);
				if (match) {
					if (!field.id.match(/_Req/) && value.match(REGEX_BLANK)) {
					}
					else {
						var type = match[1];
						var min = match[3];
						var max = match[5];
						var error = checkTypedField(value, type, min, max);
						if (error) {
							var clearName = getFieldName(field);
							clearName = clearName.replace('*','');
							errors += '- '+clearName + error + '<br />';
							faulty = faulty || field;
						}
					}
				}
			}
			if (!faulty)
			{
				stopEvent(e);
				execFormCommand(form);				
			}
			else
			{
				stopEvent(e);
				displayFormErrors(form.id, errors);
				faulty.focus();
			}
		}
		else if (e.keyCode==27) // Touche Echap
		{
			stopEvent(e);
			closeSecBody();
		}
} // checkFormForKeyboard




function checkTypedField(value, type, min, max) {
    // Valeurs par d�faut pour les bornes
    min = min || Number.NEGATIVE_INFINITY;
    max = max || Number.POSITIVE_INFINITY;
    var val;
    if ('Int' == type) {
        try {
            val = parseInt(value, 10);
			if (value.charAt(0)=='0')
				value=value.substring(1);
	   		if (String(val) != value)
	    		throw val;
        } catch (e) {
            return MSG_NOT_AN_INTEGER;
        }
    }
    if ('Dbl' == type) {
        try {
            val = parseFloat(value);
	    if (String(val) != value)
	    	throw val;
        } catch (e) {
            return MSG_NOT_A_DOUBLE;
        }
    }
    if ('Int' == type || 'Dbl' == type) {
        if (val < min)
            return MSG_TOO_LOW;
        if (val > max)
            return MSG_TOO_HIGH;
    }
    if ('Date' == type) {
        var comps = value.split('/');
        if (3 != comps.length || !comps[0].match(REGEX_DAY) ||
            !comps[1].match(REGEX_MONTH) ||
            !comps[2].match(REGEX_YEAR))
            return MSG_NOT_A_DATE;
    }
		 if ('Mail' == type) {
				testm = false ;
				for (var j=1 ; j<(value.length) ; j++) {
					if (value.charAt(j)=='@') {
						if (j<(value.length-4)){
							for (var k=j ; k<(value.length-2) ; k++) {
								if (value.charAt(k)=='.') testm = true;
							}
					 	}
					}
				}		
			if (testm==false) return MSG_NOT_A_VALID_MAIL;
		}
    return null;
} // checkTypedField

function getFieldName(field) {
    var label = getLabelFor(field);
    if (!label)
        return field.name;
    var text = '';
    var node = label.firstChild;
    // Parcours en profondeur, 
    while (true) {
        if (Node.ELEMENT_NODE == node.nodeType && node.hasChildNodes())
            node = node.firstChild;
        else if (Node.TEXT_NODE == node.nodeType)
            text += node.nodeValue;
        if (node.nextSibling)
            node = node.nextSibling;
        else {
            node = node.parentNode;
            if (node == label)
                break;
            node = node.nextSibling;
        }
    }
    //alert (text);
    return text;
} // getFieldName

function getFieldValue(field) {
    if ('INPUT' == field.tagName || 'TEXTAREA' == field.tagName)
    {
			if (field.type == "checkbox")
			{
				if (field.checked)
					return "1";
				else
					return "0";
			}
			else
				return field.value;
		}
    if ('SELECT' == field.tagName) {
        var value = '';
        if (-1 < field.selectedIndex) {
            var opt = field.options[field.selectedIndex];
            value = opt.value;
            if (!value && !('value' in opt))
                value = opt.text;
        }
        return value;
    }
    return '';
} // getFieldValue

function getLabelFor(field) {
    var labels = document.getElementsByTagName('label');
    for (var index = 0; index < labels.length; ++index) {
        var label = labels.item(index);
        if (label.htmlFor == field.id)
            return label;
    }
    return null;
} // getLabelFor

function stopEvent(e) {
    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    } else {
        e.cancelBubble = true;
        e.returnValue = false;
    }
} // stopEvent

function toggleBlindDown(target) {
    if (document.getElementById(target).style.display == 'none')
    {
       new Effect.BlindDown(target,
       {
           duration: 0.5
       });
    }
}
function toggleBlindUp(target) {
    if (document.getElementById(target)) {
      if (document.getElementById(target).style.display != 'none') {
	    new Effect.BlindUp(target,
	    {
	         duration: 0.5
	    });
	  }
    }   
}


Event.observe(window, 'load', initForms, false);
function initForms() {
    addFormChecks();
}
