/**
 * Prototypes for Search part
 */

//Prototype for search request
	var searchRequest = function(query){

	//Constructor
		this.query			= query;
		this.language		= 'en';
		this.region			= 'uk';
		this.searchEngine	= 'YahooBoss';
		this.strictLang		= '';
		this.page			= 1;
		this.resultsOnPage	= 10;
		this.searchUrl;
		this.maximumResults	= 1000;

	//Abstract methods
		this.onRequestReceived = new Function();

	//Public methods

		//Prepare query to searchWebService as xml string
		this.prepareQuery = function(){
			var sendQuery = this.query;

			if (sendQuery.length > 0) {
				sendQuery = sendQuery.replace(/&/g, '&amp;');
				sendQuery = sendQuery.replace(/</g, '&lt;');
				sendQuery = sendQuery.replace(/>/g, '&gt;');
				sendQuery = sendQuery.replace(/\\/g, '\\\\');
			};
			if (this.page>100) {
				this.page=100;
			};
			var start = (this.page-1)*this.resultsOnPage;
			var xmlQuery 	= '<?xml version="1.0"?>'
							+ '<searchQuery>'
							+ '<query>'+sendQuery+'</query>'
							+ '<language>'+this.language+'</language>'
							+ '<region>'+this.region+'</region>'
							+ '<searchEngine>'+this.searchEngine+'</searchEngine>'
							+ '<count>'+this.resultsOnPage+'</count>'
							+ '<start>'+start+'</start>'
							+ '<strictlang>'+this.strictLang+'</strictlang>'
							+ '</searchQuery>';
			return xmlQuery;
		};

		//Send query to searchWebService via HTTP/POST
		this.sendQuery = function() {
			var searchString = this.prepareQuery();
			$.post(this.searchUrl, {query: searchString}, this.onRequestReceived, 'text');
		};

		//Import from xml string
		this.importFromXml = function(xml) {
			this.query			= $('query', xml).text();
			this.language		= $('language', xml).text();
			this.searchEngine	= $('searchEngine', xml).text();
			this.resultsOnPage	= new Number( $('count', xml).text() );
			var start = new Number($('start', xml).text());
			this.page			= Math.round(start/this.resultsOnPage)+1;
			if (this.page>100) {
				this.page = 100;
			};
		};
	};

//Prototype for search response
	var searchResponse = function(xml){

	//Constructor
		var totalHits		= $('totalHits', xml).text();
		if (totalHits>this.maximumResults) {
			totalHits = this.maximumResults;
		};
		this.totalHits 		= totalHits;
		this.time			= $('time', xml).text();

		this.searchQuery	= new searchRequest();
		this.searchQuery.importFromXml( $('searchQuery', xml) );

		this.resultsList	= new Array();
		var resultsList 	= this.resultsList;

		var results			= $('responseResults', xml);
		var i=0;
		$('result', results).each(function() {
			resultsList[i] = new Object();

			resultsList[i].abstract		= $('abstract', this).text().replace(/&amp;/g, '&');

			resultsList[i].clickUrl		= $('clickUrl', this).text();
			resultsList[i].realUrl		= $('realUrl', this).text();
			resultsList[i].date			= $('date', this).text();
			resultsList[i].cachedUrl	= $('cachedUrl', this).text();
			resultsList[i].size			= $('size', this).text();
			resultsList[i].title		= $('title', this).text().replace(/&amp;/g, '&');
			resultsList[i].url			= $('url', this).text();
			resultsList[i].idDoc		= $('idDoc', this).text();
			i++;
		});
	};

//Prototype for search container
	var searchContainer = function(responseObject) {

	//Constructor
		this.responseObject	= responseObject;
		this.pagesCount		= Math.round( responseObject.totalHits/responseObject.searchQuery.resultsOnPage );
		if (this.pagesCount>100) {
			this.pagesCount = 100;
		};
		this.firstResult	= (responseObject.searchQuery.page-1)*responseObject.searchQuery.resultsOnPage+1;
		this.lastResult		= (responseObject.searchQuery.page)*responseObject.searchQuery.resultsOnPage;
		this.totalHits		= number_format( responseObject.totalHits, 0, '.', ',' );
		this.time			= number_format( responseObject.time, 2, '.', '' );

		if (this.lastResult>responseObject.totalHits) {
			this.lastResult = responseObject.totalHits;
		};

	//Public methods

		//Return result by id
		this.getResult = function (id) {
			for (var i = 0; i < this.responseObject.resultsList.length; i++) {
				var resultLine = this.responseObject.resultsList[i];
				if (resultLine.idDoc==id) {
					return resultLine;
				};
			};
		};

		//Prepare search header
		this.prepareSearchHeaderHtml = function (){
			var resultsForFound = $('#resultsForFound').val();
			var ofAbout = $('#ofAbout').val();
			var seconds = $('#seconds').val();
			
			var searchHeader	= '<strong>'+resultsForFound+'</strong> '+this.firstResult+'-'+this.lastResult
								+' '+ofAbout+' <span>'+this.totalHits+'</span> ('+this.time+' '+seconds+')';
			return searchHeader;
		};

		//Prepare search results
		this.prepareSearchResultsHtml = function(){

			var searchResultsHtml = '';

			for (var i=0; i<this.responseObject.resultsList.length; i++) {
				var resultLine = this.responseObject.resultsList[i];
				var resultTitle = resultLine.title;
				resultTitle = resultTitle.replace(/<b>/g, '');
				resultTitle = resultTitle.replace(/<\/b>/g, '');

				searchResultsHtml += '<div class="resultLine">';

				//searchResultsHtml += '<div style="width: 16px; height: 16px; float: left;"><img src="favicons/?faviconUrl='+resultLine.realUrl+'" alt="" /></div>';
				searchResultsHtml += '<div style="width: 16px; height: 16px; float: left;"><img src="favicons/html/img/default_favicon.png" alt="" /></div>';

				searchResultsHtml += '<div id="resultTitle" style="margin-left: 23px; padding-left: 0px">';

				searchResultsHtml += '<a href="'+resultLine.clickUrl+'" id="title'+resultLine.idDoc+'" title="'+resultTitle+'" class="resultTitle" target="_blank">';
				searchResultsHtml += resultLine.title;
				searchResultsHtml += '</a>';
				searchResultsHtml += '</div>';

				searchResultsHtml += '<div class="resultAbstract" id="abstract'+resultLine.idDoc+'">';
				searchResultsHtml += resultLine.abstract;
				searchResultsHtml += '</div>';

				searchResultsHtml += '<div class="resultInfo">';
				searchResultsHtml += '<span class="resultLink">'+resultLine.url+'</span> ';

				var size = new Number(resultLine.size);
				size = Math.round(size/1024);
				if (size>0){
					searchResultsHtml += '<span class="resultSize"> - '+size+'k </span>';
				}
				
				if (resultLine.cachedUrl.length>0) {
					searchResultsHtml += '<span class="resultSize"> - </span>';
					searchResultsHtml += '<a href="' + resultLine.cachedUrl + '" class="resultCached" target="_blank">Cached</a>';
				};

				searchResultsHtml += '</div>';

				searchResultsHtml += '</div>';
			};
			return searchResultsHtml;
		};

		//Prepare pagest control
		this.preparePagesControlHtml = function(page, visiblePages) {
			
			page = new Number(page);
			
			if (page>100) {
				page=100;
			}
			var pagesBar = '';
			var offset = 0;
			if (page>=visiblePages/2) {
				offset = page - Math.round(visiblePages/2);
			};
			if (offset+visiblePages>this.pagesCount) {
				offset = this.pagesCount-visiblePages;
			};

			for (var i=offset+1; i<offset+visiblePages+1; i++) {
				if (i > 0) {
					if (i == page) {
						pagesBar += '<span class="selectedPageLink">' + i + '</span> ';
					}
					else {
						pagesBar += '<a href="javascript:startSearch(' + i + ')" class="pageLink">' + i + '</a> ';
					};
				};
			};

			if (this.pagesCount==0) {
				pagesBar += '<span class="selectedPageLink">1</span> ';
			};

			//Check left ...
			if (offset>0) {
				pagesBar = '<span class="dots">...</span> ' + pagesBar;
			};

			//Check left arrow
			if (page>1) {
				pagesBar = '<a href="javascript:startSearch(' + (page-1) + ')" class="pageLink">←</a> '+pagesBar;
			}
			else {
				pagesBar = '<span class="arrowPage">←</span> '+pagesBar;
			};

			//Check right ...
			if (offset + visiblePages < this.pagesCount) {
				pagesBar += '<span class="dots">...</span> ';
			};

			//Check right arrow
			if (page<this.pagesCount) {
				pagesBar += '<a href="javascript:startSearch(' + (page+1) + ')" class="pageLink">→</a> ';
			}
			else {
				pagesBar += '<span class="arrowPage">→</span> ';
			};
			return pagesBar;
		};

		//Prepare pagest control
		this.prepareTopPagesControlHtml = function(page){

			var prevNumber = new Number(page) - 1;
			var nextNumber = new Number(page) + 1;

			var backBar = '<img src="images/pointer_left_gray.gif" alt="Prev" />';
			if (page>1) {
				var backBar = '<img src="images/pointer_left.gif" alt="Prev" />';
				backBar = '<a href="javascript:startSearch('+prevNumber+')" class="white" title="Show previous page">'+backBar+'</a>';

				shortcut.add("Ctrl+left",function() {
					startSearch(prevNumber);
				},{
					'disable_in_input':true
				});

			};

			var nextBar = '<img src="images/pointer_right_gray.gif" alt="Next" />';
			if (page < this.pagesCount) {
				var nextBar = '<img src="images/pointer_right.gif" alt="Next" />';
				nextBar = '<a href="javascript:startSearch('+nextNumber+')" class="white" title="Show next page">'+nextBar+'</a>';

				shortcut.add("Ctrl+right",function() {
					startSearch(nextNumber);
				},{
					'disable_in_input':true
				});
			};

			var middleBar = ' ';

			return backBar+middleBar+nextBar;
		};
	};