/**
 * JS class for ajax catalog search
 * 
 * requires Prototype 1.6.1
 * 
 * @copyright  (c)2010 Spion Media GmbH
 * @author     Uwe Mesecke <um@spion-media.eu>
 */

if (typeof AjaxCatalogSearch == "undefined") {
	var AjaxCatalogSearch = {};
}

/****************************************************************************************
 * Controller
 */

AjaxCatalogSearch.Controller = Class.create();

AjaxCatalogSearch.Controller.prototype = {
	initialize: function(inputElement, resultElement, requestUrl, blogUrl, blogResultElementId, defaultText) {
		this.clickedItem = false;
		this.inputElement = inputElement;
		this.resultElement = resultElement;
		this.requestUrl = requestUrl;
		this.blogUrl = blogUrl;
		this.blogResultElementId = blogResultElementId;
		this.defaultText = defaultText;
		
		this.captureChanges = false;
		
		this.blogResultElement = false;
		this.blogResultContent = false;
		
		this.inputElement.observe("focus", this.handleOnFocus.bind(this));
		this.inputElement.observe("blur", this.handleOnBlur.bind(this));
		this.formObserver = new Form.Element.Observer(this.inputElement, 0.5, this.handleQueryChanges.bind(this));
		
		if (this.inputElement.value == "") {
			this.inputElement.value = defaultText;
		}
	},
	
	handleOnFocus: function() {
		if (this.inputElement.value == this.defaultText) {
			this.inputElement.value = "";
		} else if (this.inputElement.value != "") {
			this.getSuggestSearchResults(this.inputElement.value);
		}
		this.captureChanges = true;
	},
	
	handleOnBlur: function() {
		this.captureChanges = false;
		new PeriodicalExecuter(function(pe) {
			this.clearResults();
			pe.stop();
		}.bind(this), 0.5);
	},
	
	handleQueryChanges: function(el, query) {
		if (query == "") {
			this.clearResults();
		} else if (this.captureChanges) {
			this.getSuggestSearchResults(query);
		}
	},
	
	getSuggestSearchResults: function(query) {
		this.abortAjaxRequests();
		
		this.blogResultContent = false;
		this.blogResultElement = false;
		
		this.ajaxObj = new Ajax.Request(this.requestUrl, {
			method:'get',
			parameters: {q: query},
			onSuccess: function(transport) {
				var response = transport.responseText || "";
				if (response != "") {
					this.resultElement.update(response);
					this.blogResultElement = this.resultElement.select("#" + this.blogResultElementId).first();
					this.updateBlogResults();
				}
			}.bind(this),
			onFailure: function() {}
		});
		
		this.ajaxBlogObj = new Ajax.Request(this.blogUrl, {
			method:'get',
			parameters: {s: query, wp_s: 'ac' },
			onSuccess: function (transport) {
				var response = transport.responseText || "";
				if (response != "") {
					this.blogResultContent = response;
					this.updateBlogResults();
				}
			}.bind(this),
			onFailure: function() {}
		});
	},
	
	updateBlogResults : function() {
		if (!this.blogResultContent || !this.blogResultElement) {
			return;
		}
		
		this.blogResultElement.update(this.blogResultContent);
		
		this.blogResultElement = false;
		this.blogResultContent = false;
	},
	
	clearResults: function() {
		this.abortAjaxRequests();
		this.resultElement.update("");
	},
	
	abortAjaxRequests: function() {
		if (this.ajaxObj && !this.ajaxObj._complete) {
			this.ajaxObj.transport.abort();
		}

		if (this.ajaxBlogObj && !this.ajaxBlogObj._complete) {
			this.ajaxBlogObj.transport.abort();
		}
	}
};

