// Copyright 2004 and onwards Google Inc.
//
// uncompressed / commented / renamed by Chris... 
// Customized by Pritesh Shah (pshah at csulb dot edu)
// 10/29/07.VM. Modified for ColdFusion. Absolute path.
var w="";
var pa=false;
var _oldInputFieldValue=""; // inputField value (set during call to google...)...(was ta)
var da=false;
var _currentInputFieldValue=""; // also inputField value (was g)
var G="";
var _eventKeycode=""; // event keycode... (was m)
var _highlightedSuggestionIndex=-1; // currently hightlighted suggestion index (was j)
var _highlightedSuggestionDiv=null; // currently highlisted suggestion div... (was h)
var _completeDivRows=-1; // completeDiv rows at time of keypress... (was Z)
var _completeDivDivList=null; // completeDiv div list at time of keypress (was za)
var _completeDivRows2=5; // was Ca... initially 5? not sure difference between this and _completeDivRows...
var q="";
var _divTag="div"; // Was Lb
var _spanTag="span"; // Was Bb
var _documentForm=null; // Form on html page... (was la...)
var _inputField=null; // Input field on form... (was a)
var _completeDiv=null; // document.completeDiv (was b)
var _submitButton=null; // submit button (was Xa)
var mb=null;
var X=null;
var _enString=null; // This becomes the string "en" (was ha)
var _cursorUpDownPressed=false;  // Was ra...
var kc=null;
var hc=null;
var _resultCache=new Object(); // This is a cache of results from google... (was Ua)
var ca=1;
var Aa=1;
var Y=false;
var _lastKeyCode=-1; // Gets set on keyDown... Was na... 
var Va=(new Date()).getTime();
var _hasXMLHTTP=false; // Gets set to true if XMLHTTP Supported (was Q)
var _xmlHttp=null; // This is the XMLHttp Object... (was k) 
var _completeSearchEnString=null; // Gets set to "/complete/search/?hl=en" (was sa)
var _completeSearchString=null; // Gets set to "/complete/search" ... (was E)
var B=null;
var aa=null;
var Ba=false;
var Ka=false;
var p=60;
var _searchString=null; // Gets set to "search" in installAC (was ia)
var ya=null;
var _timeoutAdjustment=0; // timeout adjustment... (was W)... gets adjusted over time...

// This is the function that get's called from the google html page...
// Line from page:
// InstallAC(document.f,document.f.q,document.f.btnG,"search","en");
// document.f is the name of the form on the page...
// document.f.q is the input text box on the page... 
//  -> <input autocomplete="off" maxLength=256 size=55 name=q value="">
// document.f.btnG Google Search button
InstallAC=function(frm,fld,sb,pn,rl,hd,sm,ufn){
  
  
  _documentForm=frm;
  _inputField=fld;
  _submitButton=sb;
  //alert("InstallAC called");
  //alert(_documentForm);
  //alert(_inputField);
  //alert(_submitButton);
  
  
  if(!pn) {
    pn="search";
	//alert("IN");
  }
  //alert(pn);
  _searchString=pn;
  //alert(_searchString);
  //alert(fld.value);
  var Kb="en|";
  var Jb="zh-CN|zh-TW|ja|ko|vi|";
  if(!rl||Kb.indexOf(rl+"|")==-1) {
    rl="en";
  }
  _enString=escapeURI(rl);
  //alert(_enString);
  if(Jb.indexOf(_enString+"|")==-1){
    // We won't pass through here...
    X=true;
    Y=false;
    Ba=false
  }else{
    // but will come through here...
    X=false;
    if(_enString.indexOf("zh")==0) {
      // not here...
      Y=false;
    } else {
      // but here...
      Y=true;
    }
    Ba=true
  }
  // hd is not defined, so becomes false...
  if(!hd) {
    hd=false;
  }
  ya=hd;

  // sm not defined, so becomes the string "query"
  if(!sm) {
    sm="query";
  }
  w=sm;

  // ufn is not defined...
  mb=ufn;
	//alert("InstallAC called");
  installACPartTwo()
}
;

// blurs focus, then sets focus again... 
// This is getting aclled when we press cursor up / cursor down...
// Was Yb...
function blurThenGetFocus(){
  _cursorUpDownPressed=true;
  //_inputField.blur();
  setTimeout("setInputFieldFocus();",10);
  return
}

// setup a keydown event...
// Was Fb...
function setupKeydown1(){
	//alert("setupKeydown1 called");
  if(document.createEventObject) {
    var y=document.createEventObject();
    y.ctrlKey=true;
    y.keyCode=70;
    document.fireEvent("onkeydown",y)
  }
}

// setup a keydown event...
// I can't figure out what calls this...
// was nc...
function setupKeydown2(vb){
  var y=document.createEventObject();
  y.ctrlKey=true;
  y.keyCode=vb;
  document.fireEvent("onkeydown",y)
}

function gc(event){}
function ic(event){}

// Was Pb
function keyDownHandler(event){
  if(!event&&window.event) {
    event=window.event;
  }
  if(event) {
    _lastKeyCode=event.keyCode;
  }

  // We are backspacing here...
  if(event&&event.keyCode==8){
	  //alert(event.srcElement);
	  //alert(a);
    
	/*
	Pritesh Commented this out, not sure what it does though
	if(X&&(_inputField.createTextRange&&(event.srcElement==a&&(bb(_inputField)==0&&lb(_inputField)==0)))){
		
		
      cc(_inputField);
      event.cancelBubble=true;
      event.returnValue=false;
      return false
    }
	
	*/
  }
}

function mc(){}

// Was Db..
function resizeHandler(){
  if(w=="url"){
    setInputFieldSize()
  }
  setCompleteDivSize()
}

// was ba...
function setCompleteDivSize(){
  if(_completeDiv){
    _completeDiv.style.left=calculateOffsetLeft(_inputField)+"px";
    _completeDiv.style.top=calculateOffsetTop(_inputField)+_inputField.offsetHeight-1+"px";
    _completeDiv.style.width=calculateWidth()+"px"
  }
}

// calculate width of inputField... Note browser specific adjustments...
// Was Ja()
function calculateWidth(){
  if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1){
    return _inputField.offsetWidth-ca*2
  }else{
    return _inputField.offsetWidth
  }
}


// Called from InstallAC...
// was ac()
function installACPartTwo(){
	//alert("InstallACPartTwo called");
  if(getXMLHTTP()){
	  //alert("Has XMLHttp");
    _hasXMLHTTP=true
  }else{
    _hasXMLHTTP=false
	//alert("NO XMLHttp");
  }

  // pa init'd to false at the top of this file...
  if(pa) {
    _completeSearchString="complete";
  } else {
    _completeSearchString="/complete/"+_searchString;
  }

  //_completeSearchEnString=_completeSearchString+"?hl="+_enString;
  //alert(_completeSearchEnString);

  if(!_hasXMLHTTP){
    //setCookie("qu","",0,_completeSearchString,null,null)
  }

  _documentForm.onsubmit=Fa;
  _inputField.autocomplete="off";
  _inputField.onblur=onBlurHandler;
  if(_inputField.createTextRange) {
    _inputField.onkeyup=new Function("return okuh(event);");
  } else {
	  //alert(okuh);
    _inputField.onkeyup=okuh;
  }
  _inputField.onsubmit=Fa;
  _currentInputFieldValue=_inputField.value;
  //alert("Current :"+_currentInputFieldValue);
  //alert("Old : "+_oldInputFieldValue);
  _oldInputFieldValue=_currentInputFieldValue;
  //alert("New Current :"+_currentInputFieldValue);
  //alert("New Old : "+_oldInputFieldValue);
  _completeDiv=document.createElement("DIV");
  _completeDiv.id="completeDiv";
  ca=1;
  Aa=1;
  _completeDiv.style.borderRight="black "+ca+"px solid";
  _completeDiv.style.borderLeft="black "+ca+"px solid";
  _completeDiv.style.borderTop="black "+Aa+"px solid";
  _completeDiv.style.borderBottom="black "+Aa+"px solid";
  _completeDiv.style.zIndex="1";
  _completeDiv.style.paddingRight="0";
  _completeDiv.style.paddingLeft="0";
  _completeDiv.style.paddingTop="0";
  _completeDiv.style.paddingBottom="0";
  setCompleteDivSize();
  _completeDiv.style.visibility="hidden";
  _completeDiv.style.position="absolute";
  _completeDiv.style.backgroundColor="white";
  document.body.appendChild(_completeDiv);
  cacheResults("",new Array(),new Array());
  Gb(_completeDiv);
  var s=document.createElement("DIV");
  s.style.visibility="hidden";
  // Added by Pritesh
  s.style.display="none";
  // Ends here
  s.style.position="absolute";
  s.style.left="-10000";
  s.style.top="-10000";
  s.style.width="0";
  s.style.height="0";
  var M=document.createElement("IFRAME");
  M.completeDiv=_completeDiv;
  M.name="completionFrame";
  M.id="completionFrame";
  //M.src=_completeSearchEnString;
  s.appendChild(M);
  document.body.appendChild(s);
  if(frames&&(frames["completionFrame"]&&frames["completionFrame"].frameElement)) {
    B=frames["completionFrame"].frameElement;
	//alert("1");
  } else {
	  //alert("2");
    B=document.getElementById("completionFrame");
  }
  if(w=="url"){
    setInputFieldSize();
    setCompleteDivSize()
  }
  window.onresize=resizeHandler;
  document.onkeydown=keyDownHandler;
  setupKeydown1()
  
}

// Was Ob
function onBlurHandler(event){
  if(!event&&window.event) {
    event=window.event;
  }
  if(!_cursorUpDownPressed){
    hideCompleteDiv();
    // check if tab pressed...
    if(_lastKeyCode==9){
      setSubmitButtonFocus();
      _lastKeyCode=-1
    }
  }
  _cursorUpDownPressed=false
}

okuh=function(e){
  _eventKeycode=e.keyCode;
  aa=_inputField.value;
  Oa()
}
;
// Was Xb...
function setSubmitButtonFocus(){
  //Commented by Pritesh
  //_submitButton.focus()
}

// Was sfi..
setInputFieldFocus=function(){
  _inputField.focus()
}
;

// strip CR from string...
// was Wb
function stripCRFromString(va){
  for(var f=0,oa="",zb="\n\r"; f<va.length; f++) {
    if (zb.indexOf(va.charAt(f))==-1) {
      oa+=va.charAt(f);
    } else {
      oa+=" ";
    }
  }
return oa
}

// Find span value with className = dc...
// Was Qa
function findSpanValueForClass(i,dc){
  var ga=i.getElementsByTagName(_spanTag);
  if(ga){
    for(var f=0; f<ga.length; ++f){
      if(ga[f].className==dc){
        var value=ga[f].innerHTML;
        if(value=="&nbsp;") {
          return"";
        } else{
          var z=stripCRFromString(value);
          return z
        }
      }
    }
  }else{
    return""
  }
}

// Return null if i undefined...
// otherwise return value of span cAutoComplete...
// was U
function valueOfCAutoComplete(i){
  if(!i) {
    return null;
  }
  return findSpanValueForClass(i,"cAutoComplete")
}

// Return null if i undefined...
// otherwise return value of span dAutoComplete...
// was wa
function valueOfDAutoComplete(i){
  if(!i) {
    return null;
  }
  return findSpanValueForClass(i,"dAutoComplete")
}

// Was F
function hideCompleteDiv(){
  document.getElementById("completeDiv").style.visibility="hidden"
}
// Was cb
function showCompleteDiv(){
  document.getElementById("completeDiv").style.visibility="visible";
  setCompleteDivSize()
}

// This is a result caching mechanism...
// was Ma
function cacheResults(is,cs,ds){
  _resultCache[is]=new Array(cs,ds)
}

// We get the following javascript code dynamically returned from google:
// sendRPCDone(frameElement, "fast bug", new Array("fast bug track", "fast bugs", "fast bug", "fast bugtrack"), new Array("793,000 results", "2,040,000 results", "6,000,000 results", "7,910 results"), new Array(""));
sendRPCDone=function(fr,is,cs,ds,pr){
  if(_timeoutAdjustment>0) {
    _timeoutAdjustment--;
  }
  var lc=(new Date()).getTime();
  if(!fr) {
    fr=B;
  }
  cacheResults(is,cs,ds);
  var b=fr.completeDiv;
  b.completeStrings=cs;
  b.displayStrings=ds;
  b.prefixStrings=pr;
  displaySuggestedList(b,b.completeStrings);
  Pa(b,valueOfCAutoComplete);
  if(_completeDivRows2>0) {
    b.height=16*_completeDivRows2+4;
  } else {
    hideCompleteDiv();
  }
}

function Oa(){
  // 38 is up cursor key, 40 is down cursor key...
  if(_eventKeycode==40||_eventKeycode==38) {
    blurThenGetFocus();
  }
  var N=lb(_inputField);
  var v=bb(_inputField);
  var V=_inputField.value;
  //alert(V);
  if(X&&_eventKeycode!=0){
    if(N>0&&v!=-1) {
      V=V.substring(0,v);
    } 
    if(_eventKeycode==13||_eventKeycode==3){ 
      var d=_inputField; 
      if(d.createTextRange){
        var t=d.createTextRange();
        t.moveStart("character",d.value.length);
        t.select()
      } else if (d.setSelectionRange){
        d.setSelectionRange(d.value.length,d.value.length)
      }
    } else { 
      if(_inputField.value!=V) {
        selectEntry(V)
      }
    }
  }
  _currentInputFieldValue=V;
  if(handleCursorUpDownEnter(_eventKeycode)&&_eventKeycode!=0) { 
    Pa(_completeDiv,valueOfCAutoComplete)
  }
}

function Fa(){
  //alert(w);
  return xb(w)
}

function xb(eb) {
  //alert(eb);
  da=true;  
  if(!_hasXMLHTTP){
    //setCookie("qu","",0,_completeSearchString,null,null)
  }
  hideCompleteDiv();
  if(eb=="url"){
    var R="";
    if(_highlightedSuggestionIndex!=-1&&h) {
      R=valueOfCAutoComplete(_highlightedSuggestionDiv);
    }
    if(R=="") {
      R=_inputField.value;
    }
    if(q=="") { 
      document.title=R;
    } else {
      document.title=q;
    }
    var Tb="window.frames['"+mb+"'].location = \""+R+'";';
    setTimeout(Tb,10);
    return false
  } else if(eb=="query"){
    _documentForm.submit();
    return true
  }
}

newwin=function(){
  window.open(_inputField.value);
  hideCompleteDiv();
  return false
}
;

idkc=function(e){
  if(Ba){
    var Ta=_inputField.value;
    if(Ta!=aa){
      _eventKeycode=0;
      Oa()
    }
    aa=Ta;
    setTimeout("idkc()",10)
  }
}
;
setTimeout("idkc()",10);

// Go read about encodeURIComponent here: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsmthencodeuricomponent.asp
// Basically converts a string to a valid uri... (spaces become %20, etc, etc..)
// this function was nb...
function escapeURI(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

// Was yb
// If Mb is 0, will return 150...
// If Mb is 3, will return 250...
// If Mb is 4, will return 450...
// If Mb is X, will return 850...
function recalculateTimeout(Mb){
  var H=100;
  for(var o=1; o<=(Mb-2)/2; o++){
    H=H*2
  }
  H=H+50;
  return H
}

// This function sets itself up and gets called over and over (timeout driven)
// was idfn...
mainLoop=function(){
	 
	 
  if(_oldInputFieldValue!=_currentInputFieldValue){
	  
	  
	 
    if(!da){
      var Za=escapeURI(_currentInputFieldValue);
      var ma=_resultCache[_currentInputFieldValue];
      if(ma){
        // Found in our cache...
        Va=-1;
        sendRPCDone(B,_currentInputFieldValue,ma[0],ma[1],B.completeDiv.prefixStrings)
      }else{
        _timeoutAdjustment++;
        Va=(new Date()).getTime();
        if(_hasXMLHTTP){
			//alert(Za);
          callGoogle(Za)
        }else{
          //setCookie("qu",Za,null,_completeSearchString,null,null);
          frames["completionFrame"].document.location.reload(true)
        }
      }
      _inputField.focus()
    }
    da=false
  }
  _oldInputFieldValue=_currentInputFieldValue;
  setTimeout("mainLoop()",recalculateTimeout(_timeoutAdjustment));
  return true
}
;
// Call mainLoop() after 10 milliseconds...
setTimeout("mainLoop()",10);

// This is onMouseDown function...
var Cb=function(){
  selectEntry(valueOfCAutoComplete(this));
  q=valueOfDAutoComplete(this);
  da=true;
  Fa()
}
;

// on mouseover...
var pb=function(){
  if(_highlightedSuggestionDiv) {
    setStyleForElement(_highlightedSuggestionDiv,"aAutoComplete");
  }
  setStyleForElement(this,"bAutoComplete")
}
;

// On Mouse out...
var ec=function(){
  setStyleForElement(this,"aAutoComplete")
}
;

// Called when cursor up/down pressed... selects new entry in completeDiv...
// was Na
function highlightNewValue(C){
  _currentInputFieldValue=G;
  selectEntry(G);
  q=G;
  if(!_completeDivDivList||_completeDivRows<=0) {
    return;
  }
  showCompleteDiv();
  if(C>=_completeDivRows){
    C=_completeDivRows-1
  }
  if(_highlightedSuggestionIndex!=-1&&C!=_highlightedSuggestionIndex){
    setStyleForElement(_highlightedSuggestionDiv,"aAutoComplete"); 
    _highlightedSuggestionIndex=-1
  }
  if(C<0){
    _highlightedSuggestionIndex=-1;
    _inputField.focus();
    return
  }
  _highlightedSuggestionIndex=C;
  _highlightedSuggestionDiv=_completeDivDivList.item(C);
  setStyleForElement(_highlightedSuggestionDiv,"bAutoComplete");
  _currentInputFieldValue=G;
  q=valueOfDAutoComplete(_highlightedSuggestionDiv);
  selectEntry(valueOfCAutoComplete(_highlightedSuggestionDiv))
}

// Was Eb
// returns false if cursor up / cursor down or enter pressed...
function handleCursorUpDownEnter(eventCode){
  if(eventCode==40){
    highlightNewValue(_highlightedSuggestionIndex+1);
    return false
  }else if(eventCode==38){
    highlightNewValue(_highlightedSuggestionIndex-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}

// Pa(completeDiv,H)
// This function gets called for every keypress I make...
function Pa(localCompleteDiv,ib){
  var localInputField=_inputField;
  var T=false;
  _highlightedSuggestionIndex=-1;
  // This becomes the rows in our suggestion list...
  var J=localCompleteDiv.getElementsByTagName(_divTag);
  // # of rows in list...
  var O=J.length;
  _completeDivRows=O;
  _completeDivDivList=J;
  _completeDivRows2=O;
  G=_currentInputFieldValue;
  if(_currentInputFieldValue==""||O==0){
    hideCompleteDiv()
  }else{
    showCompleteDiv()
  }
  var Ab="";
  if(_currentInputFieldValue.length>0){
    var f;
    var o;
    // My prefixStrings was always an empty array...
    // So local variable T never would be set to true...
    // And the local variable Ab would remain empty...
    for(var f=0; f<O; f++){
      for(o=0; o<localCompleteDiv.prefixStrings.length; o++){
        var Ib=localCompleteDiv.prefixStrings[o]+_currentInputFieldValue;
        if(Y||ib(J.item(f)).toUpperCase().indexOf(Ib.toUpperCase())==0) {
          Ab=localCompleteDiv.prefixStrings[o]; 
          T=true; 
          break
        }
      }
      if(T){
        break
      }
    }
  }
  if(T) {
    _highlightedSuggestionIndex=f;
  }
  for(var f=0; f<O; f++) {
    setStyleForElement(J.item(f),"aAutoComplete");
  }
  if(T){
    _highlightedSuggestionDiv=J.item(_highlightedSuggestionIndex);
    q=valueOfDAutoComplete(_highlightedSuggestionDiv)
  }else{
    q=_currentInputFieldValue;
    _highlightedSuggestionIndex=-1;
    _highlightedSuggestionDiv=null
  }
  var ab=false;
  switch(_eventKeycode){
    // cursor left, cursor right, others??
    case 8:
    case 33:
    case 34:
    case 35:
    case 35:
    case 36:
    case 37:
    case 39:
    case 45:
    case 46:
      ab=true;
      break;
    default:
      // regular keypress ...
      break
  }
  //alert("ab: " + ab);
  if(!ab&&_highlightedSuggestionDiv){
    var Da=_currentInputFieldValue;
    setStyleForElement(_highlightedSuggestionDiv,"bAutoComplete");
    var z;
    if(T) {
      z=ib(_highlightedSuggestionDiv).substr(localCompleteDiv.prefixStrings[o].length);
    } else {
      z=Da;
    }
    if(z!=localInputField.value){
      if(localInputField.value!=_currentInputFieldValue) {
        return;
      }
      if(X){
        if(localInputField.createTextRange||localInputField.setSelectionRange) {
          // Commented by Pritesh to prevent autofilling of the first entry in the INPUT field
		  
		  //selectEntry(z);
        }
        if(localInputField.createTextRange){
          var t=localInputField.createTextRange();
          t.moveStart("character",Da.length);
          t.select()
        }else if(localInputField.setSelectionRange){
          localInputField.setSelectionRange(Da.length,localInputField.value.length)
        }
      }
    }
  }else{
    _highlightedSuggestionIndex=-1;
    q=_currentInputFieldValue
  }
}

// Called as:
// calculateOffsetLeft(_inputField)
// was ob
function calculateOffsetLeft(r){
  return Ya(r,"offsetLeft")
}

// Called as:
// calculateOffsetTop(_inputField)
// Was Qb...
function calculateOffsetTop(r){
  return Ya(r,"offsetTop")
}

function Ya(r,attr){
  var kb=0;
  while(r){
    kb+=r[attr]; 
    r=r.offsetParent
  }
  return kb
}

// Sets cookie...
// (was called qa...)
function setCookie(name,value,Ra,hb,fb,Sb){
  //var Nb=name+"="+value+(Ra?";expires="+Ra.toGMTString():"")+(hb?";path="+hb:"")+(fb?";domain="+fb:"")+(Sb?";secure":"");
  //document.cookie=Nb
}

// Was Ha
function setInputFieldSize(){
  var xa=document.body.scrollWidth-220;
  xa=0.73*xa;
  _inputField.size=Math.floor(xa/6.18)
}
function lb(n){
  var N=-1;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    N=fa.text.length
  }else if(n.setSelectionRange){
    N=n.selectionEnd-n.selectionStart
  }
  return N
}

function bb(n){
  var v=0;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    fa.moveEnd("textedit",1);
    v=n.value.length-fa.text.length
  }else if(n.setSelectionRange){
    v=n.selectionStart
  }else{
    v=-1
  }
  return v
}
function cc(d){
  if(d.createTextRange){
    var t=d.createTextRange();
    t.moveStart("character",d.value.length);
    t.select() 
  } else if(d.setSelectionRange) {
    d.setSelectionRange(d.value.length,d.value.length)
  }
}

function jc(Zb,Ea){
  if(!Ea)Ea=1;
  if(pa&&pa<=Ea){
    var Ia=document.createElement("DIV");
    Ia.innerHTML=Zb;
    document.getElementById("console").appendChild(Ia)
  }
}

// Ex: setStyleForElement(document.createElement("DIV"), "aAutoComplete");
// was l
function setStyleForElement(c,name){
  db();
  c.className=name;
  if(Ka){
    return
  }
  switch(name.charAt(0)){
    case "m":
      c.style.fontSize="13px";
      c.style.fontFamily="arial,sans-serif";
      c.style.wordWrap="break-word";
	  
      break;
    case "l":
      c.style.display="block";
      c.style.paddingLeft="3";
      c.style.paddingRight="3";
      c.style.height="16px";
	  c.style.overflow="hidden";
	  
	  
      break;
    case "a":
      c.style.backgroundColor="white";
      c.style.color="black";
      if(c.displaySpan){
        c.displaySpan.style.color="green"
      }
      break;
    case "b":
      c.style.backgroundColor="#3366cc";
      c.style.color="white";
      if(c.displaySpan){
        c.displaySpan.style.color="white"
      }
      break;
    case "c":
      //alert(p);
	  // Width commented as overflow hidden was causing problems in Mozilla (specified in "l" case of this switch)
	  //c.style.width=p+"%";
      c.style.cssFloat="left";
      break;
    case "d":
      c.style.cssFloat="right";
      c.style.width=100-p+"%";
      if(w=="query"){
        c.style.fontSize="10px";
        c.style.textAlign="right";
        c.style.color="green";
        c.style.paddingTop="3px"
      }else{
        c.style.color="#696969"
      }
      break
  }
}

function db(){
  p=65;
  if(w=="query"){
    var wb=110;
    var Sa=calculateWidth();
    var tb=(Sa-wb)/Sa*100;
    p=tb
  }else{
    p=65
  }
  if(ya){
    p=99.99
  }
}
function Gb(i){
  db();
  var Ub="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word; ";
  var Vb="display: block; padding-left: 3; padding-right: 3; height: 16px; overflow: hidden; ";
  var bc="background-color: white; ";
  var qb="background-color: #3366cc; color: white ! important; ";
  var ub="display: block; margin-left: 0%; width: "+p+"%; float: left; ";
  var Ga="display: block; margin-left: "+p+"%; ";
  if(w=="query"){
    Ga+="font-size: 10px; text-align: right; color: green; padding-top: 3px; "
  }else{
    Ga+="color: #696969; "
  }
  D(".mAutoComplete",Ub);
  D(".lAutoComplete",Vb);
  D(".aAutoComplete *",bc);
  D(".bAutoComplete *",qb);
  D(".cAutoComplete",ub);
  D(".dAutoComplete",Ga);
  setStyleForElement(i,"mAutoComplete")
}

// Called from sendRPCResponse...
// i = fr.completeDiv
// cs = list of comlete strings...
// Hb = list of results...
// was rb
// was function displaySuggestedList(i,cs,Hb){
function displaySuggestedList(i,cs){
  while(i.childNodes.length>0) {
    i.removeChild(i.childNodes[0]);
  }
  // For each element in our list, we create:
  // <DIV (u) - mousedown/mouseover/mouseout aAutoComplete>
  //   <SPAN (ka) lAutoComplete>
  //     <SPAN (ua) cAutoComplete>
  //        bug tracking
  //     </SPAN (ua)>
  //     <SPAN (ea) dAutoComplete>
  //        500,000 results
  //     </SPAN (ea)>
  //   </SPAN>
  // </DIV (u)>
  
  //for(var f=0; f<cs.length; ++f){
	  
  for(var f=0; f<cs.length && f<=10; ++f){
    var u=document.createElement("DIV");
    setStyleForElement(u,"aAutoComplete");
    u.onmousedown=Cb;
    u.onmouseover=pb;
    u.onmouseout=ec;
    var ka=document.createElement("SPAN");
    setStyleForElement(ka,"lAutoComplete");
    var ua=document.createElement("SPAN");
    ua.innerHTML=html_entity_decode(cs[f]); // the text for the suggested result...
	//alert(ua.innerHTML);
	
	// ea stuff commmented out as we don't want to display number of results like Google Suggest
	//var ea=document.createElement("SPAN");
    //setStyleForElement(ea,"dAutoComplete");
    setStyleForElement(ua,"cAutoComplete");
    //u.displaySpan=ea;
    if(!ya) {
      //ea.innerHTML=Hb[f]; // the text for # results for suggested result...
    }
    ka.appendChild(ua);
    //ka.appendChild(ea);
    u.appendChild(ka);
    i.appendChild(u)
  }
}

function html_entity_decode(str) {
  var ta=document.createElement("textarea");
  ta.innerHTML=str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  return ta.value;
}


function D(name,gb){
  if(Ka){
    var I=document.styleSheets[0];
    if(I.addRule){
      I.addRule(name,gb)
    }else if(I.insertRule){
      I.insertRule(name+" { "+gb+" }",I.cssRules.length)
    }
  }
}

// Was function jb...
// returns an XMLHttp object... gets it in an IE/Mozilla friendly way..
function getXMLHTTP(){
  var A=null;
  try{
    A=new ActiveXObject("Msxml2.XMLHTTP")
  }catch(e){
    try{
      A=new ActiveXObject("Microsoft.XMLHTTP")
    } catch(oc){
      A=null
    }
  }
  if(!A && typeof XMLHttpRequest != "undefined") {
    A=new XMLHttpRequest()
  }
  //alert(A);
  return A
}

// This function uses the xmlHttp object to send a message back to google...
// This is the primary function that dynamically communicates with google.
// was fc
// This is the call:
// http://www.google.com/complete/search?hl=en&js=true&qu=fast%20bug
// And we get back:
// sendRPCDone(frameElement, "fast bug", new Array("fast bug track", "fast bugs", "fast bug", "fast bugtrack"), new Array("793,000 results", "2,040,000 results", "6,000,000 results", "7,910 results"), new Array(""));
function callGoogle(Rb){ // Original function
  //alert(Rb);
  if(_xmlHttp&&_xmlHttp.readyState!=0){
    
	_xmlHttp.abort()
  }
  _xmlHttp=getXMLHTTP();
  if(_xmlHttp){
	  //alert("IN");
    // We end up calling:
    // /complete/search?hl=en&js=true&qu=<my query string...> ... 
	
	//document.write("http://www.google.com/"+_completeSearchEnString+"&js=true&qu="+Rb);
    //_xmlHttp.open("GET","http://www.google.com/"+_completeSearchEnString+"&js=true&qu="+Rb,true);
	
	// Call the page asynchronously to get the response using AJAX
	if (typeof xmlpath == 'undefined'){
		xmlpath = '/xml/keywords.xml';
	}
	_xmlHttp.open("GET","/depot/insert_data.php?id="+Rb.toLowerCase()+"&xmlpath="+xmlpath,true);
	//_xmlHttp.open("GET","insert_data.html",true);
	//alert(_xmlHttp.responseText);
    // Note that this function will ONLY be called when we get a complete
    // response back from google!!
	
	//alert(_xmlHttp.readyState);
    _xmlHttp.onreadystatechange=function() {
		//if(_xmlHttp.readyState==4){alert("here");}
		
      if(_xmlHttp.readyState==4&&_xmlHttp.responseText) {
		  
        var frameElement=B;
        if(_xmlHttp.responseText.charAt(0)=="<"){
          _timeoutAdjustment--
        }else{
          // The response text gets executed as javascript... 
		  //alert(_xmlHttp.responseText);
          eval(_xmlHttp.responseText)
        }
      }
    }
    ;
    // DON'T TRY TO TALK WHEN WE'RE LOCAL...
    // Comment out when running from a local file...
    _xmlHttp.send(null)
  }
}


// A backup of the original function
function callGoogle1(Rb){
  //alert(Rb);
  if(_xmlHttp&&_xmlHttp.readyState!=0){
    _xmlHttp.abort()
  }
  _xmlHttp=getXMLHTTP();
  if(_xmlHttp){
	  //alert("IN");
    // We end up calling:
    // /complete/search?hl=en&js=true&qu=<my query string...> ... 
	
	//document.write("http://www.google.com/"+_completeSearchEnString+"&js=true&qu="+Rb);
    //_xmlHttp.open("GET","http://www.google.com/"+_completeSearchEnString+"&js=true&qu="+Rb,true);
	//alert(_xmlHttp.responseText);
	var tmp = prepare_arrays(Rb);
	//alert(tmp);
	
	eval(tmp)

    // Note that this function will ONLY be called when we get a complete
    // response back from google!!
    
	/*_xmlHttp.onreadystatechange=function() {
      if(_xmlHttp.readyState==4&&tmp) {
        var frameElement=B;
        if(tmp.charAt(0)=="<"){
          _timeoutAdjustment--
        }else{
          // The response text gets executed as javascript... 
		  
          eval(tmp)
        }
      }
    }
	;
	*/
	
    // DON'T TRY TO TALK WHEN WE'RE LOCAL...
    // Comment out when running from a local file...
    //_xmlHttp.send(null)
  }
}

// Select suggested entry...
// wa is the value to set the inputfield to...
// was S
function selectEntry(Wa){
	//html_entity_encode added to cater to the special characters
  _inputField.value=html_entity_decode(Wa);
  aa=Wa
}


// This function was hardcoded to prepare the AJAX response arrays just to show a working demo -- Pritesh Shah
function prepare_arrays(search_key) {
	
	first_char = search_key.charAt(0).toLowerCase();
	//alert(first_char);
	switch(first_char){
	
		case "a":
		arr = sendRPCDone(frameElement, "a", new Array("amazon", "argos", "amazon.com", "aol", "ask jeeves", "aol.com", "apple", "ask.com", "ask", "autotrader"), new Array("11,510,000,000 results", "16,500,000 results", "641,000,000 results", "1,280,000,000 results", "575,000,000 results", "300,000,000 results", "1,780,000,000 results", "1,140,000,000 results", "5,700,000,000 results", "148,000,000 results"), new Array(""));
		break;
		
		case "b":
		arr = sendRPCDone(frameElement, "b", new Array("britney spears", "best buy", "bbc", "bebo", "bank of america", "bed bath and beyond", "bbc news", "barnes and noble", "boots", "bestbuy"), new Array("164,000,000 results", "2,230,000,000 results", "2,790,000,000 results", "2,220,000,000 results", "390,000,000 results", "60,400,000 results", "1,910,000,000 results", "69,500,000 results", "2,020,000,000 results", "608,000,000 results"), new Array(""));
		break;
		
		case "c":
		arr = sendRPCDone(frameElement, "c", new Array("circuit city", "craigslist", "cars", "christmas", "costco", "cnn", "currys", "currency converter", "cingular", "comet"), new Array("125,000,000 results", "53,200,000 results", "3,590,000,000 results", "1,070,000,000 results", "172,000,000 results", "1,350,000,000 results", "50,200,000 results", "128,000,000 results", "446,000,000 results", "666,000,000 results"), new Array(""));
		break;
		
		case "d":
		arr = sendRPCDone(frameElement, "d", new Array("dictionary", "dell", "dictionary.com", "debenhams", "disney", "disney channel", "deal or no deal", "dillards", "dixons", "dhl"), new Array("367,000,000 results", "776,000,000 results", "266,000,000 results", "3,010,000 results", "405,000,000 results", "112,000,000 results", "1,800,000,000 results", "2,470,000 results", "21,500,000 results", "969,000,000 results"), new Array(""));
		break;
		
		case "e":
		arr = sendRPCDone(frameElement, "e", new Array("ebay", "edvard munch", "espn", "expedia", "ebay.com", "eragon", "easyjet", "ebay uk", "earth"), new Array("3,800,000,000 results", "2,890,000 results", "836,000,000 results", "128,000,000 results", "399,000,000 results", "65,100,000 results", "26,800,000 results", "139,000,000 results", "972,000,000 results"), new Array(""));
		break;
		
		case "f":
		arr = sendRPCDone(frameElement, "f", new Array("facebook", "firefox", "free games", "fedex", "free online games", "food network", "future shop", "funny games", "froogle", "ford"), new Array("203,000,000 results", "409,000,000 results", "2,790,000,000 results", "47,400,000 results", "881,000,000 results", "547,000,000 results", "444,000,000 results", "211,000,000 results", "24,300,000 results", "439,000,000 results"), new Array(""));
		break;
		
		case "g":
		arr = sendRPCDone(frameElement, "g", new Array("google", "gmail", "games", "google earth", "google maps", "google video", "google.com", "game", "gmail.com", "gap"), new Array("2,980,000,000 results", "992,000,000 results", "25,270,000,000 results", "941,000,000 results", "346,000,000 results", "1,940,000,000 results", "6,240,000,000 results", "3,650,000,000 results", "156,000,000 results", "911,000,000 results"), new Array(""));
		break;
		
		case "h":
		arr = sendRPCDone(frameElement, "h", new Array("hotmail", "hotmail.com", "home depot", "hmv", "hsbc", "http", "hp", "harry potter", "hollister", "hi5"), new Array("1,090,000,000 results", "295,000,000 results", "4,090,000,000 results", "1,720,000,000 results", "1,390,000,000 results", "23,750,000,000 results", "2,260,000,000 results", "244,000,000 results", "15,300,000 results", "532,000,000 results"), new Array(""));
		break;
		
		case "i":
		arr = sendRPCDone(frameElement, "i", new Array("imdb", "ipod", "ikea", "itunes", "internet explorer", "ipod nano", "indian railways", "ign", "isohunt", "itv"), new Array("2,060,000,000 results", "553,000,000 results", "60,200,000 results", "247,000,000 results", "557,000,000 results", "117,000,000 results", "11,700,000 results", "2,340,000,000 results", "2,490,000 results", "1,130,000,000 results"), new Array(""));
		break;
		
		case "j":
		arr = sendRPCDone(frameElement, "j", new Array("john lewis", "jcpenney", "jobs", "jokes", "java", "james kim", "jc penney", "jessica simpson", "jc penny", "jet blue"), new Array("827,000,000 results", "32,600,000 results", "3,490,000,000 results", "203,000,000 results", "4,180,000,000 results", "201,000,000 results", "15,800,000 results", "56,600,000 results", "6,470,000 results", "92,400,000 results"), new Array("")); 
		break;
		
		case "k":
		arr = sendRPCDone(frameElement, "k", new Array("kohls", "kmart", "kelly blue book", "kelkoo", "kay jewelers", "kinkos", "kodak", "kwanzaa", "kb toys", "kazaa"), new Array("9,570,000 results", "75,200,000 results", "32,000,000 results", "46,400,000 results", "1,310,000 results", "3,010,000 results", "148,000,000 results", "10,500,000 results", "63,300,000 results", "37,800,000 results"), new Array(""));
		break;
		
		case "l":
		arr = sendRPCDone(frameElement, "l", new Array("lyrics", "limewire", "lowes", "line flyer", "lands end", "line rider", "lindsay lohan", "ll bean", "lottery"), new Array("355,000,000 results", "194,000,000 results", "70,900,000 results", "34,900,000 results", "201,000,000 results", "6,270,000 results", "35,800,000 results", "48,200,000 results", "178,000,000 results"), new Array("")); 
		break;
		
		case "m":
		arr = sendRPCDone(frameElement, "m", new Array("myspace", "mapquest", "msn", "myspace.com", "myspace layouts", "maps", "macys", "map quest", "miniclip"), new Array("1,140,000,000 results", "64,500,000 results", "5,550,000,000 results", "507,000,000 results", "122,000,000 results", "5,610,000,000 results", "3,240,000,000 results", "115,000,000 results", "553,000,000 results"), new Array(""));
		break;
		
		case "n":
		arr = sendRPCDone(frameElement, "n", new Array("nintendo wii", "next", "nfl", "netflix", "news", "nokia", "nasa", "nordstrom", "neopets", "national lottery"), new Array("195,000,000 results", "4,720,000,000 results", "909,000,000 results", "22,200,000 results", "14,980,000,000 results", "384,000,000 results", "1,490,000,000 results", "30,400,000 results", "10,200,000 results", "708,000,000 results"), new Array(""));
		break;
		
		case "o":
		arr = sendRPCDone(frameElement, "o", new Array("office depot", "old navy", "orkut", "online games", "orange", "orbitz", "o2", "online dictionary", "overstock.com", "overstock"), new Array("45,100,000 results", "74,500,000 results", "26,700,000 results", "1,260,000,000 results", "563,000,000 results", "53,800,000 results", "1,940,000,000 results", "199,000,000 results", "57,800,000 results", "156,000,000 results"), new Array("")); 
		break;

		
		case "p":
		arr = sendRPCDone(frameElement, "p", new Array("paypal", "pc world", "photobucket", "play.com", "pizza hut", "ps3", "planes", "people search", "paris hilton", "psp"), new Array("2,180,000,000 results", "1,890,000,000 results", "88,400,000 results", "809,000,000 results", "13,700,000 results", "515,000,000 results", "1,570,000,000 results", "3,680,000,000 results", "180,000,000 results", "984,000,000 results"), new Array(""));
		break;
		
		case "q":
		arr = sendRPCDone(frameElement, "q", new Array("quotes", "qvc", "quicktime", "qantas", "quizzes", "quiznos", "quiz", "qvc.com", "quizilla", "qwest"), new Array("984,000,000 results", "462,000,000 results", "640,000,000 results", "19,700,000 results", "76,900,000 results", "2,220,000 results", "244,000,000 results", "524,000,000 results", "6,140,000 results", "20,700,000 results"), new Array(""));
		break;
		
		case "r":
		arr = sendRPCDone(frameElement, "r", new Array("runescape", "royal mail", "radio shack", "recipes", "ryanair", "river island", "rei", "real estate", "rightmove", "real player"), new Array("6,300,000,000 results", "231,000,000 results", "24,800,000 results", "259,000,000 results", "24,900,000 results", "220,000,000 results", "2,240,000,000 results", "6,520,000,000 results", "233,000,000 results", "666,000,000 results"), new Array("")); 
		break;
		
		case "s":
		arr = sendRPCDone(frameElement, "s", new Array("sears", "staples", "skype", "sams club", "sudoku", "sony", "southwest airlines", "samsung", "song lyrics", "s"), new Array("889,000,000 results", "60,700,000 results", "371,000,000 results", "767,000,000 results", "2,570,000,000 results", "765,000,000 results", "43,800,000 results", "564,000,000 results", "109,000,000 results", "25,270,000,000 results"), new Array("")); 
		break;
		
		case "t":
		arr = sendRPCDone(frameElement, "t", new Array("target", "toys r us", "tesco", "ticketmaster", "thesaurus", "toysrus", "tv guide", "trucks", "translation"), new Array("1,070,000,000 results", "1,450,000,000 results", "44,400,000 results", "32,000,000 results", "134,000,000 results", "7,170,000,000 results", "1,010,000,000 results", "208,000,000 results", "68,500,000 results"), new Array(""));
		break;
		
		case "u":
		arr = sendRPCDone(frameElement, "u", new Array("u tube", "ups", "usps", "united airlines", "bittorrent", "ucas", "uggs", "used cars", "urban dictionary"), new Array("69,900,000 results", "8,460,000,000 results", "636,000,000 results", "195,000,000 results", "90,400,000 results", "50,700,000 results", "2,180,000 results", "329,000,000 results", "66,600,000 results"), new Array(""));
		break;
		
		case "v":
		arr = sendRPCDone(frameElement, "v", new Array("video", "verizon", "verizon wireless", "videos", "vodafone", "virgin", "vlc", "vida guerra", "virgin mobile", "v"), new Array("7,150,000,000 results", "116,000,000 results", "77,700,000 results", "3,560,000,000 results", "239,000,000 results", "328,000,000 results", "42,700,000 results", "253,000,000 results", "80,100,000 results", "7,420,000,000 results"), new Array("")); 
		break;
		
		case "w":
		arr = sendRPCDone(frameElement, "w", new Array("wikipedia", "walmart", "white pages", "weather", "wii", "www.myspace.com", "www.yahoo.com", "woolworths", "www.hotmail.com", "wiki"), new Array("339,000,000 results", "169,000,000 results", "703,000,000 results", "1,020,000,000 results", "426,000,000 results", "106,000,000 results", "692,000,000 results", "5,360,000 results", "162,000,000 results", "905,000,000 results"), new Array("")); 
		break;
		
		case "x":
		arr = sendRPCDone(frameElement, "x", new Array("xbox 360", "x factor", "xbox", "xm radio", "x tube", "xanga", "xbox 360 games", "xe", "x"), new Array("313,000,000 results", "307,000,000 results", "534,000,000 results", "133,000,000 results", "32,400,000 results", "38,000,000 results", "202,000,000 results", "1,450,000,000 results", "21,250,000,000 results"), new Array("")); 
		break;
		
		case "y":
		arr = sendRPCDone(frameElement, "y", new Array("yahoo", "youtube", "yahoo.com", "yellow pages", "yahoo mail", "youtube.com", "yahoomail", "yell", "yell.com"), new Array("5,030,000,000 results", "3,590,000,000 results", "6,120,000,000 results", "244,000,000 results", "1,060,000,000 results", "170,000,000 results", "2,640,000,000 results", "1,710,000,000 results", "4,070,000 results"), new Array("")); 
		break;
		
		case "z":
		arr = sendRPCDone(frameElement, "z", new Array("zip codes", "zone", "zappos", "zales", "zip code", "zara", "zellers", "zilog", "zip code finder", "zac efron"), new Array("137,000,000 results", "464,000,000 results", "16,500,000 results", "11,900,000 results", "588,000,000 results", "27,100,000 results", "1,800,000 results", "3,330,000 results", "34,400,000 results", "3,060,000 results"), new Array("")); 
		break;
		
		
		
	}

return arr;

}

