All pastes #515980 Raw Edit

Mine

public javascript v1 · immutable
#515980 ·published 2007-05-28 13:35 UTC
rendered paste body
// Copyright 2004 and onwards Google Inc.//// uncompressed / commented / renamed by Chris... //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 Lbvar _spanTag="span"; // Was Bbvar _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 buttonInstallAC=function(frm,fld,sb,pn,rl,hd,sm,ufn){  _documentForm=frm;  _inputField=fld;  _submitButton=sb;  if(!pn) {    pn="search";  }  _searchString=pn;  var Kb="en|";  var Jb="zh-CN|zh-TW|ja|ko|vi|";  if(!rl||Kb.indexOf(rl+"|")==-1) {    rl="en";  }  _enString=escapeURI(rl);  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;  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(){  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 Pbfunction keyDownHandler(event){  if(!event&&window.event) {    event=window.event;  }  if(event) {    _lastKeyCode=event.keyCode;  }  // We are backspacing here...  if(event&&event.keyCode==8){    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(){  if(getXMLHTTP()){    _hasXMLHTTP=true  }else{    _hasXMLHTTP=false  }  // pa init'd to false at the top of this file...  if(pa) {    _completeSearchString="complete";  } else {    _completeSearchString="/complete/"+_searchString;  }  _completeSearchEnString=_completeSearchString+"?hl="+_enString;  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 {    _inputField.onkeyup=okuh;  }  _inputField.onsubmit=Fa;  _currentInputFieldValue=_inputField.value;  _oldInputFieldValue=_currentInputFieldValue;  _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";  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;  } else {    B=document.getElementById("completionFrame");  }  if(w=="url"){    setInputFieldSize();    setCompleteDivSize()  }  window.onresize=resizeHandler;  document.onkeydown=keyDownHandler;  setupKeydown1()}// Was Obfunction 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(){  _submitButton.focus()}// Was sfi..setInputFieldFocus=function(){  _inputField.focus()};// strip CR from string...// was Wbfunction 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 Qafunction 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 Ufunction valueOfCAutoComplete(i){  if(!i) {    return null;  }  return findSpanValueForClass(i,"cAutoComplete")}// Return null if i undefined...// otherwise return value of span dAutoComplete...// was wafunction valueOfDAutoComplete(i){  if(!i) {    return null;  }  return findSpanValueForClass(i,"dAutoComplete")}// Was Ffunction hideCompleteDiv(){  document.getElementById("completeDiv").style.visibility="hidden"}// Was cbfunction showCompleteDiv(){  document.getElementById("completeDiv").style.visibility="visible";  setCompleteDivSize()}// This is a result caching mechanism...// was Mafunction 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,b.displayStrings);  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;  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(){  return xb(w)}function xb(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){          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 Nafunction 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) {          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 obfunction 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 Hafunction 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 lfunction 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":      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 rbfunction displaySuggestedList(i,cs,Hb){  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){    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=cs[f]; // the text for the suggested result...    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 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()  }  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){  if(_xmlHttp&&_xmlHttp.readyState!=0){    _xmlHttp.abort()  }  _xmlHttp=getXMLHTTP();  if(_xmlHttp){    // We end up calling:    // /complete/search?hl=en&js=true&qu=<my query string...> ...     _xmlHttp.open("GET",_completeSearchEnString+"&js=true&qu="+Rb,true);    // Note that this function will ONLY be called when we get a complete    // response back from google!!    _xmlHttp.onreadystatechange=function() {      if(_xmlHttp.readyState==4&&_xmlHttp.responseText) {        var frameElement=B;        if(_xmlHttp.responseText.charAt(0)=="<"){          _timeoutAdjustment--        }else{          // The response text gets executed as javascript...           eval(_xmlHttp.responseText)        }      }    }    ;    // 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 Sfunction selectEntry(Wa){  _inputField.value=Wa;  aa=Wa}