// ===========================================================================================================================================
// Fonctions Generales
// ===========================================================================================================================================

// XDOM_GetAttributs()
// Retourne les attributs d'un objet 
// Parametre en entree : 
//         - obj  : (obligatoire) un element HTML
//         - tous : (optionnel)   un booleen indiquant le niveau d'info demande (pr ie si tous = true, sinon retourne les attributs qui ont ete definis
// Retour	:
//			- une chaine
function XDOM_GetAttributs(obj, tous)
{
	var i;
	var s="";
	
	if (tous == null)
		tous = false;
	if (obj)
		for (i = 0 ; i < obj.attributes.length ; i++)
		{
			if (tous || obj.attributes[i].specified)
				s += obj.attributes[i].name+"\t:\t"+obj.attributes[i].value+"\t";
			if (i % 5 == 0)
				s+="\n";
		}
	return s;
}


// ===========================================================================================================================================
// Fonctions concernant les <table>
// ===========================================================================================================================================

// Cette fonction supprime la colone "noCol" de maTable
// si maTable n'est pas renseigne, on prend la premiere table de la page
// si noCol n'est pas renseigne ou est > nbMAx de col, on prend la derniere colone
function XDOM_SupCol(maTable, noCol)
{
	if (maTable == null)
		maTable = document.getElementsByTagName("TABLE")[0];
		
	if (maTable.tagName == "TABLE")
	{
		if (!noCol || noCol > XDOM_GetNbCols(maTable))
			noCol = XDOM_GetNbCols(maTable);
		
		if (XDOM_GetNbCols(maTable) > 0)
			for (var i = 0 ; i < maTable.rows.length ; i++)
				maTable.rows[i].removeChild(maTable.rows[i].cells[noCol-1]);
	}
}

// Cette fonction supprime la ligne "noRow" de maTable"
// si maTable n'est pas renseigne, on prend la premiere table de la page
// si noRow n'est pas renseigne ou est > nbMax de row, on prend la derniere ligne
function XDOM_SupRow(maTable, noRow)
{
	var i, j;
	var cpt = 0;
	
	if (maTable == null)
		maTable = document.getElementsByTagName("TABLE")[0];
		
	if (maTable.tagName == "TABLE")
	{
		if (!noRow || noRow > XDOM_GetNbRows(maTable))
			noRow = XDOM_GetNbRows(maTable);
	
		if (maTable.rows.length > 0)
			maTable.rows[noRow-1].parentNode.removeChild(maTable.rows[noRow-1]);
	}
}

// Cette fonction supprime la row d'une table contenant l'objet obj
// si obj est une row, on la supprime
function XDOM_SupRowObj(obj)
{
    while (obj)
    {
        if (obj.tagName=="TR")
        {
            obj.parentNode.removeChild(obj);
            break;
        }
        obj = obj.parentNode;
    }
}

// Retourne le premier fils de obj qui a tag comme tagName
function XDOM_GetElem(obj, tag)
{
	if (!obj || tag =="")
		return null;
		
	if (obj.tagName == tag)
		return obj;
	else
	{
		var i;
		for (i = 0 ; i < obj.childNodes.length ; i++)
		{
			if (obj.childNodes[i].tagName)
			{
			 	var monObj =  XDOM_GetElem(obj.childNodes[i], tag);
				if (monObj)
					return monObj;
			}
		}
	}
}

// Retourne le premier parent de obj qui a tag comme tagName
function XDOM_GetFirstParent(obj, tag)
{
	if (!obj || tag =="")
		return null;
	
	// c'est l'objet est lui-même de tagName 'tag' on ne va pas plus loin
	if (obj.tagName == tag)
		return obj;
	else
	{
		var i;
		for (i = 0 ; i < obj.parentNodes.length ; i++)
		{
			if (obj.parentNodes[i].tagName)
			{
			 	var monObj =  XDOM_GetElem(obj.parentNodes[i], tag);
				if (monObj)
					return monObj;
			}
		}
	}
}

function XDOM_GetRow(monTableau, noRow)
{	
	if (monTableau == null)
		monTableau = document.getElementsByTagName("TABLE")[0];
		
	if (monTableau.tagName == "TABLE")	
		return monTableau.rows[noRow-1];
	else
		return null;
}

// retourne l'objet TD demande
// obj est soit une table et on renvois la td : tableau[noCol, noRow]
//         soit une tr et on renvois la td : row[noCol]
function XDOM_GetTD(obj, noCol, noRow)
{
	var maRow = null;
	if (obj && obj.tagName=="TABLE" && XDOM_GetNbRows(obj) > 0)
		maRow = XDOM_GetRow(obj, noRow);
	else if (obj && obj.tagName=="TR" && obj.cells.length > 0)
		maRow = obj;
	
	if (maRow && maRow.cells.length > 0)	
	{
		if (noCol > maRow.cells.length)
			noCol = XDOM_GetNbCols(obj);

		return maRow.cells[noCol-1];
	}
	return null;
}

// retourne le nombre de colonnes (de la premiere ligne) du tableau si obj = TABLE ou de la ligne si obj=TR)
function XDOM_GetNbCols(obj)
{
	var uneTR = null;

	if (obj && obj.tagName == "TABLE")
		uneTR = XDOM_GetElem(obj, "TR");
	else if (obj && obj.tagName == "TR")
		uneTR = obj;

	if (uneTR)
		return uneTR.cells.length;
	else 
		return 0;
}

// retourne le nombre de lignes du tableau)
function XDOM_GetNbRows(monTableau)
{
	var nbRow = 0;
	
	if (monTableau && monTableau.tagName == "TABLE")
		nbRow =  monTableau.getElementsByTagName("TR").length;

	return nbRow;
}

// retourne un tableau contenant la col et la ligne concernees par l'evenement (tab[0] = col, tab[1] = row
function XDOM_GetColRow(evt)
{
	var monElem = X_GetTarget(evt);
	var elem;
	var maTable;
	

	// On cherche la cellule qui contenait l'objet sur lequel l'evenement a eu lieu
	while (monElem && monElem.tagName && (monElem.tagName != "TD" && monElem.tagName != "TH"))
		monElem = monElem.parentNode;

	if (!monElem || !monElem.tagName || (monElem.tagName != "TD" && monElem.tagName != "TH"))
		return null;
		
	// On remonte jusqu'a la table qui contenait cette cellule
	elem = monElem.parentNode;
	while (elem && elem.tagName != "TABLE")
	{
		elem=elem.parentNode;
	}
	maTable = elem;

	if (maTable)
	{
		var row;
		var i,j;
		// on parcourt toutes les cellules de toutes les lignes pour trouver la notre !
		for (i = 0 ; i < maTable.rows.length ; i++)
		{
			row = maTable.rows[i];
			for (j = 0 ; j < row.cells.length ; j++)
			{
				if (row.cells[j] == monElem)
				  return new Array(j+1, i+1); // on retourne un tableau contenant la colone et la ligne
			}
		}
	}
	return null;
}

function XDOM_AddColViergeBefore(monTableau, noCol, noColOri)
{
	var nbCol = XDOM_GetNbCols(monTableau);
	
	if (!noCol)
		noCol = 1;
	if (!noColOri)
		noColOri = noCol;
		
	_XDOM_AddCol(monTableau, noCol, noColOri, true);
}

function XDOM_AddColViergeAfter(monTableau, noCol, noColOri)
{
	var nbCol = XDOM_GetNbCols(monTableau);

	if (!noCol)
		noCol = nbCol+1;
	if (!noColOri)
		noColOri = nbCol;
		
	_XDOM_AddCol(monTableau, noCol, noColOri, true);
}

function XDOM_AddColBefore(monTableau, noCol, noColOri)
{
	var nbCol = XDOM_GetNbCols(monTableau);
	
	if (!noCol)
		noCol = 1;
	if (!noColOri)
		noColOri = noCol;
		
	_XDOM_AddCol(monTableau, noCol, noColOri, false);
}

function XDOM_AddColAfter(monTableau, noCol, noColOri)
{
	var nbCol = XDOM_GetNbCols(monTableau);

	if (!noCol)
		noCol = nbCol+1;
	if (!noColOri)
		noColOri = nbCol;
		
	_XDOM_AddCol(monTableau, noCol, noColOri, false);
}

function XDOM_AddRowBefore(monTableau, noRow, noRowOri)
{
	var nbRow = XDOM_GetNbRows(monTableau);
	
	if (!noRow)
		noRow = 1;
	if (!noRowOri)
		noRowOri = noRow;
		
	_XDOM_AddRow(monTableau, noRow, noRowOri, false);
}

function XDOM_AddRowAfter(monTableau, noRow, noRowOri)
{
	var nbRow = XDOM_GetNbRows(monTableau);

	if (!noRow)
		noRow = nbRow+1;
	if (!noRowOri)
		noRowOri = nbRow;
		
	_XDOM_AddRow(monTableau, noRow, noRowOri, false);
}

function XDOM_AddRowViergeAfter(monTableau, noRow, noRowOri)
{
	var nbRow = XDOM_GetNbRows(monTableau);

	if (!noRow)
		noRow = nbRow+1;
	if (!noRowOri)
		noRowOri = nbRow;
		
	_XDOM_AddRow(monTableau, noRow, noRowOri, true);
}

// Remplace le contenu (seulement TEXTE !) de la TD par le texte passe en parametre
// exples : 1/ 	si on a <td>Titi</td> et monTexte='Toto' 
//				alors la méthode retournera <td>Toto</td>
//			2/ 	si on a <td><span>Titi</span></td> et monTexte='Toto'
//				alors la méthode retournera <td><span>Toto</span></td> 
function XDOM_SetTexteTD(maTD, monTexte)
{
	var i;
	var trouve = false;
	
	if (!maTD || (maTD.tagName != "TD" && maTD.tagName != "TH"))
		return;
	
	for (i= 0 ; !trouve && i < maTD.childNodes.length ; i++)
	{
		// si le contenu trouvé est de type TEXTE seulement
		if (maTD.childNodes.item(i).nodeType == 3)
		{
			maTD.childNodes.item(i).nodeValue = monTexte;
			trouve = true;
		}
	}
	if (!trouve)
	{
		maTD.appendChild(document.createTextNode(monTexte));
	}
}

// Remplace le contenu (TOUT) de la TD par le texte passe en parametre
// exples : 	1/ 	si on a <td>Titi</td> et monTexte='Toto' 
//					alors la méthode retournera <td>Toto</td>
//	ATTENTION	2/ 	si on a <td><span>Titi</span></td> et monTexte='Toto'
//					alors la méthode retournera <td>Toto</td> 
function XDOM_ReplaceTexteTD(maTD, texte)
{
	var i;
	
	if (!maTD || (maTD.tagName != "TD" && maTD.tagName != "TH"))
		return;
		
	for (i=maTD.childNodes.length-1 ; i >= 0  ; i--)
	{
		maTD.removeChild(maTD.childNodes[i]);
	}
	maTD.appendChild(document.createTextNode(texte));
}

// Retourne le contenu de la TD sous forme de chaine
// 13/01/2006 : suppression du break dans le if interne
// qui faisait que si la cellule contenait un <br />, on n'avait que la 1ère ligne du texte de la cellule
function XDOM_GetTexteTD(maTD)
{
	var monTexte = "";
	var i;
	
	if (maTD && (maTD.tagName == "TD" || maTD.tagName == "TH"))
		for (i= 0 ; i < maTD.childNodes.length ; i++)
		{
			if (maTD.childNodes.item(i).nodeType == 3)
			{
				monTexte += maTD.childNodes.item(i).nodeValue;
			}
		}
	return monTexte;
}

function XDOM_GetInnerText(el)
{
	var str = "";

	if (typeof el == "string")
		return el;
	if (typeof el == "undefined")
		return el;
	if (el.innerText)
		return el.innerText;	//Not needed but it is faster
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++)
	{
		switch (cs[i].nodeType)
		{
			case 1: //ELEMENT_NODE
				str += XDOM_GetInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

// ===========================================================================================================================================
// Fonctions internes
// ===========================================================================================================================================

// Cette fonction ajoute une ligne dans une table
// si noRow est null : la derniere ligne est dupliquee
// sinon ajoute la ligne noRow en se basant sur la ligne noRowOri
// ex : XDOM_AddRow(monTableau, 5, 2) : ajoute la ligne 5 (l'ancienne 5 deviens la 6, etc...) en reprenant le format de la ligne  2
function _XDOM_AddRow(monTableau, noRow, noRowOri, vierge)
{
	var nbCol = XDOM_GetNbCols(monTableau);
	var nbRow = XDOM_GetNbRows(monTableau);
	var rowOri, row;
	var newTD, newRow;
	var tdOri;
	
	if (nbCol == 0 || nbRow == 0)
		return;
	
	rowOri = XDOM_GetRow(monTableau, noRowOri);
	if (noRow == nbRow+1)
		row    = XDOM_GetRow(monTableau, noRow-1);
	else
		row    = XDOM_GetRow(monTableau, noRow);
	newRow = document.createElement("TR");

	for (var i = 0 ; i < rowOri.cells.length ; i++)
	{
			if (rowOri.cells[i].parentNode.parentNode.tagName=="THEAD")
			{
				if (rowOri.cells[i].tagName == "TH")
					newTD = document.createElement("TD");
				else
					newTD = document.createElement(rowOri.cells[i].tagName);
			}
			else
				newTD = rowOri.cells[i].cloneNode(!vierge);
/*	
// A VOIR...
//		if (nbRow == 1)
//		{
			if (rowOri.cells[i].tagName == "TH" && rowOri.cells[i].parentNode.parentNode.tagName=="THEAD")
				newTD = document.createElement("TD");
			else
				newTD = document.createElement(rowOri.cells[i].tagName);
		}
		else
			newTD = rowOri.cells[i].cloneNode(!vierge);
// ... FIN
*/
		newRow.appendChild(newTD);
	}
	if (noRow == nbRow+1)
		row.parentNode.appendChild(newRow);
	else
		row.parentNode.insertBefore(newRow, row);
}

// Cette fonction ajoute une colonne dans une table
// si noCol est null : la derniere colonne est dupliquee
// sinon ajoute la colonne noCol en se basant sur la colonne noColOri
// ex : XDOM_AddCol(monTableau, 5, 2) : ajoute la colonne 5 (l'ancienne 5 deviens la 6, etc...) en reprenant le format de la colonne 2
function _XDOM_AddCol(monTableau, noCol, noColOri, vierge)
{
	var nbCol = XDOM_GetNbCols(monTableau);
	var nbRow = XDOM_GetNbRows(monTableau);
	var uneRow;
	var newTD, uneTD;
	var tdOri;
	
	if (nbCol == 0 || nbRow == 0)
		return;

	for (var i = 1 ; i <= nbRow ; i++)
	{
		uneRow = XDOM_GetRow(monTableau, i);
		if (uneRow)
		{
			tdOri = XDOM_GetTD(uneRow, noColOri);
			if (tdOri)
			{
				newTD = tdOri.cloneNode(!vierge);
				if (noCol == nbCol+1)
				{
					uneTD = XDOM_GetTD(uneRow, noCol-1);
					uneTD.parentNode.appendChild(newTD);
				}
				else
				{
					uneTD = XDOM_GetTD(uneRow, noCol);
					uneTD.parentNode.insertBefore(newTD, uneTD);
				}
			}
		}
	}
}