/*
============================================================================
 NAME: 
   Search
 DESCRIPTION:
   Scripts for search functionality
 UPDATES
   2011-04-08 Ola Ljungars: changed facet method and added limit
   2011-03-08 Ola Ljungars: Removed err alerts
   2010-12-14 Ola Ljungars: Created
 TODO
   - Possible add a delay until suggestion
   - Possible increase to 3 chars until suggest
============================================================================
*/

var UseSuggestField = true;
var iSelectedIndex = -1; //not selected
var maxIndex = 10;
var Catalog = "";

function debug(str) {
  var div = document.getElementById("debugDiv");
  if (div != null) {
    div.innerHTML += str.replace("<", "&lt;").replace(">", "&gt;") + "<br />"
  }
	else{
		;
	}
}

function ddump(str) {
	return;
  var div = document.getElementById("uDumpDiv");
  if (div != null) {
    div.innerHTML = str;
  }
}

function cls_debug() {
  var div = document.getElementById("debugDiv");
  if (div != null) {
    //div.innerHTML = "";
  }
}

function SearchSolR(s) {
  debug("SearchSolR(" + s + ")");
  var params = getstandardargs().concat("q=name:" + s + "*");
  var strData = params.join('&');
  var strURL = "/_system/aspx/solrproxy.aspx"
  var URL = strURL + "?" + strData;
  xmlhttpGet(URL);
}


function FacetSuggest(s) {
  debug("FacetSuggest(" + s + ")");
  
  s = encodeURIComponent(s);
  
  var mainq = "*";
  var facet_pre = s;
  var URL = "";
  
  if(UseSuggestField){
    URL = "/_system/aspx/solrproxy.aspx?q=suggest:" + s + "*&fq=Catalog:" + Catalog + "&facet=true&facet.field=suggest&facet.prefix=" + s + "&rows=0&facet.mincount=1&facet.limit=10&facet.method=enum&wt=json";
  }
	else{
		URL = "/_system/aspx/solrproxy.aspx?q=text:"+s+"*&fq=Catalog:"+Catalog+"&facet=true&facet.field=text&facet.prefix="+s+"&rows=0&facet.mincount=1&wt=json";  	
	}
  xmlhttpGet(URL);
}


function GetTerms(s) {
  var URL = "/_system/aspx/solrproxy.aspx?terms.fl=name&terms.prefix="+s+"&indent=true&wt=json&omitHeader=true"+"&funct=terms";
  xmlhttpGet(URL);
}

var cnt = 0;

function HandleSuggest(objForm){
	debug("HandleSuggest");
  var strPartString = objForm["q"].value;
  strPartString = strPartString.toLowerCase();
  var aWords = strPartString.split(" ");
	var lastWord;
	lastWord = aWords[aWords.length-1]

	if(!(lastWord.length > 0)) {
		ToggleContainerDiv(false);
		return;
	}

  if (lastWord.length > 1) {
    FacetSuggest(lastWord);
  }
  else {
    ToggleContainerDiv(false)
  }
  
  //window.status = aWords.length + " " + lastWord.length + " " + (cnt++) + " here";
}


function HandleReturn(objForm){

	return;
}


function GetSuggested(){
	var objForm = document.forms[CurrentForm];
	var containerId = ((CurrentForm=="SearchFull")?"SearchSuggestLayerFull":"SearchSuggestLayer");
	var container = document.getElementById(containerId);
	var SuggestWord = container.childNodes[iSelectedIndex].innerHTML;
	var NewSenctence = "";

  var strPartString = objForm["q"].value;
  strPartString = strPartString.toLowerCase();
  var aWords = strPartString.split(" ");
	var lastWord = aWords[aWords.length-1];
	var i;
	for(i=0;i<aWords.length-1;i++){
		NewSenctence+=aWords[i] + " ";
	}
	NewSenctence+=SuggestWord;
	objForm["q"].value = NewSenctence;
	
	iSelectedIndex=-1;
	ToggleContainerDiv(false);
}

function VoidEvent(e){
	if(iSelectedIndex!=-1){
		GetSuggested();
		var evt = e || event;
		if (evt.stopPropagation){
			evt.preventDefault();
			evt.stopPropagation();
		} 
		else{
			evt.cancelBubble = true;
			evt.returnValue = false;
		}
	}
}

var CurrentForm = "";

function CreateFullDiv(){
	if(CurrentForm=="SearchFull"){
		var containerId = "SearchSuggestLayerFull";
		var container = document.getElementById(containerId);
		if(container==null){
			container = document.createElement("div");
			container.id = containerId;
			var toolbox = document.getElementById("toolbox");
			if(toolbox!=null){
				toolbox.parentNode.insertBefore(container,toolbox);  
			}
		}
	}
	
}


function SearchFormOnKey(e, objForm) {
  if (objForm["RTLSite"].value != "False"){ 
    return;
  }
	CurrentForm = objForm.name;
	CreateFullDiv();
	if(Catalog==""){
		Catalog = objForm["Catalog"].value;
	}
	//alert(CurrentForm);
  var evt = e || event;
	switch (evt.keyCode){
		case 13: 
			HandleReturn(objForm);
			break;
		case 38: // arrow up
			objForm.blur();
			MoveSuggestItem(-1);
			break;
		case 40: // arrow down
			objForm.blur();
			MoveSuggestItem(+1);
			break;
		case 18: // tab
			objForm.blur();
			MoveSuggestItem(-1);
			break;
		default:
			HandleSuggest(objForm);
	}
  //window.status = evt.keyCode;

	if(evt.keyCode == 18){		// canclebubble to abort tab to next form / link
		;	
	}
  

  //window.status = evt.keyCode;
  evt.cancelBubble = true;
  return false;
}



/*
======================================================================
*/

function xmlhttpGet(strURL) {
  ddump(strURL);

  var xmlHttpReq = false;
  var self = this;
  if (window.XMLHttpRequest) { // Mozilla/Safari
    self.xmlHttpReq = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) { // IE
    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  }
  self.xmlHttpReq.open('GET', strURL, true);
  //self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  self.xmlHttpReq.onreadystatechange = function() {
    if (self.xmlHttpReq.readyState == 4) {
    	iSelectedIndex=-1;
      updatepage(self.xmlHttpReq.responseText);
    }
  }
  self.xmlHttpReq.send(null);
}

function getstandardargs() {
  var params = [
        'wt=json'
        , 'indent=on'
        , 'rows=5'
        , 'fl=name,id,Page_PublishLocationUrl'
        , 'fq=Catalog:'+Catalog+''
        ];

  return params;
}


function ToggleContainerDiv(bShow) {
	var containerId = ((CurrentForm=="SearchFull")?"SearchSuggestLayerFull":"SearchSuggestLayer");
  var container = document.getElementById(containerId);
  if (container != null) {
    if (bShow) {
    	container.style.display = "inline";
			var toolbox = document.getElementById("toolbox");
			if(toolbox!=null){
				toolbox.style.zIndex = 99;	
			}
    	
    }
    else container.style.display = "none";
  }
}

function updatepage(str) {
  //alert("updatepage!")

  //cls_debug();
  var rsp;
  try {
    rsp = eval("(" + str + ")"); // use eval to parse Solr's JSON response
  }
  catch (e) {
    //alert("Error:" + str);
    return;
  }
  debug("Found 1:" + rsp.response.numFound); 
  var i;

	var containerId = ((CurrentForm=="SearchFull")?"SearchSuggestLayerFull":"SearchSuggestLayer");
  var container = document.getElementById(containerId);
  
  ClearSuggestItems(container);
  
  //var res = rsp.facet_counts.facet_fields.text;
  var res;
  if(UseSuggestField){
  	res = rsp.facet_counts.facet_fields.suggest;
  }
	else{
		res = rsp.facet_counts.facet_fields.text;
	}
  
  for (i = 0; i < res.length; i+=2) {
  	if(i<(maxIndex*2)){
			var t = res[i];
			var cnt = res[i+1]
			AddSuggestWord(container, i, t, cnt);
			debug(i + ":" + t + " " + cnt);
		}
  }
  if (rsp.response.numFound == 0) ToggleContainerDiv(false);
  else ToggleContainerDiv(true);

  
}

function ClearSuggestItems(container) {
  container.innerHTML = "";
}

function SuggestItemOver() {
  if (this) {
    if (this.id != "undefined") {
      this.focus();
      this.className = "SuggestItem_HighLight";
    }
  }
}

function SuggestItemOut() {
  if (this) {
    if (this.id != "undefined") {
      this.blur();
      this.className = "SuggestItem";
    }
  }
}

function SuggestItemClick() {
  if (this) {
    if (this.id != "undefined") {
    	var sId = this.id;
    	sId = sId.substring(2, sId.length);
      iSelectedIndex = sId/2;
      GetSuggested();
    }
  }
}

function AddSuggestWord(container, index, string, numFound) {
  var objItem = document.createElement("div");
  objItem.id = "sg" + index;
  objItem.className = "SuggestItem";
  objItem.innerHTML = string;
  objItem.onclick = SuggestItemClick;
  objItem.onmouseover = SuggestItemOver;
  objItem.onmouseout = SuggestItemOut;
  container.appendChild(objItem);
}


function MoveSuggestItem(delta){
	var containerId = ((CurrentForm=="SearchFull")?"SearchSuggestLayerFull":"SearchSuggestLayer");
	var container = document.getElementById(containerId);
	if(container.style.display!="none"){
		if(delta == 1){
			if(iSelectedIndex == (maxIndex-1)){
				delta = 0;
				return;
			}
		}
		else{
			if(iSelectedIndex == 0){
				delta = 0;
				return;	
			}
		}
		iSelectedIndex +=delta;
		UpdateSelected(iSelectedIndex);
	}
}

function UpdateSelected(){
	var i;
	var containerId = ((CurrentForm=="SearchFull")?"SearchSuggestLayerFull":"SearchSuggestLayer");
	var container = document.getElementById(containerId);
	for(i=0;i<container.childNodes.length;i++){
		container.childNodes[i].className = "SuggestItem";
	}
	container.childNodes[iSelectedIndex].className = "SuggestItem_HighLight";
	//window.status = "" + iSelectedIndex;
}
  
//window.status = "DATA HERE 61";

