/**
 * @author jfdesgagne
 */



var Search = new Class({

	Implements: [Events, Options],

	options: {
		label: null,
		restrict: null,
		idButton: null,
		idInput:null,
		top:'auto',
		right:'auto',
		left:'auto',
		bottom:'auto'
	},

	list:null,
	li:null,
	input:null,
	searchPlaceHolder:null,

	initialize: function(options){
		this.setOptions(options);
		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();
		this.search.setSearchCompleteCallback(this, this.complete);

		this.createSearch();
	},

	createSearch: function() {
		this.list = new Search.Results({id:this.options.idInput});

		this.li = this.list.toElement();
		this.li.inject(this.options.idInput + 'Result');
		this.li.setStyle('display', 'none');

		if (lang == 'en') {
			searchPlaceHolder = 'Search ...';
		} else {
			searchPlaceHolder = 'Recherche ...';
		}

		this.input = new Search.Input({id: this.options.idInput, placeHolder: searchPlaceHolder});
		this.input.refClass = this;
		this.input.addEvent('onSubmit', function(){
			this.refClass.li.setStyles({
				'top': this.refClass.options.top,
				'bottom': this.refClass.options.bottom,
				'left': this.refClass.options.left,
				'right': this.refClass.options.right,
				'display': 'block'
			});
			this.refClass.li.set('html', '<li class="first last">Recherche...</li>');
			this.refClass.query(this.value);
		});


		$(this.options.idButton).addEvent('click', function(){
			this.input.value = this.input.value;
			this.input.fireEvent('onSubmit');
		}.bind(this));


		document.addEvent('click', function(e){
			if(e.target!=$(this.options.idInput + 'Input') && e.target!=$(this.options.idButton)) {
				if (e.target != this.li && !this.li.hasChild(e.target)) this.li.setStyle('display', 'none');
			}
		}.bind(this));

		this.input.toElement().inject(this.options.idInput + 'InputDiv');
	},


	complete: function(){
		this.input.toElement().blur();
		this.list.fill(this.search.results);

		this.nav = new Search.Nav(this.search, this.search.cursor);
		this.nav.draw(this.options.idInput + 'Nav');
	},

	query: function(value){
		this.search.execute(value);
		return this;
	}

});

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

	options: {
		injectWhere: "inside"
	},

	cursor:null,
	nav:null,
	info:null,
	search:null,

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

	initialize: function(search, cursor, options){
		this.search = search;
		this.cursor = cursor;
		this.setOptions(options);

		this.prepare();
	},

	prepare:function() {
		if (this.cursor) {
			this.info = new Element('p').set('text', 'Page ' + (this.cursor.currentPageIndex + 1) + " de " + this.cursor.pages.length + " | " + this.cursor.estimatedResultCount + " résultats trouvés");

			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));
			}

			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));

			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));
			}
		}

	},

	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);
	}
});

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

	options: {
		id: null
	},

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

	initialize: function(options){
		this.setOptions(options);
		this.container = new Element('ul', {'class': 'results', 'id':this.options.id+'Results'});
	},

	fill: function(results){
		this.container.empty();

		for (var i = 0, l = results.length; i < l; i++){

			var li = this.parseResult(results[i]);

			this.container.adopt(li);

			if (i == results.length - 1) {
				new Element('li', {
					'class': 'last google-search-nav',
					'id': this.options.id + 'Nav'
				}).inject(this.container);
			}
		}

		if (results.length == 0){
			var empty = new Element('li', {'class': 'result-item'});
			var content = new Element('div', {'class': 'result-content', html: 'no results'});
			empty.adopt(content);
			this.container.adopt(empty);
		}
	},

	parseResult: function(result){
		var li = new Element('li', {'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");
		}
		var content = new Element('div', {'class': 'result-content', html: result.content});
		li.adopt(title, content);
		return li;
	}

});

Search.Input = new Class({

	Implements: [Events, Options],

	options: {
		results: 4,
		placeHolder: null,
		id: null,
		className: null
	},

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

	initialize: function(options){

		this.setOptions(options);

		this.input = new Element('input', {type: 'text'});


		if (this.options.id) this.input.set('id', this.options.id + 'Input');
		var placeHolder = this.options.placeHolder;

		this.input.addEvents({
			focus: function(){
				if (this.value == placeHolder) this.value = '';
				this.removeClass('place-holder');
			},

			blur: function(){
				if (!this.value.length){
					this.value = placeHolder;
					this.addClass('place-holder');
				}
			}
		});


		this.input.fireEvent('blur');


		this.input.addEvent('keydown', function(event){
			this.value = this.input.value;
			if (event.key == 'enter' && this.value.length) this.fireEvent('onSubmit');
		}.bind(this));
	}

});

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