/*******************
	framework
********************/
//Add Events
function addEvent( obj, type, fn ) {
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}


/* $: shortcut for document.getElementById*/
function $(obj) {
	if(typeof obj == "string") {
		return document.getElementById(obj);
	} else {
		return obj;
	}
}


// getStyle : retourne la valeur d'une propriete CSS appliquee   un element
function getStyle(oElm, strCssRule){
    var strValue = "";
    if(document.defaultView && document.defaultView.getComputedStyle) {
		try{ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); }
		catch(e) { strValue = ""; }
    }
    else if(oElm.currentStyle) {
        try{
			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
	            return p1.toUpperCase();
	        });
	        strValue = oElm.currentStyle[strCssRule];
		} catch(e) {
			strValue = "";
		}
    }
    return strValue;
}
/*retourne la valeur entiere d'un style*/
function intStyle(oElm, strCSSRule) {
	var val = parseInt(getStyle(oElm, strCSSRule));
	if (isNaN(val)) val=0;
	return val;
}

/*getElementsByClassName: return an array of Objects with specified className*/
function getElementsByClassName(oElm, sTagName, sClassName){
    var aElements = (sTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(sTagName);
	var aReturnElements = new Array();
    sClassName = sClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + sClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i < aElements.length; i++){
    	oElement = aElements[i];
		if(oRegExp.test(oElement.className))
            aReturnElements.push(oElement);
    }
	return aReturnElements
}

/* *********************************************************** */
function form_select(){
	var sel_jour = $('jour');
	for (var i=1;i<32;i++){
		var tag_option=document.createElement("option");
		(i<10)?	text = "0"+i : text=i;
		text_option=document.createTextNode(text);
		tag_option.appendChild(text_option);
		tag_option.setAttribute('value',text);
		sel_jour.appendChild(tag_option);
	}
	
	var sel_mois = $('mois');
	for (var i=1;i<13;i++){
		var tag_option=document.createElement("option");
		(i<10)?	text = "0"+i : text=i;
		text_option=document.createTextNode(text);
		tag_option.appendChild(text_option);
		tag_option.setAttribute('value',text);
		sel_mois.appendChild(tag_option);
	}
	
	var sel_annee = $('annee');
	for (var i=2000;i>1899;i--){
		var tag_option=document.createElement("option");
		(i<10)?	text = "0"+i : text=i;
		text_option=document.createTextNode(text);
		tag_option.appendChild(text_option);
		tag_option.setAttribute('value',text);
		sel_annee.appendChild(tag_option);
	}
	
	var sel_nbEnfant = $('nbrEnfant');
	for (var i=0;i<11;i++){
		var tag_option=document.createElement("option");
		(i<10)?	text = "0"+i : text=i;
		text_option=document.createTextNode(text);
		tag_option.appendChild(text_option);
		tag_option.setAttribute('value',text);
		sel_nbEnfant.appendChild(tag_option);
	}
}

function showStep(stepNum) {
	for (var i=1; i<5; i++) {
		$("step"+i).style.display = (i==stepNum) ? "block" : "none";
	}
}

function init(){
	form_select();
}

addEvent(window, 'load', init);

/****************
* Validation de formulaires
******************/
var formval={
	defaultErrorMessage:"Ce champ est erroné",
	defaultPosition:"beforefield",
	validationFunc:{
		required:function(field) {
			var returnMessage=true;
			switch(field.type) {
				case "text":
				case "file":
				case "password":
				case "textarea":
					if (field.value=="") returnMessage="text";
					break;
				case "checkbox":
				case "radio":
					var sameElt = formval.getSameElements(field);
					var onecheck=false;
					for (var i=0; i<sameElt.length; i++) {
						if (sameElt[i].checked)
							onecheck=true;
					}
					if (!onecheck) returnMessage=field.type;
					break;
				case "select-one":
				case "select-multiple":
					if(field.selectedIndex==0) 
						returnMessage="select";
					break;
			}
			return returnMessage;
		},
		email:function(field) {
			return (field.value=="" || !!field.value.match(/^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/));
		},
		pseudo:function(field) {
			return !!field.value.match(/^[a-zA-Z0-9_\-]{3,20}$/);
		},
		image:function(field) {
			return (field.value=="" || !!field.value.match(/^.+\.(gif|jpe?g|png)$/));
		},
		numbers:function(field){
			if (field.value=="") return true; return !!field.value.match(/^\d+$/);
		},
		codepostal:function(field){
			return !!field.value.match(/\d{3,8}/);
		},
		minimum:function(field) {
			if (field.nodeName!="FIELDSET") return true;
			var minNum = field.getAttribute("minimum_num") || 1;
			var properties = field.getAttribute("minimum_field") || "text,femail";
			var properties = properties.split(/,/g);
			var inputs = field.getElementsByTagName("input");
			var counter = 0;
			for (var i=0; i<inputs.length; i++) {
				var x=inputs[i];
				if (x.type==properties[0] && new RegExp(properties[1]).test(x.name) && x.offsetHeight>0) {
					if (formval.validationFunc["required"](x)===true) {
						counter++;
					}
				}
			}
			return counter<minNum ? ([false,minNum]) : true;
		}
	},
	errorMessages:{
		required:{
			checkbox:"Cette case doit être cochée",
			radio:"Vous devez sélectionner une de ces options",
			text:"Attention, ce champ est obligatoire",
			select:"Vous devez sélectionner au moins une option"
		},
		requiredoptional:this.required,
		email:"Cette adresse email est erronée",
		codepostal:"Ce code postal est erroné",
		pseudo:'Attention, votre pseudo doit contenir uniquement 20 caractères, des lettres et des numéros et les signes "_" et "-"',
		image:"Votre fichier n'est pas au bon format",
		minimum:"Vous devez remplir au moins ## champ",
		numbers:"Ce champ ne doit comporter que des chiffres"
	},
	getMessagePosition:function(field){
		var element=field;
		var position="";
		if (field.getAttribute("position")) {
			var position = field.getAttribute("position");
			if (!position.match(/^(before|after)(label|parentnode|field)$/)) {
			 	position = formval.defaultPosition;
			}
			var arrPos = position.match(/^(before|after)(label|parentnode|field)$/);
			switch(arrPos[2]) {
				case "label" : 
					var node = field;
					while(node.nodeName!="LABEL") {
						node=node.previousSibling;
					}
					if (node.nodeName=="LABEL") element=node;
					break;
				case "parentnode" : 
					var parentPos = field.getAttribute("parentnode_pos") ? parseInt(field.getAttribute("parentnode_pos")) : 1;
					var element=field;
					for (var i=0; i<parentPos; i++) {
						element=element.parentNode;
					}					
					break;
			}
			return [arrPos[1],element];
		} else {
			return [formval.defaultPosition.match(/(before|after)(label|parentnode|field)/)[1],element]
		}
	},
	getSameElements:function(field) { //return an array of elements in form who have same nodeName, name and type
		var aReturnElements=[];
		var elt=field.form.elements;
		for (var i=0; i<elt.length; i++) {
			if (elt[i].nodeName==field.nodeName && elt[i].name==field.name && elt[i].type==field.type) {
				aReturnElements.push(elt[i]);
			}
		}
		return aReturnElements;
	},
	check:function(theForm, showOnlyOneMessage, otherReturnValues) {
		var scrollTop = document.body.scrollTop;
		var finalErrorMessage="";
		var hasError=false;
		var elm = theForm.elements;
		for (var i=0; i<elm.length; i++) {
			var x=elm[i];
			if (x.offsetHeight>0) {
				if (x.getAttribute("validation")) {
					var validOptions = x.getAttribute("validation").split(/\s+/g);
					finalErrorMessage="";
					for (var j=validOptions.length-1; j>=0; j--) {
						if (typeof(formval.validationFunc[validOptions[j]])=="function") {
							var returnMessage = formval.validationFunc[validOptions[j]](x);
							var quantity = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[1] : 0;
							returnMessage = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[0] : returnMessage;
							if (returnMessage==false || typeof(returnMessage)=="string") { //si message erreur ou index de tableau associatif
								hasError=true;
								if (x.getAttribute(validOptions[j]+"_em")!=null) { //si le champ possede un message personnalisé pour l'erreur alors on affihce
									finalErrorMessage=x.getAttribute(validOptions[j]+"_em");
								} else { //sinon
									if (typeof(returnMessage)=="string") { //si le message d'erreur est un index de tableau associatif
										finalErrorMessage=formval.errorMessages[validOptions[j]][returnMessage]; //on va chercher le message associé à cet index
									} else {
										if (formval.errorMessages[validOptions[j]] && typeof(formval.errorMessages[validOptions[j]])=="string") { //si le message d'error est false
											finalErrorMessage=formval.errorMessages[validOptions[j]]; //alors on retourne le message d'erreur associé
											if (quantity>0) finalErrorMessage=finalErrorMessage.replace(/\#\#/g,quantity);
										}
										else finalErrorMessage=formval.defaultErrorMessage; //sinon on affiche le message d'erreur par défaut pour tout champ
									}
								}
							} else {
								formval.clearMessage(x);
							}						
						}
					}
					if (finalErrorMessage!="") formval.showMessage(x, finalErrorMessage);
				}
			}
		}
		document.body.scrollTop=scrollTop;
		var secondErrorValue=true;
		if (otherReturnValues) {
			if(typeof(otherReturnValues)=="boolean") {
				secondErrorValue=otherReturnValues;
			} else {
				for (var i=0; i<otherReturnValues.length; i++) {
					if (!otherReturnValues[i]) secondErrorValue = false;
				}
			}
		}
		if (showOnlyOneMessage) {
			var elm = document.getElementById(showOnlyOneMessage);
			if (hasError) {
				elm.className+=" errorAlertShow";
			} else {
				elm.className=elm.className.replace(/\berrorAlertShow\b/g,"");
			}
		}
		return (!hasError && secondErrorValue); //return true si aucune erreur sinon false;
	},
	checkIfErrorMessageBefore:function(field) {
		var node = field;
		var i=0;
		while(node.previousSibling && i<=2) {
			if (node.nodeType==1 && node.className.match(/\berrormsg\b/))
				return node;
			node=node.previousSibling;
			i++;
		}
		return null;
	},
	clearMessage:function(field) {
		if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
			if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
				var elm = document.getElementById(field.getAttribute("rel"));
				elm.className = elm.className.replace(/\berror\b/g,"");
			}
		} else {
			if (field.associatedErrorMessage) {
				field.associatedErrorMessage.style.display="none";
			}
		}
	},
	insertAfter:function(parent, nodeToInsert, nodeInDom) {
		var node = parent.insertBefore(nodeToInsert, nodeInDom);
		parent.insertBefore(nodeInDom, nodeToInsert);
		return nodeToInsert;
	},
	showMessage:function(field, msg) {
		if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
			if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
				var elm = document.getElementById(field.getAttribute("rel"));
				elm.className+=" error";
			}
		} else {
			if (!field.associatedErrorMessage) {
				if (!formval.checkIfErrorMessageBefore(field)) {
					var pos = formval.getMessagePosition(field);
					if (pos[0]=="before") {
						var msgField = pos[1].parentNode.insertBefore(document.createElement("span"),pos[1]);
					} else {
						var msgField = formval.insertAfter(pos[1].parentNode,document.createElement("span"),pos[1]);
					}
					msgField.className="errormsg";
					field.associatedErrorMessage=msgField;
				} else {
					field.associatedErrorMessage = formval.checkIfErrorMessageBefore(field);
				}
			}
			field.associatedErrorMessage.innerHTML=msg;
			field.associatedErrorMessage.style.display="";	
			//<span class="errormsg">Attention, ce champ est obligatoire</span>
		}
	}
}