// 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;
}
