/**
 * @author Alain Duchesneau (aduchesneau à terrainmarketing point com)
 */
var Search = new Class({
	
	Implements: [Events, Options],

	options: {
		label: null,
		restrict: null,
		idButton: null,
		idInput:null
	},
	
	inputField: null,
	inputDefaultLabel: null,
	submitBtn:  null,
	showingResult: false,
	search: null,
	resultList: null,
	nav: null,

	initialize: function(options){
		this.setOptions(options);
		this.initInterface();
		this.initGoogleSearch();
		
		this.initResults();
	},
	
	initGoogleSearch: function () {
		this.search = new google.search.WebSearch();
		if (this.options.label) this.search.setUserDefinedLabel(this.options.label);
		if (this.options.restrict) this.search.setSiteRestriction(this.options.restrict);
		if (this.options.size) this.search.setResultSetSize(this.options.size)
		this.search.setNoHtmlGeneration();
		if (this.search.disableAds) this.search.disableAds();
		this.search.setSearchCompleteCallback(this, this.onComplete);
	},
	
	initInterface: function () {
		$('closeBtn').addEvent('click', function(){
			this.showingResult = false;
			this.resultList.clear();
			this.resultList.hide();
			this.inputField.select();
		}.bind(this));
		this.submitBtn = $(this.options.idButton);
		if (this.submitBtn) {
			this.submitBtn.addEvents({
				'submit': this.onSubmit.bind(this),
				'mousedown': this.onSubmit.bind(this),
				'mouseover': hideMenu // global hideMenu
			});
		}
		this.inputField = $(this.options.idInput);
		if (this.inputField) {
			this.inputDefaultLabel = this.inputField.value;
			this.inputField.addEvents({
				'focus': function(e){
					if (interfaceActive) {
						if (e.target.value == this.inputDefaultLabel) 
							e.target.value = '';
						else 
							e.target.select();
						e.target.setStyle('width', 155);
						if (Browser.Engine.trident) 
							$('pageSearchInputDiv').setStyle('width', 233);
						e.stopPropagation();
					}
				}.bind(this),
				'blur': function(evt){
					if (interfaceActive) {
						(function(){
							if (!this.showingResult) {
								if (evt.target.value.length == 0) 
									evt.target.value = this.inputDefaultLabel;
								evt.target.setStyle('width', 60);
								if (Browser.Engine.trident) 
									$('pageSearchInputDiv').setStyle('width', 133);
							}
						}.bind(this)).delay(100);
					}
				}.bind(this),
				'keypress': function(evt){
					switch (evt.key){
						case 'enter':
							this.onSubmit();
							evt.target.blur();
							break;
						case 'esc':
							this.showingResult = false;
							this.resultList.clear();
							this.resultList.hide();
							this.inputField.select();
							break;
					}
					if (evt.key == 'enter') {
					}
				}.bind(this),
				'mouseover': hideMenu
			});
		}
	},
	
	initResults: function () {
		this.resultList = new Search.Results();
	},
	
	onSubmit: function (evt) {
		if (this.inputField.value.length > 0 && this.inputField.value != this.inputDefaultLabel) {
			this.resultList.clear();
			this.resultList.show();
			this.showingResult = true;
			this.search.execute(this.inputField.value);
		}
	},
	
	onComplete: function () {
		this.resultList.fill(this.search.results);
		
		if (this.nav) $('searchPagination').empty();
		this.nav = new Search.Nav(this.search, this.search.cursor);
		this.nav.draw($('searchPagination'));

		this.inputField.select();
	},
	
	trace: function (obj) {
		if (window.console) {
			console.log(obj);
		}
	}
});

Search.Results = new Class({
	Implements: [Events],

	container: null,
	list: null,
	defaultNoResult: '',
	visib: false,

	initialize: function(){
		this.container = $('pageSearchResults');
		this.list = $('searchResults');
		this.defaultNoResult = this.list.getElement('dd').get('html');
		this.clear();
	},
	
	clear: function () {
		this.list.empty();
	},
	
	show: function () {
		if (!this.visib) {
			this.container.addClass('showed');
			this.visib = true;
		}
	},

	hide: function () {
		this.container.removeClass('showed');
		this.visib = false;
	},

	fill: function(results){
		this.show();
		this.clear();

		for (var i = 0, l = results.length; i < l; i++){
			this.parseResult(results[i]);
		}

		if (results.length == 0){
			var empty = new Element('dt', {'class': 'result-item', html:this.defaultNoResult});
			this.list.adopt(empty);
		}
	},

	parseResult: function(result){
		var dt = new Element('dt', {'class': 'result-item'});
		var title = new Element('a', {'class': 'result-title', html: result.title, href: result.unescapedUrl});
		if (result.unescapedUrl.substring(result.unescapedUrl.length - 4) == ".pdf") {
			title.addClass("pdfIcon");
		}
		dt.adopt(title);
		this.list.adopt(dt);
		var dd = new Element('dd', {'class': 'result-content', html: result.content});
		this.list.adopt(dd);
	}

});

Search.Nav = new Class({
	Implements: [Events, Options],

	options: {
		injectWhere: "inside"
	},

	cursor:null,
	nav:null,
	info:null,
	search:null,
	lbl_page: 'Page ',
	lbl_of: ' of ',
	lbl_res_found: ' total',
	lbl_google: 'More results…',
	

	toElement: function(){
		return this.container;
	},

	initialize: function(search, cursor, options){
		this.search = search;
		this.cursor = cursor;
		this.setOptions(options);
		if (langue == 'fr') {
			this.lbl_of = ' de ';
			this.lbl_google = 'Plus de résultats…';
		}

		this.prepare();
	},

	prepare:function() {
		if (this.cursor) {
			this.info = new Element('p').set('text', this.lbl_page + (this.cursor.currentPageIndex + 1) + this.lbl_of + this.cursor.pages.length + "  |  " + this.cursor.estimatedResultCount + this.lbl_res_found);
			
			// Previous
			this.nav = new Element('ul');
			if (this.cursor.currentPageIndex > 0) {
				var li = new Element('li').inject(this.nav);
				var a = new Element('a', {
					'title': (this.cursor.currentPageIndex - 1),
					'href': 'javascript://'
				}).set('text', "<").inject(li);
				a.addEvent('click', this.changePage.bind(this));
			} else {
				var li = new Element('li').set('html', '<span class="off">&lt;</span>').inject(this.nav);
			}
			
			// Pages
			this.cursor.pages.each(function(el){
				var li = new Element('li').inject(this.nav);
				if (el.label - 1 != (this.cursor.currentPageIndex)) {
					var a = new Element('a', {
						'title': (el.label - 1),
						'href': 'javascript://'
					}).set('text', el.label).inject(li);
					a.addEvent('click', this.changePage.bind(this))
				}
				else {
					li.set('text', el.label);
				}
			}.bind(this));

			// Next
			if (this.cursor.currentPageIndex < this.cursor.pages.length - 1) {
				var li = new Element('li').inject(this.nav);
				var a = new Element('a', {
					'title': (this.cursor.currentPageIndex + 1),
					'href': 'javascript://'
				}).set('text', ">").inject(li);
				a.addEvent('click', this.changePage.bind(this));
			} else {
				var li = new Element('li').set('html', '<span class="off">&gt;</span>').inject(this.nav);
			}

			// More results @ google
			if (this.cursor.moreResultsUrl) {
				var li = new Element('li').inject(this.nav);
				var a = new Element('a', {
					'href': this.cursor.moreResultsUrl,
					'target': '_blank'
				}).inject(li);
				var img = new Element('img',{
					'src': '/img/google.gif',
					'alt': this.lbl_google,
					'title': this.lbl_google,
					'class': 'moreResults'
				}).inject(a);
			}
		}
	},

	draw:function(element) {
		if (this.nav) {
			this.info.inject(element, this.options.injectWhere);
			this.nav.inject(element, this.options.injectWhere);
		}
	},

	changePage:function(event) {
		this.search.gotoPage(event.target.title);
	}
});

google.load('search', '1', {nocss: true});

