var activeSearchKeys = new Array();
var activeSearchObjs = new Array();

function Search(cgiURL, queryField, searchInfos, resultList, searchingHint, nothingFoundHint, searchErrorHint)
{
   var key = queryField + "/" + searchInfos + "/" + resultList + "/" + searchingHint + "/" + nothingFoundHint + "/" + searchErrorHint + "/" + cgiURL;
   for(var i = 0; i < activeSearchKeys.length; i++)
   {
      if(activeSearchKeys[i] == key)
      {
         return activeSearchObjs[i];
      }
   }

   var newSearch = new Web20Search(cgiURL,
                                   queryField,
                                   searchInfos,
                                   resultList,
                                   searchingHint,
                                   nothingFoundHint,
                                   searchErrorHint);

   activeSearchKeys.push(key);
   activeSearchObjs.push(newSearch);

   return newSearch;
}

function Web20Search(cgiURL,
                     queryField,
                     searchInfos,
                     resultList,
                     searchingHint,
                     nothingFoundHint,
                     searchErrorHint)
{
   var mHTTPRequest = false;
   var mOldQueryString = "";

   var mCGIURL = cgiURL;
   var mQueryFieldId = queryField;
   var mSearchInfosId = searchInfos;
   var mResultListId = resultList;
   var mSearchingHintId = searchingHint;
   var mNothingFoundHintId = nothingFoundHint;
   var mSearchErrorHintId = searchErrorHint;

   var mQueryField = null;
   var mSearchInfosField = null;
   var mResultList = null;
   var mSearchingHint = null;
   var mNothingFoundHint = null;
   var mSearchErrorHint = null;

   this.refreshSearch = function()
   {
      if(!mQueryField)
         mQueryField = document.getElementById(mQueryFieldId);
      if(!mSearchInfosField)
         mSearchInfosField = document.getElementById(mSearchInfosId);
      if(!mResultList)
         mResultList = document.getElementById(mResultListId);
      if(!mSearchingHint)
         mSearchingHint = document.getElementById(mSearchingHintId);
      if(!mNothingFoundHint)
         mNothingFoundHint = document.getElementById(mNothingFoundHintId);
      if(!mSearchErrorHint)
         mSearchErrorHint = document.getElementById(mSearchErrorHintId);


      var newQueryString = mQueryField.value;
      if(newQueryString == "")
      {
         mSearchInfosField.style.display = "none";
         mResultList.style.display = "none";
         mSearchingHint.style.display = "none";
         mNothingFoundHint.style.display = "none";
         mSearchErrorHint.style.display = "none";
      }
      else if(newQueryString != mOldQueryString)
      {
         mSearchInfosField.style.display = "block";
         mResultList.style.display = "none";
         mSearchingHint.style.display = "block";
         mNothingFoundHint.style.display = "none";
         mSearchErrorHint.style.display = "none";

         sendRequest(encodeURIComponent(newQueryString));
      }
      mOldQueryString = newQueryString;
   }

   function sendRequest(queryString)
   {
      mHTTPRequest = false;   // Cancel old request
      if(window.XMLHttpRequest)  // Mozilla, Safari, ...
      {
         mHTTPRequest = new XMLHttpRequest();
         if(mHTTPRequest.overrideMimeType)
         {
            mHTTPRequest.overrideMimeType('text/xml; charset=UTF-8');
         }
      }
      else if(window.ActiveXObject) // IE
      {
         try
         {
            mHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP");
         }
         catch(e)
         {
            try
            {
               mHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
            }
         }
      }

      if(!mHTTPRequest)
      {
         mResultList.style.display = "none";
         mSearchingHint.style.display = "none";
         mNothingFoundHint.style.display = "none";
         mSearchErrorHint.style.display = "block";

         return false;
      }

      mHTTPRequest.onreadystatechange = handleResponse;
      mHTTPRequest.open('GET', mCGIURL + queryString, true);
      mHTTPRequest.setRequestHeader("Content-Transfer-Encoding", "UTF-8");
      mHTTPRequest.send(null);
   }

   function handleResponse()
   {
      if(mHTTPRequest.readyState == 4)
      {
         if(mHTTPRequest.status == 200)
         {
            var xmldoc = mHTTPRequest.responseXML;
            var results = xmldoc.getElementsByTagName('results')[0].getElementsByTagName('result');

            if (results.length) {
               var titles = new Array(results.length);
               var urls   = new Array(results.length);
               for(var i = 0; i < results.length; i++)
               {
                  titles[i] = results[i].getElementsByTagName('title')[0].firstChild.nodeValue;
                  urls[i]   = results[i].getElementsByTagName('url')[0].firstChild.nodeValue;
               }

               // Build result list
               while (mResultList.childNodes.length > 0)
               {
                  mResultList.removeChild(mResultList.firstChild);
               }

               if (titles != null)
               {
                  for (i = 0; i < titles.length; i++)
                  {
                     var option = document.createElement("li");

                     var link   = document.createElement("a");
                     var linkText = document.createTextNode(titles[i]);

                     link.setAttribute("href", urls[i], false);
                     link.appendChild(linkText);

                     option.appendChild(link);

                     mResultList.appendChild(option);
                  }
               }

               // Display result list
               mResultList.style.display = "block";
               mSearchingHint.style.display = "none";
               mNothingFoundHint.style.display = "none";
               mSearchErrorHint.style.display = "none";
            } else {
               mResultList.style.display = "none";
               mSearchingHint.style.display = "none";
               mNothingFoundHint.style.display = "block";
               mSearchErrorHint.style.display = "none";
            }
         }
         else
         {
            mResultList.style.display = "none";
            mSearchingHint.style.display = "none";
            mNothingFoundHint.style.display = "none";
            mSearchErrorHint.style.display = "block";
         }
      }
   }
}

