var NODE_TYPE_ELEMENT = 1;

jQuery(document).ready(function() {
    resetSearch();
    jQuery('#search').submit( function() {
        if( jQuery('#query').val() == '' ){ 
            return; 
        };
        search();
        return false;
    });
    initAndSubmit();
});            


function doSubmit()
{
    search();
}

function searchPage(query,start) 
{  
  jQuery('#start').val( start );
  jQuery('#query').val( query );
  search();
};


function search()
{   
    if( jQuery.trim( jQuery('#query').val() ).length < 1 ) {
    	return false;
    }

    jQuery('#find').attr("disabled", true); 
    if( jQuery('#wait') ) { 
        jQuery('#wait').show(); 
    }
    
    var paramMap = 
    {
      rows : jQuery('#resultsPerPage').val(),
      start : jQuery('#start').val(),
      q : jQuery('#query').val(),
      version: '2.2',
      wt: 'xslt',
      tr: 'opensearch.xsl',
      fl: 'id,url,title'
    };
    
    //alert( jQuery('#openSearchURL').val() + " " +  jQuery.param(paramMap) );
    
    jQuery.ajax( {
      type: "GET",
      cache: false,
      url: jQuery('#openSearchURL').val(),
      data: jQuery.param(paramMap),
      success: function(response) {
        onReponse(  response );
      }
    }); 
}

function onReponse(xmlDocument)
{  
    var oNode = xmlDocument.documentElement;
    //alert( oNode );    
    var HTML_CODE = '';

    if (oNode.hasChildNodes()) {
      jQuery('#result-summary').show();  
      jQuery('#result-set').show();        
    
      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 );        

        jQuery('#total-results').html( totalResults );
        if( jQuery('#items-per-page')) jQuery('#items-per-page').html( itemsPerPage );
        if( jQuery('#page') && totalPages > 0) jQuery('#page').html( 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;
            }          
            jQuery('#page-number-links').html( generatePageNumLinksHTML(startPageNum,endPageNum,itemsPerPage,currentPage,jQuery('#query').val() ) );
            
            if( currentPage > 1 ) {
               jQuery('#previous-page-link').show();
               var prevHref = "javascript:searchPage(\'" + jQuery('#query').val() + "\',\'" + (currentPage - 2)*itemsPerPage + "\')";
               jQuery('#previous-page-link').attr('href',prevHref);
            }
            else {
               jQuery('#previous-page-link').hide();
            }

            if( currentPage < totalPages ) {
               jQuery('#next-page-link').show();
               var nextHref = "javascript:searchPage(\'" + jQuery('#query').val() + "\',\'" + currentPage*itemsPerPage + "\')";
               jQuery('#next-page-link').attr('href',nextHref);
            }           
            else {
              jQuery('#next-page-link').hide();
            }
        }
        else {
            if( jQuery('#page-number-links') ) {
            	jQuery('#page-number-links').html("")
            }
            jQuery('#previous-page-link').hide();
            jQuery('#next-page-link').hide();
        }        
      }
      catch(e) {
        alert(e);
      }
      var items = oNode.getElementsByTagName("item");
      var length = items.length;
      //alert("4");
         
      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>";
        }
      }
    }
    jQuery('#find').attr("disabled", false); 
    if( jQuery('wait') ) { jQuery('#wait').hide() };
    jQuery('#result-set ').html( HTML_CODE );
  }    
    
function resetSearch() 
{
  jQuery('#query').focus();
  jQuery('#query').val('');
  jQuery('#start').val('0');
  jQuery('#resultsPerPage').value = '5';  
  jQuery('#find').attr("disabled", false);
  jQuery('#previous-page-link').hide();
  jQuery('#next-page-link').hide(); 
  jQuery('#result-set').hide();
  jQuery('#result-summary').hide();
  jQuery('#wait').hide();
}

function initAndSubmit()
{
  if( window.location.search ) {
    var page = new Query(window.location.search);
    var q = page.getValue('textquery');
    if(q) {
      jQuery('#start').val(0);
      jQuery('#resultsPerPage').val('5');    
      jQuery('#query').val(unescape( q.replace(/\+/g," ") ) );     
      doSubmit();  
    }
  }
}

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

function getTextValue(elem)
{
    //alert(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++) {
          //alert( all[j].localName + "==" + tagName + " or " + all[j].baseName + "==" + tagName );
        if (all[j].localName == tagName || all[j].baseName == tagName) { 
          result.push(all[j]); 
        }
      }
    }
  }
  catch(e) {
    //ie hack'
    results = oNode.getElementsByTagName(ns + ":" + tagName);
  }
  return result;
};

