/**
* La documentation de ce script n'est pas développée ici, on fera référence à la documentation de completionMEV.js
**/

var dn="www.easyvols.org";
//var dn="seoul.mev.lfr:85";
var completionMEHURLRoot;
var texteHotel;
switch(window.lang){
	case "es_ES":
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/es_ES";
		texteHotel=" hoteles";
		break;
	case "it_IT":
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/it_IT";
		texteHotel=" hotel";
		break;
	case "en_GB":
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/en_GB";
		texteHotel=" hotels";
		break;
	case "de_DE":
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/de_DE";
		texteHotel=" hotels";
		break;
	case "fr_FR":
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/fr_FR";
		texteHotel=" hôtel(s)";
		break;
	default:
		completionMEHURLRoot="http://"+dn+"/base/rjs/completion/MEH/fr_FR";
		texteHotel=" hôtel(s)";
		break;
}

var completionMEHRJS=new RemoteScript(completionMEHURLRoot+"/load_default.rjs");

// Hauteur des lignes pour les MSIE<=6.9
var MSIE6_LINE_HEIGHT=20;
var MSIE6_LINE_WIDTH=300;



function CompletionMEH(elementText,elementData,positionDiv,maxTownsInList) {
	this.poolIndex=completionMEHPool.add(this);
	this.status="off";
	this.elementText=elementText;
	this.elementText.setAttribute("autocomplete","off");
	if(genericNavigator.navigator.id==MSIE){
		addJavascriptToAttribute(this.elementText,"onkeydown","completionMEHPool.get("+this.poolIndex+").toucheDown(event);");
		addJavascriptToAttribute(this.elementText,"onkeyup","completionMEHPool.get("+this.poolIndex+").toucheUp(event);");
		addJavascriptToAttribute(this.elementText,"onfocus","completionMEHPool.get("+this.poolIndex+").updatePropositions(event);");
		addJavascriptToAttribute(this.elementText,"ondeactivate","completionMEHPool.get("+this.poolIndex+").delayedHidePropositions(500);");
	}
	else{
		addJavascriptToAttribute(this.elementText,"onkeydown","return completionMEHPool.get("+this.poolIndex+").toucheDown(event);");
		addJavascriptToAttribute(this.elementText,"onkeyup","return completionMEHPool.get("+this.poolIndex+").toucheUp(event);");
		addJavascriptToAttribute(this.elementText,"onfocus","return completionMEHPool.get("+this.poolIndex+").updatePropositions(event);");
		addJavascriptToAttribute(this.elementText,"onblur","completionMEHPool.get("+this.poolIndex+").delayedHidePropositions(500);");
	}
	this.elementData=elementData;
	this.propositionsDiv=document.createElement("DIV");
	this.propositionsDiv.style.visibility="hidden";
	this.propositionsDiv.className="completionMEH";
	if(genericNavigator.navigator.id==MSIE&&genericNavigator.navigator.version<=6.9){
		this.propositionsDiv.style.width=MSIE6_LINE_WIDTH+"px";
		this.propositionsDiv.style.padding="5px";
	}
	positionDiv.appendChild(this.propositionsDiv);

	var DEFAULT_MAX_TOWNS_IN_LIST=6;
	this.maxTownsInList=DEFAULT_MAX_TOWNS_IN_LIST;
	if(maxTownsInList){
		this.maxTownsInList=maxTownsInList;
	}

	this.propositions=[];
	this.lineSelected=-1;
	this.lines=[];
	this.pageIndex=0;	
	this.updating=false;

	this.toucheUp=function(event) {
		if(!event){return;}
		if(shouldUpdatePropositions(event)){
			this.updatePropositions(event);
		}
		return true;
	};

	this.toucheDown=function(event) {
		if(!event){return;}
		return completionToucheDown(this, event);
	};

	this.updatePropositions=function(event){
		if(!event){return;}
		if(this.updating){return;}
		this.updating=true;
		if(event.type!=="focus"){
			this.elementData.value="";
		}
		var elementTextValue=this.elementText.value;
		if(elementTextValue.length>=3){
			var prefix=getPrefix(elementTextValue);
			this.propositions=[];
			var completionObjet=this;
			var onAfterUpdate=function(){
					//console.log('/load_'+prefix+'.rjs reçu : '+completionObjet.propositions.length+' proposition(s)');
					completionObjet.updating=false;
				};
			completionMEHRJS.invoke(completionMEHURLRoot+"/load_"+prefix+".rjs","initMEHPropositions("+this.poolIndex+")", onAfterUpdate);
		}
		else{
			this.hidePropositions();
			this.updating=false;
		}
		return true;
	};

	this.showPropositions=function() {
		// Si le div de positionnement des propositions n'est pas présent, inutile d'aller plus loin
		if(!this.propositionsDiv){return;}
		
		// On vide le div de positionnement de tous les éléments précédements affichés
		var node=this.propositionsDiv.lastChild;
		while(node){
			this.propositionsDiv.removeChild(node);
			node=this.propositionsDiv.lastChild;
		}

		// On calcule l'expression régulière qui correspond au texte tapé par l'utilisateur
		var regExp=new RegExp("^"+formateText(this.elementText.value).replace(/\s+/,"\\s+")+".*");

		// Cette variable va tenir le décompte des lignes des villes affichés
		var line=0;
		this.lines=[];
		// On passe en revue toutes les propositions villes
		for(var i=0;i<this.propositions.length;i++){
			// Si la proposition ville matche avec le champ texte
			if(this.propositions[i].matches(regExp)){
				addJavascriptToAttribute(this.propositions[i].div,"onmouseover","completionMEHPool.get("+this.poolIndex+").selectLine("+line+")");
				addJavascriptToAttribute(this.propositions[i].div,"onmousedown","completionMEHPool.get("+this.poolIndex+").validLine("+line+")");
				this.lines[line]=this.propositions[i];
				// On insère la ville dans le tableau des lignes
				line++;
				
				// Initialisation des variables utilisé pour la mise en gras dans les proposition du texte saisie.
				var reg=new RegExp("("+formateText(this.elementText.value).replace(/\s+/,"\\s+")+")", "gi");
				var chaine = this.propositions[i].div.childNodes[0].nodeValue;
				// Creation d'une chaine sans accent pour la mise en évidance.
				chaineSansAccent=replaceAccents(chaine);
				// Modification du DOM pour mettre en évidance la correspondance entre le texte fourni et celui proposé.
				this.propositions[i].div.childNodes[0].nodeValue="";
				modifDomWhithSearch(chaine, chaineSansAccent, this.elementText.value, this.propositions[i].div, reg);
				this.propositionsDiv.appendChild(this.propositions[i].div);

				if(genericNavigator.navigator.id==MSIE&&genericNavigator.navigator.version<=6.9){
					this.propositions[i].div.style.height=MSIE6_LINE_HEIGHT+"px";
					this.propositions[i].div.style.width=MSIE6_LINE_WIDTH+"px";
				}
			}
		}
		// Par défaut on n'a pas de ligne sélectionnée (-1), tout action sur les flêches du clavier va faire apparitre la selection grâce aux tests
		// su this.lineSelected dans les méthodes decreaseSelectedPosition() ou increaseSelectedPosition() 
		this.hidePage();
		this.lineSelected=-1;
		this.pageIndex=0;	
		this.showPage();

		if(this.propositions.length>0&&this.propositionsDiv&&this.propositionsDiv.lastChild){
			this.status="on";
			showPropositionsElement(this.propositionsDiv, line);
		}
		else{
			this.hidePropositions();
		}
	};

	this.hidePropositions=function() {
		this.status="off";
		hidePropositionsElement(this.propositionsDiv);
	};

	this.delayedHidePropositions=function(delay){
		window.setTimeout('completionMEHPool.get('+this.poolIndex+').hidePropositions();', delay);
	};

	this.updatePage=function() {
		// On détermine l'éventuel nouveau pageIndex
		var newPageIndex=Math.floor(this.lineSelected/this.maxTownsInList);
		// S'il a changé on cache la page courante et on affiche la nouvelle
		if(this.pageIndex!=newPageIndex){
			this.hidePage();
			this.pageIndex=newPageIndex;
			this.showPage();
		}
	};

	this.showPage=function() {
		for(var i=this.pageIndex*this.maxTownsInList;i<(this.pageIndex+1)*this.maxTownsInList&&i<this.lines.length&&i>=0;i++){
			this.lines[i].div.style.display="block";
		}
	};

	this.hidePage=function() {
		for(var i=this.pageIndex*this.maxTownsInList;i<(this.pageIndex+1)*this.maxTownsInList&&i<this.lines.length&&i>=0;i++){
			this.lines[i].div.style.display="none";
		}
	};
	
	this.decreaseSelectedProposition=function() {
		this.deselectProposition();
		this.lineSelected--;
		if(this.lineSelected<0){
			this.lineSelected=this.lines.length-1;
		}
		this.selectProposition();
	};

	this.increaseSelectedProposition=function() {
		this.deselectProposition();
		this.lineSelected++;
		if(this.lineSelected>=this.lines.length){
			if(this.lines.length>0){
				this.lineSelected=0;
			}
			else{
				this.lineSelected=-1;
			}
		}
		this.selectProposition();
	};

	this.selectProposition=function() {
		if(this.lines[this.lineSelected]){
			addClass(this.lines[this.lineSelected].div,"selected");
		}
	};

	this.deselectProposition=function() {
		if(this.lines[this.lineSelected]){
			removeClass(this.lines[this.lineSelected].div,"selected");
		}
	};

	this.selectLine=function(line) {
		this.deselectProposition();
		this.lineSelected=line;
		if(this.lineSelected>=this.lines.length){
			if(this.lines.length>0){
				this.lineSelected=0;
			}
			else{
				this.lineSelected=-1;
			}
		}
		else if(this.lineSelected<0){
			this.lineSelected=this.lines.length-1;
		}
		this.selectProposition();
	};
	
	this.validLine=function(line){
		this.elementText.value=this.lines[line].nom;
		this.elementData.value=this.lines[line].data;
		// Par défaut, les villes ne sont pas visibles car il faut tester leur page d'appartenance
		this.hidePropositions();
	};

}

function PropositionMEHVille(nom,pays,code,id,nbHotels) {
	this.nom=nom;
	this.code=code;
	this.id=id;
	if(this.id&&this.code&&this.code!=="null"){
		this.data="v:"+this.id+"|c:"+this.code+"|t:"+this.nom;
	}
	else if(this.id){
		this.data="v:"+this.id;
	}
	else if(this.code&&this.code!=="null"){
		this.data="c:"+this.code;
	}
	else{
		this.data=this.nom;
	}
	this.pays=pays;
	this.div=document.createElement("DIV");
	this.div.className="propositionVille";
	if(nbHotels) {
		this.nbHotels=nbHotels;
		this.div.appendChild(document.createTextNode(nom+", "+pays+" ("+nbHotels+texteHotel+")"));
	}else{
		this.div.appendChild(document.createTextNode(nom+", "+pays));
	}
	this.div.style.display="none";
	this.index=-1;
	this.keywords=[];
}
PropositionMEHVille.prototype={
	add: function(kw){
		this.keywords.push(kw);
	},
	matches: function(_re){
		if(textMatch(this.nom,_re)){return true;}
		if(textMatch(this.pays,_re)){return true;}
		if(textMatch(this.code,_re)){return true;}
		for(var i=this.keywords.length;i--;){
			if(textMatch(this.keywords[i],_re)){return true;}
		}
		return false;
	}
};

var completionMEHPool={
	pool: [],
	add: function(completion){
		this.pool.push(completion);
		return this.pool.length-1;
	},
	get: function(poolIndex){
		return this.pool[poolIndex];
	}
};
