
 var CurrentAction = "";
 var mainLoopTrigger = false;
 var fieldValueTemporary = "";
 var temporaryAutoComplete = "";
 var iFrameName = null;
 var autoCompleteTrigger = null;
 var autoCompleteTriggerY = false;

 var emptyResponse = 'sendRPCDone(frameElement, "", new Array(), new Array(), new Array(""));';

 var _oldInputFieldValue = "";
 var _currentInputFieldValue = "";
 var _eventKeycode = "";
 var _highlightedSuggestionIndex = -1;
 var _highlightedSuggestionDiv = null;
 var _completeDivRows = -1;
 var _completeDivDivList = null;
 var _completeDivRows2 = 5;
 var _documentForm = null;
 var _inputField = null;
 var _completeDiv = null;
 var _submitButton = null;
 var _enString = null;
 var _cursorUpDownPressed = false;
 var _resultCache = new Object();

 var _lastKeyCode = -1;
 var timeoutCounter = (new Date()).getTime();
 var _XMLHTTPsupported = false;
 var xmlHttpObject = null;
 var _completeSearchEnString = null;
 var _completeSearchString = null;
 var theFrameElement = null;
 var globalInputFieldValue = null;
 var autoCompleteTriggerBa = false;
 var percentage = 60;
 var _searchString=null;
 var _timeoutAdjustment=0;

 var completionFrameName = "completionFrame";



 function SuggestInstaller (parameterForm, parameterMainField, parameterButton, accountId){

   _documentForm = parameterForm;
   _inputField = parameterMainField;
   _submitButton = parameterButton;
   _searchString = "suggest.do";

   _enString = "";
   autoCompleteTrigger = false;
   autoCompleteTriggerY = false;
   autoCompleteTriggerBa = false;
   CurrentAction = "query";
   iFrameName = "thesuggestiframe";

   if(getXMLHTTP()){ _XMLHTTPsupported = true; } else { _XMLHTTPsupported = false; };
   _completeSearchString = "./" + accountId + "/suggest/";
   _completeSearchEnString = _completeSearchString + "?hl=" + _enString;



   if(!_XMLHTTPsupported){ setCookie("qu", "", 0, _completeSearchString, null, null) };



   _inputField.autocomplete = "off";
   _currentInputFieldValue = _inputField.value;
   _oldInputFieldValue = _currentInputFieldValue;
   _inputField.onblur = onBlurHandler;

   if(_inputField.createTextRange) {
           _inputField.onkeyup = new Function("return CallEventFocusTextrange(event);");
   } else {
           _inputField.onkeyup = CallEventFocusTextrange;
   };

   window.onresize = resizeHandler;
   document.onkeydown = keyDownHandler;
   setupKeyPressDownload();
   CreateDynamicDiv ();

}



 function sendRPCDone(fr,is,cs,ds,pr){
   if(_timeoutAdjustment>0) {
     _timeoutAdjustment--;
   };
   cacheResults(is,cs,ds);
   var varCompleteDiv = fr.completeDiv;
   varCompleteDiv.completeStrings = cs;
   varCompleteDiv.displayStrings = ds;
   varCompleteDiv.prefixStrings = pr;
   displaySuggestedList(varCompleteDiv, varCompleteDiv.completeStrings, varCompleteDiv.displayStrings);
   callKeyPressHandler (varCompleteDiv, valueOfCAutoComplete);
   if(_completeDivRows2 > 0) {
     varCompleteDiv.height = 16*_completeDivRows2 + 4;
   } else {
     hideCompleteDiv();
   }
 }


 function mainLoop (){

    if(_oldInputFieldValue != _currentInputFieldValue){

     if(!mainLoopTrigger) {
       var escapedFieldValue = escapeURI( _currentInputFieldValue );
       var ma = _resultCache[_currentInputFieldValue];
       if(ma){

         timeoutCounter = -1;
         sendRPCDone(theFrameElement, _currentInputFieldValue, ma[0], ma[1], theFrameElement.completeDiv.prefixStrings)
        } else {

         _timeoutAdjustment++;
         timeoutCounter=(new Date()).getTime();

         if(_XMLHTTPsupported){
           callDataServer( escapedFieldValue )
         }else{
           setCookie("qu", escapedFieldValue, null, _completeSearchString, null, null);
           frames[ completionFrameName ].document.location.reload(true)
         }

       }
       _inputField.focus();
     }
     mainLoopTrigger = false;
   }
   _oldInputFieldValue = _currentInputFieldValue;
   setTimeout("mainLoop()", recalculateTimeout( _timeoutAdjustment ));
   return true;

 };

 setTimeout("mainLoop()",10);


 function highlightNewValue( passedParameter ){

   _currentInputFieldValue = fieldValueTemporary;
   selectEntry( fieldValueTemporary );
   temporaryAutoComplete = fieldValueTemporary;
   if(!_completeDivDivList||_completeDivRows<=0) {
     return;
   }
   showCompleteDiv();
   if(passedParameter >= _completeDivRows){ passedParameter = _completeDivRows - 1; };

   if(_highlightedSuggestionIndex!=-1 && passedParameter!=_highlightedSuggestionIndex){
     setStyleForElement(_highlightedSuggestionDiv,"aIdentity");
     _highlightedSuggestionIndex=-1;
   }
   if(passedParameter < 0){
     _highlightedSuggestionIndex = -1;
     _inputField.focus();
     return
   }
   _highlightedSuggestionIndex = passedParameter;
   _highlightedSuggestionDiv = _completeDivDivList.item ( passedParameter );
   setStyleForElement(_highlightedSuggestionDiv, "bIdentity");
   _currentInputFieldValue = fieldValueTemporary;
   temporaryAutoComplete = valueOfDAutoComplete( _highlightedSuggestionDiv );
   selectEntry(valueOfCAutoComplete( _highlightedSuggestionDiv ));
 };




 function displaySuggestedList(theCompleteDiv, stringsToDisplay, listOfResults){

   while(theCompleteDiv.childNodes.length>0) {
     theCompleteDiv.removeChild( theCompleteDiv.childNodes[0] );
   }

   for(var counter = 0; counter < stringsToDisplay.length; ++counter){
     var documentDivElement = document.createElement("DIV");
     setStyleForElement(documentDivElement, "aIdentity");
     documentDivElement.onmousedown = varMouseDown;
     documentDivElement.onmouseover = varMouseOver;
     documentDivElement.onmouseout  = varMouseOut;
     var documentSpanElement = document.createElement("SPAN");
     setStyleForElement(documentSpanElement, "lIdentity");
     var documentSpanElementTwo = document.createElement("SPAN");
     documentSpanElementTwo.innerHTML = stringsToDisplay[ counter ];

     var documentSpanElementThree = document.createElement("SPAN");
     setStyleForElement(documentSpanElementThree, "dIdentity");
     setStyleForElement(documentSpanElementTwo,"cIdentity");
     documentDivElement.displaySpan = documentSpanElementThree;
     documentSpanElementThree.innerHTML = listOfResults[ counter ];

     documentSpanElement.appendChild ( documentSpanElementTwo );
     documentDivElement.appendChild ( documentSpanElement );
     theCompleteDiv.appendChild ( documentDivElement )
   }
 }



 function selectEntry( tobeInputfieldValue ){

   _inputField.value = tobeInputfieldValue;
   globalInputFieldValue = tobeInputfieldValue;

 }

// ===============================================================
//     VISUAL ROUTINES
// ===============================================================


 function resultsWidthPercent(){
   percentage = 65;
   if(CurrentAction == "query"){
     var wb=110;
     var Sa=calculateWidth();
     var tb=(Sa-wb)/Sa*100;
     percentage = tb;
   }else{
     percentage = 65;
   }
   percentage = 99;

 }

 function setStyleForElement(c, name){
   resultsWidthPercent();
   c.className=name;

   switch(name){
     case "mIdentity":
       c.style.fontSize="11px";
       c.style.fontFamily="arial,sans-serif";
       c.style.wordWrap="break-word";
       break;
     case "lIdentity":
       c.style.display="block";
       c.style.paddingLeft = c.style.paddingRight = "3";
       //c.style.paddingRight="3";
       c.style.height="16px";
       c.style.overflow="hidden";
       break;
     case "aIdentity":
       c.style.backgroundColor="white";
       c.style.color="black";
       if(c.displaySpan){
         c.displaySpan.style.color="green"
       }
       break;
     case "bIdentity":
       c.style.backgroundColor="#3366cc";
       c.style.color="white";
       if(c.displaySpan){
         c.displaySpan.style.color="white"
       }
       break;
     case "cIdentity":
       c.style.width = percentage + "%";
       c.style.cssFloat="left";
       break;
     case "dIdentity":
       c.style.cssFloat="right";
       c.style.width = 100 - percentage + "%";
       if(CurrentAction == "query"){
         c.style.fontSize="10px";
         c.style.textAlign="right";
         c.style.color="green";
         c.style.paddingTop="3px"
       }else{
         c.style.color="#696969"
       }
       break
   }
 }


 function setInputFieldSize(){
   tmp = 0.73*(document.body.scrollWidth-220);
   _inputField.size = Math.floor(tmp/6.18)
 }


 function calculateOffsetLeft(r){
   return OffsetSetter (r,"offsetLeft");
 }


 function calculateOffsetTop(r){
   return OffsetSetter (r,"offsetTop");
 }


 function OffsetSetter (r,attr){
   var kb=0;
   while(r){
     kb+=r[attr];
     r=r.offsetParent;
   }
   return kb
 }


 function hideCompleteDiv(){
   document.getElementById("completeDiv").style.visibility="hidden";
 }


 function showCompleteDiv(){
   document.getElementById("completeDiv").style.visibility="visible";
   setCompleteDivSize();
 }


 function setCompleteDivSize(){
   if(_completeDiv){
     _completeDiv.style.left = calculateOffsetLeft(_inputField) + "px";
     _completeDiv.style.top = calculateOffsetTop(_inputField) + _inputField.offsetHeight - 1 + "px";
     _completeDiv.style.width = calculateWidth() + "px";
   }
 }

 function calculateWidth(){
   if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1){
     return _inputField.offsetWidth-2;
   }else{
     return _inputField.offsetWidth;
   }
 }


// ===============================================================
//     BROWSER ROUTINES
// ===============================================================



 function CreateDynamicDiv () {

        _completeDiv = document.createElement("DIV");
        _completeDiv.id = "completeDiv";
        _completeDiv.style.borderBottom = _completeDiv.style.borderTop = _completeDiv.style.borderRight = _completeDiv.style.borderLeft = "black 1px solid";
        _completeDiv.style.zIndex = "1";
        _completeDiv.style.paddingBottom = _completeDiv.style.paddingTop = _completeDiv.style.paddingLeft = _completeDiv.style.paddingRight = "0";
        _completeDiv.style.visibility = "hidden";
        _completeDiv.style.position = "absolute";
        _completeDiv.style.backgroundColor = "white";
        setCompleteDivSize();
        document.body.appendChild(_completeDiv);
        resultsWidthPercent();
        setStyleForElement(_completeDiv, "mIdentity");
        cacheResults("",new Array(),new Array());

        divElement = document.createElement("DIV");
        divElement.style.visibility = "hidden";
        divElement.style.position = "absolute";
        divElement.style.top = divElement.style.left = "-10000";
        divElement.style.height = divElement.style.width = "0";
        iFrameElement = document.createElement("IFRAME");
        iFrameElement.completeDiv = _completeDiv;
        iFrameElement.id = iFrameElement.name = completionFrameName;
        // iFrameElement.src = _completeSearchEnString;
        //iFrameElement.src = emptyResponse;
        divElement.appendChild( iFrameElement );

        //alert("1 " + _completeSearchEnString);

        document.body.appendChild(divElement);

        //alert("2 " + _completeSearchEnString);

        if(frames&&(frames[ completionFrameName ]&&frames[ completionFrameName ].frameElement)) {
          theFrameElement = frames[ completionFrameName ].frameElement;
          //alert("3 " + _completeSearchEnString);
        } else {
          theFrameElement = document.getElementById( completionFrameName );
            //alert("3.5 " + _completeSearchEnString);
        }

        //alert("4 " + _completeSearchEnString);

        if(CurrentAction == "url") setInputFieldSize();

 }


 function resizeHandler(){
   if(CurrentAction == "url"){ setInputFieldSize() }
   setCompleteDivSize();
 }


 function cacheResults(isCounter, cs, ds){
   _resultCache[isCounter] = new Array(cs,ds);
 }


 function findSpanValueForClass(i, parameterClassName){
   var spanList = i.getElementsByTagName( "span" );
   if( spanList ){
     for(var f=0; f < spanList.length; ++f){
       if(spanList[f].className == parameterClassName){
         var value = spanList[f].innerHTML;
         if(value=="&nbsp;") {
           return"";
         } else{
           var z = stripCRFromString(value);
           return z;
         }
       }
     }
   }else{
     return"";
   }
 }


 function setCookie(name,value,Ra,hb,fb,Sb){
   document.cookie = name+"="+value+(Ra?";expires="+Ra.toGMTString():"")+(hb?";path="+hb:"")+(fb?";domain="+fb:"")+(Sb?";secure":"");
 }


// ===============================================================
//     EVENT ROUTINES
// ===============================================================

 function blurThenGetFocus(){
   _cursorUpDownPressed = true;
   _inputField.blur();
   setTimeout("_inputField.focus();", 10);
   return;
 }

 function setupKeyPressDownload(){
   if(document.createEventObject) {
     var eventObject = document.createEventObject();
     eventObject.ctrlKey = true;
     eventObject.keyCode = 70;
     document.fireEvent("onkeydown", eventObject);
   }
 }


 function keyDownHandler(event){
   if(!event&&window.event) { event = window.event; };
   if(event) { _lastKeyCode = event.keyCode; };
 }


 function onBlurHandler(event){
   if(!event&&window.event) {
     event=window.event;
   }
   if(!_cursorUpDownPressed){
     hideCompleteDiv();
     if(_lastKeyCode==9){
       _lastKeyCode = -1;
     }
   }
   _cursorUpDownPressed=false;
 }


 function CallEventFocusTextrange ( parameterEvent ){
   _eventKeycode = parameterEvent.keyCode;
   globalInputFieldValue = _inputField.value;
   focusTextRange();
 };


 function recalculateTimeout( Mb ){
   var H=100;
   for(var o=1; o<=(Mb-2)/2; o++){
     H = H*2;
   }
   H = H+50;
   return H;
 }


 function varMouseDown (){
   selectEntry ( valueOfCAutoComplete(this) );
   temporaryAutoComplete = valueOfDAutoComplete(this);
   mainLoopTrigger = true;
   FieldSubmitHandler();

 };


 function varMouseOver(){
   if(_highlightedSuggestionDiv) {
     setStyleForElement(_highlightedSuggestionDiv,"aIdentity");
   }
   setStyleForElement(this,"bIdentity");
 };


 function varMouseOut(){
   setStyleForElement(this,"aIdentity");
 };


 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
 };



 function callKeyPressHandler (localCompleteDiv, ib){

   var localInputField = _inputField;
   var T = false;
   _highlightedSuggestionIndex = -1;
   var J = localCompleteDiv.getElementsByTagName( "div" );
   var O = J.length;
   _completeDivRows = O;
   _completeDivDivList = J;
   _completeDivRows2 = O;
   fieldValueTemporary = _currentInputFieldValue;
   if(_currentInputFieldValue==""||O==0){
     hideCompleteDiv();
   }else{
     showCompleteDiv();
   }

   var Ab="";
   if( _currentInputFieldValue.length > 0 ) {
     var f;
     var o;
     for(var f=0; f < O; f++){
       for(o=0; o < localCompleteDiv.prefixStrings.length; o++){
         var Ib = localCompleteDiv.prefixStrings[o]+_currentInputFieldValue;
         if(autoCompleteTriggerY||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),"aIdentity");
   }
   if(T){
     _highlightedSuggestionDiv = J.item(_highlightedSuggestionIndex);
     temporaryAutoComplete = valueOfDAutoComplete(_highlightedSuggestionDiv)
   }else{
     temporaryAutoComplete = _currentInputFieldValue;
     _highlightedSuggestionIndex = -1;
     _highlightedSuggestionDiv = null;
   }
   var ab = false;
   switch(_eventKeycode){
     case 8:
     case 33:
     case 34:
     case 35:
     case 35:
     case 36:
     case 37:
     case 39:
     case 45:
     case 46:
       ab=true;
       break;
     default:
       break
   }

   if(!ab&&_highlightedSuggestionDiv){
     setStyleForElement(_highlightedSuggestionDiv, "bIdentity");
     var z;
     if(T) {
       z=ib(_highlightedSuggestionDiv).substr( localCompleteDiv.prefixStrings[o].length );
     } else {
       z = _currentInputFieldValue;
     }
     if(z!=localInputField.value){
       if(localInputField.value != _currentInputFieldValue) {
         return;
       }
       if(autoCompleteTrigger){
         if(localInputField.createTextRange||localInputField.setSelectionRange) {
           selectEntry( z );
         }
         if(localInputField.createTextRange){
           var t = localInputField.createTextRange();
           t.moveStart("character", _currentInputFieldValue.length);
           t.select()
         }else if(localInputField.setSelectionRange){
           localInputField.setSelectionRange( _currentInputFieldValue.length, localInputField.value.length )
         }
       }
     }
   }else{
     _highlightedSuggestionIndex = -1;
     temporaryAutoComplete = _currentInputFieldValue;
   }
 }


// ===============================================================
//     AUTOCOMPLETE, STRINGS AND TEXT RANGES
// ===============================================================



 function stripCRFromString( parameterString ){
   for(var f = 0, newString = "", zb = "\n\r"; f < parameterString.length; f++) {
     if (zb.indexOf(parameterString.charAt(f)) == -1) {
       newString += parameterString.charAt(f);
     } else {
       newString += " ";
     }
   }
 return newString;
 };



 function valueOfCAutoComplete( parameter ){
   if(!parameter) {
     return null;
   }
   return findSpanValueForClass(parameter, "cIdentity");
 }



 function valueOfDAutoComplete(i){
   return findSpanValueForClass(i,"dIdentity");
 }


 function focusTextRange(){

   if(_eventKeycode==40||_eventKeycode==38) {
     blurThenGetFocus();
   }
   var varSelectionRangeDuplicator = SelectionRangeDuplicator ( _inputField );
   var varSelectionRangeCreator = SelectionRangeCreator ( _inputField );
   var varFieldValue = _inputField.value;
   if(autoCompleteTrigger && _eventKeycode!=0){
     if(SelectionRangeDuplicator>0&&varSelectionRangeCreator!=-1) {
       varFieldValue = varFieldValue.substring(0, varSelectionRangeCreator);
     }
     if(_eventKeycode==13||_eventKeycode==3){
       var varFieldObject = _inputField;
       if(varFieldObject.createTextRange){
         var varTextRange = varFieldObject.createTextRange();
         varTextRange.moveStart("character", varFieldObject.value.length);
         varTextRange.select();
       } else if (varFieldObject.setSelectionRange){
         varFieldObject.setSelectionRange(varFieldObject.value.length, varFieldObject.value.length);
       }
     } else {
       if(_inputField.value != varFieldValue) {
         selectEntry( varFieldValue )
       }
     }
   }
   _currentInputFieldValue = varFieldValue;
   if(handleCursorUpDownEnter(_eventKeycode)&&_eventKeycode!=0) {

     callKeyPressHandler (_completeDiv, valueOfCAutoComplete);

   }
 }

function InputFieldSetter (e){
   if( autoCompleteTriggerBa ){
     var Ta = _inputField.value;
     if(Ta != globalInputFieldValue){
       _eventKeycode = 0;
       focusTextRange();
     }
     globalInputFieldValue = Ta;
     setTimeout("InputFieldSetter()", 10)
   }
 };
 setTimeout("InputFieldSetter()", 10);


 function escapeURI(La){
   if(encodeURIComponent) {
     return encodeURIComponent(La);
   }
   if(escape) {
     return escape(La)
   }
 }


  function FieldSubmitHandler(){
    return DivSubmitToTextField( CurrentAction );
  }


  function DivSubmitToTextField(eb) {
    mainLoopTrigger = true;
    if(!_XMLHTTPsupported){
      setCookie("qu", "" , 0, _completeSearchString, null, null);
    }

    hideCompleteDiv();

    return false;
   
  }




 function SelectionRangeDuplicator (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 SelectionRangeCreator (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
 }


 // ===============================================================
 //     HTTP AND DATA HANDLING
 // ===============================================================

  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;
  }



  function callDataServer(Rb){

    // alert( "&js=true&qu=" + Rb);  

    if(xmlHttpObject && xmlHttpObject.readyState!=0){
      xmlHttpObject.abort();
    }

    xmlHttpObject = getXMLHTTP();

    if(xmlHttpObject){

      //window.open(_completeSearchEnString+"&js=true&qu=" + Rb, "new");
      // alert( "&js=true&qu=" + Rb);

      if (Rb.length > 0) {

      xmlHttpObject.open("GET",_completeSearchEnString+"&js=true&qu=" + Rb,true);

      xmlHttpObject.onreadystatechange = function() {
        if(xmlHttpObject.readyState==4 && xmlHttpObject.responseText) {
          var frameElement = theFrameElement;
          if(xmlHttpObject.responseText.charAt(0)=="<"){
            _timeoutAdjustment--
          }else{
            eval(xmlHttpObject.responseText);
          }
        }
      };

      xmlHttpObject.send(null);
    } else {
         eval(emptyResponse);
      }
     }
  }


 // ===============================================================
 //     EXTERNAL HTML FUNCTIONS
 // ===============================================================


 function FieldClick() {

   mainLoopTrigger = false;
   varCompleteDiv2 = document.getElementById('completeDiv');
   while(varCompleteDiv2.childNodes.length > 0) {
        varCompleteDiv2.removeChild( varCompleteDiv2.childNodes[0] );
   };

 }

 function FieldFocus (name_of_field) {

    active_field = eval(name_of_field);
    _inputField = active_field;
    if (_completeDiv != null && _completeDiv.style.visibility == 'hidden') {
        _inputField.value = '';
    }
    document.getElementById('completeDiv').style.top = calculateOffsetTop(_inputField) + 20;

 }

 function SubmitHandler () {

     return false;

 }

 function SuggestClick() {

    parent.location = "./artist/" + document.forma.searchfield.value; 

 }

 function AddSuggestField (parameterField) {

      _inputField = parameterField;
      _inputField.autocomplete = "off";
      _inputField.onblur=onBlurHandler;
      if(_inputField.createTextRange) {
        _inputField.onkeyup = new Function("return CallEventFocusTextrange(event);");
      } else {
        _inputField.onkeyup = CallEventFocusTextrange;
      }
      //_inputField.onsubmit = FieldSubmitHandler;
      _currentInputFieldValue = _inputField.value;
      parameterEnSearchString = "en";
      _enString = escapeURI( parameterEnSearchString );

 }
