/**
*
* Javascript-Objekt für die Produktsuche
*
**/
function Simple_Search(submit_search ,category_id ,vendor_cat ,all_cat) {
	
	this.submit_search		= submit_search;
	this.category_id		= category_id;
	this.vendor_cat			= vendor_cat;
	this.all_cat 			= all_cat;

	this.button_size		= 15.5;
	this.max_sub_cat_levels	= 5;
	
	var all_cat_uid				= new Array();
	var all_cat_title			= new Array();
	var all_cat_parent_uid		= new Array();
	var all_cat_priority		= new Array();
	var priority_list			= new Array();

	var this_vendor_cat;
	var cat_path;
	var cat_layers_open;
	var no_col;

	this.init_page = function init_page() {

		// in all_cat sind die Kategorien wie folgt gespeichert: ([ID, Name, Parent-ID, Priorität], ...)
		
		for (var i=0; i<this.all_cat.length; i=i+4) {
		
			all_cat_uid[this.all_cat[i]]		= this.all_cat[i];
			all_cat_title[this.all_cat[i]]		= this.all_cat[i+1];
			all_cat_parent_uid[this.all_cat[i]]	= this.all_cat[i+2];
			all_cat_priority[this.all_cat[i]]	= this.all_cat[i+3];
		}
		
		// Zweidimensionales Array mit allen Kategorien und deren Priorität
		for (var j=0;j<all_cat_uid.length;j++){
			priority_list[j] = [  
				[ all_cat_uid[j] ], 
				[ all_cat_priority[j] ]
				];
		}


		// Liste aller [Sub]kategorien, die der aktuelle vendor hat
		// Wenn alle vendors ausgewählt sind, werden auch alle [Sub]kategorien ausgewählt
		this_vendor_cat		= this.get_this_vendor_cat();
			
		if (this.category_id == '') {
			this.category_id = '0';
		}
			
		cat_path 			= this.get_cat_path();
		
		cat_layers_open		= 0;
	
		var cat_form 		= document.forms['simple_search'].elements['category_id'];
		cat_form.value 		= this.category_id;
		
		this.init_subcategories();
		
	}
	
	this.init_subcategories = function init_subcategories() {

		// mit Marke container_height = 60, ohne container_height = 30
		var container_height = 30;
		// die einzelnen [Sub]kategorie-Level von oben nach unten durchgehen
		for (var i=0; i<cat_path.length; i++) {
			var sel = document.forms['simple_search'].elements["swords_category" + i];
			var layer = document.getElementById("categorylayer" + i);
			// alle bisherigen options von sel löschen bis aus 'alle'
			for (var j=sel.length-1; j>0; j--) {
				sel.remove(j);
			}
	
			var these_cats = new Array();
			var uid_priority = new Array();
			
			if (i==0) {
				these_cats = this.get_sub_cats('0');
			} else {
				these_cats = this.get_sub_cats(cat_path[i-1]);
			}

			//Kategorien in these_cats mit Kategorie-uids in Priority List vergleichen und entsprechende Priorität anhängen
			for (var l=0; l<these_cats.length;l++) {
				for (var t=0;t<priority_list.length;t++) {
					if (these_cats[l] == priority_list[t][0]) {
						//zweidimensionales Array mit ausgewählten Kategorien und entspr. Priorität
						uid_priority[l] = [					
								[ these_cats[l] ],
								[ priority_list[t][1] ],
							];
					}
				}
			}
			// Es soll nur nach Priorität sortiert werden, falls eine Priorität festgelegt ist 
			// und diese nicht doppelt vorhanden ist. 
			// Andernfalls wird nach Kategorie-uid sortiert
			
			for (var z=0; z<uid_priority.length; z++) {
				for (var x=0; x<uid_priority.length;x++) {
					if ( uid_priority [z][1] != '0' && uid_priority [z][1] != uid_priority [x][1] ) {
						// mehrdimensionales Array nach Priorität sortieren
						var uid_sorted = uid_priority.sort(sortCategory);
						for (var k=0;k<uid_sorted.length; k++){
							// Priorität abtrennen und Array aus sortierten uids erstellen
							these_cats[k]	= uid_sorted[k][0];				
						}
					}
				}	
			}

		for (var k=0; k<these_cats.length; k++) {
			var newopt = new Option(sel);
			var this_selected = false;

			// Kategorie ID als Value eintragen
			newopt.value = these_cats[k];

			// Kategorie Bezeichnung als title eintragen
			newopt.text = all_cat_title[these_cats[k]];
	
			//diese Option vorwählen, falls ihr value mit letzter Kategorie übereinstimmt
			if (newopt.value == cat_path[i]) {
				this_selected = true;
			}

			sel.options[k+1] = newopt;
			sel.options[k+1].selected = this_selected;
		}			

		if (cat_layers_open == 0) {
			// nur bei Seiteninitialisierung
			if (i>0) {
				if (i>1) {
					layer.style.top = 25;
				} else {
					// mit Marke top = 55, ohne top = 25
					layer.style.top = 25;
				}				
				container_height += 25;
			}
		}
	}
		
	if (cat_layers_open == 0) {
		// bei Seiteninitialisierung
		cat_layers_open = cat_path.length;

		var container = document.getElementById("lefttoplayer");
		container.style.height = container_height;
	} else {
		if (cat_path.length > cat_layers_open) {
			// es müssen noch Layer geöffnet werden
			for (var i=cat_layers_open; i<cat_path.length; i++) {
				move_layer("categorylayer" + (i), 0, 25, "vertical", "lefttoplayer");
			}
		} else {
			// es müssen noch Layer geschlossen werden
			for (var i=cat_layers_open-1; i>=cat_path.length; i--) {
				move_layer("categorylayer" + (i), 0, -25, "vertical", "lefttoplayer");
			}
		}
		cat_layers_open = cat_path.length;
	}
	}
	
	this.get_cat_path = function get_cat_path() {
	
		var path=Array();
	
		var sc = this.get_sub_cats(this.category_id);
		
		// Falls es Unterkategorien gibt, wird eine Null angehängt
		if (sc.length>0)
		customPush(path, '0');
				
		// die eigentliche category_id vorn anhängen, falls es nicht root 0 ist
		if (this.category_id>0) {
			path = customUnshift(path, this.category_id);
		
			var parent_id = all_cat_parent_uid[this.category_id];
	
			while (parent_id > 0) {
				path = customUnshift(path, parent_id);
				parent_id = all_cat_parent_uid[parent_id];
			}
		}
		return path;
	
	}
	
	/**
 	* Funktion zur Bestimmung aller nichtrekursiven Subkategorien einer Kategorie unter 
 	* Berücksichtigung des ggf. ausgewählten vendors.
 	*/
	
	this.get_sub_cats = function get_sub_cats(cat_id) {
	
		var all_sub_cat = Array();
		for (var key in all_cat_parent_uid) {
			if (parseInt(all_cat_parent_uid[key])==parseInt(cat_id))
				customPush(all_sub_cat,key);
		}
			
		var is = intersect(all_sub_cat, this_vendor_cat);
		return is;
	}
	
	/**
 	* Funktion zur Bestimmung aller [Sub]kategorien eines Vendors.
 	* Wenn alle vendors gewählt sind, werden alle Kategorien zurückgegeben.
 	*
 	* @return	array	alle [Sub]kategorien des gewählten Herstellers
 	*/
	
	this.get_this_vendor_cat = function get_this_vendor_cat() {
	
		var vendor = document.forms['simple_search'].elements['swords_vendor'];
	
		var cats = Array();
		
		if (vendor.value == '0') {
			for (var i=0; i<all_cat_uid.length; i++) {
				customPush(cats,all_cat_uid[i]);
			}
		} else {
			// state 0: vendor noch nicht gefunden, weitersuchen
			// state 1: vendor gefunden, cat ids auslesen
			// state 2: nächsten vendor gefunden, Abbruch
			var state = 0;
			for (var i = 0; (i < this.vendor_cat.length) && (state < 2); i++) {
				switch (state) {
					case 0:
						if (this.vendor_cat[i] == 'vendor:' + vendor.value) {
							state = 1;
						}
					break;
					
					case 1:
						if (this.vendor_cat[i].match(/vendor/)) {
							state = 2;
						} else {
							customPush(cats,this.vendor_cat[i]);
						}
					break;
				}
			}
		}
		return cats;
	
	}

	
	this.change_cat_search = function change_cat_search(obj) {
	
		obj_id = parseInt(obj.id.split("swords_category")[1]);
		
		for (var i=cat_path.length; i>obj_id; i--) {
			customPop(cat_path);
		}
		
		customPush(cat_path,obj.value);
		
		// Wenn bei einer echten Subkategorie "alle" ausgewählt werden,
		// also wenn obj.value=0 aber obj_id!=0, dann soll category_id
		// bestimmt werden aus [nächsthöheres obj].value
		if (obj.value==0 && obj_id!=0) {
			parent_obj = document.forms['simple_search'].elements['swords_category' + parseInt(obj_id-1)];
			this.category_id = parent_obj.value;
		} else {
			this.category_id	= obj.value;
		}
		
		var cat_form 	= document.forms['simple_search'].elements['category_id'];
		cat_form.value 	= this.category_id;
		cat_path = this.get_cat_path();
		this.init_subcategories();
	}
	
	
	this.move_catlayers = function move_catlayers(obj) {
	
		var my_id = parseInt(obj.id.split("swords_category")[1]);
	
		if (my_id < max_sub_cat_levels) {
			// Die Routine entfällt für das letzte Sublevel
			if (parseInt(obj.value)>0) {
				// Nächsten Subkategorielayer ausfahren
				move_layer("categorylayer" + (my_id + 1), 0, 25, "vertical", "lefttoplayer");
				cat_level ++;
			}
			else {
				// Wenn 'alle Subkategorien' ausgewählt wird,
				// werden alle Subkategorienlayer eingefahren
				for (var i=cat_level; i>my_id; i--) {
					move_layer("categorylayer" + i, 0, -25, "vertical", "lefttoplayer");
				}
				cat_level = my_id;
			}
		}
	}

}
/**
 *
 * benötigte Funktionen außerhalb des Objektes
 *
 */

function change_simple_num_products() {
	document.forms['simple_search'].submit();
}

/** ---AJAX-Funktionen für Simple Search--- **/

/**
 * Sendet einen AJAX-Request, der eine Liste mit möglichen gesuchten Artikeln zurückliefert.
 *
 * @param	string	parameter	das bisher eingegeben Suchwort
 * @param	int		vendor		die ID des aktuell gewählten Herstellers
 * @param	int		category	die ID der aktuell gewählten Kategorie
 *
 * @return	bool	false, wenn es einen Fehler gab
 */
function doRequest(parameter, vendor, category) {
	
	if (parameter.length > 2) {
		var url		= 'typo3conf/ext/tt_products/pi/ajax/autosuggest_article.php';
		parameter	= '?param='		+ escape(parameter);
		vendor		= '&vendor='	+ escape(vendor);
		category	= '&category='	+ escape(category);
			
		req = new ajaxRequest(url + parameter + vendor + category);
	} 
	else {
			return false;
		}
	if (req == false) {
		return false;
	}

}
	
/**
 * Diese Funktion wird vom AJAX-Request aus aufgerufen und verarbeitet die zurückgelieferten
 * Daten.
 */		
function ajaxResponse() {
	
	/*
	 * die readystates des XmlHttpRequest-Objektes (von http://www.oreilly.de/artikel/ajax3/index.html): 
	 * 0: Die Anfrage ist noch nicht initialisiert (bevor Sie open() aufrufen).
	 * 1: Die Anfrage ist erstellt und initialisiert, aber noch nicht gesendet (bevor Sie send() aufrufen).
	 * 2: Die Anfrage wurde gesendet und wird verarbeitet (Sie können die Kopfdaten der Antwort auswerten).
	 * 3: Die Anfrage wird verarbeitet; meistens steht ein Teil der Antwort schon zur Verfügung, doch der Server ist noch nicht mit der Antwort fertig.
	 * 4: Die Anfrage ist abgeschlossen; die Antwort des Servers steht bereit.
	 */
	     
	// wir wollen erst etwas machen, wenn die Anfrage komplett fertig ist und ohne 
	// HTTP-Fehlercode zurückkomt
	   if ((request.readyState == 4) && (request.status == 200)) {
	// hier schreiben wir unsere vorschläge rein
	   var ausgabe	= document.forms['simple_search'].elements['ausgabe'];
	
		// alle bisherigen Elemente loeschen
		while (ausgabe.length > 0) {			
			ausgabe.options[ausgabe.length - 1] = null;
		}
			
	    if (request.responseText == '') {
			// es wurde keine DB Übereinstimmung gefunden
			ausgabe.style.height = 0;
		} else {
			document.forms['simple_search'].elements['ausgabe'].style.display = 'block';
			var foo 			= request.responseText;
			// Elemente entsprechend der Markierung extrahieren
			var elements 		= foo.split('/element/');
			for (var i = 0; i < elements.length; i++) {
				if (elements[i] != '') {
					// neues Option Element anlegen
					newopt 				= new Option(ausgabe);
					var txt				= replaceSpecialChars(elements[i],0);	
					// Value eintragen
					newopt.value 		= txt;
					// Bezeichnung eintragen
					newopt.text 		= txt;
					ausgabe.options[ausgabe.length] = newopt;	
				}
			}
				
			// height des Ausgabefeldes berechnen
			var height			 = (ausgabe.length * 20);
			if (height > 200) {
				height = 200;
			}
			ausgabe.style.height = height;	
		}
	} 
	
}


// Artikelvorschläge in Multiselect anzeigen
function showAutosuggest(element) {
	var vendor 	 		= document.forms['simple_search'].elements['swords_vendor'].value;
	var category 		= document.forms['simple_search'].elements['category_id'].value;
	
	doRequest(element.value, vendor, category);
}

/**
 * Beim drücken der Pfeiltaste nach unten Fokus auf Multiselect legen um
 * Tastennavigation zu ermöglichen
 */
function setFocus(event) {
	var selectElement 	= document.getElementById('ausgabe');
	if (event.keyCode==40) {
		selectElement.focus();
	}
}

/**
 * Setzt ausgewählten Artikel im Textfeld article_name
 */
function setValue(element){
	var text	= document.forms['simple_search'].elements['article_name'];
	text.value 	= element.value;

	while (element.length > 0) {			
		element.options[element.length - 1] = null;
	}
	
	text.focus();
	element.style.display = 'none';
}

/**
 * Komparator für das Sortieren des mehrdimensionalen Kategorie-Arrays anhand der Priorität
 *
 */
function sortCategory(a, b){	
    return parseInt(a[1]) > parseInt(b[1]) ? 1 :
    parseInt(a[1]) < parseInt(b[1]) ? -1 :
    0;
}

