

Search = {
	
//PROPERTIES---------------------------------------------------------------------------
	
	//Used for onix search
	_SEARCHSTR: '/secondary/onix/onixsearch.js?open&query=',
	_COUNT_SEARCHSTR: '/secondary/onix/countsearch.js?open&query=',
	
	
//METHODS-----------------------------------------------------------------------------------------------------------------------------------------------------------------	
 	
	loadAjaxSearchCount: function()
    {           
        var oXHR = DH.createXHR();
        oXHR.open('GET',(this._COUNT_SEARCHSTR + this.query + '+and+[Form]=Product'),false);
        oXHR.send(null);  
		
		//If request error
		if(!(oXHR.readyState == 4 && (oXHR.status == 200 || oXHR.status == 304))) return false;
        
		var searchElementsStr = oXHR.responseText;
        
        //Check wheter request was successfull
        try{
            eval(searchElementsStr);
        } catch(oError) {
            throw new Error('Search.loadAjaxSearchCount() error on eval(searchElementsStr) Serries.load()');
        }
		 
        //If search results exist
        if(typeof searchElements != 'undefined' && typeof searchElements == 'number')
        { 
           this.searchElements = parseInt(searchElements);
		   if(Secondary._LOG_ENABLED)LOG.printH1('Search.loadAjaxSearchCount() - returned ' + this.searchElements + ' as a count');
        } else {
            throw new Error("Search.loadAjaxSearchCount() 'searchElements' is undefined");
        }
    },
	
	getSearchStr: function()
	{
		
	},
	
	loadAjax: function()
    {  
		if(typeof this.searchElements == 'undefined')return false;
		
        var oXHR = DH.createXHR();
        oXHR.open('GET',this._SEARCHSTR + this.query + '+and+[Form]=Product&start=' + this.start + '&count=' + this.count,false);
        oXHR.send(null);  
		
		//If request error
		if(!(oXHR.readyState == 4 && (oXHR.status == 200 || oXHR.status == 304))) return false;
        
		var viewResultsStr = oXHR.responseText;
        
        //Check wheter request was successfull
        try{
            eval(viewResultsStr);
        } catch(oError) {
            throw new Error('Search.loadAjax() error on eval(viewResultsStr) Serries.load()');
        }
        
        //If search results exist
        if(typeof searchOnixResults != 'undefined' && searchOnixResults instanceof Array && searchOnixResults.length > 0)
        {                
            this.searchIndex = new Array();
            for(var i = 1; i < searchOnixResults.length; i++)
            {
                if(typeof searchOnixResults[i] != 'undefined' && this.isResultValid(i))
                {
                    this.searchIndex.push(searchOnixResults[i]);                  
                }
            }
			
			
			if(this.searchIndex.length > 0)
			{
				this.loaded = true;	
			}
			
            if(Secondary._LOG_ENABLED)LOG.printH1('Search.loadAjax() - returned ' + this.searchIndex.length + ' results');
            
            //If there are no valid results
            if(this.searchIndex.length == 0)
            {
                return false;
                //If log enabled display message
                if(Secondary._LOG_ENABLED)LOG.printH1('Search.loadAjax() did not return any valid results');
            } else {
                return true;
            } 
        } else {
            throw new Error("Search.loadAjax() 'searchOnixResults' is undefined");
        }
    },
	
	//Function which validates a 'viewResults' entry
    isResultValid: function(x)
    {
        //1 - docID
        //2 - Distinctive Title
        //3 - Edition Statement
        //4 - Lead Author
        //5 - Publication Date
        //6 - ISBN
        //7 - Price
        //8 - Publisher Name
        //9 - Imprint or Binding
        //10 - Summary (Abstract if it exists otherwise first 300 chars of Main Description)
        //11 - parentID
        //12 - BIC Main Subject Code
        //13 - Subject
        //14 - Area
        //15 - Series
        
        //Variable used to detect invalid properties
        var valid = true;
        
        //Array to store invalid properties
        var tempArray = new Array();
        
        //check isbn
		var oRe = /\s|\D/gi;
        if(typeof searchOnixResults[x].viewCol6 != 'string' || searchOnixResults[x].viewCol6.length != 13 || oRe.test(decodeURIComponent(searchOnixResults[x].viewCol6)))
        {
            valid = false;
            tempArray.push('isbn' + decodeURIComponent(searchOnixResults[x].viewCol6.toString()));
        }
        
        //check title
        if(typeof searchOnixResults[x].viewCol2 != 'string' || searchOnixResults[x].viewCol2.length == 0)
        {
            valid = false;
            tempArray.push('title');
        }
        
        //check isbn
        if(typeof searchOnixResults[x].viewCol15 != 'string' || searchOnixResults[x].viewCol15.length == 0)
        {
            valid = false;
            tempArray.push('series');
        }
        
        //if there are invalid entries and log is enabled
        if(valid == false && Secondary._LOG_ENABLED)LOG.printH1('searchOnixResults[' + x + '] invalid ' + tempArray.join(', '));
        
        return valid;
    },
	
	attachResults: function()
	{
		if(typeof attachResultsCount == 'undefined')attachResultsCount = 0;
		
		//Get reference to holder element
		var oHolder = document.getElementById('index2');
		if(!oHolder)
		{
			//If exceeded the number of determined iterations
			if(attachResultsCount > 10)
			{
				throw new Error('Search.attachResults() exceeded its limit of iterations');
			}
			//Try again in 100 miliseconds
			attachResultsCount++;
			setTimeout('Search.attachResults()',100);
			return;
		}
		
		this.attachResultsHeader(oHolder);	
		
		this.attachPageNav(oHolder);
		
		if(!this.loaded)return;
		
		//var arrayLength = ((this.count + this.start) < this.searchElements) ? (this.count + this.start) : this.searchElements;
		
		for(var i = 0; i < this.searchIndex.length; i = i + 3)
		{
			var start = i;
			var count = i + 3;
			if(this.searchIndex.length < count) count = this.searchIndex.length;
			
			//Create ul to hold row for series items
			var ul = document.createElement('ul');
			var ulClass = new Array();
			ulClass.push('second');
			ul.className = ulClass.join(' ');
				
			//Loop through items and attach series items
			for(var x = start; x < count; x++)
			{
				//Crate list item
				var li = document.createElement('li');
					
				var item = new OnixItem('series',this.searchIndex[x]);
					
				item.attachSeriesIndex1Item(li);
					
				ul.appendChild(li);
			}	
				
			oHolder.appendChild(ul);
		}
		
		this.attachPageNav(oHolder);
	},
	
	attachResultsHeader: function(parent)
	{
		var div = DH.createDiv('','searchResultsHeader');
		
		var oh2 = document.createElement('h2');
		oh2.appendChild(document.createTextNode('Search results'));
		div.appendChild(oh2);	
		
		var start = this.start;
		var count = this.start + (this.searchIndex.length - 1);
		if(this.loaded)
		{
			var str = 'Viewing results ' + start + ' to ' + count + ' of ' + this.searchElements + ' from the catalogue:';
		} else {
			var str = 'There are no results.';	
		}
		var p = DH.createP(str);
		div.appendChild(p);
		
		parent.appendChild(div);
	},
	
	attachPageNav: function(oHolder)
	{
	    if(!this.pageNav)
	    {
	        this.pageNav = new PagesNav('libraries/Search?open&query=' + this.query,this.start,this.count,this.searchElements);
	    }
	    this.pageNav.attach(oHolder);   
	},
	
	
	init: function()
	{
		//Get search parameters
		this.start = (DH.getURLParam('start')) ? parseInt(decodeURIComponent(DH.getURLParam('start'))) : 1;
		this.count = (DH.getURLParam('count')) ? parseInt(decodeURIComponent(DH.getURLParam('count'))) : 20;
		this.query = (DH.getURLParam('query')) ? decodeURIComponent(DH.getURLParam('query')) : '';
		
		this.loadAjaxSearchCount();		
		this.loadAjax();
	}
}