var NODE_TYPE_ELEMENT = 1;
var AjaxOpenSearch = Class.create();

AjaxOpenSearch.prototype = 
{	
  initialize: function()
  {
    resetSearch();
    Event.observe($('search'), 'submit', this.submit.bindAsEventListener(this), false);
  },
  
  submit: function(event) 
  {  
    Event.stop(event);    
    if( $('query').value == ''){ return };        
     $('find').disabled = true;  
     $('start').value = '0';    
    if( $('wait') ) { Element.show($('wait')) };    
    this.doAjax();
  },
  
  doSubmit: function()
  {
    $('find').disabled = true;      
    if( $('wait') ) { Element.show($('wait')) };    
    this.doAjax();
  },
  
  doAjax: function() 
  {      
    var parameterQueryMap = 
    {
      hitsPerPage : $F('resultsPerPage'),
      hitsPerSite : 0,
      start : $F('start'),
      query : $F('query'),
      lang : 'en'
    };
    //alert( $F('openSearchURL') + " " + $H(parameterQueryMap).toQueryString());
          
    new Ajax.Request( $F('openSearchURL'), 
    {
      method: 'get', 
      parameters: $H(parameterQueryMap).toQueryString(),
      onComplete: this.onResponse
    });
  },
      
  onResponse: function(response) 
  {      
    //alert(response.responseText);
    var oNode = response.responseXML.documentElement;
    var HTML_CODE = '';

    if (oNode.hasChildNodes()) 
    {
      Element.show( $('result-summary') );  
      Element.show( $('result-set') );        
    
      try
      {
        var totalResults = getTextValue( getElementsByLocalName(oNode,"opensearch","totalResults")[0] ); 
        var startIndex   = getTextValue( getElementsByLocalName(oNode,"opensearch","startIndex")[0] );
        var itemsPerPage = getTextValue( getElementsByLocalName(oNode,"opensearch","itemsPerPage")[0] );              
        var currentPage  = Math.floor(startIndex / itemsPerPage) + 1
        var totalPages   = Math.ceil( totalResults / itemsPerPage );        

        $('total-results').innerHTML = totalResults;
        if($('items-per-page')) $('items-per-page').innerHTML = itemsPerPage;
        if($('page') && totalPages > 0) $('page').innerHTML = currentPage + "/" + totalPages;        
        
        if(totalPages > 1)
        {       
            var pageNumsToShow = 10;
            var startPageNum = 1;                        
            var endPageNum = pageNumsToShow; 

            if( currentPage >= pageNumsToShow)
            {
                startPageNum = currentPage - Math.floor(pageNumsToShow/2);
                endPageNum = currentPage + Math.floor(pageNumsToShow/2);
            }                        
                        
            if(endPageNum > totalPages)
            {
                endPageNum = totalPages;
                startPageNum = endPageNum - pageNumsToShow +1;                                
            }
            
            if(startPageNum < 1)
            {
                startPageNum = 1;
            }          
            $('page-number-links').innerHTML = generatePageNumLinksHTML(startPageNum,endPageNum,itemsPerPage,currentPage,$F('query'));
            
            if( currentPage > 1 )
            {
              Element.show( $('previous-page-link') );
               var prevHref = "javascript:submit(\'" + $F('query') + "\',\'" + (currentPage - 2)*itemsPerPage + "\')";
               $('previous-page-link').href = prevHref;
            }
            else
            {
              Element.hide( $('previous-page-link') );
            }

            if( currentPage < totalPages )
            {
               Element.show( $('next-page-link') );
               var nextHref = "javascript:submit(\'" + $F('query') + "\',\'" + currentPage*itemsPerPage + "\')";
               $('next-page-link').href = nextHref;
            }           
            else
            {
              Element.hide( $('next-page-link') );
            }
        }
        else
        {
            if( $('page-number-links') ) {
            	$('page-number-links').innerHTML = ""
            }
            Element.hide( $('previous-page-link') );
            Element.hide( $('next-page-link') );
        }        
      }
      catch(e)
      {
        alert(e);
      }
            
      var items = oNode.getElementsByTagName("item");
      var length = items.length;
         
         for (var i=0; i < length; i++)
         {              
            var item = items[i];

            if( item.nodeType == NODE_TYPE_ELEMENT)
            {
                var title = getTextValue( item.getElementsByTagName("title")[0].firstChild );
                var description = getTextValue( item.getElementsByTagName("description")[0] );
                var link = getTextValue( item.getElementsByTagName("link")[0].firstChild );
                
                HTML_CODE += '<b>' + title + '</b><br>';
                HTML_CODE += description + '<br>';
                HTML_CODE += '<a href=\"' + link + '\">' + link + '</a><br>';
                HTML_CODE += "<hr>";
            }
         }
    }
     $('find').disabled = false;
    if( $('wait') ) { Element.hide($('wait')) };
    $('result-set').innerHTML = HTML_CODE;
  }    
};


function getTextValue(elem)
{
  /**
   *  gecko: textContent
   *  ie: text
   *  safari: .nodeValue of first child
   */
  if (document.implementation && document.implementation.createDocument) 
  {
    var result = elem.textContent;

    //safari hack
    if (typeof(result) == "undefined") 
    { 
      result = elem.firstChild; 
      return (result ? result.nodeValue : "");
    }
    return result;
  } 
  else if (window.ActiveXObject) 
  {
    return elem.text;
  } 
  else 
  {
    alert("Ooops - no XML parser available");
    return false;
  }
};

function getElementsByLocalName(elem,ns,tagName) 
{
  var result = [];
  var elems = elem;
  if (!(elems instanceof Array)) 
  { 
    elems = [elem]; 
  }
  
  try
  {    
    for (var i=0;i<elems.length;i++) 
    {
      var all = elems[i].getElementsByTagName("*");

      for (var j=0; j < all.length; j++) 
      {
        if (all[j].localName == tagName || all[j].baseName == tagName) 
        { 
          result.push(all[j]); 
        }
      }
    }
  }
  catch(e)
  {
    //ie hack
    results = oNode.getElementsByTagName(ns + ":" + tagName);
  }
  return result;
};

function generatePageNumLinksHTML(startPageNum,endPageNum,itemsPerPage,currentPage,query)
{
    var html = "";
    for (var i = startPageNum; i <= endPageNum; i++)
    {
      var numLink = "";
      if(i == currentPage)
      {
        numLink += "<span style=\"currenPage\">" + i + "</span>";
      }
      else
      {
        numLink += "<a href=\"javascript:submit(\'" + query + "\',\'" + (i-1)*itemsPerPage + "\')\">" + i + "</a>";
      }
      html += numLink + " &nbsp; ";
    }  
    return html;
};

function submit(word,start) 
{  
  $('start').value = start;
  $('query').value = word;
  AjaxOpenSearch.prototype.doSubmit();
};

function resetSearch()
{
  $('query').focus();
  $('query').value = '';
  $('start').value = '0';
  $('resultsPerPage').value = '100';
  $('find').disabled = false;      
  Element.hide( $('previous-page-link') );     
  Element.hide( $('next-page-link') );  
  Element.hide( $('result-set') );  
  Element.hide( $('result-summary') );
  Element.hide( $('wait') );
};


Event.observe(window, 'load', function() 
{
  new AjaxOpenSearch();
}, false );


function initAndSubmit()
{
  //alert(window.location.search);
  if( window.location.search ) {
    var page = new Query(window.location.search);
    var q = page.getValue('textquery');
    if(q){
      $('start').value = 0;
      $('resultsPerPage').value = '100';    
      $('query').value = unescape(q.replace(/\+/g," "));     
      AjaxOpenSearch.prototype.doSubmit();  
    }
  }
}

