// Tableau pour mettre en cache
var _resultCache = new Object();

// Encode la chaîne de caractères
function escapeURI(str){
	if(encodeURIComponent)
		return encodeURIComponent(str);

	if(escape)
		return escape(str);
}

// Mettre les réponses en cache
function mettreEnCache(cle, suggestions) {
	_resultCache[cle] = suggestions;
}

function obtenirCache(cle) {
	if(cle.length < 3)
		return new Array();

	return _resultCache[cle];
}

// Transformer les données du document XML en un tableau
function traiterXml(xmlDoc, nodeName) {
	var options = xmlDoc.getElementsByTagName(nodeName);
	var optionsListe = new Array();

	for(var i = 0; i < options.length; ++i)
		optionsListe.push(options[i].firstChild.data);

	return optionsListe;
}

// Afficher les résultats au bon endroit
function calculateOffsetLeft(r) {
	return calculateOffset(r, "offsetLeft");
}

function calculateOffsetTop(r) {
	return calculateOffset(r, "offsetTop");
}

function calculateOffset(r, attr) {
	var kb = 0;

	while(r) {
		kb += r[attr];
		r = r.offsetParent;
	}

	return kb;
}

// Gestion des événements
var _lastKeyCode = null;

// Handler pour le keydown du document
var onKeyDownHandler = function(event) {
	if(!event && window.event)
		event = window.event;
	// On enregistre la touche ayant déclenché l'évènement
	if(event)
		_lastKeyCode = event.keyCode;
}

var _highlightedSuggestionIndex = -1;
var _highlightedSuggestionDiv = null;

// Taille de la sélection dans le champ input
function rangeSize(n) {
	var N = -1;

	if(n.createTextRange) {
		var fa = document.selection.createRange().duplicate();
		N = fa.text.length;
	}
	else if(n.setSelectionRange)
		N = n.selectionEnd - n.selectionStart;

	return N;
}

// taille du champ input non sélectionne
function beforeRangeSize(n) {
	var v = 0;

	if(n.createTextRange) {
		var fa = document.selection.createRange().duplicate();
		fa.moveEnd("textedit", 1);
		v = n.value.length - fa.text.length;
	}
	else if(n.setSelectionRange)
		v = n.selectionStart
	else
		v = -1;

	return v;
}

// Place le curseur à la fin du champ
function cursorAfterValue(n) {
	if(n.createTextRange) {
		var t = n.createTextRange();
		t.moveStart("character", n.value.length);
		t.select();
	}
	else if(n.setSelectionRange)
		n.setSelectionRange(n.value.length, n.value.length);
}

// Retourne la valeur de la possibilité (texte) contenu dans une div de possibilité
function getSuggestion(uneDiv) {
	if(!uneDiv)
		return null;

	return trimCR(uneDiv.getElementsByTagName('span')[0].firstChild.data);
}

// supprime les caractères retour chariot et line feed d'une chaîne de caractères
function trimCR(chaine) {
	for(var f = 0, nChaine = "", zb = "\n\r"; f < chaine.length; f++) {
		if (zb.indexOf(chaine.charAt(f)) == -1)
			nChaine += chaine.charAt(f);
	}

	return nChaine;
}

// Déclenchée quand on passe sur une div de possibilité. La div précédente est passée en style normal
var divOnMouseOver = function() {
	if(_highlightedSuggestionDiv)
		_highlightedSuggestionDiv.className = "AutoCompleteDiv";

	this.className = "AutoCompleteDivAct";
};

// Déclenchée quand la sourie quitte une div de possibilité. La div repasse a l'état normal
var divOnMouseOut = function() {
	this.className = "AutoCompleteDiv";
};
