
//###################################################################################
function trier(tableau,colonnes,sens,nTit)	//######## trier un tableau htm ########
//###################################################################################
//
// <script type="text/javascript" src="trier.js"></script>
//
// appel : trier(tableau à trier,"colonnes","sens",Nbr Lignes de Titres à ne pas trier 0 par défaut);
//         colonnes : n° [,type[:taille]][;n°[,type[:taille]]...]
//                    Type actuellement possibles ( C par défaut )
//                    c            Caractères
//                    jj/mm/aaaa   Date jj/mm/aaaa
//                    mm/aaaa      Date mm/aaaa
//                    jjmmaaaa     Date jjmmaaaa
//                    e:taille     Entier:nbr caractères maxi
//
{
	var nbrTit=nTit ? nTit : 0;									// lignes Titre
	var ligfin=tableau.rows.length; 								// nbr lignes
	var TabCol=colonnes.split(";");  							// format : n°,type:taille;n°;...n°
	var buffer=Array(ligfin-nbrTit); 							// buffer[nbr lignes]
	for ( var l=nbrTit; l<ligfin; l++ )
	{
		var colfin=tableau.rows[l].cells.length;  			// nbr colonnes
		buffer[l-nbrTit]=new Array(colfin+1);
		buffer[l-nbrTit][0]="";  									// buffer[ligne][0]=critères de tri
		for ( var t=0; t<TabCol.length; t++ )
		{
			var Prm=TabCol[t].split(",");  					// Prm[0]=n° colonne
			if (!Prm[1]) Prm[1]="c";       					// Prm[1]=type
			var Zone=tableau.rows[l].cells[Prm[0]].innerHTML;
			Prm=Prm[1].split(":");         					// Prm[0]=type, Prm[1]=taille
			switch (Prm[0].toLowerCase())
			{
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				case "e":  //~~~~ Entiers ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if ( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				} else {
					while ( Zone.length<Number(Prm[1]) ) 	// adapter la
					{
						Zone="0"+Zone;
					}             			// longueur
				}

				break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				case "jjmmaaaa":  //~~~~ format date ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if ( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				} else {
					Zone=	Zone.substr(4,4) +
					Zone.substr(2,2) +
					Zone.substr(0,2);  					// mise en forme aaaammjj
				}
				break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				case "jj/mm/aaaa":  //~~~~ format date ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if ( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				}	else {
					Zone=	Zone.substr(6,4) +
					Zone.substr(3,2) +
					Zone.substr(0,2);  					// mise en forme aaaammjj
				}
				break;
				case "mm/aaaa":  //~~~~ format date ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if ( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				}	else {
					//<!--mm/aaaa-->; 
					Zone=	Zone.substr(7,4) +
					Zone.substr(4,2);  					// mise en forme aaaamm
				}
				break;
				/*===========================================\
				! je n'ai mis ici que quelques possibilités. !
				! on peut ajouter :                          !
				!                                            !
				!  case "type de zone":                      !
				!       ... traitements adaptés ...          !
				!       break;                               !
				!                                            !
				\===========================================*/
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				default:   //~~~~ par défaut ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				}

				case "c":  //~~~~ caractères ~~~~
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				if( Zone=="" && sens.charAt(0).toLowerCase()=="a")
				{
					Zone="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
				}
				break;
			}
			buffer[l-nbrTit][0]+=Zone;
		}
		for ( var c=0;c<colfin;c++ )									// mémoriser contenu [lignes][colonnes]
		{
			buffer[l-nbrTit][c+1]=tableau.rows[l].cells[c].innerHTML;
		}
	}
	buffer.sort();	// trier
	if (sens.charAt(0).toLowerCase()!="a")						// inversion si non= A[scendant]
	{
		buffer.reverse();
	}
	for ( l=nbrTit;l<ligfin;l++ )									// "recharger" le tableau htm
	//==============================================
	{
		for ( c=1;c<=colfin;c++ )
		{
			tableau.rows[l].cells[c-1].innerHTML=buffer[l-nbrTit][c];
		}
	}
}
//##############################################################################
