function AdvisedSearchSmall(basic_color, selected_color, category_id, vendor_cat, all_cat, colors, color_names, scope, colormenu_position) {

	this.basic_color		= basic_color;
	this.selected_color 	= selected_color;
	this.category_id		= category_id;
	this.vendor_cat			= vendor_cat;
	this.all_cat 			= all_cat;
	this.colors				= colors;
	this.color_names		= color_names;
	this.scope				= scope;
	this.position 			= colormenu_position;

	this.button_size		= 12;

	this.value_no_color		= 'NC100';
	this.max_sub_cat_levels	= 5;

	var self 				= this;
	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() {

		cat_path = this.get_cat_path();

		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 in all_cat_uid) {
			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_layers_open		= 0;

		var cat_form 				= document.forms['advised_search_'+this.scope].elements['category_id'];
		cat_form.value 				= this.category_id;

		if (this.scope.match(/all|navi/i)) {
			this.init_subcategories();
		}

		main_color					= document.forms['advised_search_'+this.scope].elements['main_color'];
		main_color.value			= this.basic_color_search;

		sel_color					= document.forms['advised_search_'+this.scope].elements['selected_color'];
		sel_color.value				= this.selected_color;

		// zweispaltiges Farbmenu aus den Hauptfarben erzeugen und darstellen				
		if ( this.scope.match(/all/) || this.colors.length > 0) {
			this.buildColorMenu(this.colors.length, this.colors, this.scope+'_col_table', 0);
		}
	}

	// Funktion zum Initialisieren der Kategorie-Levels
	this.init_subcategories = function init_subcategories() {

		var category_menu		= $('#cat0').data('dz_selectmenu');
		var top_cats			= this.get_sub_cats('0');
		top_cats				= this._sortCatArray(top_cats);
		var default_category	= '-- alle Kategorien --';
		var new_status			= {key: '0', value: default_category, selected: true};
		var new_default			= {key: '0', value: '<span class="default-option">'+default_category+'</span>', selected: false};
		var new_options			= [new_default];
		var dropdown_width		= textWidth(default_category);

		// gesetzte Kategorie ID des Selects holen
		var category_menu		= $('#cat0').data('dz_selectmenu');
		if (category_menu) {
			var old_category_id	= category_menu.getHiddenInput().val();
		} else {
			var old_category_id	= 0;
		}			
		
		var value				= '';
		var selected			= false;
		var old_category_exists	= false;
		
		for (var k in top_cats) {

			selected		= false;
			value			= all_cat_title[top_cats[k]];
			var str_length	= textWidth(value);

			if (str_length > dropdown_width) {
				dropdown_width = str_length;
			}

			if (top_cats[k] == old_category_id) {
				old_category_exists = true;
				selected 			= true;
				new_status 			= {
					key		: top_cats[k],
					value	: value,
					selected: selected
				}
			}

			var new_elem = {
					key		: top_cats[k],
					value	: '<span class="top-cat-title">'+value+'<span>',
					selected: selected
			};

			new_options.push(new_elem);

			var sub_cats	= this.get_sub_cats(top_cats[k]);
			sub_cats		= this._sortCatArray(sub_cats);
			value 			= '';

			for (var j in sub_cats) {
				value		= all_cat_title[sub_cats[j]];
				selected	= false;

				str_length	= textWidth(value);
				if (str_length > dropdown_width) {
					dropdown_width = str_length;
				}

				if (sub_cats[j] == old_category_id) {
					old_category_exists = true;		
					selected			= true;
					new_status 			= {
						key		: sub_cats[j],
						value	: value,
						selected: selected
					}
				}

				new_options.push({
					key		: sub_cats[j],
					value	: '<span class="sub-cat-title">'+value+'</span>',
					selected: selected
				}) ;
			}
		}

		var new_cats	= {options: new_options, status: new_status};
		if (category_menu) {
			// dz-selectmenu initialisieren
			category_menu
				.setDropdownWidth(dropdown_width+7)
				.init(new_cats);
			if (old_category_exists) {
				category_menu.getHiddenInput().val(old_category_id);
			} else {
				// wenn Kategorie nicht existiert, Marker zurücksetzen
				category_menu.getHiddenInput().val(0);
			}
		} else {
			// <select> initialisieren
			this._initSelect(new_cats);
		}

		return;
	}
	
	this._initSelect = function _initSelect(new_cats) {

		for (var i=0; i<=cat_path.length; i++) {
			var sel 	= document.forms['advised_search_'+this.scope].elements['swords_cat'+i];

			// alle bisherigen options entfernen
			for (var j=sel.length-1; j>=0; j--) {
				sel.remove(j);
			}
			
			for (var i in new_cats['options']) {
				var newopt = new Option(sel);
				newopt.value 	= new_cats['options'][i].key;
				newopt.text  	= $(new_cats['options'][i].value).text();
				newopt.selected	= new_cats['options'][i].selected;
				
				sel.options[sel.options.length] = newopt;
			}
		}		
	}

	this._sortCatArray = function _sortCatArray(cat_array) {
		var uid_priority = new Array();
		//Kategorien in cat_array mit Kategorie-uids in Priority List vergleichen und entsprechende Priorität anhängen
		for (var l in cat_array) {
			for (var t in priority_list) {
				if (cat_array[l] == priority_list[t][0]) {
					//zweidimensionales Array mit ausgewählten Kategorien und entspr. Priorität
					uid_priority[l] = [
							[ cat_array[l] ],
							[ priority_list[t][1] ],
						];
				}
			}
		}

		for (var z in uid_priority) {
			for (var x in uid_priority) {
				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_navi);
					for (var k=0;k<uid_sorted.length; k++){
						// Priorität abtrennen und Array aus sortierten uids erstellen
						cat_array[k]	= uid_sorted[k][0];
					}
				}
			}
		}

		return cat_array;
	}

	/**
 	* 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['advised_search_'+this.scope].elements['swords_vendor'];
		var vendor_value    = vendor.value;
		if (vendor_value == '') {
			vendor_value = 0;
		}

		var cats = Array();
		if (vendor_value == '0') {
			for (var i in all_cat_uid){
				cats.push(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 in this.vendor_cat) {
				if (state >= 2) {
					break;
				}

				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 {
							cats.push(this.vendor_cat[i]);
						}
					break;
				}
			}
		}

		return cats;
	}

	/**
 	* Funktion zur Bestimmung des Kategorien-Pfades anhand der Kategorie-ID.
	*
 	* @return	array	der Pfad zur Kategorie
 	*/

	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)
			path.push('0');

		// die eigentliche category_id vorn anhängen, falls es nicht root 0 ist
		if (this.category_id>0) {
			path.unshift(this.category_id);

			var parent_id = all_cat_parent_uid[this.category_id];
			while (parent_id > 0) {
				path.unshift(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)) {
				all_sub_cat.push(key);
			}
		}

		var is = intersect(all_sub_cat, this_vendor_cat);
		return is;
	}

	/**
 	* Wenn sich der Hersteller ändert muss die Kategorieauswahl dahingehend angepasst werden,
 	* dass nur diejenigen Kategorien dargestellt werden, die der gewählte Hersteller führt.
 	*/

	this.change_vendor = function change_vendor() {
		// Element vendor bestimmen
		var vendor			= document.forms['advised_search_'+this.scope].elements['swords_vendor'];
		var vendor_value	= vendor.value;

		this_vendor_cat	= this.get_this_vendor_cat();

		if (vendor_value != 0) {
			// vendor steht nicht auf 'alle'
			// letzten Knoten vom Kategoriepfad nehmen
			// evtl. anhängigen Null-Unterknoten entfernen
			this.category_id = cat_path.pop();
			if ((this.category_id == '0') && cat_path.length>0) {
				this.category_id = cat_path.pop();
			}
			while (!isElementOf(this_vendor_cat, this.category_id) && cat_path.length>0) {
				this.category_id = cat_path.pop();
			}
			if (!isElementOf(this_vendor_cat, this.category_id) && cat_path.length==0) {
				this.category_id = 0;
			}

			var cat_form 		= document.forms['advised_search_'+this.scope].elements['category_id'];
			cat_form.value 		= this.category_id;
		}

		cat_path = this.get_cat_path();
		this.init_subcategories();
	}

	/**
 	 * Funktion zur Ereignisbehandlung Änderung eines Category-Selects
 	 *
 	 * @param	HTMLSelectElement	obj	das zur Kategorie gehörige Element der Auswahlliste
 	 */

	this.change_cat = function change_cat(obj) {
		return;
	}

	this.submit_color = function submit_color() {
		self.no_col++;
		// onclick Anzeige der gewählten Hauptfarbe
		var color								= this.id;
		self.buildColorMenu(colors.length, colors,self.scope+'_col_table', color);
		main_color								= document.forms['advised_search_'+self.scope].elements['main_color'];
		main_color.value						= color.replace(/#/,'');
		this.basic_color						= color;
		sel_color 								= document.forms['advised_search_'+self.scope].elements['selected_color'];
		sel_color.value							= color.replace(/#/,'');
	}

	/**
 	* zweizeiliges Farbmenü der Hauptfarben erzeugen.
 	*
 	* @param	int		total_cells
 	* @param	int		rootID
 	* @param	string	marked_color
 	*/
	this.buildColorMenu = function buildColorMenu(total_cells, colors, rootID, marked_color) {
		if (this.scope == 'navi') {
			var border_selected = '2px solid #000000';
			var border_grey		= '2px solid #DEDEDE';
		} else {
			var border_selected = '1px solid #000000';
			var border_grey		= '1px solid #DEDEDE';
		}

		// gewählte Hauptfarbe
		var root 			= document.getElementById(rootID);

		if (this.position == 'horizontal') {
			var element = 'td';

			var table 			= document.createElement('table');
			table.id 			= 'swatch_simcol';
			table.cellpadding 	= 0;
			table.cellspacing 	= 1;

			root.appendChild(table);

			var tbody 			= document.createElement('tbody');
			table.appendChild(tbody);

			row 				= tbody.appendChild(document.createElement('tr') );
			tbody.appendChild(row);
		} else {
			var element = 'li';

			var list 			= document.createElement('ul');
			list.style.listStyleType = 'none';
			list.id 				 = 'swatch_simcol';
			root.appendChild(list);
		}

		for (var i = 0; i < total_cells/2; i++) {
			if (i == 0) {
				// Button keine Farbe
				tda						= document.createElement(element);
				val						= document.createElement('img');
				val.id					= this.value_no_color;
				val.title				= "keine Farbe";
				val.style.cursor		= "default";
				val.style.width			= this.button_size;
				val.style.height		= this.button_size;
				val.style.border		= border_grey;
				val.style.font			= "9px verdana,arial,helvetica,sans-serif";
				val.src					= "resources/tk/img/layout/search/button_no_color.gif";
				if (marked_color == this.value_no_color || (marked_color == 0 && this.basic_color == 0) ) {
					val.style.border	= border_selected;
					this.no_col = 0;
				}
				// Farbwahl setzten
				val.onclick				= this.submit_color;
				tda.appendChild(val);
				if (this.position == 'horizontal') {
					row.appendChild(tda);
				} else {
					list.appendChild(tda);
				}
			}

			tda						= document.createElement(element);
			tda.style.height		= 15;
			val						= document.createElement('div');
			val.id					= colors[i];
			val.title				= this.color_names[i];
			val.style.background 	= colors[i];
			val.style.width			= ($.browser.msie) ? this.button_size + 3 : this.button_size - 0.5;
			val.style.height		= this.button_size;
			val.style.border		= border_grey;
			val.style.font			= "9px verdana,arial,helvetica,sans-serif";
			val.className			= 'colorfield';

			if (colors[i] == this.basic_color && (!colors[i] == marked_color) && (marked_color != this.value_no_color)) {
				// gewählte Hauptfarbe markieren
	 			val.style.border		= border_selected;
			}
			else if (colors[i] == marked_color) {
				val.style.border		= border_selected;

			}
			if (this.no_col == 0) {
				val.style.opacity 	= .5;
				val.style.filter 	= 'alpha(opacity=' + 50 + ')';
			}

			// Farbwahl setzten
			val.onclick					= this.submit_color;

			tda.appendChild(val);
			if (this.position == 'horizontal') {
				row.appendChild(tda);
			} else {
				list.appendChild(tda);
			}
		}

		if (this.position == 'horizontal' && !this.scope.match(/banner/i)) {
			br = document.createElement('tr');
			tbody.appendChild(br);
		}

		for (var i = total_cells/2; i < total_cells; i++) {
			tda						= document.createElement(element);
			tda.style.height		= 15;
			val						= document.createElement('div');
			val.id					= colors[i];
			val.title				= this.color_names[i];
			val.style.background 	= colors[i];
			val.style.width			= ($.browser.msie) ? this.button_size + 3 : this.button_size - 0.5;
			val.style.height		= this.button_size;
			val.style.border		= border_grey;
			val.style.font			= "9px verdana,arial,helvetica,sans-serif";
			val.className			= 'colorfield';

			if (colors[i] == this.basic_color && (!colors[i] == marked_color) && (marked_color != this.value_no_color)) {
				// gewählte Hauptfarbe markieren
				val.style.border		= border_selected;
			}
			else if (colors[i] == marked_color) {
				val.style.border		= border_selected;

			}
			if (this.no_col == 0) {
				val.style.opacity 	= .5;
				val.style.filter 	= 'alpha(opacity=' + 50 + ')';
			}

			// Farbwahl setzten
			val.onclick					= this.submit_color;

			tda.appendChild(val);
			if (this.position == 'horizontal' && !this.scope.match(/banner/i)) {
				br.appendChild(tda);
			} else if (this.position == 'vertical') {
				list.appendChild(tda);
			} else {
				row.appendChild(tda);
			}
		}

		if (this.position == 'horizontal') {
			var rootElement = table;
		} else {
			var rootElement = list;
		}

		if ( root.hasChildNodes() ) {
			root.replaceChild(rootElement,root.firstChild);
		} else {
			root.appendChild(rootElement);
		}
	}

	return this;
}

/** ---AJAX-Funktionen für Advised Search Navi--- **/

/**
 * 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_navi(parameter_navi, vendor_navi, category_navi) {
	if (parameter_navi.length > 2) {
		var url_navi		= 'typo3conf/ext/tt_products/pi/ajax/autosuggest_article.php';
		parameter_navi		= '?param='		+ escape(parameter_navi);
		vendor_navi			= '&vendor='	+ escape(vendor_navi);
		category_navi		= '&category='	+ escape(category_navi);
		req = new ajaxRequest_navi(url_navi + parameter_navi + vendor_navi + category_navi);
	} else {
		return false;
	}
	if (req == false) {
		return false;
	}
}

/**
 * Diese Funktion wird vom AJAX-Request aus aufgerufen und verarbeitet die zurückgelieferten
 * Daten.
 */
function ajaxResponse_navi() {

	/*
	* 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 output = $('#output');
		// alle bisherigen Elemente loeschen
	    output.html('');

	    if (request.responseText == '') {
			// es wurde keine DB Übereinstimmung gefunden
	    	output.hide();
		} else {
			output.css('display','block');
			var foo 			= request.responseText;
			// Elemente entsprechend der Markierung extrahieren
			var elements 		= foo.split('/element/');
			var newelem;
			var dropdown_width = output.outerWidth();

			for (var i = 0; i < elements.length; i++) {
				if (elements[i] != '') {
					// neues Element anlegen

					var txt			= replaceSpecialChars(elements[i],0);

					var str_length	= textWidth(txt)+5;
					if (str_length > dropdown_width) {
						dropdown_width = str_length;
					}

					newelem		= $('<li/>',{
									id		: 'suggest_'+txt.replace(' ','_'),
									html	: '<a>'+txt+'</a>',
									name	: i
					});

					output.append(newelem);
				}
			}

			// height des Ausgabefeldes berechnen
			var height			 = ((elements.length -1) * 15);
			if (height > 200 && ! $.browser.msie) {
				height = 200;
			}

			if (height > 180 && $.browser.msie) {
				height = 180;
			}

			if(! $.browser.msie) {
				dropdown_width = dropdown_width - 2;
			}

			output.css({
				height	: height,
				width	: dropdown_width
			});

			// Events der Suchergebnisse
			$('#output li').each(function(){
				$(this).bind('mouseover', function() {
					$(this).addClass('ui-dz_selectmenu_navi_menu_hover');
				});
				$(this).bind('mouseout', function() {
					$(this).removeClass('ui-dz_selectmenu_navi_menu_hover');
				});

				$(this).bind('click', function() {
					$('#search_article_name').val($(this).text());
				});
			});
		}
	}
}

// Artikelvorschläge in Multiselect anzeigen
function showAutosuggest_navi(element) {
	var vendor 	 		= document.forms['advised_search_navi'].elements['swords_vendor'].value;
	var category 		= document.forms['advised_search_navi'].elements['category_id'].value;

	doRequest_navi(element.value, vendor, category);
}

/**
 * Prüft ob das  Autosuggestfeld geöffnet ist
 * 
 * return boolean
 */
function isOpen_Autosuggest() {
	return ($('#output').is(":visible"));
}

/**
 * Beim drücken der Pfeiltaste nach unten Fokus auf Multiselect legen um
 * Tastennavigation zu ermöglichen
 */
function setFocus_navi(event) {
	if ((event.keyCode == 40) || (event.keyCode == 38 )) {

		var index = parseInt($('#output li.ui-dz_selectmenu_navi_menu_hover').attr('name'));

		index = (index)? index: 0;

		// alle hover entfernen
		$('#output li').removeClass('ui-dz_selectmenu_navi_menu_hover');

		if (event.keyCode==40) {
			// DOWN
			index++;
		} else if (event.keyCode==38) {
			// UP
			index--;
		}

		var ul			= $('#output');
		var selected	= $('#output li:nth-child('+index+')');
		selected.addClass('ui-dz_selectmenu_navi_menu_hover');

		$('#search_article_name').val(selected.text());

		var offset = 0;
		if (selected.position()) {
			if (selected.position().top + selected.height() > ul.height()) {
				offset = selected.height() * index - selected.position().top
				ul.scrollTop( offset );
			}

			if ((selected.position().top  < 0)) {
				offset = selected.height() * index + selected.position().top;
				ul.scrollTop( offset );
			}
		}
	}
}

/**
 * Setzt ausgewählten Artikel im Textfeld article_name
 */
function setValue_navi(element){
	var text	= $('#search_article_name');
	text.val(element.value);

	while (element.length > 0) {
		element.options[element.length - 1] = null;
	}

	text.focus();
	element.style.display = 'none';
}

/**
 * Funktion zum Absenden des Formulars mit der der Enter-Taste.
 */
function sendForm_navi(code) {
	if (code == 13) {
            submit_navi_search();
	}
}

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