/**
 * cache ou affiche un élément
 * @param str : id de l'élément
 */
function displayOrHide(id) {
   if($(id).visible()){
   		$(id).hide();
   }else{
   		$(id).show();
   }
}

/**
 * supprime les espaces en début et en fin de texte
 * @param str : chaîne de caractères
 */
function trim(str) {
   return str.replace(/^\s*|\s*$/g,'');
}

/**
 * retourne les dimensions de la page (navigateur du client)
 */
function getPageSize(){
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}
	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}
	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}

/**
 * contrôle les valeurs obligatoires d'un formulaire
 * @param listElements : liste des champs à contrôler (soit un tableau, soit un élément unique)
 * @param listMessages : liste des messages d'erreurs (soit un tableau, soit un élément unique), correspondant aux éléments à contrôler
 * @usage <form onsubmit="return controlForm( new Array('elem1', 'elem2') , new Array('message1', 'message2') )">
 * @usage pour controler qu'un radio/checkbox aie au moins une valeur sélectionnée parmi plusieurs choix,
 * l'élément 'elem' du premier tableau doit être un Array
 */
function controlForm (listElements, listMessages) {
	// if you give me an item, and not an array; handle this
	if (typeof(listElements)!='object' || listElements.constructor!=Array) {
		listElements = new Array(listElements);
	}
	if (typeof(listMessages)!='object' || listMessages.constructor!=Array) {
		listMessages = new Array(listMessages);
	}
	
	// both arrays' lengths must be the same
	if (listElements.length != listMessages.length) {
		alert('error : wrong number of elements - aborted');
		return false;
	}
	
	for (i=0; i<listElements.length; i++) {
		// here is the solution to handle checkbox and radio : give me an array with possible selected items ! :-D
		if (listElements[i].constructor == Array) {
			var isValue = false;
			for (var j=0; j<listElements[i].length; j++) {
				if (listElements[i][j].checked == true) {
					isValue = true;
				}
			}
			if (!isValue) {
				alert(listMessages[i]);
				return false;
			}
		} else {
			switch (listElements[i].type) {
				case 'text' :
				case 'password' :
				case 'textarea' :
				case 'select-one' :
				case 'select-multiple' :
				case 'file' :
					if (trim(listElements[i].value) == '' || listElements[i].value == '-2') {
						alert(listMessages[i]);
						listElements[i].focus();
						return false;
					}
					break;
				case 'radio' :
					// if you give me a simple radio (for multiple choices, see above)
					if (!listElements[i].checked) {
						alert(listMessages[i]);
						listElements[i].focus();
						return false;
					}
					break;
				case 'checkbox' :
					// if you give me a simple checkbox (for multiple choices, see above)
					if (!listElements[i].checked) {
						alert(listMessages[i]);
						listElements[i].focus();
						return false;
					}
					break;
				case 'hidden' :
					break;
				default :
					// this case should not happen. what sort of element did you give me?
					alert('indéfini : ' + listElements[i].type);
					return false;
					break;
			}
		}
	}
	return true;
}

/**
 * contrôle la longueur maximale d'un textarea
 * @param elem : l'élément textarea
 * @param leng : longueur max autorisée
 * @param indic : numéro de l'indicateur du nombre de caractères restant
 * @usage <textarea onkeyup="maxlength(100)" onkeydown="maxlength(100)"></textarea>
 */
function maxlength (elem, leng, indic) {
	if (elem.value.length>leng) {
		elem.value = elem.value.substring(0, leng);
	}
	document.getElementById(indic).innerHTML = leng - elem.value.length;
}

/**
 * formulaire de validation de message (gestion) : accepter
 */
function validation_accept(formulaire) {
	if (confirm('accepter?')) {
		formulaire.validation_status.value = 'ok';
		formulaire.submit();
	}
}

/**
 * formulaire de validation de message (gestion) : refuser
 */
function validation_refuse(formulaire) {
	if (confirm('refuser?')) {
		formulaire.validation_status.value = 'refused';
		formulaire.submit();
	}
}

/**
 * ajax : connexion distante par javascript
 * http://openweb.eu.org/articles/objet_xmlhttprequest/
 */
function getHTTPObject() {

	var xmlhttp = false;
	/* Compilation conditionnelle d'IE */
	/*@cc_on
	@if (@_jscript_version >= 5)
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
	@end @*/
	
	/* on essaie de créer l'objet si ce n'est pas déjà fait */
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = false;
		}
	}
	return xmlhttp;
}

/**
 * Affiche le texte contenu dans cet element
 */
function getText(node) {
    var res = node.textContent; // w3c
    if (res == null)
	res = node.text; // IE
    return res;
}


/**
 * change le nombre de caractères restants pour un élément de formulaire
 * @param text		élément de formulaire, de type textarea
 * @param len		nombre entier, longueur maximale
 * @param id		string, identifiant du span contenant le nb de carac. max.
 */
function change_textarea_length(text, len, id) {
	var v = len - text.value.length;
	if (v<0) {
		v = 0;
		text.value=text.value.substring(0,len);
	}
	document.getElementById(id).innerHTML = v;
}


// preload et rollover

function preload_img()
{
  var img_list = preload_img.arguments;
  if (document.preloadlist == null) 
    document.preloadlist = new Array();
  var top = document.preloadlist.length;
  for (var i=0; i < img_list.length; i++) {
    document.preloadlist[top+i] = new Image;
    document.preloadlist[top+i].src = img_list[i];
  } 
}

function change_img_src(name, nsdoc, rpath, preload)
{ 
  var img = eval((navigator.appName.indexOf('Netscape', 0) != -1) ? nsdoc+'.'+name : 'document.all.'+name);
  if (name == '')
    return;
  if (img) {
    img.altsrc = img.src;
    img.src    = rpath;
  } 
}

function restore_img_src(name, nsdoc)
{
  var img = eval((navigator.appName.indexOf('Netscape', 0) != -1) ? nsdoc+'.'+name : 'document.all.'+name);
  if (name == '')
    return;
  if (img && img.altsrc) {
    img.src    = img.altsrc;
    img.altsrc = null;
  } 
}


/**
 * affiche un élément progressivement par opacité
 * @param ciblebox						: nom de l'élément à modifier
 * @param opacité						: opacité de départ : [0;100] %
 * @param maximum						: opacité maximale ( <= 100)
 * @param sens							: +1 => apparait, -1 => disparait
 */
function lightbox(ciblebox, opacite, maximum, sens) {
	opacite = parseInt(opacite)+5/parseInt(sens);
	$(ciblebox).style.opacity = (opacite/100);
	$(ciblebox).style.filter = 'alpha(opacity='+opacite+')';
	if (sens == 1 && opacite < maximum) {
		setTimeout("lightbox('"+ciblebox+"', "+opacite+", "+maximum+", "+sens+")",15);
	} else if (sens == -1 && opacite > 0) {
		setTimeout("lightbox('"+ciblebox+"', "+opacite+", "+maximum+", "+sens+")",15);
	}
}

/**
 * pour un champ de formulaire de type checkbox (une ou plusieurs), sélectionne ou désélectionne toutes
 * @param cases							: élément du formulaire
 * @param val							: valeur = true ou false
 */
function selectCases(cases, val) {
	if (cases.length > 1) {
		for (i = 0; i < cases.length; i ++) {
			cases[i].checked = val;
		}
	} else {
		cases.checked = val;
	}
}


/**
 * retourne une liste d'éléments HTML en fonction du nom de leur classe
 */
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\\\s)"+searchClass+"(\\\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


/**
 * méthode pour palier à la mauvaise reconnaissance du getByName de IE
 */
function ByName(tag, element_name){
	var i;
	var result_list = new Array();
	var elements_list = document.getElementsByTagName(tag);
	for(i=0; i<elements_list.length; i++){
		if(elements_list[i].name == element_name){
			result_list[result_list.length] = elements_list[i];
		}
	}
	return result_list;
}

/**
 * efface toutes les radio-box qui portent la même classe que l'id passé en paramètre, sauf celui coché
 * change la couleur de l'entête de la ligne si ok pour ce pos
 */
function updateDispoRadios(id, coche) {
	var i;
	var j;
	var k;
	// liste des colonnes
	if (id) {
		var mylist = getElementsByClass('radio colonne'+id);
		for (i = 0 ; i < mylist.length; i ++) {
			if (mylist[i].name != 'pos_'+coche) {
				mylist[i].checked = false;
			}
		}
	}
	
	// liste des POS
	var nbPosOk = 0;
	for (i = 0; i < listePos.length; i ++) {
		//alert(listePos[i]);
		var entetes = $$('.nomPos'+listePos[i]);
		mypos = ByName('input', 'pos_'+listePos[i]);
		var ok = false;
		for (j = 0; j < mypos.length; j ++) {
			if (mypos[j].checked) {
				
				for (k = 0; k < entetes.length; k ++) {
					entetes[k].className = 'nomPosOk nomPos'+listePos[i];
				}
				
				ok = true;
				nbPosOk ++;
				j = mypos.length;
			}
		}
		if (!ok) {
			for (k = 0; k < entetes.length; k++) {
				entetes[k].className = 'nomPosDefault nomPos'+listePos[i];
			}
		}
	}
	
	if (nbPosOk == listePos.length) {
		document.getElementById('boutonOk').style.display = '';
	} else {
		document.getElementById('boutonOk').style.display = 'none';
	}
	
}

function mousePosition(e) {
	//On repère la position de la souris et on ajuste selon le scroll, de la façon adaptée au navigateur

	if (is_ie6up) {
	    x = event.x + document.documentElement.scrollLeft;
	    y = event.y + document.documentElement.scrollTop;
	} else {
	    x = e.clientX + document.documentElement.scrollLeft;
	    y = e.clientY + document.documentElement.scrollTop;
	}
	
	if (window.innerHeight) {
		wiw = window.innerWidth;
		wih = window.innerHeight;
	} else if (document.documentElement.clientWidth) {
		wiw = document.documentElement.clientWidth;
		wih = document.documentElement.clientHeight;
	} else {
		wiw = document.body.clientWidth;
		wih = document.body.clientHeight;
	}

	if ((e ? e.clientX : event.x) < wiw / 2) {
		x = x + 15;
	} else {
		x = x - document.getElementById('divinfo').offsetWidth - 15;
	}
	if ((e ? e.clientY : event.y) < wih / 2) {
		y = y + 15;
	} else {
		y = y - document.getElementById('divinfo').offsetHeight - 15;
	}

	document.getElementById('helpBox').style.left = x-(document.getElementById('helpBox').style.width)+"px";
	document.getElementById('helpBox').style.top = y-(document.getElementById('helpBox').style.height)+"px";
}

/****************************************************************
 * Display an hidden div at the position of the mouse cursor. 	*
 *																*
 * @params	divId	the html id of the div						*
 * 			content the html content to add.					*
 ****************************************************************/
function displayHiddenDiv (divId, container, content, imgId) {

	var dimensions = $(imgId).cumulativeOffset();
	$(divId).style.left = (dimensions[0]+12)+"px";
	$(divId).style.top = dimensions[1]+"px";

	$(container).update("<p>"+content+"</p>");
	$(divId).show();
	
}

function hideHiddenDiv (divId, container){
	$(divId).hide();
	$(container).update("");
}

/***************************************
 * Modify the security img on the page *
 ***************************************/
function refreshCaptchaImg (imgId){
	var img = document.getElementById(imgId); 
	var sid = Math.random(); 
	img.src = '/checkimage.php?'+sid; 
}


/*********************************************
 * Met en évidence le champs de formulaire 
 * qui a le focus
 *********************************************/
function inputOnFocus(){
	var arrayInputs = new Array();

 	var inputs = document.getElementsByTagName('input');
 	for(var i=0; i<inputs.length; i++){
  		if(inputs[i].type == 'text' || inputs[i].type == 'password') arrayInputs[arrayInputs.length] = inputs[i];
 	}
 	inputs = document.getElementsByTagName('select');
 	for(var i=0; i<inputs.length; i++) arrayInputs[arrayInputs.length] = inputs[i];
 	inputs = document.getElementsByTagName('textarea');
 	for(var i=0; i<inputs.length; i++) arrayInputs[arrayInputs.length] = inputs[i];
 	for(var i=0; i<arrayInputs.length; i++){
  		var onLoad = arrayInputs[i].onfocus
  		$(arrayInputs[i]).observe('focus', function(event){
	   	this.className += (this.className ? ' ' : '')+'onFocus';
  		});
  		
  		arrayInputs[i].onblur = function(){
   		var newClassName = '';
   		var classNames = this.className.split(' ');
   		for(var i=0; i<classNames.length; i++){
    			if(classNames[i] != 'onFocus') newClassName += (newClassName ? ' ' : '')+classNames[i];
   		}
  	 		this.className = (newClassName ? newClassName : '');
  		}
 	}
}
function addEvent(element, event, func){
   if(element.addEventListener) element.addEventListener(event, func, func);
   else element.attachEvent('on'+event, func);
}
window.addEvent(window, 'load', inputOnFocus);
