var def_company = "V1.1";

var resultDivId    = "results";
var resultIframe   = "resultsIfr";
var resultLinkRoot = "result";

var handleFunction;
var searchElement  = "";
var filterElement  = "";
var idElement      = "";
var dataUrl        = "";
var itemName       = "";
var addUrl         = "";
var popUpTitle     = "";
var helpTextKey    = "";
var extraFunction  = "";
var viewFunction   = "";
var viewText       = "";

var itemCount    =  0;
var selectedItem = -2;
var maxResults   = 20;

var searchElements = new Array();

function predict( ev )
{
  if( typeof( ev ) == "undefined" )
  {
    ev = event;
  }

  var elem = ev.target;

  if( typeof( elem ) == "undefined" )
  {
    elem = ev.srcElement;
  }

  searchElement  = searchElements[elem.id][0];
  idElement      = searchElements[elem.id][1];
  dataUrl        = searchElements[elem.id][2];
  itemName       = searchElements[elem.id][3];
  extraFunction  = searchElements[elem.id].length>9 ? searchElements[elem.id][9] : "";
  viewFunction   = searchElements[elem.id].length>10 ? searchElements[elem.id][10] : "";
  viewText       = searchElements[elem.id].length>11 ? searchElements[elem.id][11] : "";

  if( searchElements[elem.id].length > 4 )
  {
    addUrl = searchElements[elem.id][4];
  }
  else
  {
    addUrl = "";
  }

  if( searchElements[elem.id].length > 5 )
  {
    filterElement = searchElements[elem.id][5];

    getElt( filterElement ).onchange = doSearch;
  }
  else
  {
    filterElement = "";
  }

  if( searchElements[elem.id].length > 6 && searchElements[elem.id][6] != "" )
  {
    handleFunction = searchElements[elem.id][6];
  }
  else
  {
    handleFunction = handleSearch;
  }

  if( searchElements[elem.id].length > 7 )
  {
    popUpTitle = searchElements[elem.id][7];
  }
  else
  {
    popUpTitle = "";
  }

  if( searchElements[elem.id].length > 8 && typeof( def_helpText ) != "undefined" )
  {
    helpTextKey = searchElements[elem.id][8];
  }
  else
  {
    helpTextKey = "";
  }

  if( getElt( idElement ) != null )
  {
    getElt( idElement ).value = "";
    showNotFound();
  }
  if ( extraFunction != "" && typeof(eval(extraFunction))=="function" )
  {
    eval(extraFunction+"(\"\",\"\")");
  }

  if( elem.value.length > 2 )
  {
    doSearch();
  }
  else
  {
    getResultDiv().innerHTML = "";
    hideResults();
  }

  return true;
}

function doSearch()
{
  if( searchElement != "" )
  {
    var searchElem = getElt( searchElement );
    var filterElem = getElt( filterElement );

    showSearching();

    callRemote( dataUrl + "?searchTerm=" + escape( escape( searchElem.value ) ) + "&maxResults=" + maxResults + "&filterTerm=" + escape( escape( ( ( filterElem != null ) ? getElemValue( filterElem ) : "" ) ) ), handleFunction );
  }
}

function handleSearch( data )
{
  var parser = new DOMImplementation();

  var domDocument    = parser.loadXML( data );
  var domRootElement = domDocument.getDocumentElement();

  var results = domRootElement.getChildNodes();

  var resultHtml = "";

  for( var i = 0 ; results.length < maxResults && i < results.length ; i++ )
  {
    var viewlink = "";
    if ( viewFunction!="" && viewText!="" )
    {
      viewlink = '<a class="view" href="#" onclick="'+viewFunction+'(\''+ results.item(i).getAttribute("id")+'\',\''+getItemValue( results.item( i ) )+'\');return false">'+viewText+'</a>';
    }
    resultHtml += viewlink;
    resultHtml += '<a id="' + resultLinkRoot + i + '" onclick="return clickon(this)" href="' + results.item( i ).getAttribute( "id" ) + '">' + getItemValue( results.item( i ) ) + '</a>';
  }

  if( results.length == 0 )									// No results
  {
    resultHtml += '<div class="message">No Results Found</div>';
  }
  else if( results.length > maxResults )							// Too many results
  {
    var item = results.item( results.length - 1 );

    if( item.getAttribute( "id" ) == "-999" )
    {
      resultHtml += '<div class="message">' + getItemValue( item ) + '</div>'
    }
  }
  else if( popUpTitle != "" )									// Do we display a title?
  {
    resultHtml = '<div class="message">'+ popUpTitle + '</div>' + resultHtml;
  }

  if( helpTextKey != "" )
  {
    resultHtml += '<div class="message"><a href="#" onclick="return openHelp(\''+ helpTextKey + '\',event)">What is This?</a></div>';
  }

  if( addUrl != "" )
  {
    resultHtml += '<a href="#" onclick="return addItem()">Add New ' + itemName + '</a>';
  }

  if( resultHtml == "" )
  {
    hideResults();
    itemCount = 0;
  }
  else
  {
    getResultDiv().innerHTML = resultHtml;
    itemCount = results.length;
    selectedItem = -2;
    showResults();
  }

  hideSearching();
}

function showNotFound()
{
  var searchElt = getElt( searchElement );

  if( searchElt.className.indexOf( "notFound " ) < 0 )
  {
    searchElt.className = "notFound " + searchElt.className;
  }
}

function hideNotFound()
{
  var searchElt = getElt( searchElement );

  if( searchElt.className.indexOf( "notFound " ) == 0 )
  {
    searchElt.className = searchElt.className.substring( 9 );
  }
}

function showSearching()
{
  var searchElem = getElt( searchElement );

  if( searchElem.className.indexOf( "searching" ) < 0 )
  {
    searchElem.className = "searching " + searchElem.className;
  }
}

function hideSearching()
{
  var searchElem = getElt( searchElement );

  if( searchElem.className.indexOf( "searching" ) == 0 )
  {
    searchElem.className = searchElem.className.substring( 10 );
  }
}

function addItem()
{
  var elem = getElt( searchElement );

  if( confirm( "Are you sure you wish to add '" + elem.value + "' as a new " + itemName ) )
  {
    callRemote( addUrl + "?newItemName=" + escape( escape( elem.value ) ), handleAdd );
  }

  return false;
}

function handleAdd( data )
{
  var parser = new DOMImplementation();

  var domDocument    = parser.loadXML( data );
  var domRootElement = domDocument.getDocumentElement();

  var results = domRootElement.getChildNodes();

  if( getElt( idElement ) != null )
  {
    getElt( idElement ).value = results.item( 0 ).getAttribute( "id" );
  }

  getElt( searchElement ).value = getItemValue( results.item( 0 ) );

  if ( extraFunction != "" && typeof(eval(extraFunction))=="function" )
  {
    eval(extraFunction+"('"+results.item( 0 ).getAttribute( "id" )+"','"+getItemValue( results.item( 0 ) ) + "')");
  }

  hideResults();
}

function getResultDiv()
{
  var resultDiv = getElt( resultDivId );

  if( !resultDiv )
  {
    resultDiv = document.createElement( "div" );

    resultDiv.setAttribute( "id", resultDivId );

    document.body.appendChild( resultDiv );
  }

  var resultIfr = getElt( resultIframe );

  if( document.all && !resultIfr )
  {
    resultIfr = document.createElement( "iframe" );

    resultIfr.setAttribute( "id",          resultIframe );
    resultIfr.setAttribute( "src",         "/blank.html" );
    resultIfr.setAttribute( "frameBorder", "0" );
    resultIfr.setAttribute( "scrolling",   "no" );

    resultIfr.style.display = "none";
    resultIfr.style.filter  = "alpha(Opacity=0)";
    resultIfr.style.zIndex  = 4;

    document.body.appendChild( resultIfr );
  }

  return resultDiv;
}

function showResults()
{
  var resultDiv = getResultDiv();

  resultDiv.style.top        = getlayertop(  searchElement ) + getlayerheight( searchElement );
  resultDiv.style.left       = getlayerleft( searchElement );
  resultDiv.style.visibility = "visible";

  if( document.all )
  {
    var resultIfr = getElt( resultIframe );

    resultIfr.style.width   = resultDiv.clientWidth + 4;
    resultIfr.style.height  = resultDiv.clientHeight + 4;
    resultIfr.style.top     = resultDiv.style.top;
    resultIfr.style.left    = resultDiv.style.left;
    resultIfr.style.display = "";
  }

  if( selectedItem == -2 )
  {
    selectedItem = -1;
  }
}

function hideResults()
{
  getResultDiv().style.visibility = "hidden";

  if( document.all )
  {
    getElt( resultIframe ).style.display = "none";
  }

  if( selectedItem != -3 )
  {
    selectedItem = -2;
  }
}

function choose( keyCode )
{
  if( selectedItem == -2 ) return false;

  var item = getElt( resultLinkRoot + selectedItem );

  if( keyCode == 13 )
  {
    if( item == null ) return true;

    getElt( searchElement ).value = item.innerHTML;

    if( getElt( idElement ) != null )
    {
      getElt( idElement ).value = getItemId( item.href );
    }

    if( getElt( filterElement ) != null )
    {
      setFilterElement( item.innerHTML );
    }

    if ( extraFunction != "" && typeof(eval(extraFunction))=="function" )
    {
      eval(extraFunction+"('"+getItemId( item.href )+"','"+item.innerHTML + "')");
    }

    selectedItem = -3;

    hideResults();
    hideNotFound();

    return true;
  }

  if( item != null )
  {
    item.className = "";
  }

  if( keyCode == 38 ) selectedItem -=1;
  if( keyCode == 40 ) selectedItem +=1;

  if( selectedItem < -1 ) selectedItem = -1;
  if( selectedItem >= itemCount ) selectedItem = itemCount - 1;

  item = getElt( resultLinkRoot + selectedItem );

  if( item != null )
  {
    item.className = "on";
  }

  return false;
}

function clickon( anchor )
{
  getElt( searchElement ).value = anchor.innerHTML;

  if( getElt( idElement ) != null )
  {
    getElt( idElement ).value = getItemId( anchor.href );
  }

  if( getElt( filterElement ) != null )
  {
    setFilterElement( anchor.innerHTML );
  }

  if ( extraFunction != "" && typeof(eval(extraFunction))=="function" )
  {
    eval(extraFunction+"('"+ getItemId( anchor.href ) +"','"+ anchor.innerHTML.replace("'","\\'") + "')");
  }


  hideResults();
  hideNotFound();

  return false;
}

function setFilterElement( itemText )
{
  var openPos  = itemText.indexOf( "(" );
  var closePos = itemText.indexOf( ")" );

  if( openPos != -1 && closePos != -1 )
  {
    var filterText = itemText.substring( openPos + 1, closePos );

    setElemValue( getElt( filterElement ), filterText );

    getElt( searchElement ).value = itemText.substring( 0, openPos - 1 );
  }
}

function getItemId( hrefString )
{
  return hrefString.substring( hrefString.lastIndexOf( "/" ) + 1, hrefString.length );
}

function checkSubmit()
{
  var submit = ( selectedItem == -2 );

  if( selectedItem == -3 )
  {
    selectedItem = -2;
  }

  if( submit && ajaxSearch_oldsubmit != null && typeof( ajaxSearch_oldsubmit ) != "undefined" )
  {
    submit = ajaxSearch_oldsubmit();
  }

  return submit;
}

function ajaxSearchSetup()
{
  var id;
  var element;

  for( id in searchElements )
  {
    ajaxSearchAppend( id )
    //element = getElt( id );
    //
    //if( typeof( element ) != "undefined" && element != null )
    //{
    //  element.onkeyup       = predict;
    //  element.autocomplete  = "off";
//  //    element.onblur        = hideResults;
    //
    //  if( ajaxSearch_oldsubmit == null )
    //  {
    //    ajaxSearch_oldsubmit = element.form.onsubmit;
    //  }
    //
    //  element.form.onsubmit = checkSubmit;
    //}
  }

  if( typeof( ajaxSearch_oldload ) != "undefined" && ajaxSearch_oldload != null )
  {
    ajaxSearch_oldload();
    ajaxSearch_oldload == null;
  }
}
function ajaxSearchAppend( id )
{
  var element = getElt( id );

  if( typeof( element ) != "undefined" && element != null )
  {
    element.onkeyup       = predict;
    element.autocomplete  = "off";
//    element.onblur        = hideResults;

    if( ajaxSearch_oldsubmit == null )
    {
      ajaxSearch_oldsubmit = element.form.onsubmit;
    }

    element.form.onsubmit = checkSubmit;
  }
}

var ajaxSearch_oldload = window.onload;
window.onload = ajaxSearchSetup;
var ajaxSearch_oldsubmit = null;
