function in_array(search, myArray) {
	
	if(myArray.length < 1)
		return false;
		
		
	for(var i = 0; i < myArray.length; i++) {
		
		if(myArray[i] == search) 
			return true;	
	}

	return false;
}

function array_diff(tab1, tab2) {
	
	var tabDiff = new Array();
		
	for(var i = 0; i < tab2.length; i++) {
		
		if(in_array(tab2[i] , tab1) == false)
			tabDiff[tabDiff.length] = tab2[i];
	} 
	
	return tabDiff;
}


function checkNumeric(element) {

	myValue = element.value;
	
	var newValue = '';
	myValue.scan(/[0-9,\.]{1}/, function(match) { newValue += match[0];  } );

	return newValue;
}





var Radio = Class.create();

Radio.prototype = {
	
	initialize: function(idGroupe , nb) {
		
		this.idGroupe = idGroupe;
		this.nb = nb;
		
		this.precision = new Array();
		this.precisionCache = new Array();
		
		this.setObserver();
	},
	setObserver: function() {
		
		var _this = this;
		
		for(var i = 1; i <= this.nb; i++) {	
		
			var myElement = $(this.idGroupe + '_' + i);
			
			myElement.observe('click' , function(event) { 
					var myEl = Event.element(event);
					_this.check(myEl); 
 			} );
		}	
	},
	check: function(element) {

		var valueElement = element.value;
		
		for(var i = 0; i < this.precision.length; i++) {
			this.updatePreciser(this.precision[i]);
		}

		
	},
	
	setPrecision: function(numero) {
		
		var _this = this;
		
		for(var j = 0; j < this.setPrecision.arguments.length; j++) {
			
			var numero = this.setPrecision.arguments[j];
			var inputPrecision = $(this.idGroupe + '_' + numero + '_Pr');
			
			if(inputPrecision) {
				this.precision[this.precision.length] = numero;
				
				inputPrecision.observe('keyup' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );		
				inputPrecision.observe('change' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );
				inputPrecision.observe('click' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );				
			}	
		}
	},

	checkPrecision: function(element) {
		
		var boxPrecisionId = element.id;
		var boxId = boxPrecisionId.substring(0 , boxPrecisionId.length - 3);		

		var box = $(boxId);
		var boxPrecision = $(boxPrecisionId);
		
		if(boxPrecision.value != '') {			
			box.checked = true;
			this.check(box);			
		}  
		
	},
	updatePreciser: function(numElement) {
		
		var i = numElement;
		var box = $(this.idGroupe + '_' + i);
		var boxPrecision = $(this.idGroupe + '_' + i + '_Pr');
		
		if(boxPrecision) {
					
			if(box.checked == true && boxPrecision.value == '' && this.precisionCache[numElement] != undefined ) 
				boxPrecision.value = this.precisionCache[numElement];
				
			else if(box.checked == false && boxPrecision.value != '') {
					this.precisionCache[numElement] = boxPrecision.value;
					boxPrecision.value = '';
			}
		}
	}
}



var Checkbox = Class.create();

Checkbox.prototype = {
	
	initialize: function(idGroupe , nb) {
		
		this.idGroupe = idGroupe;
		this.nb = nb;
		this.choixMax = false;
		
		
		this.precision = new Array();
		this.precisionCache = new Array();
		
		this.inverses = new Array();
		
		this.setObserver();
	},
	setObserver: function() {
		
		var _this = this;
		
		for(var i = 1; i <= this.nb; i++) {	
		
			var myElement = $(this.idGroupe + '_' + i);
			
			myElement.observe('click' , function(event) { 
					var myEl = Event.element(event);
					_this.check(myEl); 
 			} );
 			myElement.observe('change' , function(event) { 
					var myEl = Event.element(event);
					_this.check(myEl); 
 			} );
		}		
	},
	setPrecision: function(numero) {
		
		var _this = this;
		
		for(var j = 0; j < this.setPrecision.arguments.length; j++) {
			
			var numero = this.setPrecision.arguments[j];
			var inputPrecision = $(this.idGroupe + '_' + numero + '_Pr');
			
			if(inputPrecision) {
				
				this.precision[this.precision.length] = numero;
				
				inputPrecision.observe('keyup' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );		
				inputPrecision.observe('change' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );
				inputPrecision.observe('click' , function(event) { 
						var myEl = Event.element(event);
						_this.checkPrecision(myEl); 
	 			} );				
			}	
		}
	},
	setInverse: function(groupe1 , groupe2) {
		
		var myGroupe1 = new Array();
		var myGroupe2 = new Array();
		

		if(groupe2 == false) {
			
			for(var i = 1; i <= this.nb; i++) {
			
				if(in_array(i , groupe1) == false)
					myGroupe2[myGroupe2.length] = i;
			}
		
		
		} else
			myGroupe2 = groupe2;
			
		
		myGroupe1 = groupe1;
	
		var indiceCourant = this.inverses.length;
				
		this.inverses[indiceCourant] = new Array();
		this.inverses[indiceCourant]['c'] = myGroupe1;
		this.inverses[indiceCourant]['i'] = myGroupe2;
	},
	setMax: function(max) {
	
		this.choixMax = max;
	},
	check: function(element) {
		
		var numModalite = element.value;
		
		if(this.choixMax != false) {
			
			var nbChecked = 0;
			
			for(var j = 1; j <= this.nb; j++) {
				if($(this.idGroupe + '_' + j).checked == true) 
					nbChecked++;
			}
			
			if(nbChecked >  this.choixMax) {
				$(this.idGroupe + '_' + numModalite).checked = false;
				return;
			}
		}
						
		if(in_array(numModalite, this.precision) == true)
			this.updatePreciser(numModalite);
		
		if(	$(this.idGroupe + '_' + numModalite).checked == true) {
			
			for(var i = 0; i < this.inverses.length; i++) {
		
				if(in_array(numModalite, this.inverses[i]['c'])) 
					this.deselectGroupe(this.inverses[i]['i']);
				else if(in_array(numModalite, this.inverses[i]['i'])) 
					this.deselectGroupe(this.inverses[i]['c']);				
				
			}
		}
	},
	deselectGroupe: function(groupe) {
				
		for(var i = 0; i < groupe.length; i++) {
			$(this.idGroupe + '_' + groupe[i]).checked = false;
			this.check($(this.idGroupe + '_' + groupe[i]));
		}				
	
	},
	checkPrecision: function(element) {
		
		var boxPrecisionId = element.id;
		var boxId = boxPrecisionId.substring(0 , boxPrecisionId.length - 3);		

		var box = $(boxId);
		var boxPrecision = $(boxPrecisionId);
		
		if(boxPrecision.value != '') {			
			box.checked = true;
			this.check(box);			
		}  
		
	},
	updatePreciser: function(numElement) {
		
		var i = numElement;
		var box = $(this.idGroupe + '_' + i);
		var boxPrecision = $(this.idGroupe + '_' + i + '_Pr');
		
		if(boxPrecision) {
					
			if(box.checked == true && boxPrecision.value == '' && this.precisionCache[numElement] != undefined ) 
				boxPrecision.value = this.precisionCache[numElement];
				
			else if(box.checked == false && boxPrecision.value != '') {
			
					this.precisionCache[numElement] = boxPrecision.value;
					boxPrecision.value = '';
			}
		}
	}
}


var SelectMultiple = Class.create();

SelectMultiple.prototype = {
	
	initialize: function(idGroupe , nb) {
		
		this.idGroupe = idGroupe;
		this.nb = nb;
		this.choixMax = false;
		this.selected = new Array();
		
		this.setObserver();
	},
	setObserver: function() {
		
		var _this = this;
		
		var myElement = $(this.idGroupe);

 		myElement.observe('change' , function() { 
				_this.check(); 
 		});
	},
	setMax: function(max) {
		this.choixMax = max;
	},
	check: function() {
		
		var currentElements = new Array();
	
		for(var i = 1; i <= this.nb; i++) {
			
			if($(this.idGroupe + '_' + i).selected == true) {
			
				currentElements[currentElements.length] = i;	
			}
			else if(this.selected.indexOf(i) != -1)
					this.selected = this.selected.without(i);
				
		}
		
		var nouveaux = array_diff(this.selected, currentElements);
				
		if(this.choixMax != false && (this.selected.length + nouveaux.length) > this.choixMax) {
			
			var exces = (this.selected.length + nouveaux.length) - this.choixMax ;
			var temp_nouveaux = nouveaux;

			for(var i = 0; i < exces; i++) {
				
				$(this.idGroupe + '_' + nouveaux[i]).selected = false;
				temp_nouveaux = temp_nouveaux.without(nouveaux[i]);
			}
			nouveaux = temp_nouveaux;
		}
		
		for(var j = 0; j < nouveaux.length; j++) 
			this.selected[this.selected.length] = nouveaux[j];	
		
	}
}







 
var Classement_Saisie = Class.create();

Classement_Saisie.prototype = {
	
	initialize: function(idGroupe , nb) {
		
		this.idGroupe = idGroupe;
		this.nb = nb;
		this.max = this.nb;
		
		this.setObserver();
		
		this.valeurs = new Array();
		
		for(var i = 1; i <= this.nb; i++) 
			this.valeurs[i] = $(this.idGroupe + '_' + i).value;
		
		
	},
	setMax: function(maximum) {
	
		this.max = maximum;
	},
	setObserver: function() {
		
		var _this = this;
		
		for(var i = 1; i <= this.nb; i++) {
			
			var myElement = $(this.idGroupe + '_' + i);
			
			myElement.observe('keyup' , function(event) { 
						var myEl = Event.element(event);
						_this.checkElement(myEl);
				 } );
			myElement.observe('change' , function(event) { 
						var myEl = Event.element(event);
						_this.checkElement(myEl);
				 } );		
		}
	},
	checkElement: function(myElement) {
	
		newValue = checkNumeric(myElement);

		if(newValue != '' && (parseInt(newValue) < 1 || parseInt(newValue) > this.max) )
				newValue = '';

		if(newValue != '' && !this.checkDoublon(myElement)) {
			newValue = '';
		}
		
		myElement.value =  newValue;
	},
	checkDoublon: function(element) {
		
		for(var i = 1; i <= this.nb; i++) {
			
			var myElement = $(this.idGroupe + '_' + i);
			if(myElement.id == element.id) continue;
				
			if(myElement.value == element.value) 
				return false;
		
		}
	
		return true;	
	},
	getInputByValue: function(myValue) {
	
		for(var i = 1; i <= this.nb; i++) {
			
			var myElement = $(this.idGroupe + '_' + i);
			
			if(myElement.value == myValue) 
				return myElement;		

		}		
	
		return false;
	}
}	

var Classement_Select = Class.create();

Classement_Select.prototype = {
	
	initialize: function(idGroupe , nb) {
		
		this.idGroupe = idGroupe;
		this.nb = nb;
		this.max = this.nb;
		
		this.setObserver();
		
	},
	setMax: function(maximum) {
		this.max = maximum;
	},
	setObserver: function() {
		
		var _this = this;
	
		for(var i = 1; i <= this.nb; i++) {
			
			var myElement = $(this.idGroupe + '_' + i);
			
			myElement.observe('change' , function(event) { 
						var myEl = Event.element(event);
						_this.checkElement(myEl);
			} );		
		}
	},
	initialiseElement: function() {
	
		for(var i = 1; i <= this.nb; i++) {
			
			var currentSelect = $(this.idGroupe + '_' + i);
		
			if(currentSelect.value != '')
				this.checkElement(currentSelect);
		}
		
	},
	checkElement: function(myElement) {
	
		newValue = myElement.value;


		if(newValue != '')
			this.chooseOption(myElement , newValue);
		
		for(var i = 1; i <= this.max; i++) {
			
			if(!this.isSelected(i))
				this.restoreOption(i);		
		}
		
		return true;
	},
	chooseOption: function(select , option) {
		
		for(var i = 1; i <= this.nb; i++) {
			
			var currentSelect = $(this.idGroupe + '_' + i);
			
			if(currentSelect.id == select.id)
				continue;
				
			this.removeOption(currentSelect , option);
		}
	
		return true;
	
	},
	restoreOption: function(option) {
		
		for(var i = 1; i <= this.nb; i++) {
			
			var currentSelect = $(this.idGroupe + '_' + i);
			
			if(!this.inSelect(currentSelect , option))
				this.addOption(currentSelect , option);
		
		}
		
		return true;		
	},
	removeOption: function(select , value) {
		
		if(this.inSelect(select , value)) {
		
			var options = select.childNodes;
			
			for(var i = 0; i < 	options.length; i++) {
			
				if(options[i].value == value) {
					select.removeChild(options[i])
					break;
				}
			}				
		}	
	
		return true;
	},
	addOption: function(select , value) {
	
		var myOption = document.createElement('option');
			myOption.setAttribute('value' , value);
			
		var texte = document.createTextNode(value);
			myOption.appendChild(texte);
			
		var listeOptions = select.childNodes;
		var insert = false;
		
		for(var i = 0; i < listeOptions.length ; i++) {
		
			if(listeOptions[i].value > value) {
				select.insertBefore(myOption , listeOptions[i]);
				insert = true;
				break;
			} 
		}
		
		if(!insert) 
			select.appendChild(myOption);			
		
		return true;
	},
	isSelected: function(option) {
	
		for(var i = 1; i <= this.nb; i++) {
			
			var currentSelect = $(this.idGroupe + '_' + i);
			
			if(currentSelect.value == option) 
				return true;
		}
		
		return false;		
		
	},	
	inSelect: function(select , myOption) {
	
		var options = select.childNodes;
		
		for(var i = 0; i < options.length; i++) {
			
			if(options[i].value ==  myOption)
				return true;	
		}		
		
		return false;
	}
}	



var Matrice_Radio = Class.create();

Matrice_Radio.prototype = {
	
	initialize: function(idGroupe , nbEchelles, nbModalites, classHoover, classChecked) {
		
		this.idGroupe = idGroupe;
		this.nbEchelles = nbEchelles;
		this.nbModalites = nbModalites;
		this.classHoover = classHoover;
		this.classChecked = classChecked;
		
					
		this.setObserver();
		
	},
	
	setObserver: function() {
	
		var _this = this;
		
		for(var i = 1; i <= this.nbModalites; i++) {
			
			for(var j = 1; j <= this.nbEchelles; j++) {
				
				var myCell = $(this.idGroupe + 'M' + i + '_' + j);
				var parentCell = myCell.parentNode;
				
				if(this.classHoover) {
					Element.observe(parentCell, 'mouseover' , function(event) { 
								var myEl = Event.findElement(event , 'TD');
								_this.onMouse(myEl);
					} );
		
					Element.observe(parentCell, 'mouseout' , function(event) { 
								var myEl = Event.findElement(event , 'TD');
								_this.outMouse(myEl);
					} );
				}
				
				
				Element.observe(parentCell, 'click' , function(event) { 
							var myEl = Event.findElement(event , 'TD');
							_this.clickMouse(myEl);
				} );											
			}
		
		}
		
		return true;	
	},
	onMouse: function(element) {
	
		Element.addClassName(element , this.classHoover);

		return true;
	},
	outMouse: function(element) {
		
		Element.removeClassName(element , this.classHoover);
		
		return true;
	},
	clickMouse: function(element) {

		var myRadio = element.getElementsByTagName('INPUT')[0];
		
		myRadio.checked = true;
		
		if(this.classChecked) {
			this.updateModaliteStyle(element);
			Element.addClassName(element , this.classChecked);		
		}
		
		return true;		
	},
	updateModaliteStyle: function(element) {
		
		var myTr = element.parentNode;
		var listeTd = Element.immediateDescendants(myTr);
		
		for(var i = 0; i < listeTd.length; i++) {
		
			if(Element.hasClassName(listeTd[i] , this.classChecked))
				Element.removeClassName(listeTd[i] , this.classChecked);
		}
		
		return true;		
	},
	setDefaut: function(valeurs) {
	
		if(this.classChecked) {
		
			for(var i = 0; i < this.setDefaut.arguments.length; i++) {
			
				var myArg = this.setDefaut.arguments[i];
				var myRadio = $(this.idGroupe + 'M' + myArg[0] + '_' + myArg[1]);
				var myCell = myRadio.parentNode;
				
				Element.addClassName(myCell , this.classChecked);
			}
		}
	}


}










var Matrice_Checkbox = Class.create();

Matrice_Checkbox.prototype = {
	
	initialize: function(idGroupe , nbEchelles, nbModalites, classHoover, classChecked) {
		
		this.idGroupe = idGroupe;
		this.nbEchelles = nbEchelles;
		this.nbModalites = nbModalites;
		this.classHoover = classHoover;
		this.classChecked = classChecked;
		
					
		this.setObserver();
		
	},
	
	setObserver: function() {
	
		var _this = this;
		
		for(var i = 1; i <= this.nbModalites; i++) {
			
			for(var j = 1; j <= this.nbEchelles; j++) {
				
				var myCell = $(this.idGroupe + 'M' + i + '_' + j);
				var parentCell = myCell.parentNode;
				
				if(this.classHoover) {
					Element.observe(parentCell, 'mouseover' , function(event) { 
								var myEl = Event.findElement(event , 'TD');
								_this.onMouse(myEl);
					} );
		
					Element.observe(parentCell, 'mouseout' , function(event) { 
								var myEl = Event.findElement(event , 'TD');
								_this.outMouse(myEl);
					} );
				}
				
				
				Element.observe(parentCell, 'click' , function(event) { 
							_this.clickMouse(event);
							
				} );											
			}
		
		}
		
		return true;	
	},
	onMouse: function(element) {
	
		Element.addClassName(element , this.classHoover);

		return true;
	},
	outMouse: function(element) {
		
		Element.removeClassName(element , this.classHoover);
		
		return true;
	},
	clickMouse: function(event) {
		
		var element = Event.findElement(event , 'TD');
		var tagElement = Event.element(event).tagName;
		
		var myCheckbox= element.getElementsByTagName('INPUT')[0];
							
		if(tagElement == 'TD') {

			if(!myCheckbox.checked) {
				myCheckbox.checked = true;
				Element.addClassName(element , this.classChecked);
			}
			else {
				myCheckbox.checked = false;
				Element.removeClassName(element , this.classChecked);
			}		
		
		
		} else {
		
			var myCheckbox= element.getElementsByTagName('INPUT')[0];
			
			if(myCheckbox.checked) {
				myCheckbox.checked = true;
				Element.addClassName(element , this.classChecked);
			}
			else {
				myCheckbox.checked = false;
				Element.removeClassName(element , this.classChecked);
			}		
		}
		
		return true;		
	},
	updateModaliteStyle: function(element) {
		
		var myTr = element.parentNode;
		var listeTd = Element.immediateDescendants(myTr);
		
		for(var i = 0; i < listeTd.length; i++) {
		
			if(Element.hasClassName(listeTd[i] , this.classChecked) && element.checked == false)
				Element.removeClassName(listeTd[i] , this.classChecked);
		}
		
		return true;		
	},
	setDefaut: function(valeurs) {
	
		if(this.classChecked) {
		
			for(var i = 0; i < this.setDefaut.arguments.length; i++) {
			
				var myArg = this.setDefaut.arguments[i];
				
				for(var j =0; j < myArg[1].length; j++) {
					
					var myCheckbox = $(this.idGroupe + 'M' + myArg[0] + '_' + myArg[1][j]);
					var myCell = myCheckbox.parentNode;
							
					Element.addClassName(myCell , this.classChecked);
				}

			}
		}
	}	


}





var Numerique = Class.create();


Numerique.prototype = {
	
	initialize: function(idElement) {
		
		this.element = $(idElement);
		this.min = false;
		this.max = false;
			
		this.setObserver();
	},
	
	setObserver: function() {
		
		var _this = this;

		
		Element.observe(this.element , 'change', function(event) { _this.check(event.findElement('INPUT')); } );
		Element.observe(this.element , 'keyup', function(event) { _this.check(event.findElement('INPUT')); } );
		Element.observe(this.element , 'keypress', function(event) { _this.check(event.findElement('INPUT')); } );
	},
	
	check: function(element) {
		
		element.value = checkNumeric(element);
	},
	
	setMin: function(val) {
	
	
	},
	
	setMax: function(val) {
	
	
	}
}
	
	


var Matrice_Ouverte_Numerique = Class.create();

Matrice_Ouverte_Numerique.prototype = {
	
	initialize: function(idGroupe , nbItems) {
		
		this.idGroupe = idGroupe;
		this.nbItems = nbItems;
		
		this.listeObjets = [];
		
		this.setObserver();

	},
	
	setObserver: function() {
	
		var _this = this;
		
		for(var i = 1; i <= this.nbItems; i++) {
					
			this.listeObjets[i] = new Numerique( this.idGroupe + '_' + i);
		}
		
		
		return true;	
	},
	onMouse: function(element) {
	
		Element.addClassName(element , this.classHoover);

		return true;
	},
	outMouse: function(element) {
		
		Element.removeClassName(element , this.classHoover);
		
		return true;
	},
	clickMouse: function(element) {

		var myRadio = element.getElementsByTagName('INPUT')[0];
		
		myRadio.checked = true;
		
		if(this.classChecked) {
			this.updateModaliteStyle(element);
			Element.addClassName(element , this.classChecked);		
		}
		
		return true;		
	},
	updateModaliteStyle: function(element) {
		
		var myTr = element.parentNode;
		var listeTd = Element.immediateDescendants(myTr);
		
		for(var i = 0; i < listeTd.length; i++) {
		
			if(Element.hasClassName(listeTd[i] , this.classChecked))
				Element.removeClassName(listeTd[i] , this.classChecked);
		}
		
		return true;		
	},
	setDefaut: function(valeurs) {
	
		if(this.classChecked) {
		
			for(var i = 0; i < this.setDefaut.arguments.length; i++) {
			
				var myArg = this.setDefaut.arguments[i];
				var myRadio = $(this.idGroupe + 'M' + myArg[0] + '_' + myArg[1]);
				var myCell = myRadio.parentNode;
				
				Element.addClassName(myCell , this.classChecked);
			}
		}
	},

	setMin: function(val) {
	
	
	},
	
	setMax: function(val) {
	
	
	}
}


var Matrice_Ouverte_Texte = Class.create();

Matrice_Ouverte_Texte.prototype = {
	
	initialize: function(idGroupe , nbitems) {
	
	}
	
}





/*       */


function initialisationQuestionnaire() {

	var listeAides = document.getElementsByClassName('question-header-aide');
	
	for(var i=0; i < listeAides.length; i++) {
		
		var parent = listeAides[i].parentNode;
		
		var icone = document.createElement('IMG');
			icone.src = '/images/module_questionnaire/iconeAide.jpg';
			icone.className = 'iconeAide';
			
		Element.observe(icone, 'click' , function(event) { 
				viewAide(event); 
		} );
		
		Element.setStyle(icone, {
			right:Element.positionedOffset(parent).left + Element.getWidth(parent) + 'px',
			top:'0px'
		});
			
		
									
		parent.insertBefore(icone ,  parent.firstChild);
				
		listeAides[i].hide();
	}
	

}


function viewAide(event) {

	var icone = Event.element(event)
	var parentIcone = icone.parentNode;
	var zoneTexte = Element.getElementsByClassName(parentIcone , 'question-header-aide')[0];
	
	Element.setStyle(parentIcone , {position:"relative"} );
	
	var rightPx = Element.getWidth(icone);
	var topPx = Element.getHeight(icone);
	
	zoneTexte.setStyle({
			zindex:'100',
			position: 'absolute',
			right : rightPx + 'px',
			top : topPx + 'px'
		});
			


	zoneTexte.show();
	
	Event.stop(event);
	
	Element.observe(document, 'click', function(event) { 
		if(Event.element(event) == zoneTexte) return false;
		hideAide(zoneTexte); 	
	 });
	Element.observe(window, 'resize', function(event) { 
		
		hideAide(zoneTexte); 	
	 });	
}

function hideAide(zoneTexte) {
	
	var parentIcone = zoneTexte.parentNode;
	var icone = Element.getElementsByClassName(parentIcone , 'iconeAide')[0];
		
	Element.setStyle(parentIcone , {position:"static"} );
	
	Element.hide(zoneTexte);

}








