var system_timer = 2000; //timer pour les fonctions setTimeout

//----------------------------------------
//Gestion des données
//----------------------------------------

function dataManager()
{
	this.savefile = "";
	this.deletefile = "";
	this.loadfile = "";

	this.title = [];
	this.dataArray = [];

	this.formId = "";
	this.formData = [];
	this.formTitle = [];
}

//-----------------------------------------

dataManager.prototype.setFormId = function(formId){this.formId = formId;};
dataManager.prototype.setSavefile = function(url){this.savefile = url;};
dataManager.prototype.setDeletefile = function(url){this.deletefile = url;};
dataManager.prototype.setLoadfile = function(url){this.loadfile = url;};

//-----------------------------------------
//Interaction avec l'interface
//-----------------------------------------

dataManager.prototype.putFormData = function(row)
{
	for(var i = 1; i < this.title.length; i++) //ne pas considéré l'id
	{
		if(document.getElementById(this.formId+this.title[i]))
		{
			var obj = document.getElementById(this.formId+this.title[i]);

			switch(obj.type)
			{
				case "text":			
					if(obj.name=="date"){obj.value = dateFormatDM("d.m.Y", getTableDate(this.dataArray[row][i]));}
					else{obj.value = unHTMLentities(this.dataArray[row][i]);}
					break;

				case "checkbox":
					if(this.dataArray[row][i]==false || this.dataArray[row][i]==0){obj.checked=false;}
					else{obj.checked=true;}
					break;

				case "select-one":
					obj.name = this.dataArray[row][i];
					break;

				case "password":
					obj.value = "";
					break;
						
				default:				
					obj.value = unHTMLentities(this.dataArray[row][i]);
					break;				
			}

			obj.className="classFormOnBlur";
			obj.onfocus=function(){this.className="classFormOnFocus";};
			obj.onblur=function(){this.className="classFormOnBlur";};
		}
	}
};

dataManager.prototype.getColumnByTitle = function(title)
{
	//Récupération de la column title
	for(var i=0; i < this.title.length; i++)
	{
		if(title==this.title[i]){return i;}
	}

return null;
};

dataManager.prototype.getRowByValueTitle = function(value, title)
{
	//Récupération de la column title
	var columnId = 0;
	for(var i=0; i < this.title.length; i++)
	{
		if(title==this.title[i]){columnId=i;}
	}

	for(var i=0; i < this.dataArray.length; i++)
	{
		if(this.dataArray[i][columnId]==value){return i;}
	}

return null;
};

dataManager.prototype.getFormData = function()
{
	this.formData = [];
	this.formTitle = [];

	for(var i = 1; i < this.title.length; i++) //ne pas considéré l'id
	{
		if(document.getElementById(this.formId+this.title[i]))
		{
			var obj = document.getElementById(this.formId+this.title[i]);
			var val = "";

			switch(obj.type)
			{
				case "text":
					if(obj.name=="date"){val = dateFormatDM("Y-m-d", getInputDate(obj.value));}
					else{val = obj.value;}
					break;

				case "checkbox":
					if(obj.checked==true){val=1;}
					else{val=0;}
					break;

				case "select-one":
					val = obj.value;
					break;

				case "password":
					if(obj.value==""){val="system_undefined";}
					else{val = SHA1(obj.value);}
					break;
						
				default:				
					val = obj.value;
					break;				
			}


			this.formData.push(escape(val));
			this.formTitle.push(this.title[i]);
		}
	}	
};


//-----------------------------------------
//Interaction avec la base de donnée
//-----------------------------------------

dataManager.prototype.save = function(id, innerHTML)
{
	if(document.getElementById(innerHTML))
	{
		if(isIdinChild(document.getElementById(innerHTML), "system_loadingImg")==false)
		{
			document.getElementById(innerHTML).innerHTML+="<div id=\"system_loadingImg\" align='center' style='height: "+(document.getElementById(innerHTML).offsetHeight)+"px; width: "+(document.getElementById(innerHTML).offsetWidth-5)+"px; background-color: #FFFFFF; opacity: .7; filter: alpha(opacity=70);-moz-opacity: 70; z-index: 99999; margin-Top : "+(-document.getElementById(innerHTML).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";
		}
	}

	var dd = new Date();
	var txt = "";	

	for(var i = 0; i < this.formData.length; i++)
	{	
		txt = txt+"&"+this.formTitle[i]+"="+this.formData[i];
	}

return this.execData(this.savefile, "id="+id+txt+"&system_time="+dd.getTime());
};

dataManager.prototype.del = function(id, system_table, innerHTML)
{
	if(document.getElementById(innerHTML))
	{
		if(isIdinChild(document.getElementById(innerHTML), "system_loadingImg")==false)
		{
			document.getElementById(innerHTML).innerHTML+="<div id=\"system_loadingImg\" align='center' style='height: "+(document.getElementById(innerHTML).offsetHeight)+"px; width: "+(document.getElementById(innerHTML).offsetWidth-5)+"px; background-color: #FFFFFF; opacity: .7; filter: alpha(opacity=70);-moz-opacity: 70; z-index: 99999; margin-Top : "+(-document.getElementById(innerHTML).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";
		}
	}

	var dd = new Date();

	if(system_table==undefined || system_table=="")
	{
		var txt = "id="+id+"&system_time="+dd.getTime();
	}
	else
	{
		var txt = "id="+id+"&system_table="+system_table+"&system_time="+dd.getTime();
	}

return this.execData(this.deletefile, txt);
};

dataManager.prototype.load = function(id, objetClient, fctClient, innerHTML)
{
	if(document.getElementById(innerHTML))
	{	
		if(isIdinChild(document.getElementById(innerHTML), "system_loadingImg")==false)
		{
			document.getElementById(innerHTML).innerHTML+="<div id='system_loadingImg' align='center' style='height: "+(document.getElementById(innerHTML).offsetHeight)+"px; width: "+(document.getElementById(innerHTML).offsetWidth-5)+"px; background-color: #FFFFFF; opacity: .7; filter: alpha(opacity=70);-moz-opacity: 70; z-index: 99999; margin-Top : "+(-document.getElementById(innerHTML).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";
		}
	}

	var dd = new Date();

	if(id==undefined){loadData(this.loadfile+"?system_time="+dd.getTime(), this, objetClient, fctClient);}
	else{loadData(this.loadfile+"?id="+id+"&system_time="+dd.getTime(), this, objetClient, fctClient);}

return this.dataArray;
};

dataManager.prototype.execData = function(file, myText)
{
	if(security_onelog()==1)
	{
			if(window.XMLHttpRequest) {
				xmlhttp = new XMLHttpRequest();
			} else if(window.ActiveXObject) {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} else {
				return false;
			}

			xmlhttp.open("POST", file, false);
			xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // sending it as encoded formdata
			xmlhttp.setRequestHeader("Content-length",myText.length); // we need to specify the length of the contents
			xmlhttp.setRequestHeader("Connection","close"); // Connection is to be closed after transfer
			xmlhttp.onreadystatechange=function() {
				if (xmlhttp.readyState == 4) { // Wait until everything is fetched!
					//alert(xmlhttp.getAllResponseHeaders());
				}
			};

			xmlhttp.send(myText); // This time, we need to send the text.
		
		return xmlhttp.responseText;
	}
	else
	{
		document.location.href="https://"+document.domain;
	}
};

function security_onelog()
{
	var file = "https://"+document.domain+"/gestpub/php/security/system_logid.php";
	var myText = "system_logid="+system_logid;

	if(window.XMLHttpRequest) {
		xmlhttp = new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		return false;
	}

	xmlhttp.open("POST", file, false);
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // sending it as encoded formdata
	xmlhttp.setRequestHeader("Content-length",myText.length); // we need to specify the length of the contents
	xmlhttp.setRequestHeader("Connection","close"); // Connection is to be closed after transfer
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState == 4) { // Wait until everything is fetched!
			//alert(xmlhttp.getAllResponseHeaders());
		}
	};

	xmlhttp.send(myText); // This time, we need to send the text.

return xmlhttp.responseText;
}

function system_isadmin()
{
	var file = "https://"+document.domain+"/gestpub/php/security/system_isadmin.php";
	var myText = "system_logid="+system_logid;

	if(window.XMLHttpRequest) {
		xmlhttp = new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		return false;
	}

	xmlhttp.open("POST", file, false);
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // sending it as encoded formdata
	xmlhttp.setRequestHeader("Content-length",myText.length); // we need to specify the length of the contents
	xmlhttp.setRequestHeader("Connection","close"); // Connection is to be closed after transfer
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState == 4) { // Wait until everything is fetched!
			//alert(xmlhttp.getAllResponseHeaders());
		}
	};

	xmlhttp.send(myText); // This time, we need to send the text.

return xmlhttp.responseText;
}

//-----------------------------------------
// LOAD FUNCTION BY READING XML
//-----------------------------------------

var listload_req = [];

function reload_reqCheckstate(id, type, contentId)
{
	if(type=="getContent")
	{
		if(document.getElementById(contentId))
		{
			if(isIdinChild(document.getElementById(contentId), "system_loadingImg")==false)
			{
				document.getElementById(contentId).innerHTML="<div id=\"system_loadingImg\" align='center' style='height: "+(document.getElementById(contentId).offsetHeight)+"px; width: "+(document.getElementById(contentId).offsetWidth-5)+"px; background-color: #FFFFFF; opacity: .7; filter: alpha(opacity=70);-moz-opacity: 70; z-index: 99999; margin-Top : "+(-document.getElementById(contentId).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";
			}
		}
	}

	listload_req[id][5]=2;
	load_reqCheckstate(id, type);
}

function load_reqCheckstate(id, type)
{
	if(typeof(listload_req[id][0])=='object' && (listload_req[id][5]==0 || listload_req[id][5]==2) && listload_req[id][7]<20)
	{
		//alert("id : "+id+" nb req : "+listload_req[id][7]);
		listload_req[id][7]=(listload_req[id][7])+1;
		
		try
		{
		if((listload_req[id][0]).readyState!=4 || listload_req[id][5]==2)
		{
			//document.getElementById("menuManager_debug").innerHTML+= "<br />"+id+" : relance data";

			var load_req = false;
	
			if(window.XMLHttpRequest) 
			{
				try 
				{
					load_req = new XMLHttpRequest();
				} 
				catch(e) 
				{
					load_req = false;
				}
				// branch for IE/Windows ActiveX version
			}
			else if(window.ActiveXObject)
			{
				try 
				{
					load_req = new ActiveXObject("Msxml2.XMLHTTP");
				} 
				catch(e) 
				{
					try 
					{
						load_req = new ActiveXObject("Microsoft.XMLHTTP");
					} 
					catch(e) 
					{
						load_req = false;
					}
				}
			}
	
			try
			{
				if(load_req && (listload_req[id][5]==0 || listload_req[id][5]==2)) 
				{	
					(listload_req[id][0]) = load_req;
					(listload_req[id][5]) = 0;
				
					if(type=="getData")
					{
						(listload_req[id][0]).onreadystatechange = function(){new httpRequest_getData(listload_req[id][0], id, listload_req[id][2], listload_req[id][3], listload_req[id][4], listload_req[id][6]);};
					}
					else
					{
						(listload_req[id][0]).onreadystatechange = function(){new httpRequest_getContent(listload_req[id][0], id, listload_req[id][2], listload_req[id][3], listload_req[id][4], listload_req[id][6]);};
					}
					(listload_req[id][0]).open("GET", (listload_req[id][1]), true);
					(listload_req[id][0]).send("");
				}
			}
			catch(e){}
		}
		}catch(e){}
	}
	else
	{
		if(listload_req[id][7]>=20)
		{
			//Arrêts des requêtes
		}
	}
}


function loadData(url, objetRef, objetClient, fctClient) 
{
	if(security_onelog()==1)
	{
	   if(url!="" && objetRef!="")
	   {
		var load_req = false;

		if(window.XMLHttpRequest) 
		{
			try 
			{
				load_req = new XMLHttpRequest();
			} 
			catch(e) 
			{
				load_req = false;
			}
		// branch for IE/Windows ActiveX version
		} 
		else if(window.ActiveXObject)
		{
			try 
			{
				load_req = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch(e) 
			{
				try 
				{
					load_req = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch(e) 
				{
					load_req = false;
				}
			}
		}

		if(load_req) 
		{	
			//window.status = url+" : chargement";	

			var id = listload_req.length;
			var speedT = new speedTimer(new Date().getTime());
			listload_req.push([load_req, url, objetRef, objetClient, fctClient, 0, speedT, 0]);

			//document.getElementById("menuManager_debug").innerHTML+= "<br />"+id+" : chargement debut";
			load_req.onreadystatechange = function(){new httpRequest_getData(load_req, id, objetRef, objetClient, fctClient, speedT);};
			load_req.open("GET", url, true);
			load_req.send("");
		}
	   }
	}
	else
	{
		document.location.href="https://"+document.domain+"";
	}
}



//-------------------------
//Class httpRequest Objet
//-------------------------
function httpRequest_getData(objetHttpRequest, id, varobjet, varobjetClient, varfctClient, speedT)
{
	this.speedT = speedT;

	this.objetHttpRequest = objetHttpRequest;
	this.id = id;
	this.varobjet = varobjet;
	this.varobjetClient = varobjetClient;
	this.varfctClient = varfctClient;

	this.getData();	
}

httpRequest_getData.prototype.getData = function()
{		
	try 
	{	//alert("step 1 : "+this.objetHttpRequest.readyState);
		if (this.objetHttpRequest.readyState == 4)
		{//alert("step 2 : "+this.objetHttpRequest.status);	
			if (this.objetHttpRequest.status == 200) 
			{	//alert("inside");
				//Récupération de la vistessse de téléchargement	
				this.speedT.kb = this.objetHttpRequest.responseText.length;
				this.speedT.endTime = (new Date()).getTime();
				this.speedT.getSpeed();
				
				var elements= (this.objetHttpRequest.responseText).split("</TITLE>");  
				this.varobjet.title = []; 
				
				for(var i=0; i<(elements.length-1); i++)
				{	
					var element = elements[i].split("</value>");
					var valeur = [];				

					for(var u=0; u<(element.length-1); u++)
					{	
						var end = element[u].length;
						var begin = (element[u].indexOf("<value>")+7);
					
						if(element[u].substring(begin, end)=="null"){valeur.push("");}else{valeur.push(element[u].substring(begin, end));}
					}
	
					this.varobjet.title = valeur;
				}
				
				var tmp = (this.objetHttpRequest.responseText).split("</TITLE>");   
				if(tmp[1]){var elements= tmp[1].split("</ITEM>");}
				this.varobjet.dataArray = [];	
	
				for(var i=0; i<(elements.length-1); i++)
				{
					var element = elements[i].split("</value>");
					var valeur = [];				

					for(var u=0; u<(element.length-1); u++)
					{
						var end = element[u].length;
						var begin = (element[u].indexOf("<value>")+7);

						if(element[u].substring(begin, end)=="null"){valeur.push("");}else{valeur.push(element[u].substring(begin, end));}
					}
					
					this.varobjet.dataArray.push(valeur);
				}
				
				this.varobjetClient.tmpfct = this.varfctClient;
				this.varobjetClient.tmpfct();

				listload_req[this.id][0].abort();
				listload_req[this.id][0]=null;
				listload_req[this.id][5]=1;
				//document.getElementById("menuManager_debug").innerHTML+= "<br />"+(this.id)+" : chargement fin";
			}
			else
			{
				setTimeout("reload_reqCheckstate("+this.id+",\"getData\")", system_timer);
			}
		}
		else
		{
			setTimeout("load_reqCheckstate("+this.id+",\"getData\")", system_timer);
		}
	}
	catch(e) 
	{
            //alert("Une exception s'est produite : " + e.description);
        }

};

//-----------------------------------------
// LOAD FUNCTION BY READING PHP OR TXT FILE
//-----------------------------------------

function loadContent(url, objetRef, objetClient, fctClient) 
{
	if(security_onelog()==1)
	{
	   if(url!="" && objetRef!="")
	   {
		var load_req = false;

		if(window.XMLHttpRequest) 
		{
				try 
			{
				load_req = new XMLHttpRequest();
				} 
			catch(e) 
			{
				load_req = false;
				}
			// branch for IE/Windows ActiveX version
			} 
		else if(window.ActiveXObject) 
		{
				try 
			{
					load_req = new ActiveXObject("Msxml2.XMLHTTP");
				} 
			catch(e) 
			{
					try 
				{
						load_req = new ActiveXObject("Microsoft.XMLHTTP");
					} 
				catch(e) 
				{
						load_req = false;
					}
			}
			}

		if(load_req) 
		{	
			var id = listload_req.length;
			var speedT = new speedTimer(new Date().getTime());
			listload_req.push([load_req, url, objetRef, objetClient, fctClient, 0, speedT, 0]);
			
			if(document.getElementById(objetRef))
			{	
				if(document.getElementById(objetRef).tagName=="INPUT"){system_protocole(document.getElementById(objetRef), "chargement...");}
				else{document.getElementById(objetRef).innerHTML+="<div align='center' style='height: "+document.getElementById(objetRef).offsetHeight+"px; width: "+document.getElementById(objetRef).offsetWidth+"px; background-color: #FFFFFF; opacity: .3; filter: alpha(opacity=30);-moz-opacity: 30; z-index: 99999; margin-Top : "+(-document.getElementById(objetRef).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";}
			}
			//document.getElementById("menuManager_debug").innerHTML+= "<br />"+id+" : chargement debut";

			load_req.onreadystatechange =  function(){new httpRequest_getContent(load_req, id, objetRef, objetClient, fctClient, speedT);};	
			load_req.open("GET", url, true);
			load_req.send("");
		}
	   }
	}
	else
	{
		document.location.href="https://"+document.domain+"";
	}
}

//-------------------------
//Class httpRequest Objet
//-------------------------
function httpRequest_getContent(objetHttpRequest, id, varobjet, varobjetClient, varfctClient, speedT)
{
	this.speedT = speedT;

	this.objetHttpRequest = objetHttpRequest;
	this.id = id;
	this.varobjet = varobjet;
	this.varobjetClient = varobjetClient;
	this.varfctClient = varfctClient;

	this.getContent();	
}

httpRequest_getContent.prototype.getContent = function() 
{
	try 
	{
		// only if loadContent_req shows "loaded"
		if (this.objetHttpRequest.readyState == 4) 
		{
			// only if "OK"
			if (this.objetHttpRequest.status == 200) 
			{
				//Récupération de la vistessse de téléchargement
				this.speedT.kb = this.objetHttpRequest.responseText.length;
				this.speedT.endTime = (new Date()).getTime();
				this.speedT.getSpeed();
				
				if(document.getElementById(this.varobjet).tagName=="INPUT"){system_protocole(document.getElementById(this.varobjet), this.objetHttpRequest.responseText);}
				else{document.getElementById(this.varobjet).innerHTML= this.objetHttpRequest.responseText;}

				this.varobjetClient.tmpfct = this.varfctClient;
				this.varobjetClient.tmpfct();

				listload_req[this.id][0].abort();
				listload_req[this.id][0]=null;
				listload_req[this.id][5]=1;
				//document.getElementById("menuManager_debug").innerHTML+= "<br />"+(this.id)+" : chargement fin";
			} 
			else 
			{
				setTimeout("reload_reqCheckstate("+this.id+",\"getContent\",\""+this.varobjet+"\")", system_timer);
				//document.getElementById(this.varobjet).innerHTML= "<table class=\"classFormTable\"><tr><td>Chargement incomplet (status : "+this.objetHttpRequest.status+")</td><td class=\"classButtonMouseOut\" onmouseover=\"this.className='classButtonMouseOver';\" onmouseout=\"this.className='classButtonMouseOut';\" onclick=\"reload_reqCheckstate("+this.id+",'getContent','"+this.varobjet+"');\">charger</td><td>&nbsp;</td></tr></table>";
			}
		}
		else
		{
			setTimeout("load_reqCheckstate("+this.id+",\"getContent\")", system_timer);
		}
	}
	catch(e) 
	{
            //alert("Une exception s'est produite : " + e.description);
	}
};


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Class Draw list
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function drawList(idColumnByTitle, columnsToShowByTitleArray, titleArray, dataArray, fctOnclick, classListMouseOut, classListMouseOver, classList, icone, width, height, listName)
{
	//Récupération des columns à afficher
	var columnsToShow = [];	
	for(var x=0; x < columnsToShowByTitleArray.length ; x++)
	{
		for(var i=0; i < titleArray.length; i++)
		{
			if(columnsToShowByTitleArray[x]==titleArray[i]){columnsToShow.push(i);}
		}
	}

	//Récupération de la column ID
	var columnId = 0;
	for(var i=0; i < titleArray.length; i++)
	{
		if(idColumnByTitle==titleArray[i]){columnId=i;}
	}


    var html="<div class=\""+classList+"\" style=\"height : "+height+";\"><table width=\""+width+"\" cellspacing=0><tr><td></td></tr>";

	for(var i=0; i < dataArray.length; i++)
	{
		//Définition de la fonction onclick
		if(fctOnclick.indexOf("(",0)!=-1)
		{
			fctOnclick = fctOnclick.substring(0, fctOnclick.indexOf("(",0)+1)+"\'"+dataArray[i][columnId]+"\')";
		}

		html+="<tr id=\""+listName+"_"+i+"\" onclick=\"javascript:"+fctOnclick+"; removeBoldList(this.id);\" class=\""+classListMouseOut+"\" onmouseover=\"this.className='"+classListMouseOver+"';\" onmouseout=\"this.className='"+classListMouseOut+"';\"><td width=\"45px\" valign=\"top\">&nbsp;<img src=\""+icone+"\"></img></td><td>";

		for(var x=0; x < columnsToShow.length; x++)
		{
			html+=unHTMLentities(dataArray[i][columnsToShow[x]])+"&nbsp;";	
		}
		
		html+="</td></tr>";
	}
	
	html+="</table></div>";

return html;
}

function removeBoldList(listName)
{	
	var i = 0;
	var bc = true;

	listNameB = listName;
	listName = listName.substring(0, listName.lastIndexOf("_")+1);

	while (bc==true)
	{
		if(document.getElementById(listName+i))
		{	
			if(listName+i==listNameB)
			{
				document.getElementById(listName+i).style.fontWeight="bold";
			}
			else
			{
				document.getElementById(listName+i).style.fontWeight="normal";
			}
			i++;
		}
		else{bc=false; break;}
	}
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Class Select Tag
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function putDataToSelectTag(idColumnByTitle, columnsToShowByTitleArray, loadfile, idSelectTag, id, optionNull, obj, objFct)
{
	this.idColumnByTitle = idColumnByTitle;
	this.columnsToShowByTitleArray = columnsToShowByTitleArray;
	this.loadfile  = loadfile;
	this.idSelectTag = idSelectTag;
	this.optionNull =optionNull;

	this.obj = obj;
	this.objFct = objFct;

	this.data = new dataManager();

	if(document.getElementById(this.idSelectTag))
	{
		var optionObj = document.getElementById(this.idSelectTag);		

		for(var i = 0; i < optionObj.length; i++)
		{
			optionObj.options[i]=null;
		}
		optionObj.options[0]= new Option("chargement... ", -1);
	}	

	this.load(id);
}	

putDataToSelectTag.prototype.load = function(id)
{
	this.data.setLoadfile(this.loadfile);
	this.data.load(id, this, this.toString);
};

putDataToSelectTag.prototype.toString = function()
{
	if(document.getElementById(this.idSelectTag))
	{
		//Récupération des columns à afficher
		var columnsToShow = [];	

		for(var x=0; x < this.columnsToShowByTitleArray.length ; x++)
		{
			for(var i=0; i < this.data.title.length; i++)
			{
				if(this.columnsToShowByTitleArray[x]==this.data.title[i]){columnsToShow.push(i);}
			}
		}

		//Récupération de la column ID
		var columnId = 0;
		for(var i=0; i < this.data.title.length; i++)
		{
			if(this.idColumnByTitle==this.data.title[i]){columnId=i;}
		}

		//Vide l'objet SelectTag
		var optionObj = document.getElementById(this.idSelectTag);		

		for(var i = 0; i < optionObj.length; i++)
		{
			optionObj.options[i]=null;
		}

		optionObj.length=0;

		var optionPlus=0;
		if(this.optionNull==true)
		{
			optionObj.options[0]= new Option(" -> Choisissez <- ", -1);
			var optionPlus=1;
		}

		//Insertion des valeurs
		for(var i = 0; i <this.data.dataArray.length; i++)
		{
			var option="";

			//Récupération des données à afficher
			for(var x=0; x < columnsToShow.length; x++)
			{	
				option+=unHTMLentities(this.data.dataArray[i][columnsToShow[x]])+" ";	
			}

			//Insertion de l'objet SelectTag
			if(document.getElementById(this.idSelectTag).name==this.data.dataArray[i][columnId])
			{
				optionObj.options[i+optionPlus]=new Option(option, this.data.dataArray[i][columnId]);
				optionObj.options[i+optionPlus].selected=true;
			}
			else
			{
				optionObj.options[i+optionPlus]=new Option(option, this.data.dataArray[i][columnId]);
				optionObj.options[i+optionPlus].selected=false;
			}
		}
		
	}

	if(typeof(this.obj)!='undefined' && typeof(this.objFct)!='undefined')
	{
		this.obj.tmpfct = this.objFct;
		this.obj.tmpfct();
	}
};

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Class Timer
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
var system_speed = [];

function speedTimer(startTime)
{
	this.startTime = startTime;
	this.endTime =0;
	this.kb = 0;
}

speedTimer.prototype.getSpeed = function()
{
	var tmpTime = this.endTime - this.startTime;

	if(tmpTime > 50){system_speed.push((this.kb/tmpTime));}

	var u = 0;
	var avg =0;

	if(system_speed.length >10){var x = system_speed.length-10;}else{var x = 0;}

	for(var i=x; i<system_speed.length; i++)
	{
		avg = avg + system_speed[i];
		u++;
	}

	if(u!=0)
	{	
		system_timer = (6000/(avg/u)*2);
	}
	else{system_timer = 1500;}

	if(system_timer < 1500 ){system_timer = 1500;}

	//document.getElementById("menuManager_debug").innerHTML+=system_timer;
};

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Fonctions pour la gestion de l'image loading
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function isIdinChild(obj, id)
{	
	for(var i = 0; i< obj.childNodes.length; i++)
	{
		if(obj.childNodes[i].id=="system_loadingImg")
		{
			return true;
		}
	}	

return false;
}


function putLoading(innerHTML)
{
	if(document.getElementById(innerHTML))
	{
		if(isIdinChild(document.getElementById(innerHTML), "system_loadingImg")==false)
		{
			document.getElementById(innerHTML).innerHTML+="<div id='system_loadingImg' align='center' style='height: "+(document.getElementById(innerHTML).offsetHeight)+"px; width: "+(document.getElementById(innerHTML).offsetWidth-5)+"px; background-color: #FFFFFF; opacity: .5; filter: alpha(opacity=50);-moz-opacity: 50; z-index: 99999; margin-Top : "+(-document.getElementById(innerHTML).offsetHeight)+"px; border:  0px #FFFFFF solid;'><table height='100%'><tr><td valign='center' align='center'><img src='gestpub/images/loading/loading.gif'></img></td></tr></table></div>";
		}
	}
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Fonctions pour convertir les dates au bon format
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function getInputDate(s_date) 
{
	//FORMAT : JJ.MM.AAAA
	var re_date = /^\s*(\d{1,2})\.(\d{1,2})\.(\d{2,4})\s*$/;

	if (!re_date.exec(s_date)){return null;}
	else
	{
		var n_day = Number(RegExp.$1),
		    n_month = Number(RegExp.$2),
		    n_year = Number(RegExp.$3);	
			
		if (n_month < 1 || n_month > 12){return null;}
		else
		{
			var d_numdays = new Date(n_year, n_month, 0);
	
			if (n_day > d_numdays.getDate()){return null;}
			else
			{
				return new Date(n_year, n_month - 1, n_day);
			}
		}
	}
}

function getTableDate(s_date) 
{
	//FORMAT : AAAA-MM-JJ
	var re_date = /^\s*(\d{2,4})\-(\d{1,2})\-(\d{1,2})\s*$/;

	if (!re_date.exec(s_date)){return null;}
	else
	{
		var n_day = Number(RegExp.$3),
		    n_month = Number(RegExp.$2),
		    n_year = Number(RegExp.$1);	

		if (n_month < 1 || n_month > 12){return null;}
		else
		{
			var d_numdays = new Date(n_year, n_month, 0);
	
			if (n_day > d_numdays.getDate()){return null;}
			else
			{
				return new Date(n_year, n_month - 1, n_day);
			}
		}
	}
}


function dateFormatDM(format, date) 
{
	if (date == undefined) 
	{
		return "";
	}
	
	if (typeof date == 'number') 
	{
		time = new Date();
		time.setTime(date);
		date = time;
	}
	else if (typeof date == 'string') 
	{
		date = new Date(date);
	}
	
	var fullYear = date.getYear();
	if (fullYear < 1000) 
	{
		fullYear = fullYear + 1900;
	}
    
	var hour = date.getHours();
	var day = date.getDate();
	var month = date.getMonth() + 1;
	var minute = date.getMinutes();
	var seconde = date.getSeconds();
	var milliSeconde = date.getMilliseconds();
	var reg = new RegExp('(d|m|Y|H|i|s)', 'g');
	var replacement = [];
	replacement.d = day < 10 ? '0' + day : day;
	replacement.m = month < 10 ? '0' + month : month;
	replacement.Y = fullYear;
	replacement.Y = fullYear;
	replacement.H = hour < 10 ? '0' + hour : hour;
	replacement.i = minute < 10 ? '0' + minute : minute;
	replacement.s = seconde < 10 ? '0' + seconde : seconde;
    
	return format.replace(reg, function($0) {return ($0 in replacement) ? replacement[$0] : $0.slice(1, $0.length - 1);});
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Fonctions HTML
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function unHTMLentities(texte) {

texte = texte.replace(/&quot;/g,'\"');
texte = texte.replace(/&amp;/g,'\&'); 
texte = texte.replace(/&#39;/g,'\'');
texte = texte.replace(/&lt;/g,'\<'); 
texte = texte.replace(/&gt;/g,'\>'); 
texte = texte.replace(/&circ;/g,'\^');
texte = texte.replace(/&lsquo;/g,'\‘');
texte = texte.replace(/&rsquo;/g,'\’');
texte = texte.replace(/&ldquo;/g,'\“');
texte = texte.replace(/&rdquo;/g,'\”');
texte = texte.replace(/&bull;/g,'\•'); 
texte = texte.replace(/&ndash;/g,'\–');
texte = texte.replace(/&mdash;/g,'\—');
texte = texte.replace(/&tilde;/g,'\˜');
texte = texte.replace(/&trade;/g,'\™');
texte = texte.replace(/&scaron;/g,'\š');
texte = texte.replace(/&rsaquo;/g,'\›');
texte = texte.replace(/&oelig;/g,'\œ');
texte = texte.replace(/&#357;/g,'\'); 
texte = texte.replace(/&#382;/g,'\ž'); 
texte = texte.replace(/&Yuml;/g,'\Ÿ'); 
texte = texte.replace(/&iexcl;/g,'\¡');
texte = texte.replace(/&cent;/g,'\¢'); 
texte = texte.replace(/&pound;/g,'\£');  
texte = texte.replace(/&yen;/g,'\¥'); 
texte = texte.replace(/&brvbar;/g,'\¦');
texte = texte.replace(/&sect;/g,'\§'); 
texte = texte.replace(/&uml;/g,'\¨'); 
texte = texte.replace(/&copy;/g,'\©');
texte = texte.replace(/&ordf;/g,'\ª');
texte = texte.replace(/&laquo;/g,'\«');
texte = texte.replace(/&not;/g,'\¬');
texte = texte.replace(/&shy;/g,'\­');
texte = texte.replace(/&reg;/g,'\®');
texte = texte.replace(/&macr;/g,'\¯');
texte = texte.replace(/&deg;/g,'\°');
texte = texte.replace(/&plusmn;/g,'\±');
texte = texte.replace(/&sup2;/g,'\²'); 
texte = texte.replace(/&sup3;/g,'\³'); 
texte = texte.replace(/&acute;/g,'\´'); 
texte = texte.replace(/&micro;/g,'\µ'); 
texte = texte.replace(/&para/g,'\¶'); 
texte = texte.replace(/&middot;/g,'\·');
texte = texte.replace(/&cedil;/g,'\¸'); 
texte = texte.replace(/&sup1;/g,'\¹'); 
texte = texte.replace(/&ordm;/g,'\º'); 
texte = texte.replace(/&raquo;/g,'\»');
texte = texte.replace(/&frac14;/g,'\¼'); 
texte = texte.replace(/&frac12;/g,'\½'); 
texte = texte.replace(/&frac34;/g,'\¾'); 
texte = texte.replace(/&iquest;/g,'\¿'); 
texte = texte.replace(/&Agrave;/g,'\À'); 
texte = texte.replace(/&agrave;/g,'\à'); 
texte = texte.replace(/&Aacute;/g,'\Á'); 
texte = texte.replace(/&Acirc;/g,'\Â'); 
texte = texte.replace(/&Atilde;/g,'\Ã');
texte = texte.replace(/&Auml;/g,'\Ä'); 
texte = texte.replace(/&Aring;/g,'\Å'); 
texte = texte.replace(/&AElig;/g,'\Æ'); 
texte = texte.replace(/&Ccedil;/g,'\Ç');
texte = texte.replace(/&Egrave;/g,'\È');
texte = texte.replace(/&Eacute;/g,'\É');
texte = texte.replace(/&Ecirc;/g,'\Ê');
texte = texte.replace(/&Euml;/g,'\Ë'); 
texte = texte.replace(/&Igrave;/g,'\Ì');
texte = texte.replace(/&Iacute;/g,'\Í');
texte = texte.replace(/&Icirc;/g,'\Î');
texte = texte.replace(/&Iuml;/g,'\Ï'); 
texte = texte.replace(/&ETH;/g,'\Ð'); 
texte = texte.replace(/&Ntilde;/g,'\Ñ');
texte = texte.replace(/&Ograve;/g,'\Ò');
texte = texte.replace(/&Oacute;/g,'\Ó');
texte = texte.replace(/&Ocirc;/g,'\Ô'); 
texte = texte.replace(/&Otilde;/g,'\Õ');
texte = texte.replace(/&Ouml;/g,'\Ö'); 
texte = texte.replace(/&times;/g,'\×'); 
texte = texte.replace(/&Oslash;/g,'\Ø');
texte = texte.replace(/&Ugrave;/g,'\Ù');
texte = texte.replace(/&Uacute;/g,'\Ú');
texte = texte.replace(/&Ucirc;/g,'\Û'); 
texte = texte.replace(/&Uuml;/g,'\Ü'); 
texte = texte.replace(/&Yacute;/g,'\Ý');
texte = texte.replace(/&THORN;/g,'\Þ'); 
texte = texte.replace(/&szlig;/g,'\ß'); 
texte = texte.replace(/&aacute;/g,'\à');
texte = texte.replace(/&aacute;/g,'\á');
texte = texte.replace(/&acirc;/g,'\â'); 
texte = texte.replace(/&atilde;/g,'\ã');
texte = texte.replace(/&auml;/g,'\ä'); 
texte = texte.replace(/&aring;/g,'\å'); 
texte = texte.replace(/&aelig;/g,'\æ'); 
texte = texte.replace(/&ccedil;/g,'\ç');
texte = texte.replace(/&egrave;/g,'\è');
texte = texte.replace(/&eacute;/g,'\é');
texte = texte.replace(/&ecirc;/g,'\ê'); 
texte = texte.replace(/&euml;/g,'\ë'); 
texte = texte.replace(/&igrave;/g,'\ì');
texte = texte.replace(/&iacute;/g,'\í'); 
texte = texte.replace(/&icirc;/g,'\î'); 
texte = texte.replace(/&iuml;/g,'\ï'); 
texte = texte.replace(/&eth;/g,'\ð'); 
texte = texte.replace(/&ntilde;/g,'\ñ'); 
texte = texte.replace(/&ograve;/g,'\ò'); 
texte = texte.replace(/&oacute;/g,'\ó'); 
texte = texte.replace(/&ocirc;/g,'\ô');
texte = texte.replace(/&otilde;/g,'\õ'); 
texte = texte.replace(/&ouml;/g,'\ö'); 
texte = texte.replace(/&divide;/g,'\÷'); 
texte = texte.replace(/&oslash;/g,'\ø'); 
texte = texte.replace(/&ugrave;/g,'\ù'); 
texte = texte.replace(/&uacute;/g,'\ú');
texte = texte.replace(/&ucirc;/g,'\û');
texte = texte.replace(/&uuml;/g,'\ü');
texte = texte.replace(/&yacute;/g,'\ý'); 
texte = texte.replace(/&thorn;/g,'\þ'); 
texte = texte.replace(/&yuml;/g,'\ÿ'); 
return texte;
}

function HTMLentities(texte) {

texte = texte.replace(/"/g,'&quot;'); // 34 22
texte = texte.replace(/&/g,'&amp;'); // 38 26
texte = texte.replace(/\'/g,'&#39;'); // 39 27
texte = texte.replace(/</g,'&lt;'); // 60 3C
texte = texte.replace(/>/g,'&gt;'); // 62 3E
texte = texte.replace(/\^/g,'&circ;'); // 94 5E
texte = texte.replace(/‘/g,'&lsquo;'); // 145 91
texte = texte.replace(/’/g,'&rsquo;'); // 146 92
texte = texte.replace(/“/g,'&ldquo;'); // 147 93
texte = texte.replace(/”/g,'&rdquo;'); // 148 94
texte = texte.replace(/•/g,'&bull;'); // 149 95
texte = texte.replace(/–/g,'&ndash;'); // 150 96
texte = texte.replace(/—/g,'&mdash;'); // 151 97
texte = texte.replace(/˜/g,'&tilde;'); // 152 98
texte = texte.replace(/™/g,'&trade;'); // 153 99
texte = texte.replace(/š/g,'&scaron;'); // 154 9A
texte = texte.replace(/›/g,'&rsaquo;'); // 155 9B
texte = texte.replace(/œ/g,'&oelig;'); // 156 9C
texte = texte.replace(//g,'&#357;'); // 157 9D
texte = texte.replace(/ž/g,'&#382;'); // 158 9E
texte = texte.replace(/Ÿ/g,'&Yuml;'); // 159 9F
// texte = texte.replace(/ /g,'&nbsp;'); // 160 A0
texte = texte.replace(/¡/g,'&iexcl;'); // 161 A1
texte = texte.replace(/¢/g,'&cent;'); // 162 A2
texte = texte.replace(/£/g,'&pound;'); // 163 A3
//texte = texte.replace(/ /g,'&curren;'); // 164 A4
texte = texte.replace(/¥/g,'&yen;'); // 165 A5
texte = texte.replace(/¦/g,'&brvbar;'); // 166 A6
texte = texte.replace(/§/g,'&sect;'); // 167 A7
texte = texte.replace(/¨/g,'&uml;'); // 168 A8
texte = texte.replace(/©/g,'&copy;'); // 169 A9
texte = texte.replace(/ª/g,'&ordf;'); // 170 AA
texte = texte.replace(/«/g,'&laquo;'); // 171 AB
texte = texte.replace(/¬/g,'&not;'); // 172 AC
texte = texte.replace(/­/g,'&shy;'); // 173 AD
texte = texte.replace(/®/g,'&reg;'); // 174 AE
texte = texte.replace(/¯/g,'&macr;'); // 175 AF
texte = texte.replace(/°/g,'&deg;'); // 176 B0
texte = texte.replace(/±/g,'&plusmn;'); // 177 B1
texte = texte.replace(/²/g,'&sup2;'); // 178 B2
texte = texte.replace(/³/g,'&sup3;'); // 179 B3
texte = texte.replace(/´/g,'&acute;'); // 180 B4
texte = texte.replace(/µ/g,'&micro;'); // 181 B5
texte = texte.replace(/¶/g,'&para'); // 182 B6
texte = texte.replace(/·/g,'&middot;'); // 183 B7
texte = texte.replace(/¸/g,'&cedil;'); // 184 B8
texte = texte.replace(/¹/g,'&sup1;'); // 185 B9
texte = texte.replace(/º/g,'&ordm;'); // 186 BA
texte = texte.replace(/»/g,'&raquo;'); // 187 BB
texte = texte.replace(/¼/g,'&frac14;'); // 188 BC
texte = texte.replace(/½/g,'&frac12;'); // 189 BD
texte = texte.replace(/¾/g,'&frac34;'); // 190 BE
texte = texte.replace(/¿/g,'&iquest;'); // 191 BF
texte = texte.replace(/À/g,'&Agrave;'); // 192 C0
texte = texte.replace(/à/g,'&agrave;'); // 192 C0
texte = texte.replace(/Á/g,'&Aacute;'); // 193 C1
texte = texte.replace(/Â/g,'&Acirc;'); // 194 C2
texte = texte.replace(/Ã/g,'&Atilde;'); // 195 C3
texte = texte.replace(/Ä/g,'&Auml;'); // 196 C4
texte = texte.replace(/Å/g,'&Aring;'); // 197 C5
texte = texte.replace(/Æ/g,'&AElig;'); // 198 C6
texte = texte.replace(/Ç/g,'&Ccedil;'); // 199 C7
texte = texte.replace(/È/g,'&Egrave;'); // 200 C8
texte = texte.replace(/É/g,'&Eacute;'); // 201 C9
texte = texte.replace(/Ê/g,'&Ecirc;'); // 202 CA
texte = texte.replace(/Ë/g,'&Euml;'); // 203 CB
texte = texte.replace(/Ì/g,'&Igrave;'); // 204 CC
texte = texte.replace(/Í/g,'&Iacute;'); // 205 CD
texte = texte.replace(/Î/g,'&Icirc;'); // 206 CE
texte = texte.replace(/Ï/g,'&Iuml;'); // 207 CF
texte = texte.replace(/Ð/g,'&ETH;'); // 208 D0
texte = texte.replace(/Ñ/g,'&Ntilde;'); // 209 D1
texte = texte.replace(/Ò/g,'&Ograve;'); // 210 D2
texte = texte.replace(/Ó/g,'&Oacute;'); // 211 D3
texte = texte.replace(/Ô/g,'&Ocirc;'); // 212 D4
texte = texte.replace(/Õ/g,'&Otilde;'); // 213 D5
texte = texte.replace(/Ö/g,'&Ouml;'); // 214 D6
texte = texte.replace(/×/g,'&times;'); // 215 D7
texte = texte.replace(/Ø/g,'&Oslash;'); // 216 D8
texte = texte.replace(/Ù/g,'&Ugrave;'); // 217 D9
texte = texte.replace(/Ú/g,'&Uacute;'); // 218 DA
texte = texte.replace(/Û/g,'&Ucirc;'); // 219 DB
texte = texte.replace(/Ü/g,'&Uuml;'); // 220 DC
texte = texte.replace(/Ý/g,'&Yacute;'); // 221 DD
texte = texte.replace(/Þ/g,'&THORN;'); // 222 DE
texte = texte.replace(/ß/g,'&szlig;'); // 223 DF
texte = texte.replace(/à/g,'&aacute;'); // 224 E0
texte = texte.replace(/á/g,'&aacute;'); // 225 E1
texte = texte.replace(/â/g,'&acirc;'); // 226 E2
texte = texte.replace(/ã/g,'&atilde;'); // 227 E3
texte = texte.replace(/ä/g,'&auml;'); // 228 E4
texte = texte.replace(/å/g,'&aring;'); // 229 E5
texte = texte.replace(/æ/g,'&aelig;'); // 230 E6
texte = texte.replace(/ç/g,'&ccedil;'); // 231 E7
texte = texte.replace(/è/g,'&egrave;'); // 232 E8
texte = texte.replace(/é/g,'&eacute;'); // 233 E9
texte = texte.replace(/ê/g,'&ecirc;'); // 234 EA
texte = texte.replace(/ë/g,'&euml;'); // 235 EB
texte = texte.replace(/ì/g,'&igrave;'); // 236 EC
texte = texte.replace(/í/g,'&iacute;'); // 237 ED
texte = texte.replace(/î/g,'&icirc;'); // 238 EE
texte = texte.replace(/ï/g,'&iuml;'); // 239 EF
texte = texte.replace(/ð/g,'&eth;'); // 240 F0
texte = texte.replace(/ñ/g,'&ntilde;'); // 241 F1
texte = texte.replace(/ò/g,'&ograve;'); // 242 F2
texte = texte.replace(/ó/g,'&oacute;'); // 243 F3
texte = texte.replace(/ô/g,'&ocirc;'); // 244 F4
texte = texte.replace(/õ/g,'&otilde;'); // 245 F5
texte = texte.replace(/ö/g,'&ouml;'); // 246 F6
texte = texte.replace(/÷/g,'&divide;'); // 247 F7
texte = texte.replace(/ø/g,'&oslash;'); // 248 F8
texte = texte.replace(/ù/g,'&ugrave;'); // 249 F9
texte = texte.replace(/ú/g,'&uacute;'); // 250 FA
texte = texte.replace(/û/g,'&ucirc;'); // 251 FB
texte = texte.replace(/ü/g,'&uuml;'); // 252 FC
texte = texte.replace(/ý/g,'&yacute;'); // 253 FD
texte = texte.replace(/þ/g,'&thorn;'); // 254 FE
texte = texte.replace(/ÿ/g,'&yuml;'); // 255 FF
return texte;
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//Fonction SHA1
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function SHA1 (msg) {
 
	function rotate_left(n,s) {
		var t4 = ( n<<s ) | (n>>>(32-s));
		return t4;
	}
 
	function lsb_hex(val) {
		var str="";
		var i;
		var vh;
		var vl;
 
		for( i=0; i<=6; i+=2 ) {
			vh = (val>>>(i*4+4))&0x0f;
			vl = (val>>>(i*4))&0x0f;
			str += vh.toString(16) + vl.toString(16);
		}
		return str;
	}
 
	function cvt_hex(val) {
		var str="";
		var i;
		var v;
 
		for( i=7; i>=0; i-- ) {
			v = (val>>>(i*4))&0x0f;
			str += v.toString(16);
		}
		return str;
	}
 
 
	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	}
 
	var blockstart;
	var i, j;
	//var W = new Array(80);
	var W = [];
	var H0 = 0x67452301;
	var H1 = 0xEFCDAB89;
	var H2 = 0x98BADCFE;
	var H3 = 0x10325476;
	var H4 = 0xC3D2E1F0;
	var A, B, C, D, E;
	var temp;
 
	msg = Utf8Encode(msg);
 
	var msg_len = msg.length;
 
	var word_array = [];
	for( i=0; i<msg_len-3; i+=4 ) {
		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
		word_array.push( j );
	}
 
	switch( msg_len % 4 ) {
		case 0:
			i = 0x080000000;
		break;
		case 1:
			i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
		break;
 
		case 2:
			i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
		break;
 
		case 3:
			i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8	| 0x80;
		break;
	}
 
	word_array.push(i);
 
	while((word_array.length % 16) != 14) {word_array.push(0);}
 
	word_array.push(msg_len>>>29);
	word_array.push((msg_len<<3)&0x0ffffffff);
 
 
	for (blockstart=0; blockstart<word_array.length; blockstart+=16) {
 
		for(i=0; i<16; i++) {W[i] = word_array[blockstart+i];}
		for(i=16; i<=79; i++) {W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);}
 
		A = H0;
		B = H1;
		C = H2;
		D = H3;
		E = H4;
 
		for(i= 0; i<=19; i++) {
			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for(i=20; i<=39; i++) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for(i=40; i<=59; i++) {
			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for(i=60; i<=79; i++) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		H0 = (H0 + A) & 0x0ffffffff;
		H1 = (H1 + B) & 0x0ffffffff;
		H2 = (H2 + C) & 0x0ffffffff;
		H3 = (H3 + D) & 0x0ffffffff;
		H4 = (H4 + E) & 0x0ffffffff;
 
	}
 
	var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
 
	return temp.toLowerCase();
 
}


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//GESTION DES CODES --> PROTOCOLE
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

function system_protocole(input, response)
{
	input.title="";
	input.value="";
	
	var re = new RegExp("system_code_\d*", "gi");
	var responses = response.split(re);
	
	if(responses.length==0)
	{
		input.value = unHTMLentities(response);
		input.title = "";
		input.style.background="rgb(240, 240, 240)";
		input.name=-1;
	}
	else
	{
		if(uAccount.admin==1)
		{
			for(var i = 0; i<responses.length; i++)
			{	
				var val = parseInt(responses[i],10);
			
				switch(val)
				{
					case 0 :
						input.value += "disponible ";
						input.title += "disponible ";
						input.style.background="#99FF66";
						input.name=1;
						break;	
	
					case 1 :
						input.value += "Ecran indisponible ";
						input.title += "Ecran indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 2 :
						input.value += "Activité du compte non acceptée ";
						input.title += "Activité du compte non acceptée ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 3 :
						input.value += "Activité du contenu non acceptée ";
						input.title += "Activité du contenu non acceptée ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 4 :
						input.value += "Temps indisponible ";
						input.title += "Temps indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 5 :
						input.value += "Temps maximum par écran dépassé ";
						input.title += "Temps maximum par écran dépassé ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 6 :
						input.value += "réservé ";
						input.title += "réservé ";
						input.style.background = "#99FF66";
						input.name=1;
						break;
	
					case 7 :
						input.value += "indisponible ";
						input.title += "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 8 :
						input.value += "Espaces insuffisants ";
						input.title += "Espaces insuffisants ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 9 :
						input.value += "Espaces utilisés ";
						input.title += "Espaces utilisés ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
					
					case 10 :
						input.value += "annulé ";
						input.title += "annulé ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;					
	
					default:
						input.value = unHTMLentities(responses[i]);
						input.title = "";
						input.style.background = "rgb(240, 240, 240)";
						input.name=-1;
						break;
				}
			}
		}
		else //pour client
		{
			for(var i = 0; i<responses.length; i++)
			{	
				var val = parseInt(responses[i],10);
			
				switch(val)
				{
					case 0 :
						input.value = "disponible ";
						input.title = "disponible ";
						input.style.background="#99FF66";
						input.name=1;
						break;	
	
					case 1 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 2 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 3 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 4 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 5 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 6 :
						input.value = "réservé ";
						input.title = "réservé ";
						input.style.background = "#99FF66";
						input.name=1;
						break;
	
					case 7 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 8 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
	
					case 9 :
						input.value = "indisponible ";
						input.title = "indisponible ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;
					
					case 10 :
						input.value = "annulé ";
						input.title = "annulé ";
						input.style.background = "#FFCC66";
						input.name=0;
						break;					
	
					default:
						input.value = unHTMLentities(responses[i]);
						input.title = "";
						input.style.background = "rgb(240, 240, 240)";
						input.name=-1;
						break;
				}
			}

		}
	}
}


//------------------------------
//CLASS tabManager_list
//------------------------------

var tabManager_list = [];

function tabManager_getTabObj(name)
{
	for(var i=tabManager_list.length-1; i>=0; i--)
	{	
		if(tabManager_list[i].name==name)
		{
			return tabManager_list[i];
		}
	}
}

function tabManager_showTab(name, tabId)
{
	var obj = tabManager_getTabObj(name);

	if(obj)
	{
		obj.showTab(tabId);
	}	
}

//------------------------------
//CLASS tabManagerElement
//------------------------------
function tabManagerElement(name, text, width, obj, visible, innerHTMLid, innerHTMLlink)
{
	this.name = name;
	this.text = text;
	this.width = width;
	this.obj = obj;
	this.loaded = false;
	this.innerHTMLid = innerHTMLid;
	this.innerHTMLlink = innerHTMLlink;

	if(visible==false){this.visible=false;}else{this.visible=true;}
}


//----------------------------------------------------------------------
//CLASS tabManager
//----------------------------------------------------------------------
function tabManager(name, height, width, bgColorSelected, bgColorUnSelected, borderColor, reload, visible)
{
	this.activeButtonId;
	this.activeId;
	this.name = name;
	this.tab = [];
	this.height = height;
	this.width = width;
	this.bgColorSelected = bgColorSelected;
	this.bgColorUnSelected = bgColorUnSelected;
	this.borderColor = borderColor;
	this.visible = visible;
	
	if(visible==false){this.visible=false;}else{this.visible=true;}

	if(reload!=true){this.reload=false;}else{this.reload=true;}

	tabManager_list.push(this);
}

tabManager.prototype.getObjByName = function(name)
{
	for(var i = 0; i < this.tab.length; i++)
	{
		if(this.tab[i].name == name){return this.tab[i].obj;}
	}
};

tabManager.prototype.getTabByName = function(name)
{
	for(var i = 0; i < this.tab.length; i++)
	{
		if(this.tab[i].name == name){return this.tab[i];}
	}
};

tabManager.prototype.getIdByName = function(name)
{
	for(var i = 0; i < this.tab.length; i++)
	{
		if(this.tab[i].name == name){return i;}
	}

return -1;
};

tabManager.prototype.getButtonIdByName = function(name)
{
	for(var i = 0; i < this.tab.length; i++)
	{
		if(this.tab[i].name == name){return this.name+"_TAB_"+i+"_button";}
	}
};

tabManager.prototype.add = function(name, text, width, obj, visible, innerHTMLid, innerHTMLlink)
{
	this.tab.push(new tabManagerElement(name, text, width, obj, visible, innerHTMLid, innerHTMLlink));
};

tabManager.prototype.toString = function(id)
{
	this.activeId = id;

	if(this.visible==true){var display = "inline";}else{var display = "none";}
	
	var html = "<table id=\"tab_"+this.name+"\" cellspacing=0 cellpadding=0 style=\"width:"+this.width+"px; display: "+display+";\"><tr><td style=\"width:"+this.width+"px;\"><table cellspacing=0 style=\"width: 100%; border-color: "+this.borderColor+";\"><tr>";
	    
	for (var i = 0; i< this.tab.length; i++)
	{
		if(this.tab[i].visible==true)
		{
			html+="<td style=\"width :"+this.tab[i].width+";\" id=\""+this.name+"_TAB_"+i+"_button\" class=\"classButtonMouseOut\" onmouseover=\"this.className='classButtonMouseOver';\" onmouseout=\"this.className='classButtonMouseOut';\" onclick=\"javascript: tabManager_showTab('"+this.name+"', this.id);\">&nbsp;"+this.tab[i].text+"&nbsp;</td>";	
		}
	}

	html+="<td style=\"border-color: "+this.borderColor+"; border-style:solid; border-right-width:0px; border-left-width:0px; border-top-width:0px; border-bottom-width:1px;\">&nbsp;</td></tr></table>";
	html+="</td></tr><tr><td><table id="+this.name+" style=\"width: 100%; background: "+this.bgColorSelected+";border-color: "+this.borderColor+"; border-style:solid; border-right-width:1px; border-left-width:1px; border-top-width:0px; border-bottom-width:1px; height:"+this.height+"px;\"><tr><td valign=\"top\">";

	for(var i = 0; i < this.tab.length; i++)
	{
		if(i==0)
		{
			html+="<div style=\"display: inline; visibility: visible; overflow: visible;\" id=\""+this.name+"_TAB_"+i+"\"></div>";
		}
		else
		{
			html+="<div style=\"display: none; visibility: hidden; overflow: hidden;\" id=\""+this.name+"_TAB_"+i+"\"></div>";
		}
		this.tab[i].obj.htmlParent = this.name+"_TAB_"+i;
		this.tab[i].loaded=false;
	}

	html+="</td></tr></table></td></tr></table>";

return html;
};

tabManager.prototype.hideTabs = function(id)
{
	var tabs = (document.getElementById(this.name)).getElementsByTagName("div");

	for(var u = 0; u < tabs.length; u++)
	{
		if(((tabs[u]).id).substring(0, ((this.name).length+5))==this.name+"_TAB_")
		{
			(tabs[u]).style.display="none";
			(tabs[u]).style.visibility="hidden";
			(tabs[u]).style.overflow="hidden";


			try
			{
				document.getElementById((tabs[u]).id+"_button").style.fontWeight="normal";
				document.getElementById((tabs[u]).id+"_button").style.background=this.bgColorUnSelected;

				if(this.name+"_TAB_"+(id-1)==(tabs[u]).id){document.getElementById((tabs[u]).id+"_button").style.borderRightWidth="0px";}
				else{document.getElementById((tabs[u]).id+"_button").style.borderRightWidth="1px";}

				document.getElementById((tabs[u]).id+"_button").style.borderLeftWidth="0px";
				document.getElementById((tabs[u]).id+"_button").style.borderTopWidth="0px";
				document.getElementById((tabs[u]).id+"_button").style.borderBottomWidth="1px";
			}catch(e){}
		}
	}
};

tabManager.prototype.hide = function()
{
	document.getElementById("tab_"+this.name).style.display="none";
};

tabManager.prototype.show = function()
{
	document.getElementById("tab_"+this.name).style.display="inline";
};

tabManager.prototype.showTab = function(buttonId)
{
	this.activeButtonId = buttonId;

	var button = "_button";
	var tabId = buttonId.substr(0, buttonId.length - button.length);
	var id = tabId.substr(tabId.lastIndexOf("_")+1, tabId.length);

	this.hideTabs(id);

	if(this.tab[id].visible==true)
	{
		document.getElementById(buttonId).style.fontWeight="bold";
		document.getElementById(buttonId).style.background=this.bgColorSelected;
		document.getElementById(buttonId).style.borderRightWidth="1px";
		document.getElementById(buttonId).style.borderLeftWidth="1px";
		document.getElementById(buttonId).style.borderTopWidth="1px";
		document.getElementById(buttonId).style.borderBottomWidth="0px";
	}
	
	document.getElementById(tabId).style.display="inline";
	document.getElementById(tabId).style.visibility="visible";
	document.getElementById(tabId).style.overflow="visible";

	if(this.tab[id].loaded==false || this.reload==true)
	{
		this.tab[id].obj.load(this.activeId);
		this.tab[id].loaded=true;
	}
	
	if(this.tab[id].innerHTMLid && this.tab[id].innerHTMLlink)
	{	
		loadContent(this.tab[id].innerHTMLlink, this.tab[id].innerHTMLid);
	}
};


//------------------------------
//CLASS gridManager_list
//------------------------------

var gridManager_list = [];

function gridManager_getGridObj(name)
{
	for(var i=gridManager_list.length-1; i>=0; i--)
	{
		if(gridManager_list[i].name==name)
		{
			return gridManager_list[i];
		}
	}
}

function gridManager_moveDiv(name, preferedObj)
{
	var obj = gridManager_getGridObj(name);

	if(obj)
	{
		obj.moveDivs(preferedObj);
	}
}

function gridManager_rowFilter(name)
{
	var obj = gridManager_getGridObj(name);

	if(obj)
	{
		obj.rowFilter();
	}	
}

function gridManager_rowSort(name, columnToSort, columnObj)
{
	var obj = gridManager_getGridObj(name);

	if(obj)
	{
		obj.rowSort(columnToSort, columnObj);
	}	
}

function gridManager_mouseMove(name, columnObj, typ)
{
	var obj = gridManager_getGridObj(name);

	if(obj)
	{
		obj.mouseMove(columnObj, typ);
	}	
}



//----------------------------------------------------------------------------------------------------------
// CLASS grid (constructeur integre)
//----------------------------------------------------------------------------------------------------------

function gridManager(name)
{
	this.name = name;

	this.title;			//Tableau des titres des colonnes
	this.data;			//Tableau de données x|y
	this.columnWidth;		//Tableau de la largeur des colonnes
	this.columnHeaderAlign;		//Tableau d'alignement des colonnes des titres
	this.columnDataAlign;		//Tableau d'alignement des colonnes de données
	this.columnFilter;		//Tableau oui|non d'affichages des filtres sur les colonnes
	this.columnVisible;		//Tableau oui|non d'affichages des colonnes (visible)
	this.rowColor;			//Tableau de couleur des enregistrement y
	this.borderColorSort;		//Couleur lorsque la colonne est filtrée
	this.borderColorSortLight;	//Couleur lorsque la colonne à la souris
	this.borderWidthSort;		//Largeur de la couleur lorsque la colonne est filtrée
	this.tableWidth;		//Largeur du tableau "gridManager"
	this.divWidth;			//Largeur du div contenant les données
	this.divHeight;			//Hauteur du div contenant les données
	this.firstRowWidth;		//Largeur de la première colonnne : 80px minimum sans select box status et 145 sinon.
	this.firstRowColor;		//Couleur de la première colonne
	this.rowHeight;			//Hauteur des enregistrement
	
	this.selectData = [];	//Donnée pour les selectTag
	this.inputs = [];		//Contient les valeurs des inputs
	this.inputsColor = [];	//Contient les background des inputs
	this.inputsName = [];	//Contient les nom des inputs --> Requis pour le filtre sur le statu 1 ou 0
	this.inputsId = [];	//Contient l'id du input	

	this.columnSort = [];	//Donnée pour les tris
	this.position = 0;		//Donnée pour le déplacement horizontal

	this.functionToCall_checkBox = "";	//fonction appellée lors du clique sur le checkbox avec en paramètre l'id de l'enregistrement
	this.functionToCall_rowFilter ="";	//fonction appellée lors du filtrage des données sans paramètre

	this.checkAction = 1;		//CHECK :-1 l'action est dans tous les cas lancée, 0 action lancée lorsque non coché, 1 action lancée lorsque coché
	this.checkboxChecked="";		//CHECK : Valeur par défaut du checkbox lors du chargement du tableaux 1=checked, 0=not checked ou nom de la colonne avec valeur

	this.saveAction=1;			//SAVE : -1 l'action est dans tous les cas lancée, 0 action lancée lorsque non coché, 1 action lancée lorsque coché

	this.recordTmpFunction="";		//Fonction appellée lors de la fin de la boucle de parcourt des enregristrements
	this.recordTmpObj="";			//Object qui contient la fonction ci-dessus

	this.statusVisible="block";		//Définit si le select du status est visible
	this.statusValue0="selected=\"yes\"";		//Première option sélectionnée du status Valueur = -1
	this.statusValue1="";			//Deuxième option sélectionnée du status Valueur = 0
	this.statusValue2="";			//Première option sélectionnée du status Valueur = 1

	this.progressBarValue=0;		//Valeur de la bar de progression (nombre d'item déjà traité)
	this.progressBarLength=0;		//Nombre d'item à traiter

	this.displayData="block";		//Valeur pour définir si les données sont visible ou non
	
	this.system_code="";			//Valeur pour définir le message à afficher sur l'input --> selon la fonction : system_protocole(input, response)
										//system_code_X = affiche le message du protocole; system_column_X = affiche le message d'une colonne; XXX = affiche le texte définit

	gridManager_list.push(this);
}

gridManager.prototype.setProperties = function(name, value)
{
	switch(name)
	{
		case "title":
			this.title = value;
			break;

		case "data" :
			this.data = value;
			break;

		case "columnWidth" :
			this.columnWidth = value;
			break;

		case "columnHeaderAlign" :
			this.columnHeaderAlign = value;
			break;

		case "columnDataAlign" :
			this.columnDataAlign = value;
			break;

		case "columnFilter" :
			this.columnFilter = value;
			break;

		case "columnVisible" :
			this.columnVisible = value;
			break;

		case "rowColor" :
			this.rowColor = value;
			break;
	
		case "borderColorSort" :
			this.borderColorSort = value;
			break;

		case "borderColorSortLight" :
			this.borderColorSortLight = value;
			break;

		case "borderWidthSort" :
			this.borderWidthSort = value;
			break;
	
		case "tableWidth" :
			this.tableWidth = value;
			break;

		case "divWidth" :
			this.divWidth = value;
			break;

		case "divHeight" :
			this.divHeight = value;
			break;
	
		case "firstRowWidth" :
			this.firstRowWidth = value;
			break;

		case "firstRowColor" :
			this.firstRowColor = value;
			break;

		case "functionToCall_checkBox" :
			this.functionToCall_checkBox = value;
			break;

		case "functionToCall_rowFilter" :
			if(value!=""){this.functionToCall_rowFilter = value+"()";}
			else{this.functionToCall_rowFilter = "";}
			break;

		case "checkAction" :
			this.checkAction = value;
			break;

		case "checkboxChecked" :
				var validChars = "0123456789.";
				if (validChars.indexOf(value) != -1)
				{
					if(value==1){this.checkboxChecked=1;}else{this.checkboxChecked=0;}
				}
				else
				{
					this.checkboxChecked=value;
				}
			break;

		case "statusVisible" :
			if(value==1){this.statusVisible="block";}
			else{this.statusVisible="none";}
			break;

		case "statusValue" :
			switch(value)
			{
				case -1 :
					this.statusValue0="selected=\"yes\"";
					this.statusValue1="";
					this.statusValue2="";
					break;

				case 0 :
					this.statusValue0="";
					this.statusValue1="selected=\"yes\"";
					this.statusValue2="";
					break;
			
				case 1 :
					this.statusValue0="";
					this.statusValue1="";
					this.statusValue2="selected=\"yes\"";
					break;

				default:
					this.statusValue0="selected=\"yes\"";
					this.statusValue1="";
					this.statusValue2="";
					break;
			}
			break;

		case "displayData" :
			if(value=="none"){this.displayData="none";}
			else{this.displayData="block";}
			break;

		case "saveAction" :
			this.saveAction = value;
			break;
			
		case "system_code" :
			this.system_code = value;
			break;

		default:
			break;	
	}
};

gridManager.prototype.toString = function()
{
	//---------------------------------------------------------------------------------
	//CREATION DU GRID SANS LES TITRES ET FILTRES
	//---------------------------------------------------------------------------------


   var htmlHead="<table id="+this.name+" height='"+parseInt(this.divHeight,10)+"px' cellspacing=0 cellpadding=0>";
   
   
   htmlHead+="<tr><td><table cellspacing=0 cellpadding=0><tr><td class='corner' style='text-align: center; width: "+(parseInt(this.firstRowWidth,10))+"px;'><table cellspacing=0 cellpadding=0><tr><td class=\"columnheader\"  align='left' style=\"align: left;\"><select style=\"display:"+this.statusVisible+"\" name=\"input\" class='selectheader' id=\"column_0\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='selectheader' value='-1' "+this.statusValue0+">Dispo</option><option class='optionheader' value='0' "+this.statusValue1+">non</option><option class='optionheader' value='1' "+this.statusValue2+">oui</option></select></td><td align='right' style=\"width: 70px; align: right;\"><select name=\"input\" class='selectheader' id=\"column_1\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='selectheader' value='-1'>Coch&eacute;</option><option class='optionheader' value='0'>non</option><option class='optionheader' value='1'>oui</option></select></td></tr></table></td><td><div class='divRowHeader' style='width: "+this.divWidth+"px;'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'><tr id='"+this.name+"_columns'>";

	/*if (this.admin==1)
	{
		htmlHead+="<tr><td><table cellspacing=0 cellpadding=0><tr><td class='corner' style='text-align: center; width: "+(parseInt(this.firstRowWidth,10))+"px;'><table cellspacing=0 cellpadding=0><tr><td class=\"columnheader\"  align='left' style=\"align: left;\"><select style=\"display:"+this.statusVisible+"\" name=\"input\" class='selectheader' id=\"column_0\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='selectheader' value='-1' "+this.statusValue0+">Dispo</option><option class='optionheader' value='0' "+this.statusValue1+">non</option><option class='optionheader' value='1' "+this.statusValue2+">oui</option></select></td><td align='right' style=\"width: 70px; align: right;\"><select name=\"input\" class='selectheader' id=\"column_1\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='selectheader' value='-1'>Coch&eacute;</option><option class='optionheader' value='0'>non</option><option class='optionheader' value='1'>oui</option></select></td></tr></table></td><td><div class='divRowHeader' style='width: "+this.divWidth+"px;'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'><tr id='"+this.name+"_columns'>";
	}
	else
	{
		htmlHead+="<tr><td><table cellspacing=0 cellpadding=0><tr><td class='corner' style='text-align: center; width: "+(parseInt(this.firstRowWidth,10))+"px;'><table cellspacing=0 cellpadding=0><tr><td class=\"columnheader\"  align='left' style=\"align: left;\"><select style=\"display:"+this.statusVisible+"\" name=\"input\" class='selectheader' id=\"column_0\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='optionheader' value='1' "+this.statusValue2+">Dispo</option></select></td><td align='right' style=\"width: 70px; align: right;\"><select name=\"input\" class='selectheader' id=\"column_1\" onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'><option class='selectheader' value='-1'>Coch&eacute;</option><option class='optionheader' value='0'>non</option><option class='optionheader' value='1'>oui</option></select></td></tr></table></td><td><div class='divRowHeader' style='width: "+this.divWidth+"px;'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'><tr id='"+this.name+"_columns'>";
	}*/

    var htmlBody="</tr></table></div></td></tr></table></td></tr><tr><td valign='top'><div class='divbox' style='height: "+parseInt(this.divHeight,10)+"px; width: "+(parseInt(this.divWidth,10)+parseInt(this.firstRowWidth,10))+"px;'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'>";
	
	for (var u = 0; u< this.data.length; u++)
	{
	
		var checkboxChecked="";

		switch(this.checkboxChecked)
		{
			case 0 :
				checkboxChecked="";
				break;
				
			case 1 :
				checkboxChecked="checked=\"yes\"";
				break;
				
			default :
				if(parseInt(this.data[u][this.getColumnByName(this.checkboxChecked)],10)==1){checkboxChecked="checked=\"yes\"";}else{checkboxChecked="";}
				break;
		}
	
		htmlBody+="<tr id='"+this.name+"_row_"+(u+1)+"' cellspacing=0 cellpadding=0 style='display: "+this.displayData+"'><td id='"+this.name+"_position_"+(u+1)+"' cellspacing=0 cellpadding=0><table cellspacing=0 cellpadding=0><tr><td class='rowheader' style='text-align: center; width:"+(parseInt(this.firstRowWidth,10))+"px;background-color:"+this.firstRowColor+"; height: "+this.rowHeight+"px; align: left;'><table cellspacing=0 cellpadding=0><tr><td><input id='"+this.name+"_message_"+(u+1)+"' name=-1 style=\"cursor: default; width:"+(parseInt(this.firstRowWidth,10)-30)+"px; border:0px; background: "+this.firstRowColor+";\" readonly></input></td><td><input id=\""+u+"\" name=\"selected\" "+checkboxChecked+" onclick=\"javascript: gridManager_rowFilter('"+this.name+"'); "+this.functionToCall_checkBox+"(this.id);\" type=\"checkbox\"></input></td></tr></table></td><td class='tdRow' style='background-color:"+this.rowColor[u%2]+";'><div class='divRow' style='width: "+(parseInt(this.divWidth,10))+"px;'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'><tr><td style='background-color:"+this.rowColor[u%2]+"; height: "+this.rowHeight+"px;' width=\"3px\"></td>";
		
		for (var x = 0 ; x < this.data[u].length ; x++)
		{
			if(this.data[u][x]==""){this.data[u][x]="&nbsp;";}

			if(this.columnVisible[x]==true)
			{

				htmlBody+="<td valign=\"top\" class='box' style='text-align: "+this.columnDataAlign[x]+"; background-color:"+this.rowColor[u%2]+"; width:"+this.columnWidth[x]+"; height: "+this.rowHeight+"px;'>"+unHTMLentities(this.data[u][x])+"</td>";

				if(this.columnFilter[x]==true)
				{
					if(typeof(this.selectData[x])=='undefined'){this.selectData[x] = [];}
					if((this.selectData[x]).indexOf(this.data[u][x],0) < 0){(this.selectData[x]).push(this.data[u][x]);}
				}
			}
		}
		
		htmlBody+="</tr></table></div></td></tr></table></td></tr>";
	}

	htmlBody+="</table></div></td></tr><tr><td><table cellspacing=0 cellpadding=0><tr><td class='cornerBottom' align='left' style='valign: center; align: left; height: "+this.rowHeight+"px; text-align: left; width: "+(parseInt(this.firstRowWidth,10))+"px;'><div id='"+this.name+"_progressBar' style='visibility: hidden; height:"+this.rowHeight+"px; width: 0px; background-color: rgb(0, 0, 102);'>&nbsp;</div></td><td><div class='divRowBottom' style='height: 18px; width: "+this.divWidth+"px;' onscroll='javascript : gridManager_moveDiv(\""+this.name+"\",this);'><table cellspacing=0 cellpadding=0 style='width: "+this.tableWidth+"px;'><tr>";
	htmlBody+="<td>&nbsp;</td>";
	htmlBody+="</tr></table></div></td></tr></table></td></tr></table>";

	//---------------------------------------------------------------------------------
	//CREATION DES TITRES ET FILTRES (html remplacer pour mettre le bon positionnement)
	//---------------------------------------------------------------------------------

	var htmlTitle="<td width=\"3px\"></td>";

	for (var i = 0; i<this.title.length; i++)
	{    

		if(this.columnVisible[i]==true)
		{

		htmlTitle+="";
	
		if(this.columnFilter[i]==true && this.data.length!=0)
		{
			htmlTitle+="<td id=0 class='columnheader' style='width:"+(parseInt(this.columnWidth[i],10))+"px; height: 42px; border-top-width:"+this.borderWidthSort[0]+"; border-bottom-width:"+this.borderWidthSort[0]+";'>";
			htmlTitle+="<table cellspacing=0 cellpadding=0><tr><td onmouseover='javascript: gridManager_mouseMove(\""+this.name+"\", (((this.parentNode).parentNode).parentNode).parentNode, 0);' onmouseout='javascript: gridManager_mouseMove(\""+this.name+"\", (((this.parentNode).parentNode).parentNode).parentNode, 1);' onclick='javascript : gridManager_rowSort(\""+this.name+"\","+i+", (((this.parentNode).parentNode).parentNode).parentNode); (((this.parentNode).parentNode).parentNode).parentNode.id=((parseInt((((this.parentNode).parentNode).parentNode).parentNode.id)+1)%2);' style='height: 5px; cursor: pointer;width:"+(parseInt(this.columnWidth[i],10))+"px;'></td></tr><tr><td valign='top'>&nbsp;<select name=\"table\" class='selectheader' id='column_"+i+"' style='width:"+(parseInt(this.columnWidth[i],10)-5)+"px;' onchange='javascript : gridManager_rowFilter(\""+this.name+"\");'>";
			htmlTitle+="<option value='-1' class='selectheader' style='padding:0px'>"+this.title[i]+"</option>";

			this.selectData[i].sort();

			for(var l = 0; l < this.selectData[i].length; l++)
			{
				htmlTitle+="<option class='optionheader' value='"+unHTMLentities(this.selectData[i][l])+"'>"+unHTMLentities(this.selectData[i][l])+"</option>";
			}

			htmlTitle+="</select></td></tr><tr><td onmouseover='javascript: gridManager_mouseMove(\""+this.name+"\", (((this.parentNode).parentNode).parentNode).parentNode, 0);' onmouseout='javascript: gridManager_mouseMove(\""+this.name+"\", (((this.parentNode).parentNode).parentNode).parentNode, 1);' onclick='javascript : gridManager_rowSort(\""+this.name+"\","+i+", (((this.parentNode).parentNode).parentNode).parentNode); (((this.parentNode).parentNode).parentNode).parentNode.id=((parseInt((((this.parentNode).parentNode).parentNode).parentNode.id)+1)%2);' style='height: 8px; cursor: pointer; width:"+(parseInt(this.columnWidth[i],10))+"px;'></td></tr></table>";
			htmlTitle+="</td>";

		}
		else
		{
			htmlTitle+="<td id=0 onmouseover='javascript: gridManager_mouseMove(\""+this.name+"\", this, 0);' onmouseout='javascript: gridManager_mouseMove(\""+this.name+"\", this, 1);' onclick='javascript : gridManager_rowSort(\""+this.name+"\","+i+", this); this.id=((parseInt(this.id)+1)%2);' class='columnheader' style='text-align: "+(parseInt(this.columnHeaderAlign[i],10))+"; width:"+(parseInt(this.columnWidth[i],10))+"px; cursor: pointer; border-bottom-width:"+this.borderWidthSort[0]+"; border-top-width:"+this.borderWidthSort[0]+";'>&nbsp;"+this.title[i]+"</td>";
		}
	
		htmlTitle+="";
		}
	}

	//---------------------------------------------------------------------------------
	//POSITIONNEMENT DE TITRE ET FILTRE EN ENTETE DU GRID
	//---------------------------------------------------------------------------------	

	return htmlHead+htmlTitle+htmlBody;
};

gridManager.prototype.system_protocole = function()
{
	var columnCode = "system_column";

	if(this.system_code!="")
	{
		if(this.system_code.indexOf(columnCode)!=-1)
		{
				//Affichage selon le contenu d'une colonne
				var columnName = this.system_code.substring(columnCode.length + 1, this.system_code.length);
				var column = this.getColumnByName(columnName);
						
				for(var x = 0; x < this.data.length; x++)
				{
					system_protocole(document.getElementById(this.name+"_message_"+(x+1)), this.data[x][column]);		
				}
		}
		else
		{
				for(var x = 0; x < this.data.length; x++)
				{
					system_protocole(document.getElementById(this.name+"_message_"+(x+1)), this.system_code);		
				}
		}
	}
};

gridManager.prototype.progressBar = function(value) //Valeur 1 à 100 
{
	var progressBar = document.getElementById(this.name+"_progressBar"); 

	if(value==0)
	{
		var width=0;
		progressBar.style.visibility = "hidden";
	}
	else
	{
		var width = this.firstRowWidth*(parseInt(value,10)/parseInt(this.progressBarLength,10));
		progressBar.style.visibility = "visible";
	}

	progressBar.style.width = width+"px";
};

gridManager.prototype.moveDivs = function(preferedObj)
{
	//1. Calcul position objet de référent
	if(preferedObj)
	{
		this.position = preferedObj.scrollLeft;
	}

	//2. Application de la position sur les divs
	var divs = (document.getElementById(this.name)).getElementsByTagName("div"); 

	for(var u = 0; u < divs.length; u++)
	{
		if(divs[u].className=="divRow" || divs[u].className=="divRowHeader")
		{
			(divs[u]).scrollLeft = this.position;
		}
	}	
};

gridManager.prototype.rowFilter = function()
{
	//Récupération des valeurs dans les inputs
	this.getInputsValues();

	var selects = (document.getElementById(this.name)).getElementsByTagName("select");
	var columns = [];
	var columnsVal = [];

	var inputs = [];
	var inputsVal = [];

	for(var u = 0; u < selects.length ; u++)
	{
		if(selects[u].value!="-1" && selects[u].name=="table")
		{
			columns.push((selects[u].id).substring((selects[u].id).lastIndexOf("_")+1));
			columnsVal.push(selects[u].value);
		}	

		if(selects[u].value!="-1" && selects[u].name=="input")
		{	
			inputs.push((selects[u].id).substring((selects[u].id).lastIndexOf("_")+1));
			inputsVal.push(selects[u].value);
		}
	}

	for(var i = 0; i<this.data.length; i++)
	{
		var visible=true;

		for(var x = 0; x < columns.length; x++)
		{
			if(unHTMLentities(this.data[i][columns[x]])!=columnsVal[x]){visible=false;}
		}

		for(var u = 0; u < inputs.length; u++)
		{
			if(this.inputsId[i][inputs[u]]==this.name+"_message_"+(i+1)) // lié au filtre du statu (valeur dans le name)
			{ 
				if(this.inputsName[i][inputs[u]]!=inputsVal[u]){visible=false;}	
			}
			else	// liés aux autres filtres (coche + filtre auto)
			{	
				if(this.inputs[i][inputs[u]]!=inputsVal[u]){visible=false;}
			}
		}

		var obj = document.getElementById(this.name+"_row_"+(i+1));

		if(visible==false){obj.style.display="none";}
		else{obj.style.display="block";}
	}

	this.moveDivs();

	if(this.functionToCall_rowFilter!=""){setTimeout(this.functionToCall_rowFilter,0);}
};

gridManager.prototype.getInputsValues = function()
{
	//Récupération des valeurs inputs
	for(var x = 0; x<this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");
		this.inputs.push([]);		
		this.inputsColor.push([]);
		this.inputsName.push([]);
		this.inputsId.push([]);

		for(var u = 0; u<inputs.length; u++)
		{
			this.inputs[x][u] = this.getObjValue(inputs[u]);
			this.inputsColor[x][u] = inputs[u].style.background;
			this.inputsName[x][u] = inputs[u].name;
			this.inputsId[x][u] = inputs[u].id;
		}
	}
};

gridManager.prototype.putInputsValues = function()
{
	//Ré-insertion des valeurs inputs
	for(var x = 0; x<this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");
		
		for(var u = 0; u<inputs.length; u++)
		{
			this.putObjValue(inputs[u], this.inputs[x][u]);
			inputs[u].style.background = this.inputsColor[x][u];
		}
	}
};

gridManager.prototype.rowSort = function(columnToSort, columnObj)
{
	var idcol = columnObj.id;

	//Récupération des lignes (1er fois)
	//if(this.columnSort.length==0)
	//{
		for(var i = 0; i<this.data.length;i++)
		{
			this.columnSort.push((document.getElementById(this.name+"_position_"+(i+1))).innerHTML);
		}
	//}

	//Récupération des valeurs dans les inputs
	this.getInputsValues();

	//Changement couleur sur la colonne titre
	var columns = (document.getElementById(this.name+"_columns")).getElementsByTagName("td");
	
	for(var x = 0; x<columns.length; x++)
	{
		columns[x].style.borderTopColor = this.borderColorSort[0];
		columns[x].style.borderTopWidth = this.borderWidthSort[0];
		columns[x].style.borderBottomColor = this.borderColorSort[0];
		columns[x].style.borderBottomWidth = this.borderWidthSort[0];
		columns[x].id=0;
	}	

	//Définition de l'ordre selon la colonne
	var values = [];

	for(var i = 0; i< this.data.length; i++)
	{
		values.push([unHTMLentities(this.data[i][columnToSort]).toLowerCase(), i]);
	}

	values.sort();

	columnObj.id = idcol;

	//Création du nouveau affichage
	if(columnObj.id==0)
	{
		for(var i = 0; i<values.length; i++)
		{
			document.getElementById(this.name+"_position_"+(i+1)).parentNode.id=this.name+"_row_"+(values[i][1]+1);
			document.getElementById(this.name+"_position_"+(i+1)).innerHTML=this.columnSort[values[i][1]];
		}

		columnObj.style.borderBottomColor = this.borderColorSort[1];
		columnObj.style.borderBottomWidth = this.borderWidthSort[1];
	}
	else
	{
		var x = 0;
		for(var i = (values.length-1); -1<i; i--)
		{x++;
			document.getElementById(this.name+"_position_"+(x)).parentNode.id=this.name+"_row_"+(values[i][1]+1);
			document.getElementById(this.name+"_position_"+(x)).innerHTML=this.columnSort[values[i][1]];
		}

		columnObj.style.borderTopColor = this.borderColorSort[1];
		columnObj.style.borderTopWidth = this.borderWidthSort[1];
	}

	//Ré-insertion des valeurs dans les inputs
	this.putInputsValues();

	this.rowFilter();
};

gridManager.prototype.mouseMove = function(columnObj, typ)
{
	if(typ==0){var color = this.borderColorSortLight[1]; var width=this.borderWidthSort[1];}
	else{var color = this.borderColorSortLight[0]; var width=this.borderWidthSort[0];}

	if(columnObj.id==0)
	{
		columnObj.style.borderBottomColor = color;
		columnObj.style.borderBottomWidth = width;
	}
	else
	{
		columnObj.style.borderTopColor = color;
		columnObj.style.borderTopWidth = width;
	}
};

gridManager.prototype.getVisibleRow = function()
{
	var list = [];

	for(var i = 0; i<this.data.length; i++)
	{
		var obj = document.getElementById(this.name+"_row_"+(i+1));

		if(obj.style.display!="none"){list.push(i);}
	}	

return list;
};

gridManager.prototype.numberOfSelectedRows = function()
{
	var nb = 0;

	//Récupération des valeurs inputs
	for(var x = 0; x<this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u<inputs.length; u++)
		{
			if(inputs[u].name=="selected"){nb+=this.getObjValue(inputs[u]);}
		}
	}

return nb;
};

gridManager.prototype.numberOfAvailableRecord = function()
{
	var nb = 0;

	//Récupération des valeurs inputs
	for(var x = 0; x<this.data.length; x++)
	{
		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1){nb++;}
	}

return nb;
};

gridManager.prototype.numberOfSelectedAvailableRecord = function()
{
	var nb = 0;
	var selected=false;
	var available=false;
	
	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1){available=true;}else{available=false;}

		if(available==true && selected==true){nb++;}
	}

return nb;
};

gridManager.prototype.numberOfNoneSelectedOrNoneAvailableRecord = function()
{
	var nb = 0;
	var selected=false;
	var available=false;
	
	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1){available=true;}else{available=false;}

		if(available==false || selected==false){nb++;}
	}

return nb;
};

gridManager.prototype.getColumnSumOfSelectedAvailableRecord = function(columnName)
{
	var nb = 0;
	var selected=false;
	var available=false;
	
	var column = this.getColumnByName(columnName);

	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1){available=true;}else{available=false;}

		if(available==true && selected==true)
		{
			nb +=parseFloat(this.data[x][column]);
		}
	}

return nb;
};

gridManager.prototype.getColumnSumOfNoneSelectedOrNoneAvailableRecord = function(columnName)
{
	var nb = 0;
	var selected=false;
	var available=false;
	
	var column = this.getColumnByName(columnName);

	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1){available=true;}else{available=false;}

		if(available==false || selected==false)
		{
			nb +=parseFloat(this.data[x][column]);
		}
	}

return nb;
};

gridManager.prototype.getColumnSumOfSelectedRecord = function(columnName)
{
	var nb = 0;
	var selected=false;
		
	var column = this.getColumnByName(columnName);

	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		if(selected==true)
		{
			nb +=parseFloat(this.data[x][column]);
		}
	}

return nb;
};


gridManager.prototype.getDistinctColumnSumOfSelectedRecord = function(columnDistinct, columnSum)
{
	var nb = 0;
	var selected=false;
	var distinct=false;
	var varDistinct = [];
	
	var columnS = this.getColumnByName(columnSum);
	var columnD = this.getColumnByName(columnDistinct);

	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1)
				{
					selected=true;
					
					if(varDistinct.indexOf(this.data[x][columnD])==-1){distinct=true; varDistinct.push(this.data[x][columnD]);}else{distinct=false;}
			
				}else{selected=false;}
			}
		}

		if(selected==true && distinct==true)
		{
			nb +=parseFloat(this.data[x][columnS]);
		}
	}

return nb;
};

gridManager.prototype.getDistinctColumnSumOfSelectedAvailableRecord = function(columnDistinct, columnSum)
{
	var nb = 0;
	var selected=false;
	var distinct=false;
	var available=false;
	var varDistinct = [];
	
	var columnS = this.getColumnByName(columnSum);
	var columnD = this.getColumnByName(columnDistinct);

	//Récupération du nombre d'enregistrement disponible et sélectionné
	for(var x = 0; x < this.data.length; x++)
	{
		var inputs = document.getElementById(this.name+"_row_"+(x+1)).getElementsByTagName("input");

		for(var u = 0; u < inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{
				if(this.getObjValue(inputs[u])==1){selected=true;}else{selected=false;}
			}
		}

		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));
		
		if(inputMessage.name==1){available=true;}else{available=false;}
		
		if(selected==true && available==true)
		{
			if(varDistinct.indexOf(this.data[x][columnD])==-1){distinct=true; varDistinct.push(this.data[x][columnD]);}else{distinct=false;}
		}
		
		if(selected==true && distinct==true && available==true)
		{
			nb +=parseInt(this.data[x][columnS],10);
		}
	}

return nb;
};


gridManager.prototype.getObjValue = function(obj)
{
	var val = "";

	switch(obj.type)
	{
		case "text":			
			val = obj.value;
			break;

		case "checkbox":
			if(obj.checked==true){val=1;}
			else{val=0;}
			break;

		case "select-one":
			val = obj.value;
			break;

		case "password":
			if(obj.value==""){val="system_undefined";}
			else{val = SHA1(obj.value);}
			break;
						
		default:				
			val = obj.value;
			break;				
	}

return val;
};

gridManager.prototype.putObjValue = function(obj, val)
{
	switch(obj.type)
	{
		case "text":			
			obj.value = val;
			break;

		case "checkbox":
			if(val==false || val==0){obj.checked=false;}
			else{obj.checked=true;}
			break;

		case "select-one":
			obj.name = val;
			break;

		case "password":
			obj.value = "";
			break;
						
		default:				
			obj.value = val;
			break;				
		}

return val;
};

gridManager.prototype.getColumnByName = function(columnName)
{
	for(var i = 0; i< this.title.length; i++)
	{
		if(this.title[i]==columnName)
		{
			return i;
		}
	}
	
return 0;
};

gridManager.prototype.tmpFunction = function()
{
	if(this.recordTmpObj!=null && this.recordTmpFunction!=null)
	{
		//Appel de la fonction demandée
		var obj = this.recordTmpObj;
			obj.tmp = this.recordTmpFunction;

			obj.tmp();
	}

		//Appel de la fonction de filtre
		this.rowFilter();

		this.progressBarValue=0;
		this.progressBar(this.progressBarValue);
};

gridManager.prototype.checkRecord = function(recordfile, variableNamesSRC, variableValuesSRC, obj, fct, record)
{
	this.recordTmpFunction = fct;
	this.recordTmpObj = obj;
	
	obj = this;
	fct = this.tmpFunction;

	if(record)
	{
		var inputs = document.getElementById(this.name+"_row_"+(parseInt(record,10)+1)).getElementsByTagName("input");

		this.progressBarLength=1;
		this.progressBarValue=0;

		for(var u = 0; u<inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{

				if(inputs[u].checked==this.checkAction || -1==this.checkAction)
				{
					var variableNames = [];
					var variableValues = [];
				
					var dd = new Date();
					variableNames.push("system_time");
					variableValues.push(dd.getTime());
				
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).value="chargement...";
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).title="";
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).style.background=this.firstRowColor;
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).name=-1;

					idrecord = this.data[record][this.getColumnByName("id")];
					var innerHTML = this.name+"_message_"+(parseInt(record,10)+1);

					variableNames.push("idrecord");
					variableValues.push(idrecord);	

					variableNames.push("rowChecked");
					variableValues.push(this.getObjValue(inputs[u]));	
						
					var obj = new recordParam(recordfile, innerHTML, obj, fct, dd, this);
					    obj.addVariables(variableNames, variableValues);
						if(variableNamesSRC){obj.addVariables(variableNamesSRC, variableValuesSRC);}

					var fct = obj.loadContent;
				}
				else
				{
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).value="";
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).title="";
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).style.background=this.firstRowColor;
					document.getElementById(this.name+"_message_"+(parseInt(record,10)+1)).name=-1;
				}

			}

		}

		obj.tmp = fct;
		obj.tmp();
	}
	else
	{
		for(var i=this.data.length-1; i>-1; i--)
		{
			this.progressBarLength=this.data.length;
			this.progressBarValue=0;

			var inputs = document.getElementById(this.name+"_row_"+(parseInt(i,10)+1)).getElementsByTagName("input");

			for(var u = 0; u<inputs.length; u++)
			{
				if(inputs[u].name=="selected")
				{
					if(inputs[u].checked==this.checkAction || -1==this.checkAction)
					{
						var variableNames = [];
						var variableValues = [];
										
						var dd = new Date();
						variableNames.push("system_time");
						variableValues.push(dd.getTime());
					
						document.getElementById(this.name+"_message_"+(i+1)).value="chargement...";
						document.getElementById(this.name+"_message_"+(i+1)).title="";
						document.getElementById(this.name+"_message_"+(i+1)).style.background=this.firstRowColor;
						document.getElementById(this.name+"_message_"+(i+1)).name=-1;

						idrecord = this.data[i][this.getColumnByName("id")];
						var innerHTML = this.name+"_message_"+(i+1);

						variableNames.push("idrecord");
						variableValues.push(idrecord);	

						variableNames.push("rowChecked");
						variableValues.push(this.getObjValue(inputs[u]));	

						var obj = new recordParam(recordfile, innerHTML,  obj, fct, dd, this);
						    obj.addVariables(variableNames, variableValues);
							if(variableNamesSRC){obj.addVariables(variableNamesSRC, variableValuesSRC);}

						var fct = obj.loadContent;
					}
					else
					{
						document.getElementById(this.name+"_message_"+(i+1)).value="";
						document.getElementById(this.name+"_message_"+(i+1)).title="";
						document.getElementById(this.name+"_message_"+(i+1)).style.background=this.firstRowColor;
						document.getElementById(this.name+"_message_"+(i+1)).name=-1;
					}
				}
			}
		}

		obj.tmp = fct;
		obj.tmp();
	}
};

gridManager.prototype.saveRecord = function(recordfile, variableNamesSRC, variableValuesSRC, obj, fct)
{
	this.recordTmpFunction = fct;
	this.recordTmpObj = obj;
		
	obj = this;
	fct = this.tmpFunction;

	for(var i=this.data.length-1; i>-1; i--)
	{
		this.progressBarLength=this.data.length;
		this.progressBarValue=0;

		var inputs = document.getElementById(this.name+"_row_"+(parseInt(i,10)+1)).getElementsByTagName("input");

		for(var u = 0; u<inputs.length; u++)
		{
			if(inputs[u].name=="selected")
			{		
				if(inputs[u].checked==this.saveAction || -1==this.saveAction)
				{
					var variableNames = [];
					var variableValues = [];
								
					var dd = new Date();
					variableNames.push("system_time");
					variableValues.push(dd.getTime());
				
					document.getElementById(this.name+"_message_"+(i+1)).value="chargement...";
					document.getElementById(this.name+"_message_"+(i+1)).title="";
					document.getElementById(this.name+"_message_"+(i+1)).style.background=this.firstRowColor;
					document.getElementById(this.name+"_message_"+(i+1)).name=-1;

					idrecord = this.data[i][this.getColumnByName("id")];
					var innerHTML = this.name+"_message_"+(i+1);
					
					variableNames.push("idrecord");
					variableValues.push(idrecord);			

					variableNames.push("rowChecked");
					variableValues.push(this.getObjValue(inputs[u]));	
	
					var obj = new recordParam(recordfile, innerHTML,  obj, fct, dd, this);
					    obj.addVariables(variableNames, variableValues);
						if(variableNamesSRC){obj.addVariables(variableNamesSRC, variableValuesSRC);}

					var fct = obj.loadContent;
				}
			}
		}
	}

	obj.tmp = fct;
	obj.tmp();
};

gridManager.prototype.commandPreview = function()
{
	if(this.allChecked()==true)
	{
		alert("interface preview");
	}
};

gridManager.prototype.allChecked = function()
{
	var nb = 0;

	//Récupération des valeurs inputs
	for(var x = 0; x<this.data.length; x++)
	{
		var inputMessage = document.getElementById(this.name+"_message_"+(x+1));

		if(inputMessage.name==1 || inputMessage.name==0){nb++;}
	}

	if(this.numberOfSelectedRows()==nb){return true;}
	else{return false;}
};


//----------------------------------------------------------------------------------------------------------
// CLASS recordParam (constructeur integre) --> Utilisé par le Grid pour permettre l'analyse step by step
//----------------------------------------------------------------------------------------------------------


function recordParam(recordfile, innerHTML, obj, fct, dd, parentObj)
{
	this.recordfile = recordfile;
	this.innerHTML = innerHTML;
	this.obj = obj;
	this.fct = fct;
	this.dd = dd;

	this.parentObj = parentObj;

	this.variables = [];
}

recordParam.prototype.addVariable = function(name, value)
{
	this.variables.push(new recordVariable(name, value));
};

recordParam.prototype.addVariables = function(names, values)
{
	for(var i=0; i<names.length; i++)
	{
		this.addVariable(names[i], values[i]);
	}
};

recordParam.prototype.getVariables = function()
{
	var val="";

	for(var i=0; i<this.variables.length; i++)
	{
		if(i==0){val+="?";}else{val+="&";}

		val+=this.variables[i].getVariable();
	}

return val;
};

recordParam.prototype.loadContent = function()
{
	this.parentObj.rowFilter();
	this.parentObj.progressBar(this.parentObj.progressBarValue++);
	loadContent(this.recordfile+this.getVariables(), this.innerHTML, this.obj, this.fct);
};

function recordVariable(name, value)
{
	this.name = name;
	this.value = value;
}

recordVariable.prototype.getVariable = function()
{
	return this.name+"="+escape(this.value);
};

//----------------------------------------------------------------------
//CLASS map (constructeur integre)
//----------------------------------------------------------------------

function mapManager(name, title, data, parentGrid, height, width)
{
	this.title = title;
	this.data = data;
	this.name = name;
	this.parentGrid = parentGrid;

	this.map = null;
	this.geocoder = null;
	this.selectedRow = null;

	this.maxLongitude=0;
	this.minLongitude=9999;
	this.maxLatitude=0;
	this.minLatitude=9999;

	this.height=height;
	this.width=width;
}

mapManager.prototype.getColumnByName = function(columnName)
{
	for(var i = 0; i< this.title.length; i++)
	{
		if(this.title[i]==columnName)
		{
			return i;
		}
	}
	
return 0;
};

mapManager.prototype.toString = function()
{
return "<div id=\"map_canvas_"+this.name+"\" style=\"width: "+parseInt(this.width,10)+"px; height: "+parseInt(this.height,10)+"px; margin-top: 0px; background: transparent; background-color: transparent;\"></div>";
};

mapManager.prototype.putPoint = function(latitude, longitude, message)
{

	var txt = "<br /><div class=\"txtMap\"><font class='classFormTable'>"+message+"</font></div>";

	var point = new GLatLng(latitude, longitude);
	var marker = new GMarker(point);
	this.map.addOverlay(marker);

	GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(txt);}); 
	//marker.openInfoWindowHtml(txt);

	if(this.maxLongitude<longitude){this.maxLongitude=longitude;}
	if(this.minLongitude>longitude){this.minLongitude=longitude;}
	if(this.maxLatitude<latitude){this.maxLatitude=latitude;}
	if(this.minLatitude>latitude){this.minLatitude=latitude;}

	var bounds = new GLatLngBounds(new GLatLng(this.minLatitude, this.minLongitude), new GLatLng(this.maxLatitude, this.maxLongitude));

	if(parseInt(this.map.getBoundsZoomLevel(bounds),10)>14){var zoom = 14;}else{var zoom = this.map.getBoundsZoomLevel(bounds);}

	this.map.setCenter(bounds.getCenter(), zoom);
};


mapManager.prototype.initialize = function() 
{
	if (GBrowserIsCompatible()) 
	{
		this.map = new GMap2(document.getElementById("map_canvas_"+this.name));
		this.geocoder = new GClientGeocoder();
		this.selectedRow = (this.parentGrid.grid).getVisibleRow();		

		for(var i = 0; i < this.data.length; i++)
		{
			if(this.selectedRow.indexOf(i)!=-1)
			{

				var latitude = unHTMLentities(this.data[i][this.getColumnByName("latitude")]);	
				var longitude = unHTMLentities(this.data[i][this.getColumnByName("longitude")]);	

				//Check si il s'agit d'un group --> Split
				if(latitude.indexOf("<br>")!=-1)
				{
					var reg=new RegExp("<br>", "g");

					var lats = latitude.split(reg);					
					var longs = longitude.split(reg);

					for(var a = 0; a < lats.length; a++)
					{
						if(lats[a].length!=0)
						{
							this.putPoint(getNumberOfString(lats[a]), getNumberOfString(longs[a]), unHTMLentities(this.data[i][this.getColumnByName("detail")]+"<br />"+this.data[i][this.getColumnByName("activity")]+"<br />"+this.data[i][this.getColumnByName("addTown")]+"<br />"+this.data[i][this.getColumnByName("addStreet")]+"<br />"+this.data[i][this.getColumnByName("addLocation")]+"<br />"+this.data[i][this.getColumnByName("screenState")]+"<br />"+this.data[i][this.getColumnByName("screenNumber")]+"<br />"+this.data[i][this.getColumnByName("companyName")]));
						}
					}
				}
				else
				{
					this.putPoint(latitude, longitude, unHTMLentities(this.data[i][this.getColumnByName("detail")]+"<br />"+this.data[i][this.getColumnByName("activity")]+"<br />"+this.data[i][this.getColumnByName("addTown")]+"<br />"+this.data[i][this.getColumnByName("addStreet")]+"<br />"+this.data[i][this.getColumnByName("addLocation")]+"<br />"+this.data[i][this.getColumnByName("screenState")]+"<br />"+this.data[i][this.getColumnByName("screenNumber")]+"<br />"+this.data[i][this.getColumnByName("companyName")]));
				}
			}
		}

		//map.addControl(new GMapTypeControl());
		this.map.addControl(new GScaleControl());
		this.map.addControl(new GLargeMapControl());
	}
};

//----------------------------------------------------------------------
//FONCTION DE RELANCE DU TIMEOUT
//----------------------------------------------------------------------

function setTimeoutModule(fct)
{
	try
	{
		eval(fct);		
	}
	catch(e)
	{
		var tmpfct = fct.replace(/\"/g,"\\\"");	
		setTimeout("setTimeoutModule(\""+tmpfct+"\")", 200);
	
	}
}

//----------------------------------------------------------------------
//FONCTION --> MISE DE DECIMAL ET CONVERTION EN TXT
//----------------------------------------------------------------------

function putDecimal(num, dec) 
{
	var str = new String(num);
	
	if(str.indexOf(".")!=-1)
	{
		var rgt = str.substring(str.indexOf(".")+1, str.length);

		for(var i = 0; i < (dec-rgt.length); i++)
		{
			str+="0";
		}
	}
	else
	{
		str+=".";		

		for(var i = 0; i < dec; i++)
		{
			str+="0";
		}
	}

	var lgt = str.substring(0, str.indexOf("."));
	var lgtEnd = str.substring(str.indexOf("."), str.length);

	if(lgt.length > 3)
	{
		var lastNb = lgt.substring(lgt.length-3, lgt.length);
		var firstNb = lgt.substring(0, lgt.length-3);

		var str = firstNb+"'"+lastNb+lgtEnd;
	}

return str;
}

//----------------------------------------------------------------------
//FONCTION --> EST NUMERIC
//----------------------------------------------------------------------

function getNumberOfString(sText)
{
	var validChars = "0123456789.";
	var thisChar;
	
	var numberToReturn="";

	for (i = 0; i < sText.length; i++) 
	{  
		thisChar = sText.charAt(i); 
		if (validChars.indexOf(thisChar) != -1){numberToReturn+=thisChar;}
	}

return numberToReturn;
}

//----------------------------------------------------------------------
//CONTROL DE LA DATE (VALIDITE) et format de la date
//----------------------------------------------------------------------


function getDate(s_date) 
{

	var re_date = /^\s*(\d{1,2})\.(\d{1,2})\.(\d{2,4})\s*$/;

	if (!re_date.exec(s_date)){return null;}
	else
	{
		var n_day = Number(RegExp.$1),
		    n_month = Number(RegExp.$2),
		    n_year = Number(RegExp.$3);	

			
		if (n_month < 1 || n_month > 12){return null;}
		else
		{
			var d_numdays = new Date(n_year, n_month, 0);
	
			if (n_day > d_numdays.getDate()){return null;}
			else
			{
				return new Date(n_year, n_month - 1, n_day);
			}
		}
	}
}


function dateFormat(format, date) 
{
	if (date == undefined) 
	{
		return "";
	}
	
	if (typeof date == 'number') 
	{
		time = new Date();
		time.setTime(date);
		date = time;
	}
	else if (typeof date == 'string') 
	{
		date = new Date(date);
	}
	
	var fullYear = date.getYear();
	if (fullYear < 1000) 
	{
		fullYear = fullYear + 1900;
	}
    
	var hour = date.getHours();
	var day = date.getDate();
	var month = date.getMonth() + 1;
	var minute = date.getMinutes();
	var seconde = date.getSeconds();
	var milliSeconde = date.getMilliseconds();
	var reg = new RegExp('(d|m|Y|H|i|s)', 'g');
	var replacement = [];
	replacement.d = day < 10 ? '0' + day : day;
	replacement.m = month < 10 ? '0' + month : month;
	replacement.Y = fullYear;
	replacement.Y = fullYear;
	replacement.H = hour < 10 ? '0' + hour : hour;
	replacement.i = minute < 10 ? '0' + minute : minute;
	replacement.s = seconde < 10 ? '0' + seconde : seconde;
    
	return format.replace(reg, function($0) {return ($0 in replacement) ? replacement[$0] : $0.slice(1, $0.length - 1);});
}


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//AJOUT DE LA FONCTION INDEXOF POUR UN ARRAY
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) {from += len;}

    for (; from < len; from++)
    {
      if (from in this && this[from] == elt) {return from;}
    }
    return -1;
  };
}

