
// + --------------------------------------------------------------------------------------
// + XHRConnection
// + V1.2
// + Thanh Nguyen, http://www.sutekidane.net
// + 14.06.2005
// + http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.fr
// + --------------------------------------------------------------------------------------
function XHRConnection(pdebug) {
	
	// + ----------------------------------------------------------------------------------
	var conn = false;
	var debug = (pdebug == true || pdebug == false) ? pdebug : false;
	var datas = new String();
	var areaId = new String();
	// Objet XML
	var xmlObj;
	// Type de comportement au chargement du XML
	var xmlLoad;
	
	// + ----------------------------------------------------------------------------------
	try {
		conn = new XMLHttpRequest();		
	}
	catch (error) {
		if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew XMLHttpRequest()\n\n' + error); }
		try {
			conn = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (error) {
			if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew ActiveXObject("Microsoft.XMLHTTP")\n\n' + error); }
			try {
				conn = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (error) {
				if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew ActiveXObject("Msxml2.XMLHTTP")\n\n' + error); }
				conn = false;
			}
		}
	}

	// + ----------------------------------------------------------------------------------
	// + setDebugOff
	// + Désactive l'affichage des exceptions
	// + ----------------------------------------------------------------------------------
	this.setDebugOff = function() {
		debug = false;
	};

	// + ----------------------------------------------------------------------------------
	// + setDebugOn
	// + Active l'affichage des exceptions
	// + ----------------------------------------------------------------------------------
	this.setDebugOn = function() {
		debug = true;
	};
	
	// + ----------------------------------------------------------------------------------
	// + resetData
	// + Permet de vider la pile des données
	// + ----------------------------------------------------------------------------------
	this.resetData = function() {
		datas = new String();
		datas = '';
	};
	
	// + ----------------------------------------------------------------------------------
	// + appendData
	// + Permet d'empiler des données afin de les envoyer
	// + ----------------------------------------------------------------------------------
	this.appendData = function(pfield, pvalue) {
		datas += (datas.length == 0) ? pfield+ "=" + escape(pvalue) : "&" + pfield + "=" + escape(pvalue);
	};
	
	// + ----------------------------------------------------------------------------------
	// + setRefreshArea
	// + Indique quel elment identifié par id est valoris lorsque l'objet XHR reoit une réponse
	// + ----------------------------------------------------------------------------------
	this.setRefreshArea = function(id) {
		areaId = id;
	};
	
	// + ----------------------------------------------------------------------------------
	// + createXMLObject
	// + Méthode permettant de créer un objet DOM, retourne la réfrence
	// + Inspiré de: http://www.quirksmode.org/dom/importxml.html
	// + ----------------------------------------------------------------------------------
	this.createXMLObject = function() {
		try {
			 	xmlDoc = document.implementation.createDocument("", "", null);
				xmlLoad = 'onload';
		}
		catch (error) {
			try {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlLoad = 'onreadystatechange ';
			}
			catch (error) {
				if (debug) { alert('Erreur lors de la tentative de création de l\'objet XML\n\n'); }
				return false;
			}
		}
		return xmlDoc;
	}
	
	// + ----------------------------------------------------------------------------------
	// + Permet de définir l'objet XML qui doit être valorisé lorsque l'objet XHR reoit une réponse
	// + ----------------------------------------------------------------------------------
	this.setXMLObject = function(obj) {
		if (obj == undefined) {
				if (debug) { alert('Paramètre manquant lors de l\'appel de la méthode setXMLObject'); }
				return false;
		}
		try {
			//xmlObj = this.createXMLObject();
			xmlObj = obj;
		}
		catch (error) {
				if (debug) { alert('Erreur lors de l\'affectation de l\'objet XML dans la méthode setXMLObject'); }
		}
	}
	
	// + ----------------------------------------------------------------------------------
	// + loadXML
	// + Charge un fichier XML
	// + Entrées
	// + 	xml				String		Le fichier XML à charger
	// + 	callBack		Objet		Le nom de la fonction de callback
	// + ----------------------------------------------------------------------------------
	this.loadXML = function(xml, callBack) {
		if (!conn) return false;
		// Chargement pour alimenter un objet DOM
		if (xmlObj && xml) {
			if (typeof callBack == "function") {
				if (xmlLoad == 'onload') {
					xmlObj.onload = callBack;
				}
				else {
					xmlObj.onreadystatechange = function() {
						if (xmlObj.readyState == 4) callBack()
					}
				}
			}
			xmlObj.load(xml);
			return;
		}		
	}

	// + ----------------------------------------------------------------------------------
	// + sendAndLoad
	// + Connexion à la page désirée avec envoie des données, puis mise en attente de la réponse
	// + Entrées
	// + 	Url				String		L'url de la page à laquelle l'objet doit se connecter
	// + 	httpMode		String		La méthode de communication HTTP : GET, HEAD ou POST
	// + 	callBack		Objet		Le nom de la fonction de callback
	// + ----------------------------------------------------------------------------------
	this.sendAndLoad = function(Url, httpMode, callBack) {
		httpMode = httpMode.toUpperCase();
		conn.onreadystatechange = function() {
			if (conn.readyState == 4 && conn.status == 200) {
				// Si une fonction de callBack a été définie
				if (typeof callBack == "function") {
					callBack(conn);
					return;
				}
				// Si une zone destinée à récupérer le résultat a été définie
				else if (areaId.length > 0){
					try {
						document.getElementById(areaId).innerHTML = conn.responseText;
					}
					catch(error) {
						if (debug) { alert('Echec, ' + areaId + ' n\'est pas un objet valide'); }
					}
					return;
				}
			}
		};
		switch(httpMode) {
			case "GET":
				try {
					Url = (datas.length > 0) ? Url + "?" + datas : Url;
					conn.open("GET", Url);
					conn.send(null);
				}
				catch(error) {
					if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la méthode GET'); }
					return false;
				}
			break;
			case "POST":
				try {
					conn.open("POST", Url); 
					conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					conn.send(datas);
				}
				catch(error) {
					if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la mthode POST'); }
					return false;
				}
			break;
			default :
				return false;
			break;
		}
		return true;
	};
	return this;
}



var nbLines;
var currentText="";
var currentIndex;
var edition;
var _list;
var _codes;
var _artist;
var lock=0;

function response(obj)
{
	lock=0;
	eval(obj.responseText);
	
	if (edition != 0){
		document.getElementById("_TextBoxSearch").value=_list[0];
	}
	
	if (_list.length <= 1 ) 
	{
		document.getElementById("_ResultList").style.visibility='hidden';
		edition=0;
		return;
	}
	
	document.getElementById("_ResultList").style.visibility='visible';
	
	nbLines=_list.length-1;
	html="";
	
	currentArtist="";
	for(i=1; i <= nbLines;i++)
	{
		if (mode==1 && _artist[i] != currentArtist)
		{
			currentArtist=_artist[i];
			html+="<span  class=\"artistItem\" Id=\"a"+i+"\">"+_artist[i]+"</span><br>";
		}
		html+="<span onclick=\"onClickItem('"+i+"')\" class=\"listItem\" Id=\"l"+i+"\">"+_list[i]+"</span><br>";
	}
	document.getElementById("_ResultList").innerHTML=html;
	
	edition=1;
	if (currentText.length>=_list[0].length) edition=0;
	currentText=_list[0];
	
	document.getElementById("l1").style.backgroundColor=selectedBgColor;
	document.getElementById("l1").style.color=selectedColor;
	currentIndex=1;
	
	if (edition == 1 )selectText();
}


function selectText()
{
	var textBoxSearch=document.getElementById("_TextBoxSearch");
	if (mode == 0 )
	{
		var ligne=document.getElementById("l"+currentIndex).innerHTML;
		textBoxSearch.value=ligne;
		
		myRE = new RegExp(currentText, "i")
		results = ligne.search(myRE)
		
		pos=results+currentText.length;
		
		if (textBoxSearch.setSelectionRange){
			textBoxSearch.setSelectionRange(pos,ligne.length);
		}
		else{
			selectedText=textBoxSearch.createTextRange();
			selectedText.moveStart("character", pos);
			selectedText.moveEnd("textedit");
			selectedText.select();
		}
	}
	textBoxSearch.focus();
}


function next()
{
	nextIndex=currentIndex+1;
	if (nextIndex > nbLines)nextIndex=1;
	document.getElementById("l"+currentIndex).style.backgroundColor=document.getElementById("l"+nextIndex).style.backgroundColor;
	document.getElementById("l"+currentIndex).style.color=document.getElementById("l"+nextIndex).style.color;
	document.getElementById("l"+nextIndex).style.backgroundColor=selectedBgColor;
	document.getElementById("l"+nextIndex).style.color=selectedColor;
	currentIndex=nextIndex;
	selectText();
}

function prev()
{
	prevIndex=currentIndex-1;
	if (prevIndex<1)prevIndex=nbLines;
	document.getElementById("l"+currentIndex).style.backgroundColor=document.getElementById("l"+prevIndex).style.backgroundColor;
	document.getElementById("l"+currentIndex).style.color=document.getElementById("l"+prevIndex).style.color;
	document.getElementById("l"+prevIndex).style.backgroundColor=selectedBgColor;
	document.getElementById("l"+prevIndex).style.color=selectedColor;
	currentIndex=prevIndex;
	selectText();
}



function keyEvent(e){

	
	switch(parseInt(e.keyCode))
	{
		case 40:
			setTimeout("next()",10);
			break;
		case 38:
			setTimeout("prev()",10);
			break;
		case 8:
			edition=0;
			setTimeout("_productList()",10);
			break;
		case 13:
			onEnter(_list[currentIndex],_codes[currentIndex]);
			break;
		case 27:
			onClean();
			
			break;
		case 16:
		case 17:
		case 18:
		case 20:
		case 37:
		case 39:
			break;
		default:
			setTimeout("_productList()",10);
		break;
	}
}

function _productList() {
	
	if (lock == 1 ) {
		document.getElementById("_ResultList").style.visibility='visible';
		document.getElementById("_ResultList").innerHTML='<span class="artistItem" >wait ...</span>';
		return;
	}
	
    var XHR = new XHRConnection();
    XHR.appendData("l", languageId);
    XHR.appendData("u", publicId);
    XHR.appendData("s", encodeURI(document.getElementById("_TextBoxSearch").value));
	XHR.appendData("m", mode);
	lock=1;
	if (mode == 0 ){
		XHR.sendAndLoad("search-crawler.php", "POST", response);
	}
	else{
		XHR.sendAndLoad("search-crawler.php", "POST", response);
	}
}

function onClean(){
	document.getElementById("_ResultList").style.visibility='hidden';
	document.getElementById("_TextBoxSearch").value='';
	document.getElementById("_ResultList").innerHTML='';
	document.getElementById("_Command").style.visibility="hidden";
	document.getElementById("_TextBoxSearch").value="";
	PlayerStop();
}
 

document.write('<div id="_Player" style="position:absolute;height:0px;width:0px;"></div>');

function PlayerStop(){
	document.getElementById("_Player").innerHTML="";
}

function PlayerStart(sound){
	document.getElementById("_Player").innerHTML="<embed src='http://mkmb.net/"+sound+"_catalogue.mp3' hidden=true autostart=true loop=false>";
} 


	var mode=0
	var publicId=111
	var languageId=1;
	
	var selectedColor="white";
	var selectedBgColor="#696969";
	
	function onClickItem(index){
		
		onEnter(_list[index],_codes[index]);
	}

	function onEnter (search,codes){
		if (document.forms.lenght > 0 )
			document.forms[0].onsubmit=function(){return false;};
		document.getElementById("_TextBoxSearch").value=search;
		document.getElementById("_ResultList").style.visibility='hidden';
		ShowCommand(search,codes);
	}
	
	
	
	function check_titre(){
		mode=0;
		onClean();
	}
	
	function check_artiste(){
		mode=1;
		onClean();
	}
		

	function ShowCommand(search,codes) {
		c=codes.split('|');
		var html="";
		var sound="";
		
		if (c[1].length > 0 ){
			htmlTemplate=document.getElementById("_Template").innerHTML;
			htmlTemplate=htmlTemplate.replace(/#TITLE#/g,search);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTID#/g,c[1]);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTTYPEID#/g,1);
			html+=htmlTemplate;
			sound=c[1];

		}
		
		if (c[2].length > 0 ){
			htmlTemplate=document.getElementById("_Template").innerHTML;
			htmlTemplate=htmlTemplate.replace(/#TITLE#/g,search);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTID#/g,c[2]);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTTYPEID#/g,21);
			html+=htmlTemplate;
			sound=c[2];

		}
		
		if (c[3].length > 0 ){
			htmlTemplate=document.getElementById("_Template").innerHTML;
			htmlTemplate=htmlTemplate.replace(/#TITLE#/g,search);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTID#/g,c[3]);
			htmlTemplate=htmlTemplate.replace(/#PRODUCTTYPEID#/g,53);
			html+=htmlTemplate;
			sound=c[3];

		}
		
		document.getElementById("_Command").innerHTML=html;
		document.getElementById("_Command").style.visibility="visible";
		
		PlayerStart(sound);
	}