/* (C) 2008 YOOtheme.com, mod_yoo_search.js */

var YOOsearch = new Class({
		initialize:function (container, options) {
			this.setOptions({
					setItemid:0, 
					fieldText:"search...", 
					resultText:"Results",
					NoresultText:"Nothing found...",
					MoreResultText: "More",
					formSelector:"form", 
					fieldSelector:"input.searchfield", 
					closeSelector:"button.search-close", 
					resultsSelector:"div.resultbox", 
					url:"index.php?option=com_search&tmpl=raw&type=json&ordering=&searchphrase=all"},
					options);
			this.form = $(container).getElement(this.options.formSelector);
			this.field = $(container).getElement(this.options.fieldSelector);
			this.close = $(container).getElement(this.options.closeSelector);
			this.resultbox = $(container).getElement(this.options.resultsSelector);
			this.sections = new Array;
			this.focussed = false;
			this.selection = false;
			this.observer = new Observer(this.field, this.processSearch.bind(this), {delay:400});
			this.field.addEvents({
								 focus:this.toggleFocus.bind(this, [true]), 
								 blur:this.toggleFocus.bind(this, [false])
								 });
			this.close.setStyle("display", "none");
			this.close.addEvents({mousedown:this.clearSearch.bindWithEvent(this)});
			}, 
		requestSearch:function () {
			this.close.setStyle("display", "inline");
			this.close.removeClass("search-close");
			this.close.addClass("search-loader");
			}, 
		clearSearch:function () {
			this.close.setStyle("display", "none");
			this.field.value = this.options.fieldText;
			this.clearResults();
			}, 
		processSearch:function () {
			if (this.field.value) {
				var url = this.options.url + "&Itemid=" + this.options.setItemid + "&searchword=" + this.field.value;
				var jSonRequest = (new Json.Remote(url, {
												   onRequest:this.requestSearch.bind(this),
												   onComplete:this.processResults.bind(this)
												   })).send();
							}
			}, 
		processResults:function (data) {
			this.clearResults();
			this.close.addClass("search-close");
			this.close.removeClass("search-loader");
			if (data) {
				var results = new Element("div", {'class':"resultbox-bg"});
				if (data.categories.length > 0) {
					var section = this.createSection("search-categories", "Search categories");
					data.categories.each((function (res) {
													this.createResult(res.title, res.text, res.url, res.image).injectInside(section);
													}).bind(this));
									}
				//resultText =  "Arama Sonucu";
				//resultText =  '" .$result_text. "';
				var section = this.createSection("search-results", resultText );
				if (data.results.length > 0) {
					data.results.each((function (res) {
													this.createResult(res.title, res.text, res.url).injectInside(section);
													}).bind(this));
				} else {
					this.createResult(NoresultText , data.error, "#").injectInside(section);
				}
				this.sections.each(function (section, i) {section.injectInside(results);});
				results.injectInside(this.resultbox);
				this.createResultbox(data.results.length > 0).injectInside(this.resultbox);
				}
			}, 
		clearResults:function () {
			this.sections = new Array;
			this.select = false;
			this.resultbox.empty();
		}, 
		selectResult:function (state) {
			this.selection = state;
		}, 
		createboxHeader:function (boxheader) {
			var tl = new Element("div", {'class':"resultbox-tl"});
			var tr = (new Element("div", {'class':"resultbox-tr"})).injectInside(tl);
			var h3 = (new Element("h3", {'class':"search-header"})).setHTML(name).injectInside(tr);
		},
		createSection:function (css, name) {
			var div = new Element("div", {'class':css});
			var tl = (new Element("div", {'class':"resultbox-tl"})).injectInside(div);
			var tr = (new Element("div", {'class':"resultbox-tr"})).injectInside(tl);
			var h3 = (new Element("h3", {'class':"search-header"})).setHTML(name).injectInside(tr);
			var ml = (new Element("div", {'class':"resultbox-ml"})).injectAfter(tl);
			var mr = (new Element("div", {'class':"resultbox-mr"})).injectInside(ml);
			var m = (new Element("div", {'class':"resultbox-m"})).injectInside(mr);
			var ul = (new Element("ul", {'class':"results"})).injectInside(m);
			this.sections.include(div);
			return ul;
		}, 
		createResult:function (title, text, url, image) {
			var li = new Element("li");
			var a = (new Element("a")).setProperty("href", url).injectInside(li);
			if (image) {
				var img = (new Element("img")).setProperty("src", image).injectInside(a);
			}
			var h3 = (new Element("h3")).setHTML(title).injectInside(a);
			a.appendText(text);
			a.addEvents({
				mouseenter:this.selectResult.bind(this, [true]), 
				mouseleave:this.selectResult.bind(this, [false])
				});
			return li;
			}, 
		createResultbox:function (searchMore) {
			var bl = new Element("div", {'class':"resultbox-bl"});
			var br = (new Element("div", {'class':"resultbox-br"})).injectInside(bl);			
			var b = (new Element("div", {'class':"resultbox-b"})).injectInside(br);
			if (searchMore) {
				var a = (new Element("a", {'class':"search-more"})).injectInside(b);
				var span = (new Element("span", {'class':"search-more"})).injectInside(a);
				a.appendText(MoreResultText);
				a.addEvents({
							mouseenter:this.selectResult.bind(this, [true]), 
							mouseleave:this.selectResult.bind(this, [false]), 
							mousedown:(function () {
												 this.form.submit();
												 }).bind(this)
							});
				}
				return bl;
			}, 
		toggleFocus:function (state) {
			this.focussed = state;
			if (!state && !this.selection) {
				this.clearResults();
				}
		}});
YOOsearch.implement(new Options);
var Observer = new Class({
		options:{periodical:false, delay:1000}, 
		initialize:function (el, onFired, options) {
				this.setOptions(options);
				this.addEvent("onFired", onFired);
				this.element = $(el);
				this.listener = this.fired.bind(this);
				this.value = this.element.getValue();
				if (this.options.periodical) {
					this.timer = this.listener.periodical(this.options.periodical);
					} else {
					this.element.addEvent("keyup", this.listener);
					}
		}, 
		fired:function () {
			var value = this.element.getValue();
			if (this.value == value) {
				return;
				}
			this.clear();
			this.value = value;
			this.timeout = this.fireEvent.delay(this.options.delay, this, ["onFired", [value]]);
		}, 
		clear:function () {
			$clear(this.timeout);
			return this;
			}
});
Observer.implement(new Options);
Observer.implement(new Events);