﻿var getFunctionsUrl = "ajSuggestion.aspx?keyword=";
var targetURL="SearchResult.aspx?SearchKey=[keyword]&QueryType=1&Operation=ChangeQueryType";
var httpRequestKeyword = ""; //Keyword ที่ถูกส่งไปในการ request โดย jsAjax.js-showPage()
var userKeyword = "";
var isKeyUpDownPressed = false;
var hasResults = false;
var ThisKeyValuesList = new Object();
var goToSearch = false; //Add By Draft.
var oKeyword;//Add By Draft.
var goByClick = false;//Add By Draft. 

window.onload = init;

function init()
{
  if (getObj("ctl00_Top1_keyword")) oKeyword = getObj("ctl00_Top1_keyword");//Add By Draft.
  if (getObj("top1_keyword")) oKeyword = getObj("top1_keyword");//Add By Draft.
  if (getObj("keyword")) oKeyword = getObj("keyword");//Add By Draft.
  oKeyword.setAttribute("autocomplete", "off");
  oKeyword.value = "";
  setTimeout("checkForChanges()", 500);
}  

function addToCache(keyword, values)
{
  ThisKeyValuesList[keyword] = new Array();
  for(i=0; i<values.length; i++)
    ThisKeyValuesList[keyword][i] = values[i];
}

function checkCache(keyword)
{
  if(ThisKeyValuesList[keyword])
    return true;
  for(i=keyword.length-2; i>=0; i--)
  {
    var currentKeyword = keyword.substring(0, i+1);
    if(ThisKeyValuesList[currentKeyword])
    {            
      var cacheResults = ThisKeyValuesList[currentKeyword];
      var keywordResults = new Array();
      var keywordResultsSize = 0;
      for(j=0;j<cacheResults.length;j++)
      {
        if(cacheResults[j].indexOf(keyword) == 0)               
          keywordResults[keywordResultsSize++] = cacheResults[j];
      }      
      addToCache(keyword, keywordResults);      
      return true;  
    }
  }
  return false;
}

function getSuggestions(keyword) 
{  
  if(keyword != "" && !isKeyUpDownPressed)
  {
    isInCache = checkCache(keyword);
    if(isInCache == true)
    {   
      //ถ้ามีใน Cache ให้ดึงใน Cache มาไม่ต้อง Get ใหม่ 
      httpRequestKeyword=keyword;
      userKeyword=keyword;     
      displayResults(keyword, ThisKeyValuesList[keyword]);                          
    }
    else    
    {
      //ถ้าไม่มีใน Cache ให้ request ไปขอใหม่
      httpRequestKeyword=keyword;
      userKeyword=keyword;     
      showPage(getFunctionsUrl + keyword,null);
      waitRequest();
    }
  }
}

function waitRequest()
{
      if (ThisAjaxResult == "")
      {
        ThisTimer = setTimeout("waitRequest();", 500);
        return; 
       }
        clearTimeout(ThisTimer);
        updateSuggestions();
}

function xmlToArray(resultsXml)
{
  var resultsArray= new Array();  
  for(i=0;i<resultsXml.length;i++)
    resultsArray[i]=resultsXml.item(i).firstChild.data;
  return resultsArray;
}

function updateSuggestions()
{
  nameArray = ThisAjaxResult.split(",");
  if(httpRequestKeyword == userKeyword)    
  {
    displayResults(httpRequestKeyword, nameArray);
  }
  else
  {
    addToCache(httpRequestKeyword, nameArray);
  }
}

function displayResults(keyword, results_array) 
{
  var div = "<select id=\"cmbKeyword\" multiple=\"multiple\" size=\"10\" onmousedown=\"goByClick=true;\" onchange=\"if (goByClick) selectValue();\" onkeyup=\"handleKeyUpCombo(event); return false;\" style=\"width:100%;border:solid 1pt gray\">"; 
  if(!ThisKeyValuesList[keyword] && keyword)
    addToCache(keyword, results_array);
  if(results_array.length == 0)
  {
    hasResults = false;
  }
  else
  {
    isKeyUpDownPressed = false;
    hasResults = true;
    for (var i=0; i<ThisKeyValuesList[keyword].length; i++) 
    {
      crtFunction = ThisKeyValuesList[keyword][i];
      crtFunctionLink = crtFunction;
        div += "<option>";
        div += crtFunction;
        div += "</option>";
     }
  }
  div += "</select>";
  var oSuggest = getObj("suggest");  
  var oScroll = getObj("scroll");
  oScroll.scrollTop = 0;
  oSuggest.innerHTML = div;
  oScroll.style.visibility = "visible";
  //==========
  //-->set position of scroll pane (Add by Draft) 
        oScroll.style.display = "inline";
	    var oScrollLeft = oKeyword.offsetLeft;
	    var oScrollTop = oKeyword.offsetTop + oKeyword.offsetHeight;
	    var objParent = oKeyword.offsetParent;
	    while (objParent != null)
	    {
	        oScrollLeft += objParent.offsetLeft;
            oScrollTop += objParent.offsetTop;
		    objParent = objParent.offsetParent;
	    }
        oScroll.style.left = oScrollLeft + 2 + 'px';
        oScroll.style.top = oScrollTop + 'px';
  //==========
  if(results_array.length > 0)
  {
      getObj("cmbKeyword").selectedIndex = 0;
   }   
}

function selectValue()
{
    var _keyword = getObj("cmbKeyword").options[getObj("cmbKeyword").selectedIndex].text;
    goToSearch = true;
    oKeyword.value = _keyword; 
    window.location = targetURL.replace("[keyword]",_keyword);
}

function checkForChanges()
{
  if (goToSearch) return;
  if (oKeyword == null || oKeyword.value==null) return;
  var keyword = oKeyword.value;
  if(keyword.length < 3)
  {
    getObj("scroll").style.visibility = "hidden";  
    userKeyword="";
    httpRequestKeyword="";
    return;
  }
  if((userKeyword != keyword) && (!isKeyUpDownPressed)) 
    getSuggestions(keyword);
}

function handleKeyUpCombo(e) 
{
  e = (!e) ? window.event : e;
  target = (!e.target) ? e.srcElement : e.target;
  if (target.nodeType == 3)
    target = target.parentNode;
  code = (e.charCode) ? e.charCode :
       ((e.keyCode) ? e.keyCode :
       ((e.which) ? e.which : 0));
  if (e.type == "keyup") 
  {    
    isKeyUpDownPressed =false; 
    if ((code < 13 && code != 8) || 
        (code >=14 && code < 32) || 
        (code >= 33 && code <= 46 && code != 38 && code != 40) || 
        (code >= 112 && code <= 123)) 
    {
      var x = "debug"; //add by draft
    }
    else
    if(code == 13)
    {
      if(getObj("cmbKeyword").selectedIndex >= 0)
      {
        selectValue();
      }        
    }        
    else
      if(code == 40)
      {                   
         getObj("cmbKeyword").focus();
      }
      else
      if(code == 38)
      {       
        if (getObj("cmbKeyword").selectedIndex == 0) oKeyword.focus();
        e.cancelBubble = true;
        e.returnValue = false;
        isKeyUpDownPressed = true;  
      }     
  }
}

function handleKeyUpKeyword(e)
{
  e = (!e) ? window.event : e;
  target = (!e.target) ? e.srcElement : e.target;
  if (target.nodeType == 3)
    target = target.parentNode;
  code = (e.charCode) ? e.charCode :
       ((e.keyCode) ? e.keyCode :
       ((e.which) ? e.which : 0));
  if (e.type == "keyup") 
  {    
    isKeyUpDownPressed =false; 
    if ((code < 13 && code != 8) || 
        (code >=14 && code < 32) || 
        (code >= 33 && code <= 46 && code != 38 && code != 40) || 
        (code >= 112 && code <= 123)) 
    {
      var x = "debug"; //add by draft
    }
    else
    if(code == 13)
    {
      if(oKeyword.value.length > 0)
      {
        window.location = targetURL.replace("[keyword]",oKeyword.value);
      }
    }
    else
      if(code == 40)
      {                   
         getObj("cmbKeyword").focus();
      }
      else // This Else Add By Draft
      {
         checkForChanges();  // This Else Add By Draft
      }
  }
}
 
//this method call from aspx
function hideSuggestions()
{
  var oScroll = getObj("scroll");
  oScroll.style.visibility = "hidden";  
}





 