/*
--------------------------------------------------------
Objet pour creer des listes (tableaux dynamiques)
class dynaList
class herite dynaListModif
--------------------------------------------------------
Copyright 2001 GHS
--------------------------------------------------------
20011228 MM : 
20020621 MM : -Modification de methodes pour que ca marche avec mozilla
              rindex = index de la derniere ligne+1 pour ajouter une ligne 
              en fin de tableau si aucune position n'est specifie lors de l'appel.
              -Possibilite de mettre '-' dans le champ supprimer pour empecher qu'une
              ligne puisse etre supprimer (en mettant 'none' lors de l'appel) de ajouterLigne().
              -Correction bug pour Mozilla/NS6 sur la methode donneLigneTexte(), la methode innerText 
              n'existe pas pour ce navigateur.  
20031128 MM : -Ajout d'une méthode permettant d'appeler des js externe pour dynalistModif "appelExterne(obj,fonction)" 
				cette méthode permet d'avoir le ligneId en cours pour chaque ligne et donc de palier au bug qui effacait ou modifié 
				la mauvaise ligne des que l'ordre des lignes du tableaux avait bougé.	               
			  -Modification de la méthode ajouterLigne de DynalistModif pour prendre en compte la methode "appelExterne()"	
--------------------------------------------------------
Usage : 
        - charger de Javascript dans le HEAD
        - instancier l'objet avec ses proprietes
        - appeler les methodes necessaires
--------------------------------------------------------
Interface: dynaList {
    object          oTable; (table element) 
    string          id;
    integer         ncol;
    string          classcss;
    string          typesuppr;
    string          libsuppr;
    integer         nid;
    string          ligneId;
   
}

Proprietes:
-oTable du type objet (HTMLElement Table) 
Qui recupere lui meme les proprietes d'un objet du type "table" (border, width, height etc....)

-id du type string,
Identifiant de l'objet et de l'element 'table' html associe.

-ncol du type integer ...
Nombre de colonnes du tableau.

-classcss du type string ...
Classe CSS associe au tableau, defaut="tableau".

-typesuppr du type string ...  
Le type du lien qui permet de supprimer une ligne du tableau (lien se trouvant dans la derniere colonne),
les choix possibles sont: 'bouton', 'image' et 'texte'(valeur par defaut).   

-libsuppr du type string ...
Le libelle du lien 'supprimer' de chaque ligne si typesuppr='bouton' ou 'texte'.
L'url de l'image du lien 'supprimer' si typesuppr='image'. La valeur par defaut est "supprimer".
  
-nid du type integer
Compteur interne specifiant le numero de la prochaine ligne a cree.

-ligneId du type string
Id de la derniere ligne (TR)  cree.



Methodes:

-new constructeur (string id, string classcss, integer ncol, string typesuppr, string libsuppr)

    *id: nom de l'instance
    *classcss: nom de la classe css associe au tableau,
    *ncol: nombre de colonnes du tableau,
    *typesuppr: type du contenue de la derniere colonne permettant de supprimer la ligne correspondante, 'bouton', 'texte', 'image'
    *libsuppr: libelle dans la colonne supprimer si bouton ou texte --> 'libelle texte' si image-->'url de l'image'


-ajouterLigne(string lId, integer rindex,string celltype, string content1, string content2 .... ),
    Ajoute une ligne avec 'ncol' cellules de type 'celltype' (TD defaut  ou TH contenant content*) au tableau a la position 'rindex',
    si 'rindex' n'est pas specifie la ligne est ajoute a la fin du tableau.
    Retourne l'ID de la ligne cree.
    
    *lId: Id de la ligne cree par defaut= 'ligne'+numero de ligne
    *rindex: position de la ligne que l'on souhaite rajoute defaut=derniere,
    *celltype: type des cellules de la ligne (TD ou TH) defaut=TD
    *content1,content2 etc.. contenue des cellules 1,2 ... de la ligne. 
    ! le content ncol+1 est inserer dans le value d'un 'input' hidden' de nom 'name="id_hidden"'


-effacerLigne(string lId),
Efface du tableau la ligne d'id "lId" , si 'lid' n'est pas specifie la ligne efface est la derniere du tableau.
Retourne l'index de la ligne efface.
 
-donneTaille(),
Renvoie un tableau contenant la taille(x,y) du tableau dynamique cree . 

-donneCellTexte(string lId)
Retourne un tableau contenant le texte contenue dans les cellules de la ligne.

-donneCellHTML(string lId)
Retourne un tableau contenant le HTML contenue dans les cellules de la ligne.

-donneLigneIndex(string lId)
Methode permettant de recuperer l'index d'une ligne en fonction de son id.



Interface: dynaListModif {
    object          oTable; (table element) 
    string          id;
    integer         ncol;
    string          classcss;
    string          typesuppr;
    string          libsuppr;
    string          typemodif;
    string          libmodif;
    string          urlmodif;
    integer         nid;
    string          ligneId;
   
}




Methodes:

-new constructeur (string id, string classcss, integer ncol, string typesuppr, string libsuppr, string typemodif, string libmodif, string urlmodif)
construit un tableau de ncol colonnes, ou la premiere colonne contient un lien definit par le 'typemodif'('bouton', 'image', 'texte') qui 
pointe vers 'urlmodif'+(? ou &)ligneId=(id de la ligne).
La derniere colonne contiendra le lien 'supprimer'.
  
    *id: nom de l'instance
    *classcss: nom de la classe css associe au tableau,
    *ncol: nombre de colonnes du tableau,
    *typesuppr: type du contenue de la derniere colonne permettant de supprimer la ligne correspondante, 'bouton', 'texte', 'image'
    *libsuppr: libelle dans la colonne supprimer si bouton ou texte --> 'libelle texte' si image-->'url de l'image'


-ajouterLigne(integer rindex,string celltype, string content1, string content2 .... ),
    Ajoute une ligne avec 'ncol' cellules de type 'celltype' (TD defaut  ou TH contenant content*) au tableau a la position 'rindex',
    si 'rindex' n'est pas specifie la ligne est ajoute a la fin du tableau.
    Retourne l'ID de la ligne cree.
    
    *lId: Id de la ligne cree par defaut= 'ligne'+numero de ligne
    *rindex: position de la ligne que l'on souhaite rajoute defaut=derniere,
    *celltype: type des cellules de la ligne (TD ou TH) defaut=TD
    *content1,content2 etc.. contenue des cellules 1,2 ... de la ligne. 
    ! le content ncol+1 est inserer dans le value d'un 'input' hidden' de nom 'name="id_hidden"'

-modifierLigne(string lid),
recree une ligne au tableau a la position occupe par ligne d'id "lid", si 'lid' n'est pas specifie la ligne est ajoute a la fin du tableau.
Retourne une reference sur la ligne cree.

-appelExterne(obj, void)
lance la fonction js passé en paramètre lorsque le lien modif est cliqué sur la première cellule.
elle rajoute le ligneId en cours comme dernier paramètre de la fonction a lancé.

--------------------------------------------------------
Exemples :


--------------------------------------------------------
Code en situation :

--------------------------------------------------------
*/
function setType(node, type) {

      try {

           node.type = type;

      } catch(e) {

           if (node.outerHTML) {
node.outerHTML=node.outerHTML.replace(/\btype=\w+\b/,'type="'+type+'"');
}else alert("la")

      }

}

function dynaList(id,classcss,ncol,typesuppr,libsuppr) {
	this.id = id;
	this.ncol = ncol;
	this.classcss = classcss || 'tableau';
	this.typesuppr = typesuppr || 'texte';
	this.libsuppr = libsuppr || 'supprimer';
	this.nid = 0;
	this.ligneId = 'ligne' + this.nid;
	this.hiddenName = this.id + '_hidden';
	
	if (id) {
		table = '<TABLE cellspacing="0" cellpadding="0" id=' + this.id + '></TABLE>';
		document.write(table);
		this.oTable = document.getElementById(this.id);
		if(this.classcss) this.oTable.className=this.classcss;
	}
}

dynaList.prototype.ajouterLigne= function(lId,celltype,rindex) {
	/* Creation de la ligne */
	if (!rindex) rindex = (this.oTable.rows.length);
	if (!celltype) celltype = 'TD';
	this.ligneId = lId || 'ligne' + this.nid++;
	oRow = this.oTable.insertRow(rindex);
	oRow.id = this.ligneId;
	lindex = oRow.rowIndex;
	if(celltype.toUpperCase() == 'TH'){
		/* Creation des cellules avec contenue passe en parametres*/
		for(i = 0; i<this.ncol; i++){  
			cell = document.createElement(celltype);
			oCell = this.oTable.rows[lindex].appendChild(cell);
			oCell.className = this.classcss;
			content=arguments[i + 3] || "&nbsp;";
			oCell.innerHTML = content;   
		}
	}
	if (celltype.toUpperCase()=='TD') {
		/* Creation des cellules avec contenue passe en parametres*/
		for(i=0; i<this.ncol-1; i++){  
			cell = document.createElement(celltype);
			oCell = this.oTable.rows[lindex].appendChild(cell);
			oCell.className = this.classcss;
			content = arguments[i + 3] || "&nbsp;";
			oCell.innerHTML = content;   
		}
		/* creation de la derniere cellule (supprimer)*/
		cell = document.createElement(celltype);
		oCell = this.oTable.rows[lindex].appendChild(cell);
		oCell.className = this.classcss;
		oCell.align = "center";
		del = this.id + '.'+'supprimerLigne(\'' + this.ligneId + '\')';

		//On affiche le supprimer seulement si il ya qqchose en parametre     
		if(arguments[this.ncol + 2] != 'none'){
			switch (this.typesuppr){
				case 'bouton':
					content = '<input type=\"button\" value=\"' + this.libsuppr + '\" onclick=\"' + del + ';return false;\" >';
					break;
				case 'image' :
					content = '<A href=\"#\" onclick=\"' + del + ';return false;\"> <IMG src=\"' + this.libsuppr + '\" border=0>  </A>';
					break;
				case 'texte' :
					if(arguments[this.ncol + 2]) this.libsuppr=arguments[this.ncol + 2];
					//on pourrait mettre arguments[arguments.length-2]
					content='<A href=\"#\" onclick=\"' + del + ';return false;\">' + this.libsuppr + '</A>';                        
					break;
			}
		} else {
			content = '-';
		}
//alert("ici");


		if (document.all) {
			var oHidden = document.createElement('INPUT TYPE="HIDDEN" NAME="'+this.hiddenName+'" ID="'+this.hiddenName+'" VALUE="'+arguments[this.ncol + 3]+'"');
//			var oHidden = document.createElement('input type="text" name="'+this.hiddenName+'" id="'+this.hiddenName+'" value="'+arguments[this.ncol + 3]+'"');
				oHidden = oCell.appendChild(oHidden);
			oCell.innerHTML += content; 
//alert (oCell.innerHTML);
		} else {
			oCell.innerHTML += content;
			var oHidden = document.createElement('INPUT');
			oHidden = oCell.appendChild(oHidden);
            oHidden.setAttribute('type','hidden');
			//setType(oHidden,"HIDDEN");
			oHidden.id = this.hiddenName;
			oHidden.name = this.hiddenName;
			oHidden.value = arguments[this.ncol + 3];
//alert(oHidden.value);
		}
	}
	return (lindex);
}


dynaList.prototype.supprimerLigne = function(lId) {
	var rindex = -1;
	var supprime = true;
	if(arguments[1]!='modif') supprime = confirm("Voulez-vous vraiment supprimer cette information ?");
	if(supprime){  
		for(var i = 0;i<this.oTable.rows.length; i++){
			if (this.oTable.rows[i].id == lId) rindex = i;
		} 
		this.oTable.deleteRow(rindex);
		this.nid--;
	}
	return(rindex);
}

dynaList.prototype.donneTaille = function() {
	var result = [];
	result[0] = this.ncol;
	result[1] = this.oTable.rows.length;
	return(result);
}

dynaList.prototype.donneLigneTexte = function(lId) {
	var txt = [];
	rindex = this.donneLigneIndex(lId);
	if(rindex == -1) rindex = 0;
	for(i = 0;i<this.ncol;i++) {
		if(document.all){ txt[i] = this.oTable.rows[rindex].cells[i].innerText;}
		//Recuperation du texte via innerHTML avec NS6 car pas de methode innerText
		//puis suppression des tags HTML
		else{
			txt[i] = this.oTable.rows[rindex].cells[i].innerHTML;        
			re1 = /(<[^>]*>)|(&[^&]*;)/ig;
			txt[i] = txt[i].replace(re1,' ');  
		}
	}
	return (txt);	
}

dynaList.prototype.donneLigneHTML = function(lId) {
	var html = [];
	rindex = this.donneLigneIndex(lId);
	if(rindex == -1) rindex = 0;
	for(i = 0;i<this.ncol;i++){
		html[i] = this.oTable.rows[rindex].cells[i].innerHTML
	}
	return (html);		
}

dynaList.prototype.donneLigneIndex = function(lId) {
	var rindex = -1;
	for(var i = 0;i<this.oTable.rows.length; i++){
		if(this.oTable.rows[i].id == lId) rindex = i;
	}
	return (rindex);	
}

dynaList.prototype.idExiste = function(lId) {
	var isId = false;
	for(var i = 0;i<this.oTable.rows.length; i++){
		if(this.oTable.rows[i].id == lId) isId = true;
	}
	return (isId);	
}

dynaList.prototype.donneColTexte = function(cindex) {
	var txt = [];
	//rindex = this.donneLigneIndex(lId);
	//if(rindex == -1) rindex = 0;  
	for(i = 0;i<this.nid;i++){
		if(document.all){ txt[i] = this.oTable.rows[i].cells[cindex].innerText;}
		//Recuperation du texte via innerHTML avec NS6 car pas de methode innerText
		//puis suppression des tags HTML
		else{
			txt[i] = this.oTable.rows[i].cells[cindex].innerHTML;        
			re1 = /(<[^>]*>)|(&[^&]*;)/ig;
			txt[i] = txt[i].replace(re1,' ');  
		}
	}
	return (txt);	
}
function dynaListModif(id,classcss,ncol,typesuppr,libsuppr,typemodif,libmodif,urlmodif) {
	this.dynaList = dynaList;
	this.dynaList(id,classcss,ncol,typesuppr,libsuppr);
	this.typemodif = typemodif || 'texte';
	this.libmodif = libmodif || 'modifier';
	this.urlmodif = urlmodif;
	this.ismodif = true;
}

dynaListModif.prototype = new dynaList();

dynaListModif.prototype.changerLien = function(lien) {
	this.urlmodif = lien;
}

dynaListModif.prototype.ajouterLigne= function(lId,celltype,rindex) {
	/*  Creation de la ligne */    
	if(!rindex) rindex = (this.oTable.rows.length);
	if(!celltype) celltype = 'TD';
	this.ligneId = lId || 'ligne' + this.nid++;
	oRow = this.oTable.insertRow(rindex);
	oRow.id = this.ligneId;
	lindex = oRow.rowIndex;
	if(celltype.toUpperCase() == 'TH'){
		/* Creation des cellules internes avec contenue passe en parametres*/
		for(i = 0; i<this.ncol; i++){  
			cell = document.createElement(celltype);
			oCell = this.oTable.rows[lindex].appendChild(cell);
			oCell.className = this.classcss;
			content = arguments[i + 3] || "&nbsp;";
			oCell.innerHTML = content;   
		}
	}
         
	if(celltype.toUpperCase() == 'TD'){
		/* creation de la premiere cellule  (modifier)*/
		cell = document.createElement(celltype);
		oCell = this.oTable.rows[lindex].appendChild(cell);
		oCell.className = this.classcss;
		/*cas d'un js*/
		if (this.urlmodif.match(/\(/)) {
			modurl = this.urlmodif.substring(0, this.urlmodif.lastIndexOf(')'));
			modurl += ((this.urlmodif.substring(this.urlmodif.indexOf('(') + 1,this.urlmodif.lastIndexOf(')'))) ? ',' : '');
			modurl += "\'" + this.ligneId + "\'";
			modurl += this.urlmodif.substring(this.urlmodif.lastIndexOf(')'), this.urlmodif.lastIndexOf('') + 1);
		} else {
			/*cas d'une url normale*/ 
			modurl = this.urlmodif.match(/\?/) ? this.urlmodif + '&ligneId=' + this.ligneId : this.urlmodif + '\?ligneId=' + this.ligneId
		}

		/* si c'est un js */
		if(this.urlmodif.match(/\(/)) {
			switch (this.typemodif){
				case 'bouton':
					content = (this.ismodif) ? 	'<input type=\"button\" value=\"' + this.libmodif + '\" onclick=\"' + modurl + ';return false;\" >' :
														'<input type=\"button\" value=\"' + this.libmodif + '\"  >'  ;
					break;
				case 'image' :
					content = (this.ismodif) ? 	'<A href=\"#\" onclick=\"' + modurl + ';return false;\"> <IMG src=\"' + this.libmodif + '\" border=0>  </A>' : 
														'<IMG src=\"' + this.libmodif + '\" border=0>';  
					break;
				case 'texte' :
					if(arguments[3]) this.libmodif=arguments[3];
					content = (this.ismodif) ? '<A href=\"#\" onclick=\"' + modurl + ';return false;\">' + this.libmodif + '</A>' : this.libmodif; 
					break;
			}
		} else {
			/* sinon */
			switch (this.typemodif){
				case 'bouton':
					content = (this.ismodif) ?  '<input type=\"button\" value=\"' + this.libmodif + '\" onclick=\"openFromEnv(\'' + modurl + '\');return false;\" >': '<input type=\"button\" value=\"' + this.libmodif + '\" >';
					break;
				case 'image' :
					content = (this.ismodif) ?  '<A href=\"#\" onclick=\"openFromEnv(\'' + modurl + '\');return false;\"> <IMG src=\"' + this.libmodif + '\" border=0>  </A>' : '<IMG src=\"' + this.libmodif + '\" border=0>';
					break;
				case 'texte' :
					if(arguments[3]) this.libmodif=arguments[3];
					content = (this.ismodif) ?  '<A href=\"#\" onclick=\"openFromEnv(\'' + modurl + '\');return false;\">' + this.libmodif + '</A>' : this.libmodif;         
					break;
			}
		}

		oCell.innerHTML = content;   
           
		/* Creation des cellules internes avec contenue passe en parametres*/
		for(i = 1; i<this.ncol-1; i++){  
			cell = document.createElement(celltype);
			oCell = this.oTable.rows[lindex].appendChild(cell);
			oCell.className = this.classcss;
			content = arguments[i + 3] || "&nbsp;";
			oCell.innerHTML = content;           
		}

		/* creation de la derniere cellule (supprimer)*/
		cell = document.createElement(celltype);
		oCell = this.oTable.rows[lindex].appendChild(cell);
		oCell.className = this.classcss;
		oCell.align = "center";
		del = this.id + '.'+'supprimerLigne(\'' + this.ligneId + '\')';
		//On affiche le supprimer seulement si il ya qqchose en parametre

		if (arguments[this.ncol + 2] != 'none') {
			switch (this.typesuppr) {
				case 'bouton':
					content = '<input type=\"button\" value=\"' + this.libsuppr + '\" onclick=\"' + del + ';return false;\" >';
					break;
				case 'image' :
					content = '<A href=\"#\" onclick=\"' + del + ';return false;\"> <IMG src=\"' + this.libsuppr + '\" border=0>  </A>';
					break;
				case 'texte' :
					if (arguments[this.ncol + 2]) this.libsuppr=arguments[this.ncol + 2];
					//on pourrait mettre arguments[arguments.length-2] au lieu de arguments[this.ncol + 2]
					content = '<A href=\"#\" onclick=\"' + del + ';return false;\">' + this.libsuppr + '</A>';
					break;
			}
		} else {
			content = '-';
		}
		if (document.all) {
			var oHidden = document.createElement('INPUT TYPE="HIDDEN" NAME="'+this.hiddenName+'" ID="'+this.hiddenName+'" VALUE="'+arguments[this.ncol + 3]+'"');
			oHidden = oCell.appendChild(oHidden);
			oCell.innerHTML += content;
		} else {
			
			var oHidden = document.createElement('INPUT');
			oHidden = oCell.appendChild(oHidden);
			oHidden.type = 'hidden';
			oHidden.id = this.hiddenName;
			oHidden.name = this.hiddenName;
			oHidden.value = arguments[this.ncol + 3];
			oCell.innerHTML += content;
		}
		//hiddenContent = '<input type=\"hidden\" name=\"' + this.hiddenName + '\" value=\"' + arguments[this.ncol + 3] + '\">';
		//oCell.innerHTML = content + hiddenContent;   
	}
	return (lindex);	
}

dynaList.prototype.modifierLigne = function(lId,celltype) {
	rindex = this.supprimerLigne(lId,'modif');
	var arg = '';
	for(i=2;i<arguments.length;i++){
		if (i!=2) arg+=',';
		arg = arg + "'" + arguments[i] + "'";
	}
	var ajouterLigne = "this.ajouterLigne('" + lId + "','" + celltype + "','" + rindex + "'," + arg + ");";
	var lindex = eval(ajouterLigne);
	return (lindex);	
}

