//---------------------------------------------------------------------------
// Christian Rihn
// crihn@sdv.fr
//
// Selection dynamiques dans les listes de CODES/LIBELLES
//
// on a deux champs : 
//	- TEXT	: permet de saisir le code ou le libellé, servant de critère de recherche
//	- SELECT: affiche la liste correspondant aux critères
//
// Remarque :	pour des raisons d'optimisation il est impératif que les insert se fasent par
//		ordre alphabetiques des libellés !
//---------------------------------------------------------------------------

function popup(msg) {
	var w=window.open("","detail","toolbar=no,width=200,height=80,directories=no,status=no,scrollbars=yes,resizable=yes,menubar=no");
        w.document.write(msg);
	return(w);
        }

// Fonction de comparaison de valeurs utilisées par le tri
function CmpCode(a,b){
        return(a[0]-b[0]);
}

function SelectGeneEscape(s){
	var invalidchars = "\\+";
	var r="";
	for (var i=0; i < s.length; i++) {
		var letter = s.charAt(i);
		if (invalidchars.indexOf(letter) != -1){
			r=r+'\\';
		}
		r=r+letter;
	}

	r=r.replace(/%/g,'.*'); 	// on gère les % comme dans les requêtes SQL
	return r;
}

//---------------------------------------------------------------------------
// Modification dynamique du champ Select en fonction de Filter
//---------------------------------------------------------------------------
function SelectGeneFilter(Select,FilterField,Add,AddPreg)
{
	var len=this.SelectGene.length;
	var s=FilterField.value;
	var Filter=SelectGeneEscape(s);

	Select.options.length=0;	//	Effacement de toutes les options

	var pattern = eval('/^'+Filter+'/i');

	if(isNaN(FilterField.value.substring(0,1)))	c=1;
	else						c=0;

	// Tri par code

	if(c==0 && this.SelectGeneSort0.length==0){
		var w;
		if(this.SelectGene.length > 1500){
			w=popup("Veuillez Patienter !<br>Traitement en cours");
		}

			this.SelectGeneSort0=this.SelectGene;
			this.SelectGeneSort0.sort(CmpCode);

		if(this.SelectGene.length > 1500){
			w.close();
		}
	}

	var l=0;
	for(i=0;i<len && l<this.MaxElem ;i++){
		var code;
		var libelle;
		var result;
		if(c==1){
			code=this.SelectGene[i][0];
			libelle=this.SelectGene[i][1];
			result = pattern.exec(this.SelectGene[i][c]);
		}
		else {
			code=this.SelectGeneSort0[i][0];
			libelle=this.SelectGeneSort0[i][1];
			result = pattern.exec(this.SelectGeneSort0[i][c]);
		}
		if (result){
			l = Select.options.length;
			Select.options[l]= new Option(code+'   '+libelle,code, false, false);
		}
	}

	if(Select.options.length==0){
			Select.options[0] = new Option("-- Pas de résultat ! --","", false, false);
	}

	if(Select.options.length>=this.MaxElem){
			l = Select.options.length;
			Select.options[l]= new Option('-  Seuls les '+this.MaxElem+' premiers éléments sont affichés !',"", false, false);
	}

	// Cas particulier ou on peut rajouter des éléments

		if(Add){
			var p = eval('/^'+AddPreg+'/i');
			var r = p.exec(FilterField.value);
			if(r){
				window.status='r=true1';
				l = Select.options.length;
				Select.options[l]= new Option('-  '+Add,"-1", false, false);
				window.status='r=true2';
			}
			else {
				window.status='r=false';
			}
		}
}

//---------------------------------------------------------------------------
// Affichage d'une zone <select> correpsondant à l'object SelectGene 
// le nom de la zone est "nom"
//---------------------------------------------------------------------------
function SelectGenePrint(SelectName, mode, liste_evenements, id_selected){

if ( mode != 'noselect')
{
	document.write('<select name="'+SelectName+'" SIZE="1"');
	document.write('>');
}
	var l=this.SelectGene.length;

if(l>this.MaxElem) l = this.MaxElem;

	for(i=0;i<l;i++){
		var code=this.SelectGene[i][0];
		var libelle=this.SelectGene[i][1];
		if ( code == id_selected )
			sel = 'SELECTED';
		else
			sel = '';
		s="<option value="+code+" "+sel+" "+liste_evenements+">"+libelle+"</option>";
		document.write(s);
	}
	if(l>=this.MaxElem){
		s="<option value=''>-  Seuls les "+this.MaxElem+" premiers éléments sont affichés !</option>";
		document.write(s);
	} 

if ( mode != 'noselect');
	document.write("</select>");
}

//---------------------------------------------------------------------------
// Rajout d'un élément dans la liste
//---------------------------------------------------------------------------
function SelectGeneAdd(code,libelle){
	var l=this.SelectGene.length;
	this.SelectGene[l]=new Array(code,libelle);
}

//---------------------------------------------------------------------------
// L'object SelectGene : liste de chaines
//---------------------------------------------------------------------------
function SelectGene(){
	this.SelectGene=new Array;		// données triées par libellé
	this.SelectGeneSort0=new Array;		// données triées par code
	this.Filter=SelectGeneFilter;
	this.PrintSelect=SelectGenePrint;
	this.Add=SelectGeneAdd;
	this.MaxElem=100;
}
