window.onload = function() {

	if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
}

/*
 *
 *  Scénarios du formulaire  
 *
 */

function initialize_form() {
	var TOGGLING_elements = [];
	var XO_elements = getElementsByRX(/^[XO]-/);
	for (var i=0;i<XO_elements.length;i++) {
		var R_element = document.getElementById(XO_elements[i].id.substr(2));
		switch (R_element.type) {
			case 'checkbox':
				R_element.onclick = toggle;
				if (!R_element.toggle_id)
					R_element.toggle_id = [];
				R_element.toggle_id.push(XO_elements[i].id); 
				TOGGLING_elements.push(R_element.id);
				break;
			case 'radio':
				var Radio_elements = document.getElementsByName(R_element.name);
				for(var j=0;j<Radio_elements.length;j++) {
					var Radio_element = Radio_elements[j];
					Radio_element.onclick = toggle;
					Radio_element.toggle_id = XO_elements[i].id; 
				}
		}
		if (R_element.checked) 
			XO_elements[i].style.display = (XO_elements[i].id.match(/^O/)) ? 'none' : '';
		else
			XO_elements[i].style.display = (XO_elements[i].id.match(/^O/)) ? '' : 'none';
		if (XO_elements[i].style.display=='none') reset(XO_elements[i].id);
	}

	var T_elements = getElementsByRX(/^T-/);
	for (var i=0;i<T_elements.length;i++) {
		T_elements[i].onclick = erase;
		var T_name = T_elements[i].name;
		var R_elements = getElementsByRX(new RegExp('^'+T_name.substr(0,T_name.indexOf('M'))+'[^'+T_name.substr(T_name.indexOf('M')+1)+']'));
		T_elements[i].E_elements = R_elements;
		for (var j=0;j<R_elements.length;j++) {
			R_elements[j].onclick = erase_and_totalize;
			R_elements[j].T_element = T_elements[i];
			R_elements[j].A_elements = R_elements;
		}
	}

	var MAX_elements = getElementsByClassRX(/^MAX/);
	for (var i=0;i<MAX_elements.length;i++) {
		var MAX_name = MAX_elements[i].name;
		var R_elements = getElementsByNameRX(new RegExp('^'+MAX_name.substr(0,MAX_name.indexOf('M'))));
		for (var j=0;j<R_elements.length;j++) {
			if (TOGGLING_elements.indexOf(R_elements[j].id)!=-1)
				R_elements[j].onclick = maximum_toggle;
			else
				R_elements[j].onclick = maximum;
			R_elements[j].max = MAX_elements[i].className.substr(3);
		}
	}

	var TOTAL_elements = getElementsByClassRX(/^TOTAL$/);
	for (var i=0;i<TOTAL_elements.length;i++) {
		var R_elements = getElementsByClassRX(new RegExp('^'+TOTAL_elements[i].id+'$'));
		for (var j=0;j<R_elements.length;j++) {
			R_elements[j].total_id = TOTAL_elements[i].id;
			R_elements[j].onchange = sum;
		}
	}

	/*
	 *
	 * Initialisation des onchange
	 *
	 */

	var CHECK_elements = getElementsByClassRX(/^is/);
	for (var i=0;i<CHECK_elements.length;i++) {
		var fonctions = CHECK_elements[i].className.split(' ');
		var combinaison = fonctions.join("(this) && ");
		CHECK_elements[i].onchange = new Function("{ return "+combinaison+"(this); }");
	}

}

function toggle(obj) {
	if (this.name)
		obj=this;
	switch (obj.type) {
		case 'checkbox':
			for (var i=0;i<obj.toggle_id.length;i++) {
				var visible = document.getElementById(obj.toggle_id[i]).style.display;
				document.getElementById(obj.toggle_id[i]).style.display = (visible) ? '' : 'none';
				if (document.getElementById(obj.toggle_id[i]).style.display=='none')
					reset(obj.toggle_id[i]);
			}
			break;
		case 'radio':
			var checked = obj.toggle_id.substr(2)==obj.id && obj.checked;
			document.getElementById(obj.toggle_id).style.display = (checked) ? '' : 'none';
			if (document.getElementById(obj.toggle_id).style.display=='none') {
				reset(obj.toggle_id);
			}
	}
}

function reset(id) {
	var input_elements = document.getElementById(id).getElementsByTagName('input');
	for (var i=0;i<input_elements.length;i++)
		switch (input_elements[i].type) {
		    case 'text':
				input_elements[i].value = '';
				break;
			case 'radio':
			case 'checkbox':
				input_elements[i].checked = false;
		}
	var textarea_elements = document.getElementById(id).getElementsByTagName('textarea');
	for (var i=0;i<textarea_elements.length;i++)
		textarea_elements[i].value = '';

	var childs = document.getElementById(id).getElementsByTagName('*');
	for (var i=0;i<childs.length;i++) {
		if (childs[i].id.match(/^X-/))
			childs[i].style.display = 'none';
		if (childs[i].id.match(/^O-/))
			childs[i].style.display = '';
	}

}

function erase() {
	if (this.checked)
		for (var i=0;i<this.E_elements.length;i++)
			this.E_elements[i].checked = false;
}

function erase_and_totalize() {
	if (this.checked) {
		var all_checked = true;
		for (var i=0;i<this.A_elements.length;i++)
			all_checked = all_checked && this.A_elements[i].checked;
		if (all_checked) {
			this.T_element.checked = true;
			for (var i=0;i<this.A_elements.length;i++)
				this.A_elements[i].checked = false;
		} else
			this.T_element.checked = false;
	}
}

function maximum(obj) {
	if (this.name)
		obj = this;
	var elements = getElementsByNameRX(new RegExp('^'+obj.name.substr(0,obj.name.indexOf('M'))));
	var checked = 0;
	for (var i=0;i<elements.length;i++)
		if (elements[i].checked)
			checked++;
	if (checked>obj.max) 
		obj.checked = false;
	return (checked<=obj.max);
}

function maximum_toggle() {
	if (maximum(this))
		toggle(this);
}

function sum(obj) {
	if (this.name)
		obj = this;
	var elements = getElementsByClassRX(new RegExp('^'+obj.total_id+'$'));
	var total = 0;
	for (var i=0;i<elements.length;i++)
		total += +elements[i].value;
	document.getElementById(obj.total_id).value = total;
}


/*
 *
 * Validation du formulaire
 *
 */


function isNecessary(field) {
	var message = "Cette saisie est nécessaire.";
	if (field.type=='radio') {
		var defined = false;
		message = "Veuillez cochez une de ces cases s'il vous plaît."
		var CHECK_elements =  document.getElementsByName(field.name);
		for (var i=0;i<CHECK_elements.length;i++) {
			if (CHECK_elements[i].checked) {
				defined = true;
				break;
			}
		}
	}
	else
		var defined = field.value;

	return checkField(field,defined,message,false);
}


function isYear(field) {
	field.value = field.value.replace(/^0*/,"");
	return checkFieldRX(field,/^\d{4}$/,"L'année doit comporter 4 chiffres.",true);
}

function isInt(field) {
	field.value = field.value.replace(/^0*/,"");
	if (!field.value)
		field.value='0';
	return checkFieldRX(field,/^\d+$/,"Ce n'est pas un nombre entier.",true);
}

function isInt5(field) {
	field.value = field.value.replace(/^0*/,"");
	return checkFieldRX(field,/^[1-5]$/,"Ce n'est pas un nombre entre 1 et 5.",true);
}

function isInt6(field) {
	field.value = field.value.replace(/^0*/,"");
	return checkFieldRX(field,/^[1-6]$/,"Ce n'est pas un nombre entre 1 et 6.",true);
}


function isDec(field) {
	field.value = field.value.replace(/\./,",");
	return checkFieldRX(field,/^\d+(,\d+)?$/,"Ce n'est pas un nombre décimal.",true);
}

function isPart(field) {
	field.value = field.value.replace(/^0*/,"");
	field.value = field.value.replace(/\./,",");
	return checkFieldRX(field,/^((100(,0+)?)|(\d{0,2}(,\d+)?))$/,"Ce n'est pas une part.",true);
}

function isEmail(field) {
	var rx = /^[a-z0-9._%+-]+@(?:[a-z0-9-]+\.)+(?:[a-z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/i;
	return checkFieldRX(field,rx,"Adresse email invalide.",true);
}

function isSiret(field) {
	field.value = field.value.replace(/[^0-9]/g,"");
	return checkFieldRX(field,/\d{14}/,"Un numéro de SIRET comporte 14 chiffres.",true);
}

function isDate(field) {
	return checkFieldRX(field,/^(((0*[1-9])|([12][0-9])|(3[01]))\/((0*[1-9])|(1[0-2]))\/(\d{4}))$/,"La date est au format jj/mm/aaaa",true);
}

function checkFieldRX(field,rx,message,empty) {
	return checkField(field,rx.test(trim(field.value)),message,empty);
}

function checkField(field,test,message,empty) {
	if (field.nextSibling)
		if (field.nextSibling.className=='warning') 
			field.parentNode.removeChild(field.nextSibling);
	field.value = trim(field.value);
	if (test || (empty && field.value=="")) {
			return true;
	}
	else {
		displayMessage(field,message);
		return false;
	}
}

function displayMessage(field,message) {
	if (!field.nextSibling || field.nextSibling.className!='warning') {
		var strong = document.createElement('strong');
		strong.style.color = 'red';
		strong.style.fontFamily = 'sans-serif';
		strong.style.fontWeight = 'bold';
		strong.style.paddingLeft = '25px';
		strong.style.background = 'url(/css/exclamation-mark.png) left center no-repeat';
		strong.style.paddingTop = '5px';
		strong.style.paddingBottom = '5px';
		strong.style.position = 'absolute';
		strong.className = 'warning';
		strong.appendChild(document.createTextNode(message));
		field.parentNode.insertBefore(strong,field.nextSibling);
		if (field.parentNode.tagName=='TD') {
			strong.style.top = (findPosY(field)-strong.clientHeight+5).toString()+'px';
			strong.style.left = (findPosX(field)-(strong.clientWidth-field.clientWidth)/2).toString()+'px';
		}
		else {
			strong.style.top = (findPosY(field)+(field.clientHeight-strong.clientHeight)/2).toString()+'px';
			if (field.type=='radio') {
				strong.style.top = (parseFloat(strong.style.top)-16).toString()+'px';
		}
			strong.style.left = (findPosX(field)+field.clientWidth).toString()+'px';
			strong.style.marginLeft = '30px';
		}
	}
}

function validate() {
	var CHECK_elements = getElementsByClassRX(/^is/);
	for (var i=0;i<CHECK_elements.length;i++)
		if (!CHECK_elements[i].onchange()) {
			CHECK_elements[i].focus();
			window.scrollTo(findPosX(CHECK_elements[i]),findPosY(CHECK_elements[i])-getWindowHeight()/3);
			return false;
		}
	return true;
}

/*
 *
 * Retourne les éléments du DOM par RegExp
 *
 */

function getElementsByRX(rx) {
	var elements = document.body.getElementsByTagName("*");
	var selected_elements = [];
	for (var i=0;i<elements.length;i++)
		if (rx.test(elements[i].id))
			selected_elements.push(elements[i]);
	return selected_elements;
}

function getElementsByClassRX(rx) {
	var elements = document.body.getElementsByTagName("*");
	var selected_elements = [];
	for (var i=0;i<elements.length;i++)
		if (rx.test(elements[i].className))
			selected_elements.push(elements[i]);
	return selected_elements;
}

function getElementsByNameRX(rx) {
	var elements = document.body.getElementsByTagName("*");
	var selected_elements = [];
	for (var i=0;i<elements.length;i++)
		if (rx.test(elements[i].name))
			selected_elements.push(elements[i]);
	return selected_elements;
}

/*
 *
 * Trim
 *
 */

function trim(s) {
	var regExpBeginning = /^\s+/;
	var regExpEnd       = /\s+$/;
	return s.replace(regExpBeginning,"").replace(regExpEnd,"");
}

/*
 *
 * Find absolute position of an element
 *
 */

function findPosX(obj)
{
var curleft = 0;
if(obj.offsetParent)
	while(1) 
	{
	  curleft += obj.offsetLeft;
	  if(!obj.offsetParent)
		break;
	  obj = obj.offsetParent;
	}
else if(obj.x)
	curleft += obj.x;
return curleft;
}

function findPosY(obj)
{
var curtop = 0;
if(obj.offsetParent)
	while(1)
	{
	  curtop += obj.offsetTop;
	  if(!obj.offsetParent)
		break;
	  obj = obj.offsetParent;
	}
else if(obj.y)
	curtop += obj.y;
return curtop;
}

function getWindowHeight() {
	var y = 0;
	if (self.innerHeight) {
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight) {
		y = document.documentElement.clientHeight;
	}
	else if (document.body) {
		y = document.body.clientHeight;
	}
	return y;
}


