if((typeof EasyCommons=='undefined')){
	throw("Requires the EasyCommons JavaScript framework >= 1.0");
}
var SortAndFilter={
  Version: '2.0.2',
  easyCommonsVersion: parseFloat(EasyCommons.Version.split(".")[0] + "." + EasyCommons.Version.split(".")[1])
};

if(SortAndFilter.easyCommonsVersion<1.0){
	throw("Requires the EasyCommons JavaScript framework >= 1.0");
}
var SortAndFilterLog={
	DEBUG:true,
	log: function(t){
		if(this.DEBUG&&document.getElementById&&document.getElementById('dbg')){
			document.getElementById('dbg').innerHTML=document.getElementById('dbg').innerHTML+t+"<br />";
		}
	}
};

/*********************************/
/*********** Constantes **********/
/*********************************/
var ATTENTE_ID="attente";
var WAITING_PANEL_ID="waitingPannel";
var DYNAMIC_PANEL_ID="dynamicList";
var FIN_DE_LISTE_ID="finDeListe";
var SNF_WAITER_ID="snfWaiterPanel";
var PAGE_NUMBERS_PANEL_ID="spanPageNumbers";
var UNSELECTED_CSS="unselectedPageIndex";
var SELECTED_CSS="selectedPageIndex";
var ALPHA_TIME=2000;
var SNF_DELAY=100;
var WAITER_PANEL_ON=false;
var min_zIndex=0;
var max_zIndex=100;

// PB: Fonction pour gerer l'opacite d'un element
var timerLaunched=false;
function hideWaiting(){
	if(!timerLaunched){
		var dt=new Date();
		window.status=dt.getHours()+":"+dt.getMinutes()+":"+dt.getSeconds();
		snf_opacity(ATTENTE_ID,100,0,ALPHA_TIME);
		timerLaunched=true;
	}
}
var Timer=hideWaiting;
function snf_opacity(id,opacStart,opacEnd,millisec) {
	//speed for each frame
	var speed=Math.round(millisec/100);
	var timer=0, i;
	//determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart>opacEnd) {
		for(i=opacStart; i>=opacEnd; i--){
			window.setTimeout("snf_changeOpacity("+i+",'"+id+"')",timer*speed);
			timer++;
		}
	}
	else if(opacStart<opacEnd){
		for(i=opacStart; i<=opacEnd; i++){
			window.setTimeout("snf_changeOpacity("+i+",'"+id+"')",timer*speed);
			timer++;
		}
	}
	if(timer>0){
		timer+=5;
		window.setTimeout("snf_stopOpacity()",timer*speed);
	}
}
//change the opacity for different browsers
function snf_changeOpacity(opacity,id) {
	if(document.getElementById&&document.getElementById(id)&&document.getElementById(id).style){
		var st=document.getElementById(id).style;
		if(st){
			try{ st.opacity=(opacity/100); }catch(e){}
			try{ st.MozOpacity=(opacity/100); }catch(e){}
			try{ st.KhtmlOpacity=(opacity/100); }catch(e){}
			try{ st.filter="alpha(opacity="+opacity+")"; }catch(e){}
		}
	}
}
function snf_stopOpacity(){
	snf_hide(ATTENTE_ID);
	snf_setBehind(ATTENTE_ID);
	snf_setFront(WAITING_PANEL_ID);
	snf_setFront(DYNAMIC_PANEL_ID);
}
// Fonction utilitaire pour recuperer l'objet style d'un element
function snf_getStyle(id,property){
  if(document.getElementById&&document.getElementById(id)){
    var elem=document.getElementById(id);
    var cssStyleDeclarationObject;
    if(elem.currentStyle){
      if(!property){return elem.currentStyle;}
      return elem.currentStyle[property];
    }else if(document.defaultView.getComputedStyle(elem,"")){
      if(!property){return document.defaultView.getComputedStyle(elem,"");}
      return document.defaultView.getComputedStyle(elem,"").getPropertyValue(property);
    }
  }
  return undefined;
}
function snf_getWidth(id){ try{ return parseInt(snf_getStyle(id,"width"), 10); }catch(e){ return 0; } }
function snf_getHeight(id){ try{ return parseInt(snf_getStyle(id,"height"), 10); }catch(e){ return 0; } }
function snf_getLeft(id){ try{ return parseInt(snf_getStyle(id,"left"), 10); }catch(e){ return 0; } }
function snf_getHTML(id){ if(document.getElementById(id)){return document.getElementById(id).innerHTML;} return undefined; }
function snf_show(id){ if(document.getElementById(id)){document.getElementById(id).style.visibility="visible";}}
function snf_hide(id){ if(document.getElementById(id)){document.getElementById(id).style.visibility="hidden";}}
function snf_switch(id){
 var elt=document.getElementById(id);
 if(elt){
//  if(elt.style.visibility=="visible") elt.style.visibility="hidden";
//  else elt.style.visibility="visible";
  if(elt.style.display=="inline"){
  	elt.style.display="none";
  }
  else{
    elt.style.display="inline";
  }
 }
}
function snf_showGroup(name){
  if(util_groups&&util_groups[name]){
    for(var i in util_groups[name]){
      try{ $(util_groups[name][i]).style.display='block';}catch(e){}
    }
  }
  return false;
}
function snf_hideGroup(name){
  if(util_groups&&util_groups[name]){
    for(var i in util_groups[name]){
      try{ $(util_groups[name][i]).style.display='none';}catch(e){}
    }
  }
  return false;
}
function snf_showOneOfGroup(name,one){
  if(util_groups&&util_groups[name]){
    for(var i in util_groups[name]){
      if(util_groups[name][i]==one){
        try{ $(util_groups[name][i]).style.display='block';}catch(e){}
      }else{
        try{ $(util_groups[name][i]).style.display='none';}catch(e){}
      }
    }
  }
  return false;
}
function snf_toggleOneOfGroup(name,one){
  if(util_groups&&util_groups[name]){
    for(var i in util_groups[name]){
      if(util_groups[name][i]==one){
        var e=$(util_groups[name][i]);
        if(e.style.display=='inline'||e.style.display=='block'){
          try{ $(util_groups[name][i]).style.display='none';}catch(e){}
        }else{
          try{ $(util_groups[name][i]).style.display='block';}catch(e){}
        }
      }else{
        try{ $(util_groups[name][i]).style.display='none';}catch(e){}
      }
    }
  }
  return false;
}
function snf_setCursor(id,cur){ if(document.getElementById(id)){document.getElementById(id).style.cursor=cur;}}
function snf_setFront(id){ if(document.getElementById(id)){document.getElementById(id).style.zIndex=++max_zIndex;}}
function snf_setBehind(id){ if(document.getElementById(id)){document.getElementById(id).style.zIndex=--min_zIndex;}}
function snf_setTop(id,n){ if(document.getElementById(id)&&!isNaN(n)){document.getElementById(id).style.top=n+"px";}}
function snf_setLeft(id,n){ if(document.getElementById(id)&&!isNaN(n)){document.getElementById(id).style.left=n+"px";}}
function snf_setClassName(id,css){ if(document.getElementById(id)){document.getElementById(id).className=css;}}
function snf_setHTML(id,html){ if(document.getElementById(id)){document.getElementById(id).innerHTML=html;}}

var array=[];// tableau des resultats
var indexAffichage=0;// index du premier resultat affiche (selon la page sur laquelle on se trouve)
var nbAffichage=10;// nombre maximal de resultats affiches
var iAff=0;// index du resultat dans les resultats visibles
function snf_doDisplay(){
  var resultat;
  var toShow;
  var passe=0;
  var pageCount;
  var i;
  while(passe<2){
    iAff=0;
    toShow=[];
    for(i in array){
      resultat=array[i];
      if(resultat.canDisplay()){
        if(indexAffichage<=iAff&&iAff<indexAffichage+nbAffichage){toShow.push(resultat.id);}
        else{snf_hide(resultat.id);}
        ++iAff;
      }else{snf_hide(resultat.id);}
    }

    // Une fois les filtres appliques, on sait combien de pages afficher
    var currentPage=snf_getCurrentPageNumber();
    pageCount=snf_getPageCount();
    if(currentPage<pageCount){break;}// Si la page courante est toujours disponible, on
                                    // continue en dehors de la boucle et on affiche les resultats
    snf_changePage(currentPage,false);// Sinon, on redefini le numero de page sans rafraichir
                                  // et on reapplique les filtres (2 passes maxi)
    ++passe;
  }

  // Affichage des blocs resultats
	for(i in toShow){
		// Evenement : positionnement d'un bloc resultat visible
		try{ snfEvent_setVisibleFlightPosition(toShow[i]); }catch(e){}
		snf_show(toShow[i]);
	}

  // Envoi des numeros de pages (de 1 a 'pageCount' s'il y a 'pageCount' pages)
  snf_updatePagePanel();
  for(i in arrayPageLabels){document.getElementById(arrayPageLabels[i]).style.display="none";}
  var label;
  for(i=1;i<=pageCount;++i){
    label=document.getElementById("page"+i);
    if(label){label.style.display="inline";}
  }

  // Evenement : fin de la fonction d'affichage
  try{ snfEvent_endDisplay(); }catch(e){}

}

var displayTO=null;

// Affichage conforme aux filtrages
function snf_display(){

  // Evenement : demarrage de la fonction d'affichage
  try{ snfEvent_startDisplay(); }catch(e){}

  if(displayTO){
    window.clearTimeout(displayTO);
    displayTO=null;
  }

  displayTO=window.setTimeout("snf_doDisplay();",SNF_DELAY);

}

var snf_refresh=snf_display;//TODO : faire un delai


// Fonction qui recupere la valeur seuil maximum strictement
// inferieure a la valeur passee en parametre (soit la borne
// inferieure de l'interval contenant la valeur donnee)
function snf_getBorneInfFiltered(arr,value){
  var borneInfFiltered=false;
  for(var i in arr){
    if(parseFloat(i)>parseFloat(value)){break;}
    borneInfFiltered=arr[i];
  }
  return borneInfFiltered;
}

// Fonction permettant de filtrer une valeur d'un tableau
function snf_filtrer(arr, value, affiche, refresh){
  if(arr[value]===undefined){return false;}
  if(affiche===undefined){affiche=false;}
  arr[value]=!affiche;
  if(refresh===undefined){refresh=true;}
  if(refresh){snf_refresh();}
  return true;
}
// Fonction permettant de filtrer toutes les valeurs d'un tableau comprises entre deux bornes
function snf_filtrerInterval(arr, borneInf, borneSup, affiche, refresh){
  borneInf=parseFloat(borneInf);
  borneSup=parseFloat(borneSup);
  if(affiche===undefined){affiche=false;}
  for(var i in arr){
    if(parseFloat(i)>=borneInf&&parseFloat(i)<=borneSup){
		arr[i]=!affiche;
	}
  }
  if(refresh===undefined){refresh=true;}
  if(refresh){snf_refresh();}
  return true;
}
// Fonction permettant de filtrer toutes les valeurs d'un tableau
function snf_filtrerTout(arr, affiche, refresh){
  if(affiche===undefined){affiche=false;}
  for(var i in arr){arr[i]=!affiche;}
  if(refresh===undefined){refresh=true;}
  if(refresh){snf_refresh();}
  return true;
}

// Fonction permettant de chosir une valeur dans un tableau
function choisir(arr,value,refresh){
  if(refresh===undefined){refresh=false;}
  snf_filtrerTout(arr,false,false);
  snf_filtrer(arr,value,true,refresh);
}
// Fonction permettant de chosir un intervalle de valeurs dans un tableau
function choisirInterval(arr,borneInf,borneSup,union,refresh){
  if(refresh===undefined){refresh=false;}
  if(union===undefined){union=false;}
  if(!union){snf_filtrerTout(arr,false,false);}
  snf_filtrerInterval(arr,borneInf,borneSup,true,refresh);
}
// Fonction permettant de chosir toutes les valeurs d'un un tableau
function choisirTout(arr,refresh){
  if(refresh===undefined){refresh=false;}
  snf_filtrerTout(arr,true,refresh);
}


/*********************************/
/***** Tableaux de filtrage ******/
/*********************************/
var arrayPRIX=[];
var arrayPARTENAIRES=[];

  //******************************************************
  // ** NB **********************************************
  //******************************************************
  // Les tableaux contiennent des booleens indiquant si les donnees sont filtrees
  // Si on ne trouve pas la valeur dans un tableaux => on affiche
  // Si on trouve la valeur dans un tableaux :
  //   - faux : la valeur n'est pas filtree => on affiche
  //   - vrai : la valeur est filtree => on n'affiche pas
  //******************************************************

function snf_borneIndiceByPercent(arr,percent,way){
  if(arr){
    if(way===undefined){way="max";}
    var arrSize=0;
    for(var i in arr){
		arrSize++;
	}
	if(way=="max"){return arrSize>0? parseInt(percent*(arrSize-2)/100,10)+1: -1;}
  	else{return arrSize>0? parseInt(percent*(arrSize-2)/100,10): -1;}
  }
  return -1;
}
function snf_borneByPercent(arr,percent,way){
	var indice=snf_borneIndiceByPercent(arr,percent,way);
	if(indice<0){return '';}
	var iIndice=0;
	for(var i in arr){ if(iIndice++==indice){return i;}}
	return '';
}
function snf_firstBorne(arr){ for(var i in arr){ return i; } return ''; }
function snf_lastBorne(arr){ var r=''; for(var i in arr){r=i;} return r; }


/*********************************/
/****** Affichage des pages ******/
/*********************************/
var pagePanelText="";
var arrayPageLabels=[];

// Fonction permettant de construire le panneau de pages
function snf_buildPagePanel(){
  pagePanelText="";
  arrayPageLabels=[];
  var pageCount=snf_getPageCount();
  var pageNumber;
  for(i=0;i<pageCount;++i){
    pageNumber=i+1;
    arrayPageLabels.push("page"+pageNumber);
    pagePanelText+="<span id=\"page"+pageNumber+"\"><a id=\"page"+pageNumber+"Link\" href=\"javascript:changePage("+i+");\" class=\""+UNSELECTED_CSS+"\">"+pageNumber+"<\/a>&nbsp;|&nbsp;</span>";
  }
}

// Fonction permettant de mettre a jour le panneau de pages
function snf_updatePagePanel(){ try{ document.getElementById(PAGE_NUMBERS_PANEL_ID).innerHTML=pagePanelText; }catch(e){} }

// Permet de changer la page active
function snf_changePage(n,refresh){
  var pageCount=snf_getPageCount();
  if(n>=pageCount){n=pageCount-1;}
  if(n<0){n=0;}

  snf_setClassName("page"+(snf_getCurrentPageNumber()+1)+"Link",UNSELECTED_CSS);

  indexAffichage=n*nbAffichage;

  if(refresh===undefined){refresh=true;}
  if(refresh){snf_refresh();}

  snf_setClassName("page"+(snf_getCurrentPageNumber(n)+1)+"Link",SELECTED_CSS);
}

function snf_getScrollLeft(){
  if(window.innerHeight){return parseInt(window.pageXOffset,10);}
  if(document.documentElement&&document.documentElement.scrollLeft){return parseInt(document.documentElement.scrollLeft,10);}
  if(document.body){return parseInt(document.body.scrollLeft,10);}
  return 0;
}

function snf_getAvailableWidth(){
  if(window.innerWidth){return parseInt(window.innerWidth,10);}
  if(document.documentElement&&document.documentElement.clientWidth){return parseInt(document.documentElement.clientWidth,10);}
  if(document.body){return parseInt(document.body.clientWidth,10);}
  return 0;
}

function snf_getScrollTop(){
  if(window.innerHeight){return parseInt(window.pageYOffset,10);}
  if(document.documentElement&&document.documentElement.scrollTop){return parseInt(document.documentElement.scrollTop,10);}
  if(document.body){return parseInt(document.body.scrollTop,10);}
  return 0;
}

function snf_getAvailableHeight(){
  if(window.innerHeight){return parseInt(window.innerHeight,10);}
  if(document.documentElement&&document.documentElement.clientHeight){return parseInt(document.documentElement.clientHeight,10);}
  if(document.body){return parseInt(document.body.clientHeight,10);}
  return 0;
}

function snf_showWaiter(show){
  if(show===undefined){show=true;}
  if(show && document.getElementById&&document.getElementById(SNF_WAITER_ID)){
    var element=document.getElementById(SNF_WAITER_ID);
    element.style.left=(snf_getScrollLeft()+snf_getAvailableWidth()/2-snf_getWidth(SNF_WAITER_ID)/2)+"px";
    element.style.top=(snf_getScrollTop()+snf_getAvailableHeight()/2-snf_getHeight(SNF_WAITER_ID))+"px";
    element.style.visibility="visible";
  }
  else{
  	snf_hide(SNF_WAITER_ID);
  }
}

function snf_hideWaiter(){
  snf_showWaiter(false);
}
/*********************************/
/* Redirection sur meilleur prix */
/*********************************/
function snf_onResultLinkOver(id){
  var codeHTML=document.body.innerHTML;
  if(codeHTML){
//    snf_setHTML('filtrePrixdbg',codeHTML.replace('<','&lt;'));

//FF    var exp=new RegExp("<a\\s+id=\"(infos_"+id+")\"\\s+href=\"[^\"]*\"\\s+onclick=\"javascript:([^\"]*)\">");
    var exp=new RegExp("<a\\s+id=\"?(infos_"+id+")\"?([^>]*)onclick=\"javascript:([^\"]+);?\"([^>]*)>","i");
//    var exp=new RegExp("<a\\s+id=\"?(infos_"+id+")\"?([^>]*)>","i");
//    var exp=new RegExp("onclick=\"javascript:([^\"]*infos\.jsp[^\"]*)\"","g");
//    var exp=/onclick="javascript:([^"]*infos\.jsp[^"]*)"/;
    var ok=exp.exec(codeHTML);
//    alert(ok);
    if(ok){
  //    alert("GOOOOOOOOOOOOO ["+ok.length+"]\n'"+ok[1]+"'\n'"+ok[2]+"'\n'"+ok[3]+"'\n'"+ok[4]+"'");
      eval(ok[3]);
    }else{
      //alert('non');
    }
    //var oHTM=document.getElementById(id).outerHTML;
//    var attr=document.getElementById(id).attributes;
//alert("attr:\n"+attr);
//alert('OUTER : '+oHTM);
//    snf_setHTML("filtrePrixdbg","<div class=\"vols\">"+snf_getHTML(id)+"</div>");
//    document.getElementById("filtrePrixdbg").style.display="inline";
  }
  return undefined;
}
function snf_openResultLinkOLD(id){
  var codeHTML=document.body.innerHTML;
  if(codeHTML){
//    snf_setHTML('filtrePrixdbg',codeHTML.replace('<','&lt;'));

//FF    var exp=new RegExp("<a\\s+id=\"(infos_"+id+")\"\\s+href=\"[^\"]*\"\\s+onclick=\"javascript:([^\"]*)\">");
    var exp=new RegExp("<a\\s+id=\"?(infos_"+id+")\"?([^>]*)onclick=\"javascript:([^\"]+);?\"([^>]*)>","i");
//    var exp=new RegExp("<a\\s+id=\"?(infos_"+id+")\"?([^>]*)>","i");
//    var exp=new RegExp("onclick=\"javascript:([^\"]*infos\.jsp[^\"]*)\"","g");
//    var exp=/onclick="javascript:([^"]*infos\.jsp[^"]*)"/;
    var ok=exp.exec(codeHTML);
//    alert(ok);
    if(ok){
  //    alert("GOOOOOOOOOOOOO ["+ok.length+"]\n'"+ok[1]+"'\n'"+ok[2]+"'\n'"+ok[3]+"'\n'"+ok[4]+"'");
      eval(ok[3]);
    }else{
      //alert('non');
    }
    //var oHTM=document.getElementById(id).outerHTML;
//    var attr=document.getElementById(id).attributes;
//alert("attr:\n"+attr);
//alert('OUTER : '+oHTM);
//    snf_setHTML("filtrePrixdbg","<div class=\"vols\">"+snf_getHTML(id)+"</div>");
//    document.getElementById("filtrePrixdbg").style.display="inline";
  }
  return undefined;
}
function snf_openResultLink(id){
	for(var i in array){
		if(array[i].id&&array[i].id==id){
			if(array[i].link){
				window.open(array[i].link,'','toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=800,height=600,left=100,top=100');
			}
			break;
		}
	}
}
/*********************************/
/*********** Evenements **********/
/*********************************/
var pos;// position du prochain resultat a afficher
function snfEvent_startDisplay(){
  pos=0;
  if(WAITER_PANEL_ON){
  	try{ snf_showWaiter(); }catch(e){}
	return undefined;
  }
}
function snfEvent_setVisibleFlightPosition(id){
  var elt=document.getElementById(id);
  elt.style.top=pos+"px";
  pos+=snf_getHeight(id);
}
function snfEvent_endDisplay(){
  if(document.getElementById&&document.getElementById(FIN_DE_LISTE_ID)){
    document.getElementById(FIN_DE_LISTE_ID).style.position="absolute";
    document.getElementById(FIN_DE_LISTE_ID).style.top=pos+"px";
  }
  var headResults=document.getElementById('headResults');
  if(headResults){
    if(!getNbResultatsMasques()){
      document.getElementById('headResults').innerHTML='Tous les r&eacute;sultats sont affich&eacute;s TTC (frais de r&eacute;servation inclus)';}
    else{
      document.getElementById('headResults').innerHTML=getNbResultatsAffiches()+' r&eacute;sultats affich&eacute;s (dont '+getNbResultatsMasques()+' masqu&eacute;s sur un total de '+getNbResultatsTotal()+' r&eacute;sultats)';
    }
  }
  try{ snf_setNbResults(getNbResultatsAffiches()); }catch(e){}
  if(WAITER_PANEL_ON){
  	try{ snf_hideWaiter(); }catch(e){}
	return undefined;
  }
  if(getNbResultatsAffiches()>0){
  	hideWaiting();
  }
}

// Fonction utiles pour la gestion des pages
function snf_getCurrentPageNumber(){ return parseInt(indexAffichage/nbAffichage,10); }
function snf_getPageCount(){ return parseInt((iAff-1)/nbAffichage+1,10); }
function snf_setNbAffichageParPage(n){ nbAffichage=n; snf_buildPagePanel(); }
function snf_getNbAffichageParPage(){ return parseInt(nbAffichage,10); }

/*********************************/
/******* Fonctions pour ME *******/
/******* { Meta - Engine } *******/
/*********************************/
function snf_formatHour(h){
 var ih=parseInt(h,10);
 if(isNaN(ih)){return h;}
 if(ih<0){ih=0;}
 if(ih>24){ih=24;}
// if(ih==24) return '23:59';
 return ih+':00';
}
function snf_setNbPartners(n){ snf_setHTML('nbPartners',n); snf_setHTML('nbPartTerm',n); }
function snf_setNbResults(n){ snf_setHTML('nbResults',n); snf_setHTML('nbVols',n); snf_setHTML('nbChambres',n); snf_setHTML('nbVoitures',n); }
function snf_setBestPrice(px,id,bestPriceId){
  if(!bestPriceId){bestPriceId='bestprice';}
  if(id){snf_setHTML(bestPriceId,'<span class="css_pricelink" onclick="javascript:snf_openResultLink(\''+id+'\');">'+px+'</span>');}
  else{snf_setHTML(bestPriceId,px);}
  if(document.getElementById(bestPriceId)){document.getElementById(bestPriceId).style.display="inline";}
}
var me_setNbPartners=snf_setNbPartners;
var me_setNbResults=snf_setNbResults;
var me_setBestPrice=snf_setBestPrice;

/*********************************/
/****** Fonctions publiques ******/
/*********************************/
function snf_activateWaiterPanel(){
  snf_setFront(SNF_WAITER_ID);
  WAITER_PANEL_ON=true;
  return undefined;
}
function refreshDisplay(){ try{ snf_refresh(); }catch(e){} return undefined; }

// Fonction utiles pour la gestion des pages
function changePage(n,refresh){ try{ snf_changePage(n,refresh); }catch(e){} return undefined; }
function incPage(refresh){ snf_changePage(indexAffichage/nbAffichage+1,refresh); return undefined; }
function decPage(refresh){ snf_changePage(indexAffichage/nbAffichage-1,refresh); return undefined; }
function setAffichageParPage(n,refresh){
  snf_setNbAffichageParPage(n);
  changePage(0,refresh);
}
function getNbResultatsAffiches() { return iAff; }
function getNbResultatsTotal() { return array.length; }
function getNbResultatsMasques() { return getNbResultatsTotal()-getNbResultatsAffiches(); }

/*********************************/
/******* Nouveau Système *********/
/********* d'évènement ***********/
/*********************************/
(function(){
	if(!window.EV){
		if(!window.ev){
			window.ev={};
		}
		window.EV=window.ev;
	}
	if(EV.filtres){return;}
	EV.INVALID_FILTER_EVENT_LISTENER_EXCEPTION=new Error("Le listener donné est invalide. Un listener d'évènements de filtrage doit implémenter les méthodes 'onFilterToggle' et 'onFilterInterval'");
	EV.filtres={
		// Tableau de listeners d'évènements de filtrage
		listeners: [],
	
		// Permet l'ajout d'un auditeur d'évènements de filtrage
		addEventListener: function(listener){
			if(!listener){throw new Error("addEventListener: NullPointerException");}
			if(typeof(listener.onFilterToggle)!='function'){throw EV.INVALID_FILTER_EVENT_LISTENER_EXCEPTION;}
			if(typeof(listener.onFilterInterval)!='function'){throw EV.INVALID_FILTER_EVENT_LISTENER_EXCEPTION;}
			this.listeners.push(listener);
		},
	
		// pour les check box
		onFilterSet: function(name, key, checked){
			this.onFilterToggle(name, key, checked, true);
		},
	
		// pour les autres
		onFilterToggle: function(name, borneValue, visible, refresh){
			//console.log("EV.filtres.onFilterToggle(name:"+name+", borneValue:"+borneValue+", visible:"+visible+", refresh:"+refresh+")");
			for(var i in this.listeners){
				try{
					this.listeners[i].onFilterToggle(name, borneValue, visible, refresh);
				}
				catch(e){
					setTimeout(function(){ throw e; }, 0);
				}
			}
		},
	
		// pour les barettes (curseurs)
		onFilterInterval: function(name, borneInf, borneSup){
			//console.log("EV.filtres.onFilterInterval(name:"+name+", borneInf:"+borneInf+(borneSup? ", borneSup:"+borneSup: "")+")");
			for(var i in this.listeners){
				try{
					this.listeners[i].onFilterInterval(name, borneInf, borneSup);
				}
				catch(e){
					setTimeout(function(){ throw e; }, 0);
				}
			}
		}
	};
})();
