//DEFINITION DE LA CLASSE DynTab

//constructeur
function DynTab(param1,param2,param3,param4,param5,param6) {
	//Déclaration et initialisation des attributs
	//->_nom est l'attribut qui est le nom de l'instance de cet objet (permettra d'utiliser les fonction de cet objet dynamiquement genre : onClick="this._nom.filtrer();"...Etc)
	this._nom          = param1;
	//->_id est l'attribut qui permettra de renseigner l'attribut id de la balise <table> principale
	this._id           = param2;
	//->_id_conteneur est l'attribut qui contient l'id du conteneur du genre <div id='id_conteneur'></div>
	this._id_conteneur = param3;
	//->_colonnes est l'attribut (hash) qui permettra de connaître la structure (nom_colonnes, type_colonne...) du tableau a afficher
	this._colonnes     = param4;
	//->_data est l'attribut (array) qui permettra de connaître les données a afficher
	this._data         = (param5 ? param5 : []);

	//->_label est l'attribut qui permettra d'afficher un label en haut du tableau
	this._label        = (param6 ? param6 : '');
	
	//->_longueur est l'attribut qui dit combien d'item je dois afficher (=> ca peut faire des pages si jamais il y a plus d'items a afficher)
	this._longueur = ( this._data.length < 15 ?  this._data.length : 15);
	//->Cet attribut est construit a l'aide de la fonction filtrer et contient les num des lignes a afficher
	this._lignes_a_afficher = [];
	//->_page_en_cours
	this._page_en_cours = 1;
	//->_nb_colonnes est le nombre de colonnes de _colonnes (on fait cela car on ne peut pas faire this._colonnes.length vu que c'est un tableau associatif)
	this._nb_colonnes = 0;
	
	//->_filtres est l'attribut (tableau) qui donne les filtres a appliquer
	this._filtres = {};
	//->_col_tri est l'attribut qui donne le libellé de la colonne a trier
	this._col_tri = '';
	//->_sens est l'attribut qui donne le sens du tri "asc" ou "desc" (asc par défaut)
	this._sens = 'asc';
	
	this._lignes = [];
	
	this._structure = '';
	
	//Pour éviter de reconstruire les filtres à chaque fois, on ne reconstruit que si les filtres ont changé
	this._filtres_a_reconstruire = true;
	this._afficher_filtres = false;
	
	//Affectation des méthodes
	this.initialise          = initialise;
	this.getPagesSelect      = getPagesSelect;
	this.getLongueurSelect   = getLongueurSelect;
	this.getColonnesSelect   = getColonnesSelect;
	this.getLabel            = getLabel;
	this.getFiltres          = getFiltres;
	this.montrerCacherColonne= montrerCacherColonne;
	this.montrerColonne      = montrerColonne;
	this.cacherColonne       = cacherColonne;
	this.changePage          = changePage;
	this.changeLongueur      = changeLongueur;
	this.getStructure        = getStructure;
	this.setCellules         = setCellules;
	this.setCellulesFiltres  = setCellulesFiltres;
	this.trier               = trier;
	
	this.montrerCacherFiltres= montrerCacherFiltres;
	this.filtrer             = filtrer;
	this.harmonise					 = harmonise;
	
}



////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// GENERE LA STRUCTURE DU TABLEAU  //////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function getStructure(){
	var resultat = '<table cellspacing="0" cellpadding="0" style="border:1px black solid" width="100%" bgcolor="white">';
	//Ligne des pages, nb de lignes par page et lien filtres...
				//
						resultat    += ' <tr>';
						resultat    += '  <td>';
						resultat    += '   <table cellspacing="0" cellpadding="0" border="0">';
				
						resultat    += '    <tr>';
						resultat    += '     <td id="dyntab_longueur_select_'+this._id+'" class="dyntab_pages"></td>';
						resultat    += '     <td id="dyntab_colonnes_select_'+this._id+'" class="dyntab_pages"></td>';
						resultat    += '     <td class="dyntab_pages">';
						if ( this._lignes_a_afficher.length > 0 )
							resultat    += '				<img src="/static/JPM/images/filtre.gif" border="0" align="absmiddle"/>&nbsp;<a class="dyntab" href="#" onClick="'+this._nom+'.montrerCacherFiltres();">Filtres automatiques</a>';
						resultat    += 			'</td>';
						resultat    += '    </tr>';
					
						
						//resultat    += '    <tr><td colspan="4" id="debug" name="debug">ARF</td></tr>';
						resultat    += '   </table>';
						resultat    += '  </td>';
						resultat    += ' </tr>';
		
			//Ligne du label
			resultat    += ' <tr>';
			resultat    += '  <td id="dyntab_label_'+this._id+'" class="dyntab_label"></td>';
			resultat    += ' </tr>';
			resultat    += ' <tr>';
			resultat    += '  <td>';
			resultat    += '   <table id="'+this._id+'" cellspacing="0" class="dyntab_table" cellpadding="0" >';
	
	var titres  = '';
	var filtres = '';
	var autres  = '';
	for(var i = 0; i < this._longueur; i++){
		autres  += '    <tr id="dyntab_ligne_'+this._id+'_'+i+'" class="dyntab_'+(i%2 == 0 ? "pair" : "impair")+'" onMouseOver="this.className=\'dyntab_hover\';" onMouseOut="this.className=\'dyntab_'+(i%2 == 0 ? "pair" : "impair")+'\';" >';
		if(i == 0){
			titres  = '    <tr id="dyntab_titres_'+this._id+'">';
			filtres = '    <tr id="dyntab_filtres_'+this._id+'" style="display:none;">';
		}
		for(var intitule in this._colonnes){
			var align   = ( this._colonnes[intitule]["align"] ? 'align="'+this._colonnes[intitule]["align"]+'"' : 'align="left"');
	    var visible = ( this._colonnes[intitule]["visible"]=="non" ? 'style="display:none;"' : '' );
	    if(i == 0){
	    	var triable = ( this._colonnes[intitule]["triable"]=="non" ? false : true);
	    	var visible1 = ( this._colonnes[intitule]["visible"]=="non" ? 'display:none;' : '' );
	    	var style   = ( triable ? 'class="dyntab_titre_triable" style="cursor:pointer;cursor:hand;'+visible1+'" onClick="'+this._nom+'.trier(\''+intitule+'\');" onMouseOver="this.className=\'dyntab_titre_triable_hover\';" onMouseOut="this.className=\'dyntab_titre_triable\';"' : 'class="dyntab_titre_nontriable" '+(visible1 != '' ? 'style="display:none;"' : ''));
	    	titres  += '     <td id="dyntab_titre_'+this._id+'_'+this._colonnes[intitule]["id"]+'" '+style+'><nobr>'+intitule+'</nobr></td>';
	    	filtres += '     <td class="dyntab_label" id="dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]+'" '+visible+'>&nbsp;</td>';
	  	}
	    autres += '     <td id="dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]+'" '+visible+' class="dyntab_'+(i%2 == 0 ? "pair" : "impair")+'" '+align+' ></td>';
	  }
	  autres  += '    </tr>';
		if(i == 0){
			titres  += '    </tr>';
			filtres += '    </tr>';
		}
	}
	resultat    += titres;
	resultat    += filtres;
	resultat    += autres;
	resultat    += '   </table>';
	resultat    += '  </td>';
	resultat    += ' </tr>';
	
	if ( this._lignes_a_afficher.length > this._longueur )
		resultat    += ' <tr><td id="dyntab_pages_select_'+this._id+'" class="dyntab_navig_pages_active"></td></tr>';
	else
		resultat    += ' <tr><td id="dyntab_pages_select_'+this._id+'" class="dyntab_navig_pages"></td></tr>';
		
	resultat    += '</table>';
	return resultat;
}



////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// HARMONISE LES VALEURS BRUT RENVOYES PAR PATIO  //////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function harmonise(){
// Permet d'harmoniser les valeurs -.01 => -0.01 && 1.5 indx. => 1.5 && .52 => 0.52
	for(var i = 0; i < this._data.length; i++){
		for(var intitule in this._colonnes) {
				var _type = ( this._colonnes[intitule]['type'] == null ? 'string' : this._colonnes[intitule]['type']);
				var valeur = this._data[i][parseInt(this._colonnes[intitule]["correspondance"])];
				//alert(_type + " : " + valeur);
				if ( _type == "pourcent" ||_type == "numerique") {
					
					valeur = ''+valeur;
					
					// Vérifie que l'on a pas affaire à une valeur Infinity
					if ( valeur == "Infinity") {
						valeur = "0";
						this._data[i][parseInt(this._colonnes[intitule]["correspondance"])] = valeur;
					}			
					
					// supprime la string indx.
					if ( valeur.match(/indx./)) {
						valeur = valeur.replace(/indx./, '');
						this._data[i][parseInt(this._colonnes[intitule]["correspondance"])] = valeur;
					}
					
					// rajoute une valeur decimale a un entier positif
					if ( (valeur.indexOf('.') == -1) && (valeur > 0)) {
						valeur = valeur + ".0";
						this._data[i][parseInt(this._colonnes[intitule]["correspondance"])] = valeur;
					}

					// rajoute 0 un un nom bre tel que .0
					if ( valeur.length > 1 ) {
						if ( valeur.substr(0,1) == "." ) {
								valeur = "0" + valeur; 
								this._data[i][parseInt(this._colonnes[intitule]["correspondance"])] = valeur;
						}
					}
					
					// rajoute -0. un un nom bre tel -.0
					if ( valeur.length > 2 ) {
						if ( valeur.substr(0,2) == "-." ) {
							valeur = "-0." + valeur.substr(2,valeur.length);
							this._data[i][parseInt(this._colonnes[intitule]["correspondance"])] = valeur;
						}	
					}
					
				}
				
		}
	}
}


////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// REMPLIT LES CASE DU TABLEAU SELON LE TYPE //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function setCellules(){
	
	var tmp = '';
	var _type = '';
	
	
	for(var i = 0; i < this._longueur; i++){
		for(var intitule in this._colonnes)
			if(this._lignes_a_afficher[(this._page_en_cours-1)*this._longueur+i]){
				document.getElementById('dyntab_ligne_'+this._id+'_'+i).style.display = '';
				
				// on recupere le type et on fait les affichages
				_type = ( this._colonnes[intitule]['type'] == null ? 'string' : this._colonnes[intitule]['type']);
				
				// precision de 2 par default
				var precision = ( this._colonnes[intitule]['precision'] == null ? '2' : this._colonnes[intitule]['precision']);
				var tmp = this._lignes_a_afficher[(this._page_en_cours-1)*this._longueur+i][this._colonnes[intitule]["correspondance"]];
				
				if ( _type == "devise" )
					tmp = affiche_devise(tmp,precision);
				
				if ( _type == "pourcent" )
					tmp = affiche_pourcent(tmp,precision);
					
				if ( _type == "numerique" )
					tmp = affiche_numerique(tmp,precision);
				
				if ( _type == "date" )
					tmp = affiche_date(tmp);
					
				if ( _type == "string" )
					tmp = affiche_string(tmp);
					
				document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).innerHTML = (tmp == '' ? '&nbsp;' : tmp);
				
			}
			else{
				document.getElementById('dyntab_ligne_'+this._id+'_'+i).style.display = 'none';
				document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).innerHTML = '&nbsp;';
		}
	}
}


function setCellulesFiltres(){
	
	var tmp = '';
	var _type = '';
	
	
	for(var i = 0; i < this._longueur; i++){
		for(var intitule in this._colonnes)
			if(this._lignes_a_afficher[i]){
				document.getElementById('dyntab_ligne_'+this._id+'_'+i).style.display = '';
				
				// on recupere le type et on fait les affichages
				_type = ( this._colonnes[intitule]['type'] == null ? 'string' : this._colonnes[intitule]['type']);
				
				// precision de 2 par default
				var precision = ( this._colonnes[intitule]['precision'] == null ? '2' : this._colonnes[intitule]['precision']);
				var tmp = this._lignes_a_afficher[i][this._colonnes[intitule]["correspondance"]];
				
				if ( _type == "devise" )
					tmp = affiche_devise(tmp,precision);
				
				if ( _type == "pourcent" )
					tmp = affiche_pourcent(tmp,precision);
					
				if ( _type == "numerique" )
					tmp = affiche_numerique(tmp,precision);
				
				if ( _type == "date" )
					tmp = affiche_date(tmp);
					
				if ( _type == "string" )
					tmp = affiche_string(tmp);
					
				document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).innerHTML = (tmp == '' ? '&nbsp;' : tmp);
				
			}
			else{
				document.getElementById('dyntab_ligne_'+this._id+'_'+i).style.display = 'none';
				document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).innerHTML = '&nbsp;';
		}
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// INITIALISATION DU TABLEAU //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function initialise(){
	//for(var i = 0; i < this._data.length; i++) this._lignes_a_afficher.push(this._data[i]);	
	//Au début, il n'y a aucun filtre => this._data et this._lignes_a_afficher sont égaux
	this.harmonise();
	this._lignes_a_afficher = this._data;
	this._lignes[0] = this.getPagesSelect();
	this._lignes[1] = this.getLongueurSelect();
	this._lignes[2] = this.getColonnesSelect();
	this._lignes[3] = this.getLabel(this._label);
	this._lignes[4] = {};
	this._structure = this.getStructure();
	document.getElementById(this._id_conteneur).innerHTML                         = this._structure;
	document.getElementById('dyntab_pages_select_'+this._id).innerHTML            = this._lignes[0];
	document.getElementById('dyntab_longueur_select_'+this._id).innerHTML         = this._lignes[1];
	document.getElementById('dyntab_colonnes_select_'+this._id).innerHTML         = this._lignes[2];
	document.getElementById('dyntab_label_'+this._id).innerHTML                   = this._lignes[3];
	this.setCellules();
}




////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// TITRE DU TABLEAU AVEC NBRE DE RESULTATS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function getLabel(label){
	return 	(label != '' ? label : (this._longueur > this._lignes_a_afficher.length ? this._lignes_a_afficher.length : this._longueur)+' éléments affichés sur '+this._lignes_a_afficher.length+' trouvés. (initialement '+this._data.length+' éléments)' );
}




////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// RENVOI LA LISTE DES CHOIX DES NUMEROS DE PAGES //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function getPagesSelect(){
	var resultat = '';
	if ( this._lignes_a_afficher.length > this._longueur ){
	  var nb_pages = Math.ceil(this._lignes_a_afficher.length/this._longueur); //On calcule le nombre de pages à créer
	  if(this._page_en_cours > 1)
	  	resultat += '<a class="page_link" href="#" onClick="'+this._nom+'.changePage(' + (this._page_en_cours - 1) + ');">&lt;</a>&nbsp;';
	  else
	  	resultat += '&lt;&nbsp;';
	  
	  for(j = 1; j <= nb_pages; j++ ){
	  	if(this._page_en_cours != j)
	    	resultat  += '<a class="page_link" href="#" onClick="'+this._nom+'.changePage(' + j + ');">' + j + '</a>&nbsp;&nbsp;';
	    else
	  		resultat  += '<b>' + j + '</b>&nbsp;&nbsp;';
		}
	  
	  if(this._page_en_cours < nb_pages)
	  	resultat += '<a class="page_link" href="#" onClick="'+this._nom+'.changePage(' + (this._page_en_cours + 1) + ');">&gt;</a>&nbsp;';
	  else
	  	resultat += '&gt;&nbsp;';
	  //resultat += 'page ' + this._page_en_cours + ' sur ' + nb_pages;
	}
	return resultat;
}


////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// RENVOI LA LISTE DES CHOIX DE LIGNES/PAGES ///////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function getLongueurSelect(){
	
	
	if(this._lignes_a_afficher.length < this._longueur || this._lignes_a_afficher.length == 0 ) return '';
	var resultat = '<nobr>Lignes/Page : <select class="dyntab_select" onChange="'+this._nom+'.changeLongueur(parseInt(this.value));">';
	var pas = Math.ceil(this._lignes_a_afficher.length / 10);
	var num = pas;
	if(this._longueur%pas != 0 ) resultat += '<option value="'+this._longueur+'" selected >'+this._longueur+'</option>';
	while(num < this._lignes_a_afficher.length){
	  resultat += '<option value="'+num+'" '+(this._longueur == num ? 'selected' : '')+'>'+num+'</option>';
	  num += pas;
	}
	resultat += '<option value="'+this._lignes_a_afficher.length+'" '+(this._longueur == this._lignes_a_afficher.length ? 'selected' : '')+'>Tout</option>';
  resultat += '</select></nobr>';
	return resultat;
}


////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// RENVOI LA LISTE DES CHOIX DE COLONNES D'AFFICAHGES ///////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function getColonnesSelect(){
	var select = '';
	if ( this._lignes_a_afficher.length > 0 ){
		this._lignes_a_afficher.length
		select += '<nobr>Colonnes : <select class="dyntab_select" onChange="'+this._nom+'.montrerCacherColonne(this.value)">';
		select += '<option value="">...</option>';
		for(var intitule in this._colonnes)
			select += '<option value="'+intitule+'" style="background-color:'+(this._colonnes[intitule]['visible'] == 'non' ? '#E0E0E0' : '#FFFFFF')+';">'+intitule+'</option>';
		select += '</select></nobr>';
		}
	return select;
}



////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// CACHE UNE COLONNE DU TABLEAU ///////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function montrerColonne(intitule){
	this._colonnes[intitule]['visible'] = 'oui';
	document.getElementById('dyntab_titre_'+this._id+'_'+this._colonnes[intitule]["id"]).style.display = '';
	document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).style.display = '';
	var i = 0;
	while(document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"])){
		document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).style.display = '';
		i++;
	}
	document.getElementById('dyntab_colonnes_select_'+this._id).innerHTML = this._lignes[2] = this.getColonnesSelect();
}


////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// CACHE UNE COLONNE DU TABLEAU ///////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
function cacherColonne(intitule){
	this._colonnes[intitule]['visible'] = 'non';
	document.getElementById('dyntab_titre_'+this._id+'_'+this._colonnes[intitule]["id"]).style.display = 'none';
	document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).style.display = 'none';
	var i = 0;
	while(document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"])){
		document.getElementById('dyntab_cell_'+this._id+'_'+i+'_'+this._colonnes[intitule]["id"]).style.display = 'none';
		i++;
	}
	document.getElementById('dyntab_colonnes_select_'+this._id).innerHTML = this._lignes[2] = this.getColonnesSelect();
}


////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// MONTRE ET CACHE LES FILTRES ///////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

function montrerCacherColonne(intitule){
	if(this._colonnes[intitule]['visible'] == 'non')
		this.montrerColonne(intitule);
	else
		this.cacherColonne(intitule);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// CHANGE DE PAGES /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
function changePage(numero){
	this._page_en_cours = numero;
	this._lignes[0] = this.getPagesSelect();
	document.getElementById('dyntab_pages_select_'+this._id).innerHTML = this._lignes[0];
	this.setCellules();
	
}


/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// REGENERE LE TABLEAU AVEC UNE NOUVELLE TAILLE ////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
function changeLongueur(taille){
	this._longueur = taille;
	this._page_en_cours = 1;
	this._lignes[0] = this.getPagesSelect();
	this._lignes[1] = this.getLongueurSelect();
	this._lignes[3] = this.getLabel(this._label);
	this._structure = this.getStructure();
	//On vérifie si avant de changer le tableau, les filtres étaient affichés
	var filtres_affiches = (document.getElementById('dyntab_filtres_'+this._id).style.display == 'none' ? false : true );
	document.getElementById(this._id_conteneur).innerHTML                         = this._structure;
	document.getElementById('dyntab_pages_select_'+this._id).innerHTML            = this._lignes[0];
	document.getElementById('dyntab_longueur_select_'+this._id).innerHTML         = this._lignes[1];
	document.getElementById('dyntab_colonnes_select_'+this._id).innerHTML         = this._lignes[2];
	document.getElementById('dyntab_label_'+this._id).innerHTML                   = this._lignes[3];
	//On remet les filtres à leur place
	for(var intitule in this._lignes[4])
		document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).innerHTML = this._lignes[4][intitule];
	if(filtres_affiches) document.getElementById('dyntab_filtres_'+this._id).style.display = '';
	
	// c-à-d qu'il y a plusieurs pages a afficher
	if ( this._lignes[0] != '' ) document.getElementById('dyntab_pages_select_'+this._id).className = 'dyntab_navig_pages_active';
	else document.getElementById('dyntab_pages_select_'+this._id).className = 'dyntab_navig_pages';
	
	this.setCellules();
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//// PERMET DE TIRER UNE COLONNE DE DONNEES SELON SON TYPE //////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

function trier(intitule){
	//Rem : une date doit etre de la forme jj/mm/aaaa pour que le tri s'opère de façon correcte
	//On enlève éventuellement la flèche de la colonne triée	
	if(this._col_tri != '') document.getElementById('dyntab_titre_'+this._id+'_'+this._colonnes[this._col_tri]["id"]).innerHTML = this._col_tri;
	this._col_tri = intitule;
	
	var type = ( this._colonnes[intitule]['type']== null ? '' : this._colonnes[intitule]['type']);
	var num_colonne_a_trier = parseInt(this._colonnes[intitule]['correspondance']);
	var tmp_tab = this._lignes_a_afficher;
	for(var i = 0; i < tmp_tab.length; i++){
	  tmp_tab[i].unshift(tmp_tab[i][num_colonne_a_trier]);
	}
	
	// type de données
	if(type.indexOf("pourcent") != -1) tmp_tab.sort(tri_Pourcent);
	else if(type == "numerique") tmp_tab.sort(tri_Numerique);
	else if(type == "date") tmp_tab.sort(tri_Date);
	else if (type == "devise") tmp_tab.sort(tri_Devise);
	else tmp_tab.sort(tri_String);
	
	
	for(var i = 0; i < tmp_tab.length; i++){
	  tmp_tab[i].shift();
	}
	
	// sens du tri
	this._lignes_a_afficher = tmp_tab;
	if(this._sens == 'desc') this._lignes_a_afficher.reverse();
	document.getElementById('dyntab_titre_'+this._id+'_'+this._colonnes[intitule]["id"]).innerHTML = intitule+(this._sens == 'asc' ? '&nbsp<img src="/static/JPM/images/asc.gif" align="absmiddle">' : '&nbsp<img src="/static/JPM/images/desc.gif" align="absmiddle">');
	this._sens = (this._sens == 'asc'? 'desc' : 'asc');
	this.setCellules();
}


/////////////////////////////////////////////////////////////////////////////////////////////////
////////// MONTRE ET CACHE LES FILTRES //////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

function montrerCacherFiltres(){
	//Si déjà construits ou que rien n'a changé, on ne le refait pas
	if(this._filtres_a_reconstruire){
		//On les reconstruit tous et on les place dans this._lignes[4] pour éviter d'avoir a les reconstruire a chaque fois qu'on demande juste à les afficher
		this._lignes[4] = this.getFiltres();
		//On les place dans leurs <td> respectifs
		for(var intitule in this._lignes[4]){
			document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).innerHTML = this._lignes[4][intitule];
		}
		//On dit que on n'a plus besoin de les reconstruire (du moins jusqu'à la prochaine fois qu'on refiltrera)
		this._filtres_a_reconstruire = false;
	}
	if(document.getElementById('dyntab_filtres_'+this._id).style.display == 'none') document.getElementById('dyntab_filtres_'+this._id).style.display = '';
	else document.getElementById('dyntab_filtres_'+this._id).style.display = 'none';
}

/////////////////////////////////////////////////////////////////////////////////////////////////
////////////////// GENERE ET CONSTRUIT LES FILTRES ////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
function getFiltres(){
	var filtres = {};
	var compte_nb_filtres = {};
	var filtrer;
	// on remet tous les count a 0
	for(var intitule in this._colonnes){
		// si l'élément a e droit d'être filtrer
		filtrer = ( this._colonnes[intitule]['filtrable'] == null ? 'oui' : this._colonnes[intitule]['filtrable']);
		// on ajoute le filtre
		if ( filtrer == "oui"){
			filtres[intitule] = {};
			compte_nb_filtres[intitule] = 0;
		}
		
	}
	// pour chaque valeur on compte le nombre d'occurrences
	boucle : for(var i = 0; i < this._lignes_a_afficher.length; i++){
	           for(var intitule in filtres){
							 // on compte le nombre d'occurence de chaque valeur filtrable
               var valeur  = this._lignes_a_afficher[i][parseInt(this._colonnes[intitule]["correspondance"])];
	             if ( filtres[intitule][valeur] != null) {
	             	 			filtres[intitule][valeur] = filtres[intitule][valeur]+1;
	             	}
	             else{
	             	 filtres[intitule][valeur] = 1;
	             	 compte_nb_filtres[intitule] = compte_nb_filtres[intitule]+1; 
	             }
	           }
	         }
	var res = {};
	// construction des balises physiques
	if ( this._lignes_a_afficher.length > 0 ){
		
			for(var intitule in filtres){
				var resultat = '<select class="dyntab" onChange="'+this._nom+'._filtres[\''+intitule+'\'] = this.value;'+this._nom+'.filtrer();">';
				resultat += '<option class="dyntab" value="">...</option>';
				for(var option in filtres[intitule])
					if(option != '') resultat += '<option class="dyntab" value="'+option+'" '+(this._filtres[intitule] == option ? 'selected' : '')+'>' + option +'('+filtres[intitule][option]+')</option>';
				resultat += '</select>';
				//document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).innerHTML = resultat;
				res[intitule] = resultat;
			}
	}
	return res;
}



/////////////////////////////////////////////////////////////////////////////////////////////////
//Retourne la liste des lignes a afficher en fonction des filtres ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
function filtrer(hash){
	if(hash != null) this._filtres = hash;
	this._lignes_a_afficher = [];
	boucle : for(var i = 0; i < this._data.length; i++){
	  for(var nom_colonne in this._filtres){
	  	var valeur_authorisee = this._filtres[nom_colonne];
	  	if(valeur_authorisee == "") continue;
	    var valeur = this._data[i][parseInt(this._colonnes[nom_colonne]["correspondance"])];
			// si le nom de la valeur est celui du filtre sont diferents on insere pas dans le table de resultats, sinon oui
	    if(valeur != valeur_authorisee) continue boucle;
	  }
	  this._lignes_a_afficher.push(this._data[i]);
	}
	
  //element de filtres, de gestions de pages, etc...
  this._lignes[4] = this.getFiltres();
  this._lignes[0] = this.getPagesSelect();
  
	this._lignes[1] = this.getLongueurSelect();
	this._lignes[3] = this.getLabel(this._label);
	this._structure = this.getStructure();
	document.getElementById(this._id_conteneur).innerHTML                         = this._structure;
	document.getElementById('dyntab_pages_select_'+this._id).innerHTML            = this._lignes[0];
	document.getElementById('dyntab_longueur_select_'+this._id).innerHTML         = this._lignes[1];
	document.getElementById('dyntab_colonnes_select_'+this._id).innerHTML         = this._lignes[2];
	document.getElementById('dyntab_label_'+this._id).innerHTML                   = this._lignes[3];
	
	//On remet les filtres à leur place dans leurs <td> respectifs
	for(var intitule in this._lignes[4])
		document.getElementById('dyntab_filtre_'+this._id+'_'+this._colonnes[intitule]["id"]).innerHTML = this._lignes[4][intitule];
	
	this.setCellulesFiltres();

  //On affiche le <tr> qui contient les filtres
	document.getElementById('dyntab_filtres_'+this._id).style.display = '';
}


/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// NOUVELLES FONCTIONS DE TRIS SUR DONNEES BRUTES ///////////////
/////////////////////////////////////////////////////////////////////////////////////////


// tri d'un type devise
function tri_Devise(a,b){
	
	var _a = a[0];
	var _b = b[0];
	
	//var _a = a[0].substring(0,a[0].length-3);
	//var _b = b[0].substring(0,b[0].length-3);
	
	if (a[0] == "" || a[0] == null) return -1;  
	if (b[0] == "" || b[0] == null) return 1; 
	return parseFloat(a[0])-parseFloat(b[0]);
}


// tri d'un type pourcent
function tri_Pourcent(a,b){

	
	var _a = a[0];
	var _b = b[0];
	
	if (_a == "" || _a == null) return -1;  
	if (_b == "" || _b == null) return 1; 
	return parseFloat(_a)-parseFloat(_b);
}

// tri d'un type numerique
function tri_Numerique(a,b){

	
	var _a = a[0];
	var _b = b[0];
	
	
	if (_a == "" || _a == null) return -1;  
	if (_b == "" || _b == null) return 1; 
	return parseFloat(_a)-parseFloat(_b);
}

// tri d'un type date
function tri_Date(a,b){
	
	var _a = a[0];
	var _b = b[0];
	
	
	var c = _a.substr(6,4)+_a.substr(3,2)+_a.substr(0,2);
	var d = _b.substr(6,4)+_b.substr(3,2)+_b.substr(0,2);
	
	return (c > d ? 1 : -1);
}

// tri d'un type string
function tri_String(a,b){
	
	var _a = a[0];
	var _b = b[0];
	return (_a > _b ? 1 : -1);
	
}



/////////////////////////////////////////////////////////////////////////
//////////////////////// FONCTIONS d'AFFICHAGES ///////////////////////////
/////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////
// Permet l'affichage d'un element de type devise avec un degré de precision///////
/////////////////////////////////////////////////////////////////////////////////////
function affiche_devise(devise,precision) {
	var _devise = devise.substr(0,devise.length-3);
	var _enddevise = devise.substr(devise.length-3,devise.length);
	
	// Cas d'une cotation en % (certaines obligations)
	if(_enddevise == "PCT")
		_enddevise = "%";
	
	_devise = ''+formatNombre(_devise,parseInt(precision));
	
	_devise += "&nbsp;" + _enddevise;
	
	return _devise;
}


//////////////////////////////////////////////////////////////////////////////////////
// Permet l'affichage d'un element de type pourcent avec un degré de precision///////
/////////////////////////////////////////////////////////////////////////////////////
function affiche_pourcent(pourcent, precision) {
	
	var _precision = precision;
	var _pourcent = pourcent;
	
	if ( _precision != "" && _precision != null && _pourcent != "" && _pourcent != null)
		_pourcent = formatPourcent(_pourcent,parseInt(_precision));
	
	return _pourcent;
}

//////////////////////////////////////////////////////////////////////////////////////
// Permet l'affichage d'un element de type numérique avec un degré de precision///////
/////////////////////////////////////////////////////////////////////////////////////
function affiche_numerique(num, precision) {
	
	var _num = num;
	var _precision = precision;

	if ( _precision != "" && _precision != null && _num != "" && _num != null)
			_num = formatNombre(_num,parseInt(_precision));
  
	return _num;
}



////////////////////////////////////////////////////////////////////////////////////////////
// Permet l'affichage d'une string : aucun traitement specifique n'est effectué //////////
//////////////////////////////////////////////////////////////////////////////////////////
function affiche_string(str) {
	return str;
}

//////////////////////////////////////////////////////////////////////////////////////////
// Permet l'affichage de la date : aucun traitement specifique n'est effectué //////////
//////////////////////////////////////////////////////////////////////////////////////////
function affiche_date(unedate) {
	return unedate;
}
