function trim(string){
	return string.replace(/(^\s*)|(\s*$)/g,'');
}

//Permet de cocher/décocher une checkbox
function checked(id){
	var checkbox= document.getElementById(id);
	checkbox.checked= !checkbox.checked;
}

function MouseOver(tr, mode)
	{
		var temp;
		if(tr.className!='listitemselected')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'listitemhover';
			}
			else 
				tr.className = 'listitem';
		}
	}
	 
	/**
	 */
	function MouseOverMenu(tr, mode)
	{
		if(tr.className != 'listitemselected')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'menuitemhover';
			}
			else 
				tr.className = temp;
		}
	}
	
	function MouseOverSensible(tr, mode)
	{
		var temp;
		if(tr.className!='listitemselectedsensible')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'listitemhoversensible';
			}
			else 
				tr.className = 'listitemsensible';
		}
	}
	 
	/**
	 */
	function MouseOverMenuSensible(tr, mode)
	{
		if(tr.className != 'listitemsensible')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'listitemhoversensible';
			}
			else 
				tr.className = temp;
		}
	}
	
	function MouseOverTache(tr, mode)
	{
		var temp;
		if(tr.className!='listitemrespselected')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'listitemresphover';
			}
			else 
				tr.className = 'listitemresp';
		}
	}
	 
	/**
	 */
	function MouseOverMenuTache(tr, mode)
	{
		if(tr.className != 'listitemresp')
		{
			if(mode == 0)
			{
				temp = tr.className;
				tr.className = 'listitemresphover';
			}
			else 
				tr.className = temp;
		}
	}
	
	 function MouseOverAll(tr, mode){
	 	
	 		var temp;
	 		if(tr.className == null || tr.className == ''){
	 			return;
	 		}
			if(tr.className=='listitem' || tr.className=='listitemhover' || tr.className=='listitemselected')
			{
				if(tr.className!='listitemselected'){ 
					if(mode == 0)
					{
						temp = tr.className;
						tr.className = 'listitemhover';
					}
					else 
						tr.className = 'listitem';
					}
			}
			else if(tr.className=='listitemsensible' || tr.className=='listitemhoversensible' || tr.className =='listitemselectedsensible')
			{
				if(tr.className !='listitemselectedsensible'){
					if(mode == 0)
					{
						temp = tr.className;
						tr.className = 'listitemhoversensible';
					}
					else 
						tr.className = 'listitemsensible';
				}
			}
			else if(tr.className=='listitemresp' || tr.className=='listitemresphover' || tr.className =='listitemrespselected')
			{
				if(tr.className!='listitemrespselected'){
					if(mode == 0)
					{
						temp = tr.className;
						tr.className = 'listitemresphover';
					}
					else 
						tr.className = 'listitemresp';
				}
			}
			else if(tr.className=='listheaderbig' || tr.className=='listheaderbighover')
			{
				if(mode == 0)
				{
					temp = tr.className;
					tr.className = 'listheaderbighover';
				}
				else 
					tr.className = 'listheaderbig';
			}
			else{
			  var tmp= tr.className;
			  var cle= "Selected";
			  var index= tmp.lastIndexOf(cle);
			  if(index < 0 || index+cle.length != tmp.length) 
				{
					if(mode == 0)
					{
						temp = tr.className;
						tr.className = tmp+'Hover';
					}
					else {
						cle= "Hover";
						index= tmp.lastIndexOf(cle);
						if(index > 0)
							tr.className = tmp.substring(0, index);
					}
				}
			}
		}

	/**
	 */
	function openForm(all)
	{
		document.forms[0].ALL.value = all;
		document.forms[0].submit();	
	}

	/**
	 */
	function resetSelectedClass(element){
		if(element.className == null)
			return;
		if(element.className == 'listitemselected')
	  	element.className = 'listitem';
	  else if(element.className == 'listitemselectedsensible')
	   	element.className = 'listitemsensible';
	  else{
	   	var index= element.className.indexOf("Selected");
	   	if(index > 0)
	   		element.className= element.className.substring(0, index);
	  }
	}
	
	function selectItem(element){
		if(element.className == 'listitemhover')
	  	element.className = 'listitemselected';
	  else if(element.className == 'listitemhoversensible')
	  	element.className = 'listitemselectedsensible';
		else if(element.className == 'listitem')
		  element.className = 'listitemselected';
		else if(element.className == 'listitemsensible')
	  	element.className = 'listitemselectedsensible';	
		else if(element.className == 'listitemresphover')
	  	element.className = 'listitemrespselected';
	  else if(element.className == 'listitemresp')
	  	element.className = 'listitemrespselected';
		
	  else{
	  	var index= element.className.lastIndexOf('Hover');
	  	if(index < 0)
	  		index= element.className.length;
	  	element.className = element.className.substring(0, index)+'Selected';
	  }
	}
	
	function deSelectItem(element){
		if(element.className == 'listitemselected')
		  	element.className = 'listitem';
		else if(element.className == 'listitemselectedsensible')
		  	element.className = 'listitemsensible';
		else if(element.className == 'listitemrespselected')
			element.className = 'listitemresp';
		else{
		  	var index= element.className.lastIndexOf('Selected');
		  	if(index < 0)
		  		index= element.className.length;
		  	element.className = element.className.substring(0, index);
		  }
	}

	
	function openFormAndSelect(tableId, tr, all)
	{
	  table = document.getElementById(tableId);
	  for(var i=0; i < table.rows.length; i+=1){
	    var row= table.rows[i];
	    resetSelectedClass(row);
	    for(var j=0; j < row.cells.length; j+=1){
	    	resetSelectedClass(row.cells[j]);
	    }
	  }
	  selectItem(tr);
	  for(var j=0; j < tr.cells.length; j+=1){
	    	selectItem(tr.cells[j]);
	  }
		tmpForm.ALL.value = all;
		tmpForm.submit();	
	}
	
	function openFormAndSelectInOtherTarget(tableId, tr, all, target)
	{
	  table = document.getElementById(tableId);
	  for(var i=0; i < table.rows.length; i+=1){
	    var row= table.rows[i];
	    resetSelectedClass(row);
	    for(var j=0; j < row.cells.length; j+=1){
	    	resetSelectedClass(row.cells[j]);
	    }
	  }
	  selectItem(tr);
	  for(var j=0; j < tr.cells.length; j+=1){
	    	selectItem(tr.cells[j]);
	  }
	  var form = document.getElementById("tmpFormTarget");
	  form.target = target;
		form.ALL.value = all;
		form.submit();	
	}
	
	

	/**
	 */
	function fillParams(aForm, param, paramName)
  	{
    	aForm["params"].value = paramName + "=" + aForm[param].value;
    	aForm.submit();
  	}

	/**
	 */
  	function comboChange(combo)
	{
  		if(combo.value == "")
    		return;
  		var all = combo.value;
  		openForm(all);
	}
	
    var sender;
   function loadXMLDoc(url,test,comment) 
   {   
      if (window.XMLHttpRequest) 
      {
       sender = new XMLHttpRequest();             
      } 
      else if (window.ActiveXObject) 
      {
          sender = new ActiveXObject("Microsoft.XMLHTTP");          
      }
       
      sender.open("POST", url, true);
      sender.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//      Cause de gros problèmes de lenteur sous IE6
//      sender.setRequestHeader("Connection", "close");
      sender.onreadystatechange = processSenderChange;  
      sender.send("comment=" + encodeURI(comment)+"&numpat="+encodeURI(numPat)); 
     }

    function processSenderChange() 
   {       
       if (sender.readyState == 4) 
      {
           if (sender.status == 200) 
           {
             response  = sender.responseXML.documentElement;
             result    = response.getElementsByTagName('result')[0].firstChild.data;
              result = unescape(result);         
              if(result=="OK"){ 
               cachePopup();
	               if(!tbl){                   
	               		parent.content.location.href=patURL  
	               }else{
	              	 	openFromTbl();
	               }
              }else{ 
                alert(result);  
              } 
            } 
           else 
           {        
          }
       }
    }  
	
	function openCloseArbre(img, idContenaire){
		var contenaire= document.getElementById(idContenaire);
		
		if(img.src.indexOf('+') > 0){
			img.src= img.src.replace('+','-');
			contenaire.style.display= '';
		}
		else{
			img.src= img.src.replace('-','+');
			contenaire.style.display= 'none';
		}
	}
    
     
      //***************************************************************************************
    //************************TRI D'UN TABLEAU HTML *****************************************



var _Index;
var _aHtml;
var _aText;
var _aStyle;
var _aOnClick;


/**
* Fonction permettant initialiser les listeners sur des 
* header des tableaux triables
*/
function initSortListener() { 
	var spans = document.getElementsByTagName("SPAN");
	for(var i = 0; spans != null && i < spans.length; i++){
		var span = spans[i];
		if(span.title == 'tri'){
			//FireFox
			if (span.addEventListener){
			  span.addEventListener('click', clicked, false);
			} 
			//IE
			else if (span.attachEvent) {
			  span.attachEvent('onclick', clicked);
			}	
		}
	 }
} 

// Dir   1: Croissant, -1: Décroissant
function SortArray(aText,aHtml,aStyle,aOnClick,Index,Order){

	_aText = aText;
	_Index = Index;
	_aHtml = aHtml;
	_aStyle = aStyle;
	_aOnClick = aOnClick;
	
    quicksort(0, aText[0].length, (Order == -1)) 
}

function exchange(i, j) { 
		
	for (z=0; z < _aText.length; z++){            //    Mise a jour des tableaux
	    Copy = _aText[z][j]; _aText[z][j] = _aText[z][i]; _aText[z][i] = Copy
	    Copy = _aHtml[z][j]; _aHtml[z][j] = _aHtml[z][i]; _aHtml[z][i] = Copy
	             
	     if(z==0){
	        Copy = _aStyle[j+1]; _aStyle[j+1] = _aStyle[i+1]; _aStyle[i+1] = Copy
	        Copy = _aOnClick[j+1]; _aOnClick[j+1] = _aOnClick[i+1]; _aOnClick[i+1] = Copy
	    }
	}
}

function compare(val1, val2, desc) { 
	return (desc) ? val1 > val2 : val1 < val2; 
}

function get(i){
	return _aText[_Index][i]; 
}

function quicksort(m, n, desc) 
{ 
	if(n <= m+1) 
		return; 
	if((n - m) == 2) { 
		if(compare(get(n-1), get(m), desc)) 
			exchange(n-1, m); return; 
	} 
	i = m + 1; 
	j = n - 1; 
	if(compare(get(m), get(i), desc)) 
		exchange(i, m);
	if(compare(get(j), get(m), desc)) 
		exchange(m, j);
	if(compare(get(m), get(i), desc)) 
		exchange(i, m); pivot = get(m);
	
	while(true) { 
		j--; 
		while(compare(pivot, get(j), desc)) 
			j--; 
		i++; 
		while(compare(get(i), pivot, desc)) 
			i++; 
			
		if(j <= i) 
			break; 
			
		exchange(i, j); 
	} 
	exchange(m, j); 
	if((j-m) < (n-j)) { 
		quicksort(m, j, desc); 
		quicksort(j+1, n, desc); 
	} else { 
		quicksort(j+1, n, desc); 
		quicksort(m, j, desc); 
	} 
} 

 //    retourne true si c'est une date valide
function IsDate(sDate){   
	var regex=new RegExp("^[0-9]{1,2}[/]{1}[0-9]{1,2}[/]{1}[0-9]{4}$","g");
	if(sDate!="" && !regex.exec(sDate)){
		return false;
	}
  var iDay = sDate.substring(0,2)
  var iMonth = sDate.substring(3,5)
  var iYear = sDate.substring(6)
  iDay = iDay*1
  iMonth = (iMonth*1)-1
  iYear = iYear*1
  var rDate = new Date(iYear,iMonth,iDay,0,0)
  if(rDate.toString() == "NaN"){
  	return false
  }
  return true
}
//    Convertie une date du format JJ/MM/AAAA en date JavaScript
function cDate(sDate){    
    var iDay = sDate.substring(0,2)
    var iMonth = sDate.substring(3,5)
    var iYear = sDate.substring(6)
    iDay = iDay*1
    iMonth = (iMonth*1)-1
    iYear = iYear*1
    var rDate = new Date(iYear,iMonth,iDay,0,0)
    return(rDate)
}

function convertStringToObj(val){
	
	if(IsDate(val)){
		return cDate(val);
	}		
	try{
		if(parseFloat(val) == val) {
			return parseFloat(val); 
		}
	}catch(e){}
	try{ 	
		return val.toUpperCase(); 	
	}
	catch(e){}
	return val; 	
}

 
function clicked(ObjE){
	var flag = (window.Event)? true : false;
	var nid = (flag)? ObjE.target : window.event.srcElement;
	if(nid.title=="tri"){
		TableOrder(nid, nid.id);
	}
}

function getColATrie(oTable, oCell){
	//    determine l'objet table parent
	var index = -1
	for (c=0; c<oTable.rows[0].cells.length; c++){
		if (oTable.rows[0].cells[c]==oCell){
			index=c
		}
	}    //    determine l'index de la cellule
		
	return index;
}

// Dir   1: Croissant, -1: Décroissant
function TableOrder(oCell, Dir){    
	var flag = (window.Event)? true : false;
	
	//Firefox, Netscape
	if(flag){
	
		while (oCell.tagName != "TD"){oCell = oCell.parentNode}    //    determine la cellule sélectionnée
		var oTable = oCell.parentNode
		while (oTable.tagName != "TABLE"){oTable = oTable.parentNode}    //    determine l'objet table parent
		var index = getColATrie(oTable, oCell);
		var RowNb = 0
		var aHtmlTable = new Array()                    //    Tableau de contenu HTML
		var aTextTable = new Array()                    //    Tableau de valeur
		var aStyleTable = new Array()  		              //    Tableau des styles
		var aOnclickTable= new Array()									//		Tableau des Onclick
		for (c=0; c<oTable.rows[0].cells.length; c++){    //    sur toutes les cellules
			var ColonneHtml = new Array()
			var ColonneText = new Array()
			var RowNb = 0
			for (r=0; r<oTable.rows.length; r++){        //    de toutes les rangées nommées "TableDatas"
				if (oTable.rows[r].id == "TableDatas"){
					ColonneHtml[RowNb] = oTable.rows[r].cells[c].innerHTML    //    met a jour le tableau de colonne correspondant
					if(c == index)
						ColonneText[RowNb] = convertStringToObj(oTable.rows[r].cells[c].innerHTML);
					else
						ColonneText[RowNb] = oTable.rows[r].cells[c].innerHTML;
					RowNb++
				}
			}
			aHtmlTable[c] = ColonneHtml
			aTextTable[c] = ColonneText

			for (a=0; a<ColonneHtml.length; a++){aHtmlTable[c][a]=ColonneHtml[a]}
			for (a=0; a<ColonneText.length; a++){aTextTable[c][a]=ColonneText[a]}
		}
		
		for(r=0; r<oTable.rows.length; r++){
			aStyleTable[r] = oTable.rows[r].className
			aOnclickTable[r]= oTable.rows[r].onclick
		}
		RowNb=0
		SortArray(aTextTable,aHtmlTable,aStyleTable,aOnclickTable,index,Dir)    //    Tri des données
		for (x=0; x<oTable.rows[0].cells.length; x++){    //    Remplacement des données dans le tableau HTML
			RowNb=0
			for (y=0; y<oTable.rows.length; y++){
				//alert(oTable.rows[y].className);
				if (oTable.rows[y].id == "TableDatas"){
					oTable.rows[y].cells[x].innerHTML= aHtmlTable[x][RowNb]
					RowNb++
				}
			}
		}
		for(r=0; r<oTable.rows.length; r++){
			oTable.rows[r].className= aStyleTable[r]
			oTable.rows[r].onclick= aOnclickTable[r]
		}
		
		//IE
	}else{
	
		while (oCell.tagName != "TD"){
			oCell = oCell.parentElement
		}    //    determine la cellule sélectionnée
		var oTable = oCell.parentElement
		while (oTable.tagName != "TABLE"){
			oTable = oTable.parentElement
		} 
		var index = getColATrie(oTable, oCell);
		var RowNb = 0
		var aHtmlTable = new Array()                    //    Tableau de contenu HTML
		var aTextTable = new Array()                    //    Tableau de valeur
		var aStyleTable = new Array()                   //    Tableau des styles
		var aOnclickTable= new Array()									//		Tableau des Onclick
		
		for (c=0; c<oTable.rows[0].cells.length; c++){    //    sur toutes les cellules
			var ColonneHtml = new Array()
			var ColonneText = new Array()
			var RowNb = 0
			for (r=0; r<oTable.rows.length; r++){        //    de toutes les rangées nommées "TableDatas"
				if (oTable.rows[r].id == "TableDatas"){
					ColonneHtml[RowNb] = oTable.rows[r].cells[c].innerHTML    //    met a jour le tableau de colonne correspondant
					if(c == index)
						ColonneText[RowNb] = convertStringToObj(oTable.rows[r].cells[c].innerText);
					else
						ColonneText[RowNb] = oTable.rows[r].cells[c].innerText;
					RowNb++
				}
			}
			aHtmlTable[c] = ColonneHtml
			aTextTable[c] = ColonneText
			for (a=0; a<ColonneHtml.length; a++){
				aHtmlTable[c][a]=ColonneHtml[a]
			}
			for (a=0; a<ColonneText.length; a++){
				aTextTable[c][a]=ColonneText[a]
			}
		}
		for(r=0; r<oTable.rows.length; r++){
			aStyleTable[r] = oTable.rows[r].className
			aOnclickTable[r]= oTable.rows[r].onclick
		}
		RowNb=0
		SortArray(aTextTable,aHtmlTable,aStyleTable,aOnclickTable,index,Dir)    //    Tri des données
		for (x=0; x<oTable.rows[0].cells.length; x++){    //    Remplacement des données dans le tableau HTML
			RowNb=0
			for (y=0; y<oTable.rows.length; y++){
				if (oTable.rows[y].id == "TableDatas"){
					oTable.rows[y].cells[x].innerHTML= aHtmlTable[x][RowNb]
					RowNb++
				}
			}
		}
		for(r=0; r<oTable.rows.length; r++){
			oTable.rows[r].className= aStyleTable[r]
			oTable.rows[r].onclick= aOnclickTable[r]
		}
	}
}
 //***************************************************************************************     
     
function EcrireCookie(nom, valeur)
{
   var argv=EcrireCookie.arguments;
   var argc=EcrireCookie.arguments.length;
   var expires=(argc > 2) ? argv[2] : null;
   var path=(argc > 3) ? argv[3] : null;
   var domain=(argc > 4) ? argv[4] : null;
   var secure=(argc > 5) ? argv[5] : false;
   document.cookie=nom+"="+escape(valeur)+
      ((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
      ((path==null) ? "" : ("; path="+path))+
      ((domain==null) ? "" : ("; domain="+domain))+
      ((secure==true) ? "; secure" : "");
}
function getCookieVal(offset)
{
   var endstr=document.cookie.indexOf (";", offset);
   if (endstr==-1) endstr=document.cookie.length;
   return unescape(document.cookie.substring(offset, endstr));
}
function LireCookie(nom)
{
   var arg=nom+"=";
   var alen=arg.length;
   var clen=document.cookie.length;
   var i=0;
   while (i<clen)
   {
      var j=i+alen;
      if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
      i=document.cookie.indexOf(" ",i)+1;
      if (i==0) break;
   }
   return null;
} 
//Permet de supprimer le lien de la dernière ligne d'un tableau 
//qui aurait un total
//Utilisée pour les statistiques bloc-op, ...
function changeLastRowToTotalOnTable(tableId){
  var tab= document.getElementById(tableId);
  var i=   tab.rows.length-1;
  var class1= tab.rows[i].className;
  var classCells= new Array();
  var ligneTr= new Array();
  
  if(i == 0)
  	return;
  
  for(var j= 0; j < tab.rows[i].cells.length; j+=1){
     ligneTr.push( tab.rows[i].cells[j].innerHTML);
     classCells.push(tab.rows[i].cells[j].className);
  }
  tab.deleteRow(i);
  var newRow= tab.insertRow(i);
  newRow.className= class1;
  var newCell= newRow.insertCell(-1);
  newCell.innerHTML= "Total";
  for(var j= 1; j < ligneTr.length; j+=1){
     var newCell= newRow.insertCell(-1);
     newCell.innerHTML= ligneTr[j];
     newCell.className= classCells[j];
  }
}

function copyToClipboard(text){
	window.clipboardData.setData('Text', text);
}

function copyLaboDataToClipBoard(tableid){
	var text = "";
	var first = true;
	var table = document.getElementById(tableid);
	for(var i = 1; i < table.rows.length; i++){
		var row = table.rows[i];
		var child = row.cells[0].childNodes[0];
		if(child != null && child.tagName != null && child.checked){
			if(first)
				first = false;
			else
				text += ' ; ';
			for(var j = 1; j < row.cells.length && j <= 4; j++){
				var cell = row.cells[j];
				if(j > 1)
					text+= " ";
				if(cell != null && cell.innerHTML != null)
					text+= cell.innerHTML.replace('<pre>', '').replace('</pre>', '').replace('<PRE>', '').replace('</PRE>', '');
			}
		}		
	}
	copyToClipboard(text);
}