var search_field = null;
var search_hint = null;
var search_form = null;
var wsURL = null;
var search_result = null;
var hint_result = null;
var preview_result = null;

var search_delay = 20; //Ritardo in ms sulla ricerca
var search_max_results = 3;
var search_max_hint_results = 3;
var search_text = "";
var search_visible = false;
var search_default = "cerca nel sito";

var search_last_reply = 0;
var lang_internal = "it";
var lang = "it";
var isOverHint=false;
var base_url="";
var closeTimeOut;
var ajaxSearchRequest = null;
var ajaxHintRequest = null;
var hints_array = [];
var current_hint_selected=null;

var label = {
	previews:{
		en:"Previews",
		it:"Anteprime"
	},
	allresult:{
		en:"ALL RESULTS",
		it:"TUTTI I RISULTATI"
	},
	hint:{
		en:"Hints",
		it:"Suggerimenti"
	}
};
var searchTimeout = null;


function initSearchAndHint( idForm, _wsURL, _lang ) {
	search_form = $('#'+idForm);
	
	if ( !existElement(search_form) ) return;
	
	search_hint = $('#hintString');
	if ( !existElement(search_hint) ) return;
	
	search_field = $('#searchString');
	if ( !existElement(search_form) ) return;
	
	search_image = $('#searchImage');
	if ( !existElement(search_field) ) return;
	
	search_result = $('#hints');
	if ( !existElement(search_result) ) return;
	
	hint_result = $('#hintResults');
	if ( !existElement(hint_result) ) return;
	
	preview_result = $('#previewResults');
	if ( !existElement(preview_result) ) return;
	
	wsURL = _wsURL;
	//wsURL ="http://www.eni.com/portal/search/search.do?keyword=noquery&x=8&y=13&locale=it_IT&header=search";
	
	if ( _lang=="" || _lang==null) return;

	var _lang_lc = _lang.toLowerCase();
	
	if(_lang_lc.indexOf("it") != -1) {
		lang = _lang;
		lang_internal="it";
		
		
	} else if(_lang_lc.indexOf("en") != -1) {
		lang = _lang;
		lang_internal="en";
		
	}
	
	
	//lang = _lang;
	//search_default = search_field.value;
	search_field.keyup(function(e) { searchFieldCallback(e)});
	search_field.click(function() { if (search_field.val()==search_default) search_field.val(""); });
	search_field.blur(function() { 
		if (search_field.val()=="") {  
			 checkIfEmptySearch()
		};
		if(isOverHint==false) hideSearch();
		//closeTimeOut=setTimeout( "hideSearch()",100);
	})
	search_image.click (function() {  keySubmit(search_field); return false});
	    
	if($("#hintTitle").length > 0) {
	 $("#hintTitle").children("span:first").text(label.hint[lang_internal]);	
	
	}
	
	checkIfEmptySearch();
	showHint(search_field.val());
}
function existElement(element) {
	return element.length >0;
} 
function checkIfEmptySearch() {
	search_field.val(search_default); 
	resetHint();
}
function keySubmit(obj){
		var val = obj.val();
		if (val == 'search'){
			obj.val('noquery');
			search_form.submit();
		}else{
			if(val == '#'){
				obj.val('noquery');
				search_form.submit();
			}	else{ 
				search_form.submit(); 
			}
	  }
}
function searchResultReset() {
	preview_result.html("");
	$("#all").remove();
}
function showSearch(testo) {
	new_search_text = trim( testo );
	if (new_search_text.length==0) {
		hideSearch();
		return;
	}	
	if ( new_search_text == search_text ) return;
	search_text = new_search_text;
	var query = new_search_text;
	var url = wsURL + "?text=" + encodeURIComponent(query) + "&lang=" + escape(lang);
	//url test
	//url="xml/search_test.xml";
	
	if(ajaxSearchRequest != null) ajaxSearchRequest.abort();
	ajaxSearchRequest = null;
	
	search_visible = true;
	ajaxSearchRequest= $.ajax({
	url: url,
	type: "GET",
	cache: false,
	async:true,
		success: function( data ) {
			processReqChangeSearch();
	  }
	});
}
function submitSearch() {
	search_form.submit();
	hideSearch();
}
function processReqChangeSearch() {
	var req = ajaxSearchRequest;
	if ( req==null ) return;
	//alert(req.readyState + " -" +req.status +" - state")
	if (req.readyState == 4 ) {
		if (req.status == 200 || req.status == 0) {
			var result=req.responseXML;
			if(result==null) return;
			//valutiamo il dom, con il risultato
			//var token = result.getElementsByTagName("token");		
			//search_last_reply = Number(token[0].textContent);
			var htmlResult='';
			var risultati = result.getElementsByTagName("result");
			searchResultReset(); // vuotiamo i risultati
			//nascondo se non ho risultati
			if(risultati.length ==0) {
				//search_result.css('display' , 'none');
				return;	
			} else {
			
				search_result.css('display' , 'block');
				
				//get position of li wrapper
				var wrapper_position = $('#searchString').offset();
				var sfondo_position = $('.contenitore').offset();
				
				var left_position = wrapper_position.left - sfondo_position.left +1;
				var top_position = wrapper_position.top + 20;
				
				if(IsNumeric(left_position) && IsNumeric(top_position)) {
					search_result.css('top', (top_position) +"px");
					search_result.css('left', (left_position)+ "px");
				}
			}
			htmlResult ='<li class="hint_title"><span>' + label.previews[lang_internal] +'</span></li>';
			for ( var i = 0; i<risultati.length && i<search_max_results; i++ ) {
				var itemResult = risultati[i];
				var tit = itemResult.getElementsByTagName("title");
				var desc = itemResult.getElementsByTagName("abstract");
				var lnk = itemResult.getElementsByTagName("link");
				var lnkFunction="";

				if ( tit.length>0 && desc.length>0 && lnk.length>0 ) {
					
					tit=(tit[0]!=null && tit[0].firstChild!=null) ? tit[0].firstChild.nodeValue : "";
					desc=(desc[0]!=null && desc[0].firstChild!=null) ? desc[0].firstChild.nodeValue : "";
					lnk=(lnk[0]!=null && lnk[0].firstChild!=null) ? lnk[0].firstChild.nodeValue : "#";
					
					//link click
					var checkextension =".pdf.ppt.xsl.doc.jpg";
					var linkextension = lnk.substr(lnk.length - 4);
					
					if(checkextension.indexOf(linkextension) !=-1) {
						if (lnk.substr(0,1) == '/') {
							var firstpos =  (location.href.lastIndexOf('ENI_en_IT/') != -1) ? location.href.lastIndexOf('ENI_en_IT/') : location.href.lastIndexOf('en_IT/') ;
							var lastpos = location.href.length;
							var namer = location.href.substr(0, firstpos);
							namer += lnk; 
							
							lnkFunction = "openFile('"+namer+"');";
						}	
					} else {
							lnkFunction ="openPage('" + lnk + "');";
					}
					var overFunction = "searchRollover('risultato_"+i+"');";
					var outFunction = "searchRollout('risultato_"+i+"');";
					//<a id="href1_'+i +'" class="title_preview_item">'+ tit+'</a><br /><a id="href2_'+i +'" class="abstract_preview_item">'+ desc+'</a>
					htmlResult +='<li style="cursor:pointer;" onmouseout="'+ outFunction + '" onmouseover="'+ overFunction + '" onClick="'+ lnkFunction + '" id="risultato_'+i+'"><p class="title_preview_item">'+ tit+'</p><p>'+ desc+'</p></li>';
				}
			
			}
			preview_result.html(htmlResult);
			if ( risultati.length==0 ) {
				searchResultReset();
				search_result.css('display' , 'none');
				//hint_result.html("<li>No results</li>");			
			} else{
				var allhtml = '<a href="javascript:;"  onclick="submitSearch();return false;" onmouseover="disableCloseHint();" onmouseout="enableCloseHint();" class="all_hint_link"><span>'+ label.allresult[lang_internal] +'</span><img src="' + base_url + 'shared/i/arrow_hint_all.gif" border="0" /></a>';
				search_result.append('<div id="all">'+ allhtml +'</div>');
			}
		} else {
			//searchResultReset();
			search_result.css('display' , 'none');
			//hint_result.html("<li>No results</li>");
		}
	}
	//req = null;
}
/******************************************************************/
/* FUNCTION CLICKED */

function openFile(val) {
	window.open(val,null,'');	
} 
function openPage(val) {
	window.location.href=val;
}
function disableCloseHint() {
	isOverHint =true;
}	
function enableCloseHint() {
	isOverHint = false;
}		
function searchRollover( elemento ) {
	disableCloseHint() 
	var container = $('#'+ elemento);
	if (container==null) return;
	container.css('backgroundColor' , '#E7E7E7');
	container.css('display' , 'block');
}
function searchRollout( elemento ) {
	enableCloseHint()
	var container = $('#'+ elemento);
	if (container==null) return;
	container.css('backgroundColor' , '');
	container.css('display' , 'block');
}
function closeAndHideSearch() {
	hints_array = null;
	search_field.val( search_default );
	search_hint.text("");
	hideSearch();
}
function hideSearch() {	
	current_hint_selected=null;
	search_visible = false;
	searchResultReset();
	search_result.css('display' , 'none');
	search_text = "";
}
function resetHint() {
	if(search_hint) search_hint.text("");
}
function searchFieldCallback(e) {
	var keycode = e.keyCode;
	// assegno il valore del suggerimento alla ricerca
	
	if(keycode==40) {
		selectNextHint();
	} else if(keycode==38) {
		selectPrevHint();
	} else if (keycode==39) {
		
		if(search_field.val() != search_default) {
			if(	search_hint.val() != "") {
				search_field.text(search_hint.val());
			}
		}
		
	} else {
		var query = search_field.val();
		//search_text = query;
		showHint(query);
		current_hint_selected = null;
		
		if(searchTimeout != null) clearTimeout(searchTimeout);
		searchTimeout = window.setTimeout( 'searchTimeoutHandler(\"'+ query +'\")',	search_delay);
	}
	
}
function restoreSearchQuery() {
	if(search_text != "" && search_text != search_default) {
		search_field.val(search_text);
		showHint(search_text);
	} 
}
function searchTimeoutHandler( testo ) {
	//valutiamo se il campo � mutato. nel caso non lo sia portiamo avanti
	var query = search_field.val();
	if ( testo!=query ) return;
	showSearch( testo );
}
function showHint(testo) {
	var hint_query = testo;
	if ( hint_query.length==0 || hint_query == search_default) {
		resetHint();
		return;
	}	
	var query = hint_query;
	var url = wsURL + "?hint=" + encodeURIComponent(query) + "&lang=" + escape(lang);
	//url="xml/hint_test.xml";
	
	if(ajaxHintRequest != null) ajaxHintRequest.abort();
	ajaxHintRequest = null;
	
	ajaxHintRequest= $.ajax({
	url: url,
	cache: false,
	async:true,
	type: "GET",
		success: function( data ) {
			processReqChangeHint();
	  }
	});
}

function selectClickHint(val) {
	current_hint_selected = val;
	selectHint();
	search_form.submit();
}


function selectPrevHint() {
	var tot_hint = hints_array.length;
	if(current_hint_selected >= 0) searchRollout( "hint_" + current_hint_selected); 
	if( tot_hint >0 ) {
		if (current_hint_selected == null) {
			current_hint_selected =tot_hint -1;
		} else {
			current_hint_selected --;
		}
		if(current_hint_selected < 0) {
			//ripristino quello che stavo cercando
			restoreSearchQuery();
			current_hint_selected = null;
			return;
		}
		selectHint();
	}
}
function selectNextHint() {
	var tot_hint = hints_array.length;
	if(current_hint_selected >= 0) searchRollout( "hint_" + current_hint_selected); 
	if( tot_hint >0 ) {
		if (current_hint_selected == null) {
			current_hint_selected =0;
		} else {
			current_hint_selected ++;
		}
		if(current_hint_selected > tot_hint -1) {
			restoreSearchQuery();
			current_hint_selected = null;
			return;
		} 
		selectHint();
	}
}

function selectHint() {
var hint_text =  hints_array[current_hint_selected];
		search_hint.text(hint_text);
		search_field.val(hint_text);
		searchRollover( "hint_" + current_hint_selected  ) 

}


function processReqChangeHint( ind ) {
	var req = ajaxHintRequest;
	hints_array = [];
	if ( req==null ) return;
	
	
	if (req.readyState == 4 ) {
		if (req.status == 200 || req.status == 0) {
			var result=req.responseXML;
			if(result==null) return;
			
			var htmlString="";
			//build hint result
			var hints = result.getElementsByTagName("hint");
			
			if(hints.length ==0) {
				return;	
			} else {
				search_result.css('display' , 'block');
			}
			
			for ( var i = 0; i<hints.length && i<search_max_hint_results; i++ ) {
				
				//tit=(tit[0]!=null && tit[0].firstChild!=null) ? tit[0].firstChild.nodeValue
				var hint= hints[i];
				var hint_text = (hint!=null && hint.firstChild!=null) ? hint.firstChild.nodeValue :"";
				
				
				//onmouseout="'+ outFunction + '" onmouseover="'+ overFunction + '" onClick="'+ lnkFunction + '"
				if(hint_text) {
					var lnkFunction= null;
					var overFunction = "searchRollover('hint_"+i+"');";
					var outFunction = "searchRollout('hint_"+i+"');";
					lnkFunction = "selectClickHint("+ i +");";
					htmlString +='<li class="hint_item" onClick="'+ lnkFunction + '" onmouseout="'+ outFunction + '"  onmouseover="'+ overFunction + '"  id="hint_'+i+'"><span>' + hint_text + '</span></li>';
					hints_array.push(hint_text);
				}
			}
			
			
			hint_result.html(htmlString);
			
			
			//fill serach result
			var hint_node = result.getElementsByTagName("hint");
			var hint_text = (hint_node[0]!=null && hint_node[0].firstChild!=null) ? hint_node[0].firstChild.nodeValue : "";
			search_hint.text(hint_text);
		}
	}
}
function trim(s) {
	var l=0; var r=s.length -1;
	while(l < s.length && s[l] == ' ')
	{	l++; }
	while(r > l && s[r] == ' ')
	{	r-=1;	}
	return s.substring(l, r+1);
}
function IsNumeric(input)
{
    return (input - 0) == input && input.length > 0;
}
