/*============================================================================================
 Fichier Javascript
 Fichier contenant divers fonction utile à l'affiche tableau

 AUTEUR:					Cédric Pouyez & Alban Ballieux
 CREATION:					04/05/2009
 VARIABLE GLOBALES:			
 MODIFICATIONS:				27/08/2009 - Ajout de la gestion de tableau ( ajout suppression de ligne mise en forme ...)
===============================================================================================
	copyright 2009 Cédric Pouyez & Alban Ballieux. 
	http://www.phpmyportal.info

	This file is part of phpMyPortal.

    phpMyPortal is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or
    any later version.

    phpMyPortal is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with phpMyPortal; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===============================================================================================*/

 /**
 * Fonction appelée par des evenements sur la page complète.
 * Elle permet de voir si une action js à été demandée dans un Affiche_Tableau par l'attribut ACTION_JS
 * 
 * @param {Object} e	L'evenement.
 * 
 * @return void
 */
function Execute_Action(e){
 	if (!e) var e = window.event;
	Target 	= ETarget(e) ;
	Event 	= 'on' + e.type; 
	Cell	= Target.cellIndex ;
	Row		= Target.parentNode.rowIndex;
	Table	= Target.offsetParent.id;
	if (isset(Tactionsjs[Table])) {
		TActTable = Tactionsjs[Table] ;
		if (isset(TActTable[Event])) { // Premier contrôle : Il existe au moins une action pour cet evenement.
			TActEvt = TActTable[Event] ; 
			if (isset(TActEvt[Row])) { //Est-ce qu'il y a une action spécifique à cette ligne 
				if (isset(TActEvt[Row][Cell])) { //Est-ce qu'il y a une action spécifique à cette cellule
					Traite_Action(TActEvt[Row][Cell],Target);
				}
				else {
					if (isset(TActEvt[Row]['ALL'])) { //Est-ce qu'il y a une action pour toute les cellules de cette ligne ?
					 	Traite_Action(TActEvt[Row]['ALL'],Target);
					}
				}
			}else {
				if (isset(TActEvt['ALL'])) { //Est-ce qu'il y a une action pour toutes les lignes ? 
					if (isset(TActEvt['ALL'][Cell])) { //Est-ce qu'il y a une action spécifique à cette colonne ?
						Traite_Action(TActEvt['ALL'][Cell],Target);
					}
					else {
						if (isset(TActEvt['ALL']['ALL'])) { //Est-ce qu'il y a une action pour tout le tableau ?
							Traite_Action(TActEvt['ALL']['ALL'],Target);
						}
					}
				}
			}
		}
	}
 }

/**
  * Fonction qui permet d'interpreter une action trouvée par Execute_Action 
  * et de l'executer.
  * 
  * @param {String} 	Action	L'action a traiter.
  * 
  * @return void
  */
function Traite_Action(Action,Target){
	Action = Macro(Action,Target);
	eval(Action) ;
 }

/**
 * Permet d'ajouter une cellule à la fin d'un tableau
 * @param {Object} IdTable			L'identifiant ou pointeur de la table de destination
 * @param {Object} NbColTable		Le nombre de colones de la table
 * @param {Object} Valeur			La valeur de la cellule
 * @param {string} ClassTr			La classe css qui sera passée à la ligne.
 * @param {string} ClassTd			La classe css qui sera passée à la cellule
 * @param {bool}   AutoriseDoublons (Défaut - false) Permet de controler qu'une valeur est déja présente ou non dans la table
 * 
 * @return void
 */
function Ajoute_Cell_Fin_Table(IdTable,NbColTable,Valeur,ClassTr,ClassTd,AutoriseDoublons){
 	IdTable		= GetPtId(IdTable);
	if(!isset(AutoriseDoublons)){
		AutoriseDoublons = false;
	}
	if(IdTable!=false){
	//Premiere Chose : Controle des doublons.
		doublon = false;
		if (AutoriseDoublons == false) {
			nblignes = IdTable.rows.length;
			for (cptlig = 0; cptlig < nblignes; cptlig++) {
				nbcol = IdTable.rows[cptlig].cells.length ;
				for(cptcol=0;cptcol<nbcol;cptcol++){
					C = IdTable.rows[cptlig].cells[cptcol].firstChild;
					if(C.innerHTML==Valeur.innerHTML){
						doublon = true ;
					}
				}
			}
		}
		if (doublon == false) {
			//La table existe on va pouvoir trouver la ligne à remplir.
			if (IdTable.rows.length == 0) {
				//La ligne n'existe pas, on en créé une.
				Row = document.createElement('TR');
				Row.className = ClassTr;
				IdTable.appendChild(Row);
			}
			else {
				//Il y a des lignes on prend la derniere
				Row = IdTable.rows[IdTable.rows.length - 1];
			}
			if (Row.cells.length >= NbColTable) {
				//La derniere ligne est complete .. Création !
				Row = document.createElement('TR');
				Row.className = ClassTr;
				IdTable.appendChild(Row);
			}
			//On est sur que Row est la bonne ligne, on peut donc ajouter sans probleme une cellule.
			Cell = document.createElement('TD');
			Cell.className = ClassTd;
			if (isObject(Valeur)) {
				Cell.appendChild(Valeur);
			}
			else {
				Cell.innerHTML = Valeur;
			}
			Row.appendChild(Cell);
		}
	}
 }

/**
 * Fonction appellé recurssivement pour Initialiser le format de l'arbre
 * 
 * @param {Object} A		inutile ...
 * @param {Object} B		Attribit javascript
 * @param {Object} C		Type d'attribut ('-' sur la ligne en cours, '*', sur toutes les cellules de la ligne, 'n' Numéro de la cellule a modifier)
 * @param {Object} D		Valeur de l'attribut
 * @param {Object} E		inutile ...
 * @param {Object} F		inutile ...
 */
function CallBackAttribut(A,B,C,D,E,F){
	var i;
	if(!isset(C) || !isset(window.MaLigne))		return true;
	if (C=='-'){		// Attribut sur la ligne
//		window.MaLigne.setAttribute(B, Macro(D,window.MaLigne));
		eval('window.MaLigne.' + B + '=Macro(D,window.MaLigne)');
	}else{
		if (C!='*'){		// Attribut sur toutes les cellules
			if(isset(window.MaLigne.cells[C])){
			//	window.MaLigne.cells[C].setAttribute(B, Macro(D,window.MaLigne.cells[C]));
				eval('window.MaLigne.cells[C].' + B + '=Macro(D,window.MaLigne.cells[C])');
			}
		}else{				// Attribut sur la cellule
			for (i=0;i<window.MaLigne.cells.length;i++){
				if(isset(window.MaLigne.cells[i])){
				//	window.MaLigne.cells[i].setAttribute(B, Macro(D,window.MaLigne.cells[i]));
					eval('window.MaLigne.cells[i].' + B + '=Macro(D,window.MaLigne.cells[i])');
				}
			}
		}
	}
	
	return true;
}

 /**
  * Méthode permettant la création d'une ligne. 
  * 
  * @param {Object} TValeurs	Un tableau contenant les valeurs à mettre dans chaque cellule de la ligne.
  * @param {Object} IdLigne		(Optionnel) L'identifiant de la ligne.
  * @param {Object} Attributs   (Optionnel) Un tableau d'attributs sur les lignes.
  * 						 	['ClassTR']	La classe mise sur les TR (lignes)
  * 
  * @return un objet TR.
  */
 function Cree_Ligne(TValeurs,IdLigne,Attributs){
 	window.MaLigne = document.createElement('TR') ;
	var NbElts = TValeurs.length ;
	var MaCell ;
	
	
	if(isset(IdLigne) && IdLigne != ''){
		MaLigne.id = IdLigne;
	}
	
	for(var i=0; i<NbElts ; i++){
		MaCell = document.createElement('TD') ;
		MaCell.innerHTML = TValeurs[i] ;
		MaLigne.appendChild(MaCell) ;
	}
	
//	Attributs.replace(new RegExp("([^@]+)\\\[([^\\]]+)\\\]=([^@]+)@", "gi"),CallBackAttribut);
	
	return MaLigne ;
 }
 
 /**
  * Permet d'inserer une TR créée par Cree_Ligne dans une table
  * 
  * @param {Object} IdTable		L'identifiant de la table (ou un pointeur sur celle-ci)
  * @param {Object} Ligne		Un identifiant ou un pointeur sur la ligne
  * @param {Object} IdPrec		Un identifiant ou un pointeur sur la ligne precedent l'insertion
  *
  * @return {Object} PtId		Objet sur l'element ajouté
  */
 function Ajoute_Ligne_Dans_Table(IdTable,Ligne,IdPrec){
 	IDTable 	= GetPtId(IdTable);
 	IdPrec		= GetPtId(IdPrec);
 	if (IDTable == false) return;
 	if (IDTable.tBodies[0]){
 		IDTable	= IDTable.tBodies[0];
 	}
 	
 	if(IDTable){
		if (IdPrec){
			IDTable.insertBefore(Ligne,IdPrec);
			return IdPrec.previousSibling;
		}else{
 		// Je pointe le dernier enregistrement
			IDTable.appendChild(Ligne);
			return getLastElementChild(IDTable)
			return IDTable.lastElementChild;
		}
	}
 }
 
 /**
  * Permet d'inserer une TR créée par Cree_Ligne dans une table
  * 
  * @param {Object} IdTable			L'identifiant de la table (ou un pointeur sur celle-ci)
  * @param {Object} Ligne			Un identifiant ou un pointeur sur la ligne
  * @param {Object} IdRemplace		Identifiant de remplacement de ligne
  * 
  * @return {Object} PtId		Objet sur l'element remplacer
  */
 function Remplace_Ligne_Dans_Table(IdTable,Ligne,IdRemplace){
 	IDTable		= GetPtId(IdTable);
 	IdRemplace 	= GetPtId(IdRemplace);
 	if (IDTable == false || IdRemplace == false) return;
 	
 	if (IDTable.tBodies[0]){
 		IDTable	= IDTable.tBodies[0];
 	}
 	
 	if(IDTable){
	// Je pointe le dernier enregistrement
		IDTable.replaceChild(Ligne,IdRemplace);
		return Ligne;
	}
 }
 
/**
 * Fonction d'ajout d'une ligne dans un tableau 
 *
 * @param {Object} IdTable			Identifiant de la table
 * @param {Object} Tableau			Liste des valeurs
 * @param {Object} Attribut			Liste de données séparé par des $
 * @param {Object} IdPrecedent		Identifiant de la ligne précedente
 * @param {Object} AutoIndex		Ajoute automatiquement un index a tous les champs des cellules ...
 * @param {Object} NumLigne			Identique si l'on parle d'un numéro de ligne de tableau ou d'un identifiant
 * 
 * @return void
 */
function Ajoute_Ligne(IdTable, Tableau, Attribut, IdPrecedent, AutoIndex, NumLigne){
	var PtLigne;
	IdTable = GetPtId(IdTable);
	
	if (isset(NumLigne) && NumLigne !=""){
	// L'IdRemplace est un numéro de ligne
		if (isset(IdTable.tBodies[0])){
	 	// le TBody existe je pointe dessus
			var Tmp	= IDTable.tBodies[0].childNodes[IdPrecedent];
	 	}else{
		// le TBody n'existe pas je reste sur table
	 		var Tmp	= IDTable.childNodes[IdPrecedent];
	 	}
 		IdPrecedent = Tmp;
	}

// La ligne n'existe pas ....  je retourne ''
	IdPrecedent = GetPtId(IdPrecedent,IdTable);
	if (IdPrecedent == false || IdPrecedent.nodeName != 'TR'){
		IdPrecedent = '';
	}
	
	PtLigne=Ajoute_Ligne_Dans_Table(IdTable,Cree_Ligne(Tableau,'',Attribut),IdPrecedent);
	
	window.MaLigne=PtLigne;
	Attribut.replace(new RegExp("([^@]+)\\\[([^\\]]+)\\\]=([^@]+)@", "gi"),CallBackAttribut);

	
	if(!AutoIndex==''){
		if (AutoIndex == 1) {
			AppliqueIndexId(PtLigne, PtLigne.rowIndex);
		}else{
			AppliqueIndexId(PtLigne, AutoIndex);
		}
	}
}

/**
 * 
 * @param {Object} IdTable			Identifiant de la table
 * @param {Object} Tableau			Liste des valeurs
 * @param {Object} Attribut			Liste de données séparé par des $
 * @param {Object} IdRemplace		Identifiant devant etre remplacé
 * @param {Object} AutoIndex		Ajoute automatiquement un index a tous les champs des cellules ...
 * @param {Object} NumLigne			Identique si l'on parle d'un numéro de ligne de tableau ou d'un identifiant
 * 
 * @return void
 */
function Remplace_Ligne(IdTable, Tableau, Attribut, IdRemplace, AutoIndex, NumLigne){
	var PtLigne;
	IdTable = GetPtId(IdTable);

	if (isset(NumLigne) && NumLigne !=""){
	// L'IdRemplace est un numéro de ligne
		if (isset(IdTable.tBodies[0])){
	 	// le TBody existe je pointe dessus
			var Tmp	= IDTable.tBodies[0].childNodes[IdRemplace];
	 	}else{
		// le TBody n'existe pas je reste sur table
	 		var Tmp	= IDTable.childNodes[IdRemplace];
	 	}
 		IdRemplace = Tmp;
	}

// La ligne n'existe pas ....  je retourne ''
	IdRemplace = GetPtId(IdRemplace,IdTable);
	if (IdRemplace == false || IdRemplace.nodeName != 'TR'){
		IdRemplace = '';
	}
	
	PtLigne=Remplace_Ligne_Dans_Table(IdTable,Cree_Ligne(Tableau,'',Attribut),IdRemplace);
	
	window.MaLigne=PtLigne;
	Attribut.replace(new RegExp("([^@]+)\\\[([^\\]]+)\\\]=([^@]+)@", "gi"),CallBackAttribut);

	if(!AutoIndex==''){
		if (AutoIndex == 1) {
			AppliqueIndexId(PtLigne, PtLigne.rowIndex);
		}else{
			AppliqueIndexId(PtLigne, AutoIndex);
		}
	}
}

/**
 * Supprime une ligne d'un tableau en javascript par son identifiant ou par un numéro de ligne
 * 
 * @param {Object} IdTable			Identifiant de la table
 * @param {Object} IdSuppression	Identifiant de la ligne à supprimer
 * @param {Object} NumLigne			Identique si l'on parle d'un numéro de ligne de tableau ou d'un identifiant
 * 
 * @return void
 */
function Delete_Ligne(IdTable, IdSuppression, NumLigne){
	var PtLigne;
	IdTable = GetPtId(IdTable);
	
	if (isset(NumLigne) && NumLigne !=""){
	// L'IdRemplace est un numéro de ligne
		if (isset(IdTable.tBodies[0])){
	 	// le TBody existe je pointe dessus
			var Tmp	= IDTable.tBodies[0].childNodes[IdSuppression];
	 	}else{
		// le TBody n'existe pas je reste sur table
	 		var Tmp	= IDTable.childNodes[IdSuppression];
	 	}
		IdSuppression = Tmp;
	}

// La ligne n'existe pas ....  je retourne ''
 	IdSuppression = GetPtId(IdSuppression,IdTable);
	if (IdSuppression == false || IdSuppression.nodeName != 'TR'){
		return '';
	}
	
// Suppression de la ligne
	IdSuppression.parentNode.removeChild(IdSuppression);
}

function CacheLigne(object){
	document.getElementById(object).style.display='none';
}

function MontreLigne(object){
	if(document.selection){//IE support
		document.getElementById(object).style.display='block';
	}else{
		document.getElementById(object).style.display='table-row';
	}
}