var urlSiteS=document.location.href.split('/');
var urlSite=urlSiteS[0]+"/"+"/"+urlSiteS[2];
var urlLang="/"+urlSiteS[3];
var premier=false;
var fermer="";
//
// Gets the browser specific XmlHttpRequest Object
//
function getXmlHttpRequestObject() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		   alert("Your browser doesn't support XMLHTTPRequest objects..."); 
	}
}

// Our XmlHttpRequest object to get the auto suggest
var searchReq = getXmlHttpRequestObject();
// Ensure not to send two GET request at the same time [0=ok, 1=in_progress, 2=recall search method]
var searchInProgressState = 0;
// constant
var predictiveSearchListDivName = 'search_suggest';

// form used for search query
var predictiveSearchForm;
var minLengthSearchFormText = 2;
// group by option
var GROUP_BY_FAMILY = 'FAMILY';
var GROUP_BY_DEPARTEMENT = 'DEP';
var groupByFilter = '';	

var xhtmlPredictiveResultList = '';

var DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI = 600;
var lastPredictiveSearchDelayHit = 0;

function modifierFermer(traduct){
    fermer=traduct;
}

//
// Called from keyup on the search textbox.
//


function searchSuggest(searchForm) {
            premier=true;
            
	predictiveSearchForm = searchForm;

	lastPredictiveSearchDelayHit = new Date();
	
	setTimeout("executeSearchSuggestAjaxCall()", DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI);
}

//
// Starts the AJAX request.
//
function executeSearchSuggestAjaxCall() {

	//alert('=>'+predictiveHitDelay);

    var tDate = new Date();
  	var tDiff = tDate.getTime() - lastPredictiveSearchDelayHit.getTime();

	if( tDiff < DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI-20 ) {
		return;
	}

	if (searchReq.readyState == 4 || searchReq.readyState == 0) {
		var str = escape(encodeUTF8(predictiveSearchForm.text.value));
		var urlSite=document.location.href.split('/');
		urlSite=urlSite[0]+"/"+"/"+urlSite[2];
		// CONST !
		if( str.length > minLengthSearchFormText ) {
			// no search in progress !
			if(searchInProgressState == 0) {
			    searchReq.open(
				"GET", urlSite+
				'/nettools/presearchxml.mdr?'
				+'siteId='+predictiveSearchForm.siteId.value
				+'&language='+predictiveSearchForm.language.value
				+'&central='+predictiveSearchForm.central.value
				+'&store='
				+'&text='+str,
				true
				);
			    searchReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");		
			    searchReq.onreadystatechange = handleSearchSuggest; 
			    searchReq.send(null);
					
			    // search is in progress
			    searchInProgressState = 1;
			    groupByFilter = GROUP_BY_FAMILY;
			}
		}
		else {
			// hide 
			hidePredictiveSearchList();
		}
	}
	else {
		// a new search to do after this one
		searchInProgressState++;		
	}	
}

//
// Show predictive search result list
// htmlContent: html content (XHTML)
//
function showPredictiveSearchList(htmlContent) {
	var searchSugestDiv = document.getElementById(predictiveSearchListDivName);
	if(htmlContent!=""){
                	searchSugestDiv.innerHTML = htmlContent;	
                	
                	document.getElementById("search_suggest").style.display="block";
	}
}

//
// Hide predictive search result list
//
function hidePredictiveSearchList() {
	var searchSugestDiv = document.getElementById(predictiveSearchListDivName);
	searchSugestDiv.innerHTML = '';	
	document.getElementById("search_suggest").style.display="none";
}

//
//
//
function resetPredictiveResultList() {
	xhtmlPredictiveResultList = '';
}

//
// 
//
function appendGroup(lang, type, averageScore, result, label, url) {

	//alert(' lang='+lang+' type='+type+'label='+label+' url='+url);
           
            if(label!=""){
                label=label.replace(new RegExp("\""),'&quot;');
                label=label.replace(new RegExp("\'\'"),'&quot;');
                label=label.replace(new RegExp("\'"),' &#146;');
                
              
                xhtmlPredictiveResultList += '<div class="suggest_link"><a onmouseover="javascript:suggestOver(this);" ';
                xhtmlPredictiveResultList += 'onmouseout="javascript:suggestOut(this);" ';
                xhtmlPredictiveResultList += 'href="' + urlSite + urlLang + url + '"';
                xhtmlPredictiveResultList += 'class="suggest_link"><b>' + label + '</b></a>';
                
            
                 xhtmlPredictiveResultList += '</div>';
                 premier=false;
  	}
}

//
//
//
function appendProduct(lang, score, label, url, typology) {

     if(label!=""){
              label=label.replace(new RegExp("\""),'&quot;');
              label=label.replace(new RegExp("\'\'"),'&quot;');
              label=label.replace(new RegExp("\'"),'&#146;');
              
	
	xhtmlPredictiveResultList += '<div class="suggest_link"><a onmouseover="javascript:suggestOver(this);" ';
	xhtmlPredictiveResultList += 'onmouseout="javascript:suggestOut(this);" ';
	xhtmlPredictiveResultList += 'href="' + urlSite + urlLang + url + '"';
  	xhtmlPredictiveResultList += 'class="suggest_link">&nbsp;&nbsp;' + label + ' ('+typology+')' + '</a></div>';
  	
             premier=false;
       }
}

//
//
//
function finalisePredictiveResultList() {
	showPredictiveSearchList(xhtmlPredictiveResultList);
}

//
// Function called when the AJAX response is returned.
//
function handleSearchSuggest() {
	if (searchReq.readyState == 4) {
	
		// reset result list
		resetPredictiveResultList();
	
		// some search are waiting
		if( searchInProgressState > 1 ) {
			searchSuggest(predictiveSearchForm);
		}
		// clear progress flag
		searchInProgressState = 0;
	
		// SEARCH RESULT <pre-search>*
		var xmlResponse = searchReq.responseXML;
		if( xmlResponse == null )
			return;
		
		var lang = xmlResponse.getElementsByTagName('language');	
		var root = xmlResponse.getElementsByTagName('pre-search');		
		
		//alert( ' => ' + root.length );
		
                    	if (root!=null && root.length>0) {
                    	    	lookUpDepartementGroup(
                    	    		lang == null ? 'FR' : lang.nodeValue,			// lang
                    	    		root[0].getElementsByTagName('department')		// department list
                    	    	);
                    	    	finalisePredictiveResultList();
                    		} // end if (root!=null) {
                    	else{
                    	                premier=false;
                    		    hidePredictiveSearchList();
                    	}
    	}
}

//
// DEPARTEMENT
//
function lookUpDepartementGroup(lang, departementList) {

	if(departementList != null) {
		for(var i=0;i<departementList.length;i++) {
		
			var departementData = departementList[i];

			// append DEPARTEMENT
		  	appendGroup( 
		  		lang,
		  		GROUP_BY_DEPARTEMENT,
		  		getNodeValuePredictiveSearch(departementData, 'score'),
		  		getNodeValuePredictiveSearch(departementData, 'result'),
		  		getNodeValuePredictiveSearch(departementData, 'title'),
		  		getNodeValuePredictiveSearch(departementData, 'category-url')
		  		);		  		
		  	
			lookUpFamilyGroup(
				lang, 
				departementData.getElementsByTagName('family') 
			);
			
		}//for i
	}//if not null
}

//
// FAMILY
//
function lookUpFamilyGroup(lang, familyList) {

	if(familyList != null) {
		for(var i=0;i<familyList.length;i++) {
		
			var familyData = familyList[i];
		
			// append DEPARTEMENT
			//function appendGroup(lang, type, averageScore, result, label, url) {
		  	appendGroup( 
		  		lang,
		  		GROUP_BY_FAMILY,
		  		getNodeValuePredictiveSearch(familyData, 'score'),
		  		getNodeValuePredictiveSearch(familyData, 'result'),
		  		getNodeValuePredictiveSearch(familyData, 'title'),
		  		getNodeValuePredictiveSearch(familyData, 'category-url')
		  		);
		  	
			lookUpProductList(
				lang,
				familyData.getElementsByTagName('product')
			);	
		}
	}
}

//
// PRODUCT
//
function lookUpProductList(lang, productList) {
	
	// list exist ?
	if( productList != null ) {
	  	for (var i = 0; i < productList.length; i++) {
	  	
			var productData = productList[i];
			//function appendProduct(lang, score, label, url, typology) {
			appendProduct(
				lang, 
				getNodeValuePredictiveSearch(productData, 'score'), 
				getNodeValuePredictiveSearch(productData, 'title'), 
				getNodeValuePredictiveSearch(productData, 'url'), 
				getNodeValuePredictiveSearch(productData, 'typology')
				);

	  	}// for j
  	}
}

//
// Get a value from a node
//
function getNodeValuePredictiveSearch(masterNode, dataNodeName) {
	var dataNodeList = masterNode.getElementsByTagName(dataNodeName);
	if( dataNodeList[0] == null )
		return '';
		
	var nodeValue = dataNodeList[0].firstChild;
	if( nodeValue != null )
		return nodeValue.nodeValue;
	
	// check attribute then
	var attribute = masterNode.getAttribute(dataNodeName);
		
	return attribute != null ? attribute : '';
}

//
// Mouse over function
//
function suggestOver(div_value) {
	div_value.className = 'suggest_link_over';
}

//
// Mouse out function
//
function suggestOut(div_value) {
	div_value.className = 'suggest_link';
}

//
// Click function: set search input text
//
function setSearch(value) {
	document.getElementById('mdr-text').value = value;
	hidePredictiveSearchList();
	document.getElementById('searchForm').submit();
	
}

function encodeUTF8(str) {
     var resultat = "";
     for (i = 0; i < str.length; i++) {
     
         var caractere = str.charCodeAt(i);
         if (caractere < 128) {
             resultat += String.fromCharCode(caractere);
         }
         
         else if((caractere > 127) && (caractere < 2048)) {
             resultat += (String.fromCharCode((caractere >> 6) | 192) + 
                 String.fromCharCode((caractere & 63) | 128));
        }
        
        else {
            resultat += (String.fromCharCode((caractere >> 12) | 224) + 
                String.fromCharCode(((caractere >> 6) & 63) | 128) + 
                String.fromCharCode((caractere & 63) | 128));
        }
    }
     return resultat;
 }
