var NODE_TYPE_ELEMENT = 1;
var AjaxOpenSearch = Class.create();
var OPENSEARCH_SERVICE_URL = 'http://www.fincent.fi/fincent/fincent-search/opensearch';

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'
    };
			  
		new Ajax.Request(OPENSEARCH_SERVICE_URL, 
		{
			method: 'get', 
			parameters: $H(parameterQueryMap).toQueryString(),
			onComplete: this.onResponse
		});
	},
			
	onResponse: function(response) 
	{	
	  var oNode = response.responseXML.documentElement;
    var HTML_CODE = '';
    //alert(response.responseText);
    	  
    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
        {
            $('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 = '5';	
  Element.hide( $('previous-page-link') ); 		
	Element.hide( $('next-page-link') );	
  Element.hide( $('result-set') );	
  Element.hide( $('result-summary') );	
};

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


