var TabloTri= Array( );	
var PremTri = -1;
var DerTri  = -1;

function Any_Arbre( precedent, suivant, ind, value  ) {
	this.TriPrec	= precedent;			// precedent dans l'arbre
	this.TriSuiv	= suivant;				// suivant dans l'arbre
	this.IndTablo	= ind;					// indice dans le tableau
	this.Value		= value;				// Valeur de tri
}

function Insert_Sup( tab_tri , courant , ind_insert ) {

	while ( 1 ) {
		if ( tab_tri[ courant ].Value <= tab_tri[ ind_insert ].Value ) {
			if ( tab_tri[ courant ].TriSuiv != -1 ) {
				courant = tab_tri[ courant ].TriSuiv;
				continue;
			}
			tab_tri[ courant ].TriSuiv = ind_insert;
			tab_tri[ ind_insert ].TriPrec = courant;
			return tab_tri;
		}
		break;
	}
	tab_tri[ ind_insert ].TriSuiv = courant;
	tab_tri[ ind_insert ].TriPrec = tab_tri[ courant ].TriPrec;
	if ( tab_tri[ courant ].TriPrec != -1 ) tab_tri[ tab_tri[ courant ].TriPrec ].TriSuiv = ind_insert;
	tab_tri[ courant ].TriPrec = ind_insert;
	return tab_tri;
}

function Insert_Inf( tab_tri , courant , ind_insert ) {
	while ( 1 ) {
		if ( tab_tri[ courant ].Value >= tab_tri[ ind_insert ].Value ) {
			if ( tab_tri[ courant ].TriPrec != -1 ) {
				courant = tab_tri[ courant ].TriPrec;
				continue;
			}
			tab_tri[ courant ].TriPrec = ind_insert;
			tab_tri[ ind_insert ].TriSuiv = courant;
			return tab_tri;
		}
		break;
	}
	tab_tri[ ind_insert ].TriPrec = courant;
	tab_tri[ ind_insert ].TriSuiv = tab_tri[ courant ].TriSuiv;
	if ( tab_tri[ courant ].TriSuiv != -1 ) tab_tri[ tab_tri[ courant ].TriSuiv ].TriPrec = ind_insert;
	tab_tri[ courant ].TriSuiv = ind_insert;
	return tab_tri;
}

function Make_Arbo( table, order ) {

	table_tri = Array( table.length );
	for (i=0; i < table.length; i++) table_tri[i] = new Any_Arbre( -1, -1, i, table[i][order]); 

	courant = 0;
	for (i=1; i < table.length; i++ ) {
		if ( table_tri[ courant ].Value <= table_tri[ i ].Value ) {
			table_tri = Insert_Sup( table_tri , courant , i);
		}
		else {
			table_tri = Insert_Inf( table_tri , courant , i);
		}
		courant = i;
	}
	return table_tri;
}

function Der_Arbre( tab_tri ) {
	courant = 0;
	while ( tab_tri[courant].TriSuiv != -1 ) courant = tab_tri[courant].TriSuiv;
	return courant;
}

function Prem_Arbre( tab_tri ) {
	courant = 0;
	while ( tab_tri[courant].TriPrec != -1 ) courant = tab_tri[courant].TriPrec;
	return courant;
}

function Next_Arbre( tab_tri, courant , mode ) {
	if ( mode < 0) return tab_tri[courant].TriPrec;
	else return tab_tri[courant].TriSuiv;
}

function Dump_Arbre( tab_tri ) {
	msg = "";
	for(i=0; i < tab_tri.length; i++) {
		msg += tab_tri[i].TriPrec + " | " + tab_tri[i].TriSuiv + " | " + tab_tri[i].IndTablo + " | " + tab_tri[i].Value + " \n";
	}
	return msg
}
