/**
 * Script: Suchformulare
 *
 * $URL: svn://192.168.1.20/RBL-dev/tags/2011-12-11-a_rbl/jkcms/js/search.ajax.js $
 * $Rev: 2141 $
 * $Author: jo $
 * $Date: 2011-12-01 21:54:45 +0100 (Do, 01 Dez 2011) $
 */

/**
 * Prototyp: Suchformular
 */
function fSearch() {
	this.url = '';
	this.result_value = '';
	this.result_text = '';
	
	// Listenspeicher
	this.stringliste = null;
	this.idliste = null;
	
	// Formularelemente
	this.searchtext = null;
	this.selector = null;
	this.okbutton = null;
	
	// Handler

	/**
	 * callback Funktion(result_value, result_text); wird aufgerufen, wenn Element ausgewählt
	 */
	this.onOk = null;
	
	/**
	 * callback Funktion(); wird aufgerufen, wenn das Formular geladen und das Setup in onLoad beendet ist.
	 * für zusätzliches Setup (z.B. add-Button)
	 */
	this.onSetup = null;

	/**
	 * callback Funktion(result_value, result_text); wird aufgerufen, wenn die Auswahl geändert wurde
	 */
	this.onChange = null;
	
	/**
	 * Aufruf des Suchformurars
	 * 
	 * @param string params wird an url angehängt 
	 */
	this.open = function (params, width) {
		var url = this.url + params;

		this.width = (width) ? width : 340;
		this.minheight = 10;
		this.create_container(ajax_event.pageX, ajax_event.pageY);
		this.load(url);
	};
	
	this.onLoad = function() {
		var inputs = this.container.getElementsByTagName('input');
		for(var i = 0; i < inputs.length; i++) {
			if (inputs[i].type == 'button') {
				this.okbutton = inputs[i];
				this.okbutton.ajaxobj = this;
				this.okbutton.onclick = function () {
					this.ajaxobj.Set();
				};
			} else if (inputs[i].type == 'text') {
				this.searchtext = inputs[i];
				this.searchtext.focus();
				this.searchtext.onkeyup = function(evt) {
					evt = (evt) ? evt : ((event) ? event : null);
					if (evt) {
						var i = this.ajaxobj.selector.options.selectedIndex;
						if (evt.keyCode == 40) {
							// down
							if (i < this.ajaxobj.selector.options.length - 1) {
								this.ajaxobj.selector.options.selectedIndex = i + 1;
								this.ajaxobj.Change();
							}
						} else if (evt.keyCode == 38) {
							// up
							if (i > 0) {
								this.ajaxobj.selector.options.selectedIndex = i - 1;
								this.ajaxobj.Change();
							}
						} else if (evt.keyCode == 13) {
							// enter
							this.ajaxobj.Set();
						} else {
							this.ajaxobj.search();
						}
					}
				};
				this.searchtext.form.onsubmit = function() {
					return false;
				};
				this.searchtext.ajaxobj = this;
			}
		}
		var selects = this.container.getElementsByTagName('select');
		if (selects.length > 0) {
			this.selector = selects[0];
			this.selector.ajaxobj = this;
			this.selector.ondblclick = function () {
				this.ajaxobj.Set();
			};
			this.selector.onchange = function () {
				this.ajaxobj.Change();
			};
		}
		if (this.onSetup) this.onSetup();
	};

	this.Set = function() {
		if (this.selector.selectedIndex >= 0) {
			this.result_value = this.selector.options[this.selector.selectedIndex].value;
			this.result_text = this.selector.options[this.selector.selectedIndex].text;
		} else {
			this.result_value = '';
			this.result_text = '';
		}
		if ((this.onOk) && (this.result_text)) {
			// callback aufrufen
			this.onOk(this.result_value, this.result_text);
			this.close();
			if (this.onChange) this.onChange(id);
		}		
	};

	this.Change = function() {
		if (this.selector.selectedIndex >= 0) {
			this.result_value = this.selector.options[this.selector.selectedIndex].value;
			this.result_text = this.selector.options[this.selector.selectedIndex].text;
		} else {
			this.result_value = '';
			this.result_text = '';
		}
		if (this.onChange) {
			// callback aufrufen
			this.onChange(this.result_value, this.result_text);
		}		
	};
	
	this.search = function() {
		var searchtext = this.searchtext.value.toLowerCase();
			
		if (!this.stringliste) {
			this.stringliste = new Array();
			this.idliste = new Array();
			for (var i = 0; i < this.selector.options.length; i++) {
				this.stringliste[i] = this.selector.options[i].text;
				this.idliste[i] = this.selector.options[i].value;
			}
		}
		this.selector.options.length = 0;
		for (var i = 0, j = 0; i < this.stringliste.length; i++) {
			var s = this.stringliste[i].toLowerCase();
			if ((searchtext.length == 0) || (s.indexOf(searchtext) >= 0)) {
				this.selector.options[j++] = new Option(this.stringliste[i], this.idliste[i], false, false);
			}
		}

		// ersten Eintrag selektieren, wenn vorhanden
		if (this.selector.options.length > 0) {
			this.selector.options.selectedIndex = 0;
		}

	};
	
}
fSearch.prototype = new ajax_obj('');

function cLiveSearch() {
	
	this.search = function() {
		var searchtext = this.searchtext.value.toLowerCase();
			
		// livesuche
		var selector = this.selector;
		var url = this.url + '&action=livesearch&searchtext=' + urlencode_string(searchtext);
		this.pendingImg = null;
		this.onLoad = function() {
			if (selector.options.length > 0) {
				selector.options.selectedIndex = 0;
			}
		};
		this.load(url);

		// ersten Eintrag selektieren, wenn vorhanden
		if (this.selector.options.length > 0) {
			this.selector.options.selectedIndex = 0;
		}

	};
	
}
cLiveSearch.prototype = new fSearch();

