/*
* @author: joachim.kliemann, phillipp.roell
 */

function clone(o) {
	js = uneval(o);
	return eval(js);
}

function in_array(haystack,needle) {
	for(i in haystack)
		if(haystack[i] == needle)
			return true;

	return false;
}

function DebugObject(obj)
{
 var res = 'Objekt: '+obj+'\n\n';
 for(temp in obj)
 {
  res += temp +': '+obj[temp]+'\t';
 }
 alert(res);
}

Array.prototype.indexOf = function( v, b, s ) {
 for( var i = +b || 0, l = this.length; i < l; i++ ) {
  if( this[i]===v || s && this[i]==v ) { return i; }
 }
 return -1;
};

if (!YAHOO.hmmh) YAHOO.namespace("hmmh.Suche");

YAHOO.hmmh.Suche = function() {
	var max_kriterien = 5;
	var vorgabetext = '';
	var benutzte_einmalige_bezeichner = new Array();
	var allereiter = new Array();
	var init = 0;
	var browserName = '';

	var minustaste = '<img class="suchkriteriumEntf" src="img/b_minus.png" alt="minus"> ';
	var plustaste_first = '<img class="suchkriteriumDazu" style="left:0px;" src="img/b_plus.png"  alt="plus">';
	var plustaste = '<img class="suchkriteriumDazu" src="img/b_plus.png"  alt="plus">';
	var defSearch = 'suchennach';
	var eNum = 0;
	var eFired = new Array();
	var events = new Array();
	var entfVal = new Array();
	var persist = new Array();

	var suche_forms,
		suche_forms_hoehen = new Array();

	var ani_aus_kompaktsuche,
			ani_aus_erweitertesuche,
			ani_aus_blaetterleisteId,
			ani_aus_fontShuffle,
			ani_aus_sortiment,
			ani_aus_alle = [];
			
	//quicksearch: parameterContainer    
  var quicksearchParameterContainer = new Array();
  //quicksearch: delimeter
  var quicksearchDelimiter = Array(' ',',',';');
  
	return {
	  
	   //quicksearch: parameter erzeugen
    createQuicksearchParameter : function(name,fieldType,eventType,value,defaultValue)
    {
      parameter = new Object();
      parameter["name"]         = name;
      parameter["fieldtype"]    = fieldType;
      parameter["eventtype"]    = eventType;
      parameter["value"]        = value;
      parameter["defaultvalue"] = defaultValue;
  
      return parameter;     
    }, 
	   
	  //quicksearch: alle parameter initieren
    initQuicksearchParameterContainer : function()
    {
      if(quicksearchParameterContainer["initquicksearch"] != "true"){
	      quicksearchParameterContainer["initquicksearch"]               = "true";   
	      quicksearchParameterContainer["img.search.keyword"]            = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.keyword","textfield","keyup","","Schlagw�rter");
	      quicksearchParameterContainer["img.search.imageno"]            = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.imageno","textfield","keyup","","Bildnummer");
	      quicksearchParameterContainer["img.search.cdname"]             = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.cdname","textfield","keyup","","CD-Name");
	      quicksearchParameterContainer["img.search.collection.choice"]  = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.collection.choice","selectbox","change","","alle");
	      quicksearchParameterContainer["img.search.orientation"]        = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.orientation","selectbox","change","","all");
	      quicksearchParameterContainer["img.search.style"]              = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.style","selectbox","change","","all");
	      quicksearchParameterContainer["img.search.colorscheme"]        = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.colorscheme","selectbox","change","","all");
	      quicksearchParameterContainer["img.search.fschoice"]           = YAHOO.hmmh.Suche.createQuicksearchParameter("img.search.fschoice","checkbox","click","","");
      }    
    },
    
    //quicksearch: initieren
    //mode 1: init parameter-data, event, refresh paramter-value
    //mode 2: init parameter-data, event, refresh paramter-value and search 
    initQuicksearch : function(initMode)
    { 
      switch(initMode){
        case '0': 
          YAHOO.hmmh.Suche.initQuicksearchParameterContainer();
          YAHOO.hmmh.Suche.quicksearchRefreshParameterContainer();
          YAHOO.hmmh.Suche.initQuicksearchEvents();
          YAHOO.hmmh.Suche.quicksearchClearHTMLContainer();
          break;
        case '1':
          YAHOO.hmmh.Suche.initQuicksearchParameterContainer();
          YAHOO.hmmh.Suche.quicksearchRefreshParameterContainer();
          YAHOO.hmmh.Suche.initQuicksearchEvents();
          YAHOO.hmmh.Suche.quicksearchSendRequest();
          break;
        default:
      }   
    },
    
    //quicksearch: events initieren
    initQuicksearchEvents : function()
    {
      for(var elemId in quicksearchParameterContainer){
        var element = YAHOO.hmmh.Suche.quicksearchGetElement(elemId);
        var elemType = YAHOO.hmmh.Suche.quicksearchGetParameterFieldType(elemId);
        if(element){
         if(elemType == "textfield"){
          $E.removeListener(elemId,"blur",YAHOO.hmmh.Suche.quicksearchHandler);   
          $E.addListener(elemId,"blur",YAHOO.hmmh.Suche.quicksearchHandler,elemId);
         } 
         $E.removeListener(elemId,YAHOO.hmmh.Suche.quicksearchGetParameterEventType(elemId),YAHOO.hmmh.Suche.quicksearchHandler);   
		     $E.addListener(elemId,YAHOO.hmmh.Suche.quicksearchGetParameterEventType(elemId),YAHOO.hmmh.Suche.quicksearchHandler,elemId);
        }
      }
    },
    
    //quicksearch: events handler
    quicksearchHandler : function(event,elemId)
    {
      var elemType = YAHOO.hmmh.Suche.quicksearchGetParameterFieldType(elemId);
      var elem     = YAHOO.hmmh.Suche.quicksearchGetElement(elemId);
      var val      = "";
      var send     = false;
      
      if(elemType == "textfield"){
        val     = elem.value;
        if(val && trim(val) && val.length > 1){
	        if(YAHOO.hmmh.Suche.quicksearchIsEndDelimiterChar(val) || event.type == "blur"){
	          send = true;
	        }
	        else{
            YAHOO.hmmh.Suche.quicksearchClearHTMLContainer();
          }
        } 
      }
      else if(elemType == "checkbox"){
        val = elem.checked ? "1" : "";
        send = true;
      }
      else if(elemType == "selectbox"){
        val  = elem.value;
        send = true;
      }
      
      if(send){
        YAHOO.hmmh.Suche.quicksearchUpdateParameterContainer(elemId, val);
        YAHOO.hmmh.Suche.quicksearchSendRequest();
      }        
    },
    
    //quicksearch: ajax request
    quicksearchSendRequest : function() 
    {
      $C.asyncRequest(
        "POST",
        "/image_result_count.htm",
	      { 
			    success : function(response) {  
			      YAHOO.hmmh.Suche.quicksearchUpdateHTMLContainer(response.responseText);
			    }
			  }, 
		    YAHOO.hmmh.Suche.quicksearchBuildParameter()
		  );     
    },
    
    //quicksearch: build search parameter
    quicksearchBuildParameter : function()
    {
      var requestParameterString = "";
      YAHOO.hmmh.Suche.quicksearchRefreshParameterContainer();
      for(var elemId in quicksearchParameterContainer){
        var value =  encodeURIComponent(YAHOO.hmmh.Suche.quicksearchGetParameterValue(elemId));
        if(value && elemId !='initquicksearch'){
          requestParameterString +=  elemId + "=" + value + "&";
        }
      }
      requestParameterString +=  "searchtype=1";
      return requestParameterString;  
    }, 
    
    //quicksearch: update parameterContainer
    quicksearchUpdateParameterContainer : function(elemId,value)
    {
      if(elemId == "initquicksearch"){
        return;
      }
      var defaultValue = YAHOO.hmmh.Suche.quicksearchGetParameterDefaultValue(elemId);
      if(typeof value=="undefined" || !value || value == defaultValue || value.search(/Schlagw.?rter/) != -1){
        value = "";
      }
      quicksearchParameterContainer[elemId]["value"] = value;    
    },
    
     //quicksearch: update all parameterContainer
    quicksearchRefreshParameterContainer : function()
    {
      for(var elemId in quicksearchParameterContainer){
        var elemType = YAHOO.hmmh.Suche.quicksearchGetParameterFieldType(elemId);
        var elem     = YAHOO.hmmh.Suche.quicksearchGetElement(elemId);
        var val      = "";
        if(elem){    
	        if(elemType == "textfield"){
	          val     = elem.value;
	        }
	        else if(elemType == "checkbox"){
	          val = elem.checked ? "1" : "";
	        }
	        else if(elemType == "selectbox"){
	          val  = elem.value;
	        }
	      }
	      YAHOO.hmmh.Suche.quicksearchUpdateParameterContainer(elemId,val);
      }
    },
    
    //quicksearch: check is last char = delimeter char
    quicksearchIsEndDelimiterChar : function(text){
      
      if(!text){
        return false;
      }
      
      if(text.length > 0){
        var lastChar =  text[text.length-1];
        for (var i = 0; i < quicksearchDelimiter.length; i++) {
          if (quicksearchDelimiter[i] == lastChar) {
            return true;
            break;
          }
        }
      } 
      
      return false;
      
    },
    
    //quicksearch: get value from parameterContainer
    quicksearchGetParameterValue : function(elemId){
      return quicksearchParameterContainer[elemId]["value"];
    },
    
    //quicksearch: get value from parameterContainer
    quicksearchGetParameterDefaultValue : function(elemId){
      return quicksearchParameterContainer[elemId]["defaultvalue"];
    },
    
    //quicksearch: get value from parameterContainer
    quicksearchGetParameterFieldType : function(elemId){
      return quicksearchParameterContainer[elemId]["fieldtype"];
    },
    
    //quicksearch: get value from parameterContainer
    quicksearchGetParameterEventType : function(elemId){
      return quicksearchParameterContainer[elemId]["eventtype"];
    },      
	 
	  //quicksearch: update html container
    quicksearchUpdateHTMLContainer : function(responseText){
    
      var resultCountContainer = $D.get("resultCountContainer");
      var results      = responseText.split('::');
      var imageCount   = results[0]; 
      var imageCDCount = results[1];
      
      var htmlText  = '';
      
      htmlText += '<span>';
      if(!imageCount || imageCount == '0'){ 
        htmlText += 'keine Bilder gefunden';
      }
      else{
        htmlText += imageCount;
        htmlText += imageCount == 1 ? ' Bild' : ' Bilder';
      }
      htmlText += '</span>';
       
      htmlText += ' / ';
      
      htmlText += '<span>';
      if(!imageCDCount || imageCDCount == '0'){ 
        htmlText += 'keine CDs gefunden';
      }
      else{
        htmlText += imageCDCount;
        htmlText += imageCDCount == 1 ? ' CD' : ' CDs';    
      }
      htmlText += '</span>';
      
      resultCountContainer.innerHTML = htmlText;
    },
    
    //quicksearch: update html container
    quicksearchClearHTMLContainer : function(){
      var resultCountContainer = $D.get("resultCountContainer");  
      if (resultCountContainer != null){
      	resultCountContainer.innerHTML = "";
      }
    },
    
    //quicksearch: get html-element
    quicksearchGetElement : function(elemId)
    {
      return document.forms["kompaktsuche"].elements[elemId];   
    },     
	 
		init: function() {
	
			var suche = $D.get("suche");

			var erweitertesuche = $D.get('erweitertesuche');
			if (erweitertesuche != null && erweitertesuche != "") {
				var esu_h3s = erweitertesuche.getElementsByTagName("h3");
				for (i=0, j=esu_h3s.length; i<j; i++ ) {
					$E.on(esu_h3s[i], 'click', YAHOO.hmmh.Suche.toggleEsuH3, esu_h3s[i], true);
				}
				/* Suchkriterien werden nach Sprachwahl erstellt */

			}
			suche_forms = suche.getElementsByTagName("form");

			for (i=0, j=suche_forms.length; i<j; i++) {
				suche_forms_hoehen[suche_forms[i].id] = suche_forms[i].offsetHeight;
				if ($D.hasClass(suche_forms[i], "unsichtbar")) {
					$D.addClass(suche_forms[i], "ausgeblendet");
					$D.removeClass(suche_forms[i], "unsichtbar");
					$D.setStyle(suche_forms[i], "height", "0");
				};
			}

			var kompaktsuche = $D.get('kompaktsuche');
			ani_aus_kompaktsuche =	new YAHOO.util.Anim('kompaktsuche',		{ height: {to: 0}}, .7, YAHOO.util.Easing.easeOut );
			ani_aus_erweitertesuche = new YAHOO.util.Anim('erweitertesuche',	{ height: {to: 0}}, .7, YAHOO.util.Easing.easeOut );
			ani_aus_fontShuffle = new YAHOO.util.Anim('fontShuffle',		{ height: {to: 0}}, .7, YAHOO.util.Easing.easeOut );
			ani_aus_fontbag = new YAHOO.util.Anim('fontBag',		{ height: {to: 0}}, .7, YAHOO.util.Easing.easeOut );
			
			ani_aus_sortiment =	new YAHOO.util.Anim('sortiment',		{ height: {to: 0}}, .9, YAHOO.util.Easing.easeOut );
			ani_aus_alle = [ani_aus_kompaktsuche,ani_aus_erweitertesuche,ani_aus_fontShuffle,ani_aus_fontbag,ani_aus_sortiment];

			var otherSearch = YAHOO.util.Selector.query("#kompaktsuche .infoHead .search#other-search");
			if(otherSearch.length > 0) {
				otherSearch = otherSearch[0];
				if(otherSearch.value == otherSearch.alt || otherSearch.value == "") {
					$D.addClass(otherSearch, "empty");
					otherSearch.value = otherSearch.alt;
				}

				$E.on(otherSearch,"focus", YAHOO.hmmh.Suche.removeOtherClass, otherSearch, true);
				$E.on(otherSearch, "blur", YAHOO.hmmh.Suche.appendOtherClass, otherSearch, true);
			};

			if(suche.getElementsByTagName("ul")[0]) {
				var reiterliste = suche.getElementsByTagName("ul")[0];
				allereiter = reiterliste.getElementsByTagName("li");
				var allereiteranker = reiterliste.getElementsByTagName("a");
				for (i=0, j=allereiteranker.length; i<j; i++) {
					$E.on(allereiteranker[i], 'click', YAHOO.hmmh.Suche.aktualisiereAlleReiterOnWait, allereiteranker[i], true);
				}

				YAHOO.hmmh.Suche.suchkriteriumDazu(null, null, true);
				YAHOO.hmmh.Suche.setDefaultCriteria();

				var suchkriterien = YAHOO.util.Selector.query("tr.suchkriterium", "kosSuchkriterien");

				//YAHOO.hmmh.Suche.ermittleBenutzteEinmaligeBezeichner();
				YAHOO.hmmh.Suche.entferneBenutzteEinmaligeBezeichner();


				if (!$D.hasClass("erweitertesuche", "ausgeblendet") && document.getElementById("img.search.collection.radio.all") != null && document.getElementById("img.search.collection.radio.all") != "") {
					if (document.getElementById("img.search.collection.radio.all").checked) {
					  document.getElementById("img.search.collection.choice").disabled = true;
					}
				}
				$E.on("ext-img.search.collection.radio.all", "click", YAHOO.hmmh.Suche.setSelectField, 0);
				$E.on("ext-img.search.collection.radio.exclusive", "click", YAHOO.hmmh.Suche.setSelectField, 1);
				
				if($D.get("ext-img.search.collection.radio.all") != null)
					if($D.get("ext-img.search.collection.radio.all").checked)
						// Aenderung fuer das Ausgrauen
						//YAHOO.hmmh.Suche.setSelectField(true, 0);

				init = 1;
				//YAHOO.hmmh.Suche.getSearchHeight();
			}
			YAHOO.hmmh.Suche.aktualisiereAgenturen();
			
			
			//quicksearch: bei wechseln neu initieren (init())
      		YAHOO.hmmh.Suche.initQuicksearch('0');
			
		},


		/* Die Suchform aufbereiten */
		processForm : function() {
			// Alle Inputs durchlaufen und die leer-Klassen korrigieren,
			// falls diese falsch sind
			var inputs = YAHOO.util.Selector.query("#kosSuchkriterien .suchkriterium .eingabeelm input[type=text]");
			for(i=0;input=inputs[i];i++) {
				input.value = input.value.trim();
				YAHOO.hmmh.Suche.schalteVorgabetext(null, input);
			}

			allthevalues = new Object();
			posArray = new Object();
			// Alle vorhanden Kriterienzeilen durchlaufen
			selectedCriterias = YAHOO.util.Selector.query('#kosSuchkriterien .bezeichner select');
			for(ci=0;selectedCriteria = selectedCriterias[ci];ci++) {

				// Kommasepariert ein Array zusammenstellen
				if(posArray[selectedCriteria.value])
					posArray[selectedCriteria.value] += ",";
				else
					posArray[selectedCriteria.value] = "";

				posArray[selectedCriteria.value] += String(ci);
				try  {
					inp = YAHOO.util.Selector.query('td.eingabeelm input', selectedCriteria.parentNode.parentNode, true)[0];

					allthevalues.push({ 'selected' : selectedCriteria.value, 'pos' : ci, 'value' : inp.value });
				} catch(e) {}
			}

			crit = YAHOO.hmmh.Suche.getCriteria();

			var startButton = YAHOO.util.Selector.query(".suchstartknopf p", null, true)[0];
			add = '';
			for(criteria in posArray) {
				// Ein input-Feld erstellen, welches hidden hinter dem Startknopf der Suche sitzt
				//  und die kommaseparierten Positionen der Felder enthaelt

				add += '<input type="hidden" name="' + crit[criteria].elmNam + '.pos" value="' + posArray[criteria] + '">';
			}

			add += '<input type="hidden" name="allthevalues" value="' + escape(uneval(allthevalues)) + '">';
			
			/* fuege hidden field dazu wenn es ein suchen nach feld gibt */
			var selectboxValue = YAHOO.util.Selector.query("td.bezeichner select", "kosSuchkriterien");
			for(i=0, j=selectboxValue.length; i<j; i++) {
				if (selectboxValue[i].value == "suchennach") {
					add += '<input type="hidden" name="img.search.searchall" value="1">';
				}
			}
			/* hidden field ende */
			
			
			// Die leern Inputs (mit der Klasse leer), sowie die leeren Texts (gefiltert mit strlen < 2) suchen
			var emptyInput = YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium .eingabeelm input.leer');
			
			var emptyTexts = YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium .eingabeelm input').filter(function(b){ if(b.type=="text" && b.value.length < 2) return 1;});
			
			if((YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium').length < 2 && emptyInput.length) || (YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium').length < 2 && emptyTexts.length)) {
				YAHOO.hmmh.Suche.queryLayer();
				return false;
			}
			
			if(YAHOO.util.Selector.query('#kompaktsuche .infoHead').length == 1) {
				emptyInput = YAHOO.util.Selector.query('#kompaktsuche .infoHead input.empty');
				emptyTexts = YAHOO.util.Selector.query('#kompaktsuche .infoHead input').filter(function(b){ if(b.type=="text" && b.value.length < 2) return 1;});
				if (emptyInput.length || emptyTexts.length) {
					YAHOO.hmmh.Suche.queryLayer();
					return false;
				}
			}
			// DD- moved here to avoid double initialization
			if (startButton!=null) {
				startButton.innerHTML += add;
			}

			// Form von Defaults befreien
			inputs = YAHOO.util.Selector.query("input.leer", 'kosSuchkriterien');
			for(i=0;i<inputs.length;i++) {
				inputs[i].value = "";
			}

			// Startbutton deaktivieren, damit man nicht zweimal absendet
			// not wanted as of HD 649
			//YAHOO.util.Selector.query('#kosSucheStarten')[0].disabled = true;
			var ele = document.getElementById('img.search.collection.choice');

			if((ele != "") && (ele != null)) {
				if(ele.value == "all" || ele.value == "alle") {
					document.getElementById('img.search.collection.choice').options[document.getElementById('img.search.collection.choice').selectedIndex].value = "";
				}
			}
			// Suchebutton ausblenden
			document.getElementById('kosSucheStarten').style.display="none";
			// Workaround um den Suchebutton nach Browser-Abbruch wieder einzublenden
			$E.on(window.document,"click", function(){
				document.getElementById('kosSucheStarten').style.display="";
				YAHOO.util.Event.removeListener(window.document, "click");
			});
			
			return true;
		},

		queryLayer : function () {
			YAHOO.hmmh.suchlayer.setDimensions(220, 80);
			var getButton = YAHOO.util.Selector.query('#kosSucheStarten')[0];
			YAHOO.hmmh.suchlayer.showsuchlayer(getButton, null,
				'<h3>Achtung</h3><p>Bitte geben Sie mindestens ein Suchkriterium ein.</p>',
				'<div style="width: 200px;"><input type="image" id="ok" src="img/bt_ok.png" alt="ok"></div>');
				YAHOO.util.Event.addListener("ok", "click", YAHOO.hmmh.dialog2.hide, YAHOO.hmmh.dialog2, true);
		},

		dropLayer : function (ev, elm) {
			YAHOO.hmmh.suchlayer.setDimensions(250, 130);

			YAHOO.hmmh.suchlayer.showsuchlayer($D.get('reiterleiste'), null,
				'<h3>Achtung</h3><p>Beim Wechseln von der erweiterten Suche auf die Schnellsuche gehen Ihre eingegebenen Suchkriterien verloren.<br /><br /> M&ouml;chten Sie trotzdem fortfahren?</p>',
				'<div id="suchlayerButtons"><img id="weiter" src="img/btn_ja.png" alt="JA"> <img id="zurueck" src="img/btn_nein.png" alt="NEIN"></div>');


				YAHOO.util.Event.addListener("zurueck", "click", YAHOO.hmmh.dialog2.hide, YAHOO.hmmh.dialog2, true);
				YAHOO.util.Event.addListener("weiter", "click", function() {
					YAHOO.hmmh.Suche.aktualisiereAlleReiter(ev, elm, true);
					YAHOO.hmmh.Suche.clearCriteria();
					YAHOO.hmmh.dialog2.hide();
				}, YAHOO.hmmh.dialog2, true);

		},

		clearCriteria : function() {
			rows = YAHOO.util.Selector.query('tr.suchkriterium');
			for(i=0;i<rows.length;i++) {
				row = rows[i];
				row.parentNode.removeChild(row);
			}

			YAHOO.hmmh.Suche.suchkriteriumDazu(null, null, true);
		},

		/* Prueft die setzbaren Kriterien fuer die JSONs und gibt die ersten gefundenen zurueck */

		getCriteria : function() {

			if(typeof(suchkriterienbilder) != 'undefined')
				return clone(suchkriterienbilder);

			if(typeof(suchkriterienschriften) != 'undefined')
				return clone(suchkriterienschriften);
		},

		/* Die Default-Werte aus dem JSON werden aus dem JSON herausgezogen und als Object zurueckgegeben, welches
		 * dann obj.max_crit (Anzhal der Kriterien) und ein Array obj.val mit den in der Form einzufuegenden Werten
		 * enthaelt */

		getDefaults : function() {
			var ret = { val : new Array() , max_crit : 0 };
			
			var criteria = YAHOO.hmmh.Suche.getCriteria();
			var fieldDoubles = new Object();
			// Geholte Kriterien durchlaufen
			for(var c in criteria) {
				// Wenn kein Positionsarray vorhanden ist ueberspringen
				if(!criteria[c].pos) continue;

				visited = new Array();

				// Das Positionsarray durchlaufen
				for(j=0;j<criteria[c].pos.length;j++) {
					if(visited[criteria[c].pos[j]]) continue;

					visited[criteria[c].pos[j]] = true;

					// Max-Kriterium (hoechste Zeilen-Position eines Defaults in der Suchmaske) setzen
					ret.max_crit = Math.max(criteria[c].pos[j]+1, ret.max_crit);
					// Wenn alle noetigen Werte vorhanden sind koennen wir die Daten ins Array druecken
					if((criteria[c].value || (criteria[c].attrib && (criteria[c].attrib.value || criteria[c].attrib.dflt))) && criteria[c].elmNam) {

						value = criteria[c].attrib.value;
						if(typeof(criteria[c].attrib.value) == "string" && criteria[c].pos.length > 1) {
							exploded = criteria[c].attrib.value.split(",");
							if(criteria[c].pos.length == exploded.length) {
								value = exploded;
							}
						}

						ret.val.push( { pos : criteria[c].pos[j] ,
									value : value && typeof(value) == "array" && value[j] ? value[j] : (criteria[c].attrib.value ? criteria[c].attrib.value : criteria[c].attrib.dflt),
									select : c,
									id : criteria[c].elmNam,
									"type" : criteria[c].attrib ? criteria[c].attrib.type : null } );
					}
					else if(criteria[c].optnen) {
						var setFlag = 0;
						if(!fieldDoubles[c]) {
							fieldDoubles[c] = new Array();
						}

						vals = 0;

						if(criteria[c].attrib && criteria[c].attrib.type && criteria[c].attrib.type != 'select') {
							vals = new Array();
						}

						for(jup in criteria[c].optnen) {
							if (criteria[c].optnen[jup].checked > 0) {

								if(vals) {
									vals.push(criteria[c].optnen[jup].value);
									continue;
								}

								if(!in_array(fieldDoubles[c], criteria[c].optnen[jup].value)) {
									agencyValue = criteria[c].optnen[jup].value;
									fieldDoubles[c].push(agencyValue);
								 	setFlag = 1;
								 	break;
								}
							}
						}
						if (setFlag == 0) {
							agencyValue = "all";
						}
						try {
						ret.val.push( { pos : criteria[c].pos[j] ,
									value : vals ? vals : agencyValue,
									select : c,
									id : criteria[c].elmNam,
									"type" : criteria[c].attrib ? criteria[c].attrib.type : null
									} );
						} catch (o) {
						}

						vals = 0;
					}
				}

			}

			retval = new Array();
			retval2 = new Array();

			for(i=0;i<ret.max_crit;i++) {
				for(x=0;x<ret.val.length;x++) {
					if(ret.val[x].pos == i) {
						retval.push(ret.val[x]);
					}
				}
			}

			n = 0;
			for(x=0;x<retval.length;x++) {
				retval[x].pos = n++;
				retval2.push(retval[x]);
			}

			if(typeof(allthevalues_raw) == "string") {
				try {
					allthevalues = eval(unescape(allthevalues_raw));

					for(x=0;x<retval2.length;x++) {
						for(y=0;y<allthevalues.length;y++) {
							if(allthevalues[y].pos == retval2[x].pos && retval2[x].select == allthevalues[y].selected) {
								retval2[x].value = allthevalues[y].value;
							}
						}
					}
				} catch(e) {}
			}

			ret.val = YAHOO.hmmh.Suche.openMore(retval2, criteria);

			return ret;
		},

		openMore : function(ret, criteria) {
			if(ret.length == 1) {
				orig = ret[0];
				if(orig && moreFields && (next = moreFields[orig.select]) && criteria && criteria[next]) {
					ret.push({ pos : 1, select : moreFields[orig.select], id : criteria[next].elmNam, type : criteria[next].elmTyp });
				}
			}

			return ret;
		},
		/**
		 * Pr�ft, ob alle Fragemente des Suchstrings value in einem Array searchIn vorkommen 
		 */
		checkSplitSearchString : function (searchIn, value) {
			if(!value) return false;
			var splitValues = value.split(" ");

			// Checke, ob ALLE Bruchst�cke der Agentur / des Suchlistentextes in der Liste der Suchtexte vorkommen
			var isInside = false;
			for(var i=0; i<splitValues.length; i++) {
				isInside = searchIn.indexOf(splitValues[i]) >=0;
				if(!isInside) break;
				
			}
			return isInside;
		},

		/** Diese Funktion wird genutzt um beim Druecken einer Taste in einem "Suchen nach"-Feld
		 * die Optionen, die gewaehlt werden koennen, zu pruefen. 
		 */
		setMatches : function() {
			crite = YAHOO.hmmh.Suche.getCriteria();
			var el = this;

			if(!el.value) return false;
			
			// Wenn sich jetzt alter und neuer Wert unterscheiden haben wir einen Treffer
			//el.value = el.value.toLowerCase();
			//option.elmBez = option.elmBez.toLowerCase();
			
			// Splitte Suchbegriffe nach Leerzeichen oder Komma
			var myString = el.value.toLowerCase();
			myString = myString.replace(/,/g," ");
			var mySplitResult = myString.split(" ");
			mySplitResult.push(myString);
			// Die Kriterien durchlaufen
			for(p in crite) {
				// Wenn das Kriterium nicht mehrere Optionen hat, dann brauchen
				// wir nichts zu tun, ab zum naechsten Kriterium!
				if(!crite[p].optnen) continue;

				// Kriterien durchlaufen
				for(c in crite[p].optnen) {
					
					var option = crite[p].optnen[c];
					
					// Alles markieren macht wenig Sinn
					if(option.value == 'all') continue;

					// Aus der Option vorhandene <b> und </b> entfernen
					option.elmBez = option.elmBez.replace(/<[\/]*b>/, '');
					
					option.elmBez = YAHOO.hmmh.Util.decodeEntities(option.elmBez);
					// 2009-10-05 Beschriftung UND Wert checken
					var bezFound = mySplitResult.indexOf(option.elmBez.toLowerCase().trim())>=0;
					var valFound = YAHOO.hmmh.Suche.checkSplitSearchString(mySplitResult,option.value.toLowerCase());
					if(bezFound || 	valFound /*&& option.elmBez != "alle" */) {
					
						try {
							// Versuchen, im aktuellen Wert des Eingabefeldes den Text
							// der aktuellen Option (Wert ODER Beschriftung) durch '' zu ersetzen
							var toReplace = option.elmBez;
							if(valFound) {
								toReplace = option.value;
							}
							var replaced = eval("el.value.replace(/" + toReplace + "/gi, '')");
							// Aus dem ersetzten Wert noch einmal alle doppelten Leerzeichen rausschneiden und dann einsetzen
							replaced = replaced.replace(/,/g, ' ');
							el.value = replaced.replace("/ +/gi", ' ');
						} catch(e){}
				
						r = YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium').length;
						
						// Das Kriterium setzen
						YAHOO.hmmh.Suche.setCriteria(r, { pos : r,
															value : option.value,
															type : crite[p].elmTyp,
															single : crite[p].single ,
															select : p ,
															id : crite[p].elmNam,
															c : c,
															p : p });
						break; // !!?
					}
				}
			}
		},

		/** Diese Funktion setzt an einem beliebigen Kriterium ein anderes ein.
		 * Ist die Zeile noch nicht vorhanden wird sie erstellt. 
		 */
		setCriteria : function(i, crit, check) {
			// Die vorhandenen Kriterien holen
			var criteria = YAHOO.util.Selector.query("tr.suchkriterium", "kosSuchkriterien");
			// Row ist das Kriterium, welches geaendert werden soll
			var row = criteria[i];
			
			// In selects werden alle Selects mit dem der einzufuegenden Zeile als Wert herausgesucht
			selects = YAHOO.util.Selector.query(".suchkriterium .bezeichner [value=" + crit.select + "]");
			
			//selects = selects.filter(function (b){
			//	/* if(b.tagName=="OPTION") return b;*/
			//	if(b.type == "select" || b.type=="select-one" || b.type=="select-multiple") return b; 
			//	});
			

			// Wenn das Kriterium einmalig ist (single) und eines gefunden wurde,
			// haben wir bereits eine Zeile, die wir aendern koennen
			YAHOO.hmmh.Suche.ermittleBenutzteEinmaligeBezeichner();

			if(crit.single==2 && selects.length > 0 && in_array(benutzte_einmalige_bezeichner,crit.select)) {
				// Die Klasse suchkriterium wird dann rekursiv Richtung document
				// gesucht und row zugewiesen
				var sel = selects[selects.length-1];
				
				row = getParentByClassName(sel, "suchkriterium");
			} 
			else {
				if(criteria.length <= i) {
					// Wenn die Anzahl der Kriterien kleiner als i (zu uendernde zeile) ist,
					// muessen wir eine Zeile hinzufuegen, die Kriterienzeilen updaten und row
					// auf das letzte Kriterium setzen
					YAHOO.hmmh.Suche.suchkriteriumDazu();
					var criteria = YAHOO.util.Selector.query("#kosSuchkriterien tr.suchkriterium");
					row = criteria[criteria.length-1];
				}
			}
			
			// select ist die erste Selectbox aus der Zeile
			var select = YAHOO.util.Selector.query("select", row, true)[0];
			
			// Wenn die erste Selectbox NICHT gleich dem angestrebten Kriterium ist,
			// (z.B. neu erstellt, weil Kriterium noch nicht vorhanden oder Kriterientyp
			// der Zeile soll geaendert werden) wird der Wert der Selectbox geaendert und
			// die Eingabe aktualisiert. noCheck wird verwendet, um checkboxen, welche
			// dann vom json2html erzeugt werden, anzukreuzen oder nicht.
			if(select.value != crit.select) {
				select.value = crit.select;

				if( document.createEvent ) {
					var evObj = document.createEvent('HTMLEvents');
					evObj.initEvent( 'change', true, false );
					select.dispatchEvent(evObj);
				} else if( document.createEventObject ) {
					// IE
				 	select.fireEvent('onchange');
				}

				YAHOO.hmmh.Suche.aktualisiereEingabeElm(null, select, check ? true : false, 1);
			}

			// Wir definieren eine einfache Funktion zum setzen von Checkboxen
			set = function(el) {
				var sel = YAHOO.util.Selector.query('[name=' + el + ']', row, true)[0];
				try {
					sel.checked = true;
					sel.selected = true;
				} catch(e) {}
			};

			setbox = function(val) {
				var sel = YAHOO.util.Selector.query('[value=' + val + ']', row, true)[0];
				try {
					sel.checked = true;
					sel.selected = true;
				} catch(e) {}
			};


			// Wir suchen zuerst nach einem Feld mit name gleich der id des zu setztenden Wertes
			var obj = YAHOO.util.Selector.query('[name=' + crit.id + ']', row)[0];


			// Ist dieses Objekt nicht gefunden worden muessen wir noch einen drauflegen,
			// dann ist es eine durchnummerierte Option (c ist die Nummer)
			if(crit.type == 'input' && !obj) {
				set(crit.id + '.' + crit.c);
			}


			if(crit.type == 'radio' || crit.type == 'checkbox') {
				// Checkboxen oder Radios behandeln
				if(typeof(crit.value) == 'string') {
					// Ist es ein String, muessen wir nur einen Wert setzen. Dies ist nur eine
					// Fehlerbehandlung fuer ein nicht wohlgeformtes Array, eigentlich sollte
					// es immer ein Array sein
					setbox(crit.value);
				} else {
					// Wenn die Werte, welche gesetzt werden sollen KEIN String sind
					// (dann ist es hoffentlich ein Array oder Object)
					//  werden alle Werte durchlaufen und per set gesetzt.
					for(l=0;l<crit.value.length;l++) {
						setbox(crit.value[l]);
					}
				}
			} else {
				// Wenn es sich weder um Checkboxen noch um Radios handelt, kein obj
				// vorhanden ist, dann suchen wir das erste input-Feld aus der eingebeelm-Klasse
				if(!obj) {
					obj = YAHOO.util.Selector.query('.eingabeelm input', criteria[i], true)[0];
				}
				
				if(crit.value && obj) {
					obj.value = crit.value;
				}
			}
		},

		/* Die default-Kriterien aus dem JSON in die Form einbauen */

		setDefaultCriteria : function() {
			// Alle defaults holen
			var val = this.getDefaults().val;

			if(YAHOO.util.Selector.query("#mainColStart").length)
				val = [];

			for(n=0;n<val.length;n++) {
				YAHOO.hmmh.Suche.setCriteria(val[n].pos, val[n]);
			}

			// Alle Inputs durchlaufen. Moeglicherweise haben wir Vorgabetexte gesetzt, diese muessen dann als solche markiert werden
			inputs = YAHOO.util.Selector.query("#kosSuchkriterien .suchkriterium .eingabeelm input[type=text]");
			for(i=0;input=inputs[i];i++) {
				YAHOO.hmmh.Suche.schalteVorgabetext(null, input);
			}

		},
		
		setSelectOptionField : function (ev) {
			var sel = $E.getTarget(ev);
			if(sel.tagName == "OPTION") {
				sel = sel.parentNode;
			}
			var val = sel.options[sel.selectedIndex].value;
			YAHOO.hmmh.Suche.setSelectField(ev, val);
		},
		
		setSelectField: function(ev, value) {
			var targ = $E.getTarget(ev);
			if(targ.nodeName == "OPTION" || targ.nodeName == "SELECT"){
		  		$D.get('ext-img.search.collection.radio.exclusive').checked = true;
		  	}
		  	var f = $D.get("ext-img.search.collection.choice");
		  	var j = f.length;
		    if (!value) {
			    for(var i = 0; i < j; i++) {
					f.options[i].selected = false;
					f.options[i].style.color = "#ccc";
				}
			} else {
			    for(var i = 0; i < j; i++) {
					f.options[i].style.color = "#000000";
				}
			  	f.disabled = false; 
			}
		},

		toggleEsuH3 : function (ev, elm, fieldset) {
			if(!fieldset)
				fieldset = YAHOO.hmmh.Accordion.getNextSibByTag(findClass(elm, 'searchHeaderWrap'), 'fieldset');

			if ($D.hasClass(elm, "geschlossen")) {
				YAHOO.hmmh.Suche.openEsuH3(elm, fieldset);
			} else {
				YAHOO.hmmh.Suche.closeEsuH3(elm, fieldset);
			}
			//YAHOO.hmmh.Suche.getSearchHeight();
		},

		openEsuH3 : function(elm, fieldset) {
			$D.removeClass(elm, "geschlossen");
			$D.removeClass(fieldset, "ausgeblendet");

			if(YAHOO.hmmh.teaserRegion){
				YAHOO.hmmh.teaserRegion.init();
			}	

		},

		closeEsuH3 : function(elm, fieldset) {
			$D.addClass(elm, "geschlossen");
			$D.addClass(fieldset, "ausgeblendet");

			if(YAHOO.hmmh.teaserRegion){
				YAHOO.hmmh.teaserRegion.init();
			}	
		},

		fadeInAgencies : function (ev, elm) {
		},

		/* Die erweiterte Suche ein- oder ausklappen im Suchergebnis, duerfte selbsterklaerend sein */
		toggleExtended : function (ev, elm) {
			
			extendedForm = YAHOO.util.Selector.query("#suche #erweitertesuche .extendedForm", null, true)[0];
			
			/*
			 * Quik Fix: Falls von einem anderen Bereich wieder 
			 * in die Erweiterte Suche geklickt wird, 
			 * Prüfe ob für das Suchkriterium 'Bildagentur' die Option 'alle' markiert ist.
			 * Dann graue die Optionen in der Select-List-Box aus. 
			 */
			 if(document.getElementById('ext-img.search.collection.radio.all')){
			 	var isCheckedAll  = document.getElementById('ext-img.search.collection.radio.all').checked;
			 	if(isCheckedAll){
			 		var options = document.getElementById('ext-img.search.collection.choice');
			 		if(options){
			 			for(var gaga = 0; gaga < options.length ; gaga++){
			 	 			options[gaga].style.color = 'rgb(204, 204, 204)';
				 		}
			 		}
			 	}
			 }
			
			
			fuss = YAHOO.util.Selector.query("#suche .fuss ", null, true)[0];
			button = YAHOO.util.Selector.query(".toggleForm a", fuss, true)[0];
			sucheButtonExtended = YAHOO.util.Selector.query(".suchstartknopf", fuss, true)[0];
			
			if($D.hasClass(extendedForm, 'ausgeblendet')) {
				$D.removeClass(fuss, 'hiddenSearch');
				$D.removeClass(fuss, 'noToggle');
				$D.removeClass(extendedForm, 'ausgeblendet');
				$D.removeClass(sucheButtonExtended, 'unsichtbar');
				button.innerHTML = '<span>Suchkriterien ausblenden</span>';
				
			} else {
				$D.addClass(fuss, 'hiddenSearch');
				$D.addClass(extendedForm, 'ausgeblendet');
				$D.addClass(sucheButtonExtended, 'unsichtbar');
				button.innerHTML = '<span>Suchkriterien einblenden</span>';
			}
			
		//YAHOO.hmmh.Suche.getSearchHeight();
		
		},

		
		/* Die Kriterien von der Schnellsuche in die erweiterte Suche kopieren */

		copyCriteria : function(from, to) {
			// Wenn wir nicht von der Kompaktsuche in dier erweiterte Suche springen
			if(from == null || from.id != "kompaktsuche" || to.id!="erweitertesuche") return false;

			// Die erweiterte Suche leeren

			var radios = YAHOO.util.Selector.query("[type=radio]", to);
			var checkboxes = YAHOO.util.Selector.query("[type=checkbox]", to);
			var texts = YAHOO.util.Selector.query("[type=text]", to);
			var selects = YAHOO.util.Selector.query("select", to);

			texts.map(function(b) {
				b.value = "";
			});

			checkboxes.map(function(b) {
				b.checked = false;
			});
			
			selects.map(function(b) {
				for(i=0;i<b.options.length;i++) {
					b.options[i].selected = false;
				}
			});


			// Von den Radio-Buttons wird immer nur der erste gesetzt, dafuer
			// benutzen wir ein Array selScope, welches das this in der map-
			// Funktion ist. Dort fuegen wir den Namen der radios (nicht den Wert)
			// ein, wenn dieser bereits vorhanden ist, wird das Feld auf false gesetzt,
			// sonst auf true.
			var selScope = new Array();

			radios.map(function(b) {
				if(b.name != "esuSuchort") {
					if(this.indexOf(b.name) == -1) {
						b.checked = true;
					} else {
						b.checked = false;
					}

					selScope.push(b.name);
				}
			}, selScope);

			// Die inputs und selects der Kompaktsuche holen
			from_fields = YAHOO.util.Selector.query('input,select', from);
			// d wird bestimmen, ob das Auswahlfeld der Agenturen in der erw. Suche aktiv ist. default: disabled=true
			d = true;
			
			for(var i=0;from_field=from_fields[i];i++) {
				// Wenn default-Text gesetzt ist, brauchen wir nichts zu uebertragen
				if($D.hasClass(from_field, 'leer')) continue;

				// Ohne name oder type machen wir gar nicht erst weiter
				if(!from_field.name || !from_field.type) continue;

				// Wir suchen passende Felder dazu
				to_fields = YAHOO.util.Selector.query('[name=' + from_field.name + ']', to, true);

				if(from_field.type == "text" && to_fields[0] && to_fields[0].type == "text") {
					// Wenn beide Felder text-inputs sind, werden die Werte des from_fields an das des
					// to_fields angehaengt - so wird werden mehrere Suchbegriffe aus unterschiedlichen
					// Kriterien nachher in der erw. Suche zusammengefuehrt
					if(to_fields.length) {
						to_fields[0].value += " " + from_field.value;
						to_fields[0].value = to_fields[0].value.trim();
					}
				}

				if(from_field.type.indexOf("select") != -1 && to_fields[0] && to_fields[0].type && to_fields[0].type.indexOf("select") != -1) {
					// Wenn es sich um zwei Selects handelt
					to_selects = new Array();
					// Alle Optionen des from_fields durchgehen

					for(j=0;j<from_field.options.length;j++) {
						if(from_field.options[j].selected)
							// Wenn die Option markiert ist haengen wir sie in ein Array mit allen selektierten Optionen
							to_selects.push(from_field.options[j].value);
					}

					// Alle Optionen des to_fields durchgehen
					for(j=0;j<to_fields[0].options.length;j++) {
						// Wenn doe Option im Array mit den selektierten Optionen auftaucht
						// selektieren wir es. d wird dann false, das Feld wird also nicht mehr
						// deaktiviert
						if(to_selects.indexOf(to_fields[0][j].value) != -1) {
							to_fields[0][j].selected = true;
							d = false;
						}
					}

				}

				// Wenn beide Felder eine Checkbox sind und die from_field-Checkbox aktiviert
				// ist setzen wir die andere auch. Deaktivert ist sie vom Leeren der Form sowieso.
				if(from_field.type=="checkbox" && from_field.checked && to_fields.length) {
					to_fields[0].checked = true;
				}

				//Ist das Feld der Kompaktsuche eine Selectbox und das Feld der erweiterten Suche ein Radiobutton
				// dann wird hier herein gesprungen.
				if(from_field.type.indexOf("select") != -1 && to_fields.length) {
					for(var j=0;j<from_field.options.length;j++) {
						if(from_field.options[j].selected)
							checkedValue = from_field.options[j].value;
					}

					for(var k=0;k<selScope.length;k++) {
						var setRadioToChecked = document.getElementById(selScope[k] + '.' + checkedValue);
						if (setRadioToChecked != null) {
							setRadioToChecked.checked = true;

							fieldset = YAHOO.hmmh.Suche.getParentByTagName(setRadioToChecked.parentNode, 'fieldset');
							if(fieldset) {
								div = YAHOO.hmmh.Accordion.getPrevSibByTag(fieldset, 'div');
								if(div) {
									header = YAHOO.util.Selector.query('h3', div, true)[0];
									if(header) {
										YAHOO.hmmh.Suche.openEsuH3(header, fieldset);
									}
								}
							}
						}
					}
				}
			}

			YAHOO.hmmh.Suche.aktualisiereAgenturen();

			// Wenn CD-Namen vorhanden sind, bekommen sie eine Spezielbehandlung
			if((kwdfields = YAHOO.util.Selector.query("[name=img.search.cdname]", from)) && kwdfields.length) {
				try {
					addto = YAHOO.util.Selector.query('.spalte input', null, true)[0];
					// Alle Felder werden gewaehlt
					for(i=0;kwdfield = kwdfields[i];i++) {
						if(!$D.hasClass(kwdfield, "leer")) {
							// Wenn die Felder sich in der Klasse "spalte" befinden, also in der erw. Suche
							addto.value += " " + kwdfield.value;
							addto.value = addto.value.trim();
						}
					}
				} catch(x) {
					//
				}
			}
		},
	/**
	 * Agenturen aktivieren / deaktivieren
	 */
	aktualisiereAgenturen : function () {
			var d = true;
			coll = $D.get('ext-img.search.collection.choice');
			if(coll==null) {
				return;
			}
			for(a=0;a<coll.options.length;a++) {
				if(coll.options[a].value == coll.value && coll.options[a].value) {
					d = false;
				}
			}
			f = $D.get("ext-img.search.collection.choice");
		    j = f.length;
			    
				// Cant attach events on option tags in IE, so add event to select
				//if(YAHOO.env.ua.ie >0) {
			$E.on(f, "click", YAHOO.hmmh.Suche.setSelectOptionField);
			if(d) {
				$D.get('ext-img.search.collection.radio.all').checked = true;
				// Aenderung fuer das Ausgrauen Anfang
				
				//}
				for(var i = 0; i < j; i++) {
					f.options[i].selected = false;
					f.options[i].style.color = "#ccc";
					//if(!(YAHOO.env.ua.ie >0)) { // s.o.
					//	$E.on(f.options[i], "click", YAHOO.hmmh.Suche.setSelectField, 1, true);
					//}
				}
				// Aenderung fuer das Ausgrauen Ende
			} else {
				$D.get('ext-img.search.collection.radio.exclusive').checked = true;
				$D.get('ext-img.search.collection.choice').disabled = false;
			}
		},
		
		aktualisiereAlleReiterOnWait: function (ev, elm, ok) {
			setTimeout(function() {
				YAHOO.hmmh.Suche.aktualisiereAlleReiter(ev, elm, ok);
			},1000);
		},
		
		aktualisiereAlleReiter: function (ev, elm, ok) {
			
			function geklickterBezeichner(getME) {
				gecklickterbezeichner = getME ? getME : YAHOO.util.Selector.query('#suche .reiter li strong span')[0].innerHTML;
				/*elm.getElementsByTagName("span")[0].firstChild.nodeValue;*/
				gecklickterbezeichner = gecklickterbezeichner.toLowerCase(); // "FontShuffle", "fontSHUFFLE", ... egal!oh neee....
				gecklickterbezeichner = gecklickterbezeichner.replace(" ", ""); // "fontshuffle", "font shuffle", ... egal!

				var form_id = "";
				switch (gecklickterbezeichner) {
					case "schnellsuche": form_id = "kompaktsuche";
					break;
					case "erweitertesuche": form_id = "erweitertesuche";
					break;
					case "fontshuffle": form_id = "fontShuffle";
					break;
					case "sortiment": form_id = "sortiment";
					break;
					case "expertenkoffer": form_id = "expertenkoffer";
					break;
					default: form_id = "keinbezeichner";
				}
				return form_id;
			}

			// alle offenen form_hoehen aktualisieren
			for (i=0, j=suche_forms.length; i<j; i++) {
				if (suche_forms[i].offsetHeight > 0) {
					suche_forms_hoehen[suche_forms[i].id] = suche_forms[i].offsetHeight;
				}
			}

			// die Anmimation folgt getrennt von der Reiteraktualisierung und sorgt so fuer ein besseres Erscheinungsbild

			to_elm = YAHOO.util.Selector.query("span", elm, true)[0];
			before = geklickterBezeichner();
			to = geklickterBezeichner(to_elm.innerHTML);
			
			if(to =="keinbezeichner") {
				return;
			}
			
			if(!ok && before == 'erweitertesuche' && to == 'kompaktsuche') {
				YAHOO.hmmh.Suche.dropLayer(ev, elm);
				return;
			}

			var ahreftag = '<a href="javascript:;">';
			var sucheDiv = document.getElementById("suche");

			for (i=0, j=allereiter.length; i<j; i++) {
				reiterbezeichner = allereiter[i].getElementsByTagName("span")[0].firstChild.nodeValue;
				try {
					/**
					 * FIX for FontShuffle
					 */
					if(YAHOO.util.Selector.query("#suche ul.reiterFix"))
					
						ahreftag = '<a onClick="if(typeof setKind !=\'undefined\'){ setKind(' + allereiter[i].className.split("kind")[1] + ');}updateNewSearchLink(' + allereiter[i].className.split("kind")[1] + ');" href="javascript:;">';
						
					if (sucheDiv!=null && $D.hasClass(sucheDiv,"kompaktsuchefonts")) {	
						if (reiterbezeichner == "FontShuffle") {
							ahreftag =  '<a href="javascript:;" onclick="shuffle(\'FontSuperCategory\');activateFontShuffle(true, true, true);">';
						} else if (reiterbezeichner == "Schnellsuche") {
							ahreftag =  '<a href="javascript:;" onclick="shuffle(\'FontSuperCategory\');activateFontShuffle(false, false, true);">';
						} else if (reiterbezeichner == "Expertenkoffer") {
							ahreftag =  '<a href="expertenkoffer.htm"><span>'+reiterbezeichner+'</span></a>';
						}
					}
					
					if (allereiter[i]!=elm.parentNode) {
						//alert(allereiter[i]);
						
						// Abfrage nach dem letzten Reiter und Link setzen - Anfang
						/*if ((allereiter.length > 2)&&(i == allereiter.length-1)){
							allereiter[i].innerHTML='<a href="expertenkoffer.htm"><span>'+reiterbezeichner+'</span></a>';
						} else {
						* */
						
						allereiter[i].innerHTML= ahreftag +'<span>'+reiterbezeichner+'</span></a>';
						YAHOO.util.Event.purgeElement(allereiter[i].firstChild, true);
						$E.on(allereiter[i].firstChild, 'click', YAHOO.hmmh.Suche.aktualisiereAlleReiterOnWait, allereiter[i].firstChild, true);
						
						
						//}
					 // Abfrage nach dem letzten Reiter und Link setzen - Ende
					} else {							
						if(ahreftag != null) {
							allereiter[i].innerHTML= ahreftag +'<strong><span>'+reiterbezeichner+'</span></strong>' + '</a>';
						}
					}
				} catch(c) {
				}

			}
			if(document.getElementById(before)!= null && document.getElementById(to)!= null) {
				YAHOO.hmmh.Suche.copyCriteria(document.getElementById(before), document.getElementById(to));
			}
			else {
				//return true;
			}
			
			// so, jetzt die Animation
			


	 // Erst mal alles ausschalten...
	 		if(YAHOO.env.ua.ie || YAHOO.env.ua.gecko == "1.8" ) {
	 			form_id = geklickterBezeichner();
	 			forms = YAHOO.util.Selector.query("#suche form");
	 			for(i=0;form=forms[i++];) {
	 				$D.addClass(form, 'ausgeblendet');
	 			}

				relevantes_form = $D.get(form_id);
				$D.removeClass(relevantes_form, 'ausgeblendet');
				/* Hoehe muss fuer den FF2 gesetzt werden */
				$D.setStyle(relevantes_form, 'height', 'auto');
				return 0;
		 		// Der Rest ist !IE
	 		}

			for (i=0, j=ani_aus_alle.length; i<j; i++) {
				var elemZumAusschalten = ani_aus_alle[i].getEl();
				if (elemZumAusschalten) {
					$D.addClass(elemZumAusschalten, 'bewegt');
					if (elemZumAusschalten.offsetHeight>0) {
						ani_aus_alle[i].onComplete.unsubscribeAll(); /* einfach genial der Schroeter! */
						ani_aus_alle[i].onComplete.subscribe(nachAnimationAus); /* hier das Form rausholen*/
						ani_aus_alle[i].animate();
					} else {
						$D.addClass(elemZumAusschalten, 'ausgeblendet');
					}
				}
			}

			function nachAnimationAus (ev, elm) {
				tempEl = this.getEl();
				if (tempEl.offsetHeight<1) {
					$D.addClass(tempEl, 'ausgeblendet');
				}
				$D.removeClass(tempEl, 'bewegt');
				animationEin();
			}

			function animationEin() {

				form_id = geklickterBezeichner();
	
				if (form_id) {
					var relevantes_form = $D.get(form_id);
					$D.addClass(relevantes_form, 'bewegt');
					$D.removeClass(relevantes_form, 'ausgeblendet');
					var	animation_ein = new YAHOO.util.Anim(form_id, { height: {to: suche_forms_hoehen[form_id]}},  .7, YAHOO.util.Easing.easeIn );
					animation_ein.onComplete.subscribe(nachAnimationEin);
					animation_ein.animate();
				}
			}

			function nachAnimationEin(ev, elm) {
				var animiertesElement = this.getEl();
				$D.removeClass(animiertesElement, "bewegt");
				$D.setStyle(animiertesElement, "height", ""); /* Commander CSS, uebernehmen Sie! */

				//YAHOO.hmmh.Suche.getSearchHeight();
				if(YAHOO.hmmh.teaserRegion){
					YAHOO.hmmh.teaserRegion.init();
				}	

			}

		},

		erstelleBezeichnerSelect: function (firstUnused) {
			var kriterien = YAHOO.hmmh.Suche.getCriteria();

			$retval = '<select name="img.search.order">';

			s = 0;
			si = '';
			for (f in kriterien) {
					$retval += '<option value="' + f + '">';
					$retval += kriterien[f]['elmBez'];
					$retval += '</option>';
			}

			$retval += '</select>';
			return $retval;
		},

		updateModforms : function () {
		
			var criteriaTRs = YAHOO.util.Selector.query("#kosSuchkriterien tr.suchkriterium");
			for (z=0, x=criteriaTRs.length; z<x; z++ ) {
				var neuesHTML = minustaste;
				var bezeichner_select = YAHOO.util.Selector.query('select', criteriaTRs[z], true)[0];
				var modform = YAHOO.util.Selector.query('.modform', criteriaTRs[z], true)[0];

				if (x<2) {
					if (bezeichner_select.value!="suchennach") {
						neuesHTML = plustaste_first;
					} else {
						neuesHTML = "&nbsp;";
					}
				} else {
					neuesHTML = minustaste;
					if ((z==x-1) && (z<max_kriterien-1)) neuesHTML += plustaste ;
				}
				if(modform != null){
					//modform.style.border="1px solid green;";
					modform.innerHTML = "<div>" + neuesHTML + "</div>";
					
					//quicksearch: bei wechseln neu initieren
					YAHOO.hmmh.Suche.initQuicksearch('0');
			  }
			}

			var suchkriteriumEntfs = $D.getElementsByClassName("suchkriteriumEntf" , "img" , "kompaktsuche");
			var suchkriteriumDazus = $D.getElementsByClassName("suchkriteriumDazu" , "img" , "kompaktsuche");

			for (z=0, x=suchkriteriumDazus.length; z<x; z++ ) {
				$E.on(suchkriteriumDazus[z], 'click', this.suchkriteriumDazu, suchkriteriumDazus[z], true);
			}

			for (z=0, x=suchkriteriumEntfs.length; z<x; z++ ) {
				$E.on(suchkriteriumEntfs[z], 'click', this.suchkriteriumEntf, suchkriteriumEntfs[z], true);
			}

		},

		suchkriteriumDazu: function(ev, elm, firstOne) {

			var kriterientable = $D.get("kosSuchkriterien");
			if(kriterientable != null) {
				var kriterientrs   = kriterientable.getElementsByTagName("tr");
				var kriterientranz = parseInt(kriterientrs.length);


				if ( kriterientranz < max_kriterien+1 ) {
					kriterientrcopy = document.createElement('tr');
					letzeskriterium = kriterientrs[kriterientranz-1];

					cell = document.createElement('td');

					if(!firstOne)
						kriterientrcopy.style.opacity = "0";

					append = function(element, createClassName) {
						cell = document.createElement('td');
						cell.className = createClassName;
						element.appendChild(cell);
					};

					append(kriterientrcopy, 'bezeichner');
					append(kriterientrcopy, 'eingabeelm');
					append(kriterientrcopy, 'modform');

					kriterientrcopy.className = 'suchkriterium nr1';
					letzeskriterium.parentNode.insertBefore(kriterientrcopy, letzeskriterium);

					var td_bezeichner = kriterientrcopy.getElementsByTagName("td")[0];
					td_bezeichner.innerHTML = YAHOO.hmmh.Suche.erstelleBezeichnerSelect(!firstOne ? true : false);

					var bezeichner_select = td_bezeichner.firstChild;

					/* Suchen (und auswaehlen) von erstem Kriterium */
					selected = new Array();
					if(!firstOne) {
						selectedSelect = YAHOO.util.Selector.query('.suchkriterium select');
						for(s in selectedSelect) {
							selected.push(selectedSelect[s].value);
						}

						for(i=0;i<bezeichner_select.options.length;i++) {
							if(selected.indexOf(bezeichner_select[i].value) == -1) {
								bezeichner_select[i].selected = true;
								break;
							}
						}
					}

					var td_eingabeelm = kriterientrcopy.getElementsByTagName("td")[1];

					YAHOO.hmmh.Suche.aktualisiereEingabeElm(null, bezeichner_select);

					$E.on(bezeichner_select, 'change', YAHOO.hmmh.Suche.aktualisiereEingabeElm, bezeichner_select, true);

					if(!firstOne) {
						einblenden = new YAHOO.util.Anim(kriterientrcopy, { opacity: {from: 0,  to: 1 } }, 0.4, YAHOO.util.Easing.easeBoth);
						einblenden.animate();
						einblenden.onComplete.subscribe(function(){
							if(YAHOO.hmmh.teaserRegion){
								YAHOO.hmmh.teaserRegion.init();
							}	
						});
					}
				}


			}

			YAHOO.hmmh.Suche.entferneBenutzteEinmaligeBezeichner();
			YAHOO.hmmh.Suche.updateModforms();

			YAHOO.hmmh.Suche.checkSuchennach();
			//YAHOO.hmmh.Suche.getSearchHeight();

			if(YAHOO.hmmh.teaserRegion) {
				$E.on(window, 'load', YAHOO.hmmh.teaserRegion.init, YAHOO.hmmh.teaserRegion, true);
				YAHOO.hmmh.teaserRegion.init();
			}	

		},

		suchkriteriumEntf: function(ev, elm) {
	
			var kriterientr = YAHOO.hmmh.Suche.getParentByTagName(elm, "tr");

			for(i in entfVal) {
				try {
					var ti = YAHOO.util.Selector.query("select", kriterientr)[0];
					if(ti.id == entfVal[i].id) {
						entfVal[i].s[entfVal[i].s.length] = entfVal[i].o;
					}
					YAHOO.hmmh.Suche.reorderSelect(entfVal[i].s);
				} catch(e) {};
			}
			window.setTimeout(function() {
			// Paranoia tut nicht weh! parentNode vorhanden?
			if (kriterientr.parentNode) {
				kriterientr.parentNode.removeChild(kriterientr);
				YAHOO.hmmh.Suche.checkSuchennach();
				YAHOO.hmmh.Suche.updateModforms();
				if(YAHOO.hmmh.teaserRegion) {
					YAHOO.hmmh.teaserRegion.init();
				}	
				//quicksearch: init bei entf
        YAHOO.hmmh.Suche.initQuicksearch('1');
			}

			/**
			 * FIX for AutoComplete in Fonts
			 */
			if(document.getElementById("mainColFonts"))
			check4OtherInputs('font.qsearch.fontname', 'font.qsearch.manufacturer', 'font.qsearch.designer');


			//YAHOO.hmmh.Suche.getSearchHeight();
			}, 200);
			
		},

		/* Macht das Handling des Vorgabetextes bzw. der
		 * Klasse "leer" bei leerem Input oder Vorgabetext */
		schalteVorgabetext: function(ev, elm) {
			// Die Zeile finden
			row = findClass(elm, 'suchkriterium');
			if(row) {
				// Wenn wir die zeile haben suchen wir nach dem ersten Select
				// und holen die Kriterien
				select = YAHOO.util.Selector.query('select', row)[0];
				crit = YAHOO.hmmh.Suche.getCriteria();
				// Wenn das select vorhanden ist, einen Wert hat und dieser dann mit einem Default
				// hat (liegt in .attrib.dflt oder .attrib.value) dann nehmen wir den (besseren, n�mlich dflt!)
				if(select && select.value && crit && crit[select.value] &&
					crit[select.value].attrib &&
					(crit[select.value].attrib.dflt || crit[select.value].attrib.value)) {
					vorgabetext = crit[select.value].attrib.dflt ? crit[select.value].attrib.dflt : crit[select.value].attrib.value;

				}
			}

			// Leerzeichen trimmen
			vorgabetext = vorgabetext.trim();

			elm.value = elm.value.trim();

			if(ev) {
				if(ev.type == 'focus') {
					if (elm.value == vorgabetext) {
						elm.value = '';
						$D.removeClass(elm, "leer");
					}
				} else if(ev.type == 'blur') {
					if (elm.value == '') {
						$D.addClass(elm, "leer");
						elm.value = vorgabetext;
					}
				}
			} else {
				if (elm.value == vorgabetext) {
					$D.addClass(elm, "leer");
				} else {
					$D.removeClass(elm, "leer");
				}
			}

		},

		/* Sichert das Erscheinen und Verschwinden von "Suchen nach" */
		checkSuchennach : function(select) {
			removeSuchennach = function(select) {
				for(ri = 0;ri<select.options.length;ri++) {
					if(select[ri].value == 'suchennach') {
						select.options[ri] = null;
						return false;
					}
				}
				return true;
			};

			addSuchennach = function(select) {
				select.options[select.length] = new Option('Suchen nach', 'suchennach');
				YAHOO.hmmh.Suche.reorderSelect(select);
			};

			// Wenn kein select-Parameter uebergeben wurde durchlaufen
			// wir alle Kriterienbezeichner mit dieser Funktion und
			// brechen dann ab
			if(!select) {
				crit = YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium select[name=bezeichner]');
				for(i=0;i<crit.length;i++)
					YAHOO.hmmh.Suche.checkSuchennach(crit[i]);

				return true;
			}

			// Dann muessen wir entweder entfernen oder hinzufuegen
			if(YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium').length > 1) {
				removeSuchennach(select);
			} else {
				addSuchennach(select);
			}

		},

		aktualisiereEingabeElm: function(ev, elm, check, force) {
			var suchoption_tr = findClass(elm, 'suchkriterium');
			if(!suchoption_tr) return false;

			var td_eingabeelm = suchoption_tr.getElementsByTagName("td")[1];

			if (td_eingabeelm && (ev || YAHOO.util.Selector.query("input, select", td_eingabeelm).length == 0 || !init || force)) {
				td_eingabeelm.innerHTML = YAHOO.hmmh.Suche.json2html(elm.value, check ? false : true);
			}

			eingabeelm = YAHOO.util.Selector.query('input', td_eingabeelm, true)[0];

			/**
			 * FIX for AutoComplete in Fonts
			 *
			 */
			

//			if (eingabeelm && eingabeelm.type=="text") {
//
//				if(elm.value == "fontname") {
//					supplementDivs4Input('font.qsearch.fontname', 'suggestfontscontainer', 'suggestfontsautocomplete');
//					check4OtherInputs('font.qsearch.fontname', 'font.qsearch.manufacturer', 'font.qsearch.designer');
//				}
//
//				if(elm.value == "hersteller") {
//					supplementDivs4Input('font.qsearch.manufacturer', 'suggestcompanycontainer', 'suggestcompanysautocomplete');
//					check4OtherInputs('font.qsearch.fontname', 'font.qsearch.manufacturer', 'font.qsearch.designer');
//				}
//
//				if(elm.value == "designer") {
//					supplementDivs4Input('font.qsearch.designer', 'suggestdesignercontainer', 'suggestdesignerautocomplete');
//					check4OtherInputs('font.qsearch.fontname', 'font.qsearch.manufacturer', 'font.qsearch.designer');
//				}
//			}
			

			//eingabeelm = td_eingabeelm.firstChild;
			eingabeelm = YAHOO.util.Selector.query('input', td_eingabeelm, true)[0];

			if (eingabeelm && eingabeelm.type=="text") {
				if(elm.value == 'suchennach') {
					$E.on(eingabeelm, 'keyup', YAHOO.hmmh.Suche.setMatches);
				}

				$E.on(eingabeelm, "focus",	YAHOO.hmmh.Suche.schalteVorgabetext, eingabeelm, true);
				$E.on(eingabeelm, "blur",	YAHOO.hmmh.Suche.schalteVorgabetext, eingabeelm, true);
				$D.addClass(eingabeelm, "leer");

			}


			//YAHOO.hmmh.Suche.ermittleBenutzteEinmaligeBezeichner();
			YAHOO.hmmh.Suche.entferneBenutzteEinmaligeBezeichner();
			YAHOO.hmmh.Suche.updateModforms();

		},
		/**			
		 * Durchforstet alle Suchkriterien nach benutzten einmaligen Bezeichnern
		 * und speichert sie im globalen Array benutzte_einmalige_bezeichner 
		 */
		ermittleBenutzteEinmaligeBezeichner: function() {


			var kriterien = this.getCriteria();
			benutzte_einmalige_bezeichner = []; // reset

			var suchkriterien = $D.getElementsByClassName("suchkriterium" , "tr" , "kosSuchkriterien");
			var j=suchkriterien.length;
			
			if (j>1) {
				benutzte_einmalige_bezeichner.push("suchennach");
			}
			try{
				for (i=0; i<j; i++) {
					if(!suchkriterien[i].getElementsByTagName("select").length) continue;
	
					var bezeichner_select_value = suchkriterien[i].getElementsByTagName("select")[0].value;
					if (kriterien[bezeichner_select_value]['single']>0) {
						benutzte_einmalige_bezeichner.push(bezeichner_select_value);
					}
				}
			} catch(e) {}
		},

		/** Loescht alle Suchkriterienzeilen, welche im DOM vorhanden sind.
		 * Die Suchkriterien werden exklusiv vom JS erstellt! */
		cleanupUselessRows : function() {
			rows = YAHOO.util.Selector.query('tr.suchkriterium', "kosSuchkriterien");
			for(r in rows) {
				if(!YAHOO.util.Selector.query('select', rows[r], true).length)
					rows[r].parentNode.removeChild(rows[r]);
			}
		},

		/** Behandelt die zu entfernenden benutzten einmaligen Bezeichner,
		 * bzw. entfernt sie, sorgt aber auch fuer das erneute Hinzufuegen 
		 */
		entferneBenutzteEinmaligeBezeichner: function(ev) {
			if(ev)
				$E.stopEvent(ev);


			// Erst noch einmal updaten
			YAHOO.hmmh.Suche.ermittleBenutzteEinmaligeBezeichner();

			// Alle Suchkriterien holen
			var suchkriterien = YAHOO.util.Selector.query("#kosSuchkriterien .suchkriterium");

			// Alle Selects holen, die sind immer gleich, wir benoetigen sie spaeter in der Schleife
			var selectboxes = YAHOO.util.Selector.query(".suchkriterium select");
			for (x in suchkriterien) {

				// Die Selectbox fuer die typenauswahl holen. Ist keiner vorhanden, dann weiter!
				if(!(bezeichner_select = YAHOO.util.Selector.query("select", suchkriterien[x], true)[0])) continue;

				var bezeichner_select_value = bezeichner_select.value;

				// Die Optionen holen
				var bezeichner_select_options = YAHOO.util.Selector.query("option", bezeichner_select);

				for (k in bezeichner_select_options) {
					// Wir durchlaufen nur die Optionen, welche sich vom Wert der Selectbox unterscheiden,
					// das waeren dann die gerade ausgewaehlten, die nicht geloescht werden duerfen und im Array
					// der benutzten einmaligen Bezeichner vorhanden sind
					if (bezeichner_select_options[k].value != bezeichner_select_value &&
						in_array(benutzte_einmalige_bezeichner, bezeichner_select_options[k].value)) {

						// Wir suchen hier nach der Selectbox, welche auf den Wert der Option steht,
						// die hier entfernt werden muss. Spaeter setzen wir ein onChange-Event auf diese
						// Checkbox, so dass wir bei Aenderung die Option wieder hinzufuegen koennen
						var found = null;
						for(fi=0 ; selectbox = selectboxes[fi];fi++) {
							if(selectbox.value == bezeichner_select_options[k].value) {
								found = selectbox;
								break;
							}
						}

						// Wenn es keinen Fund gab und diese Option nicht "Suchen nach" ist, koennen
						// wir ueberspringen.
						if(!found && bezeichner_select_options[k].value != 'suchennach') continue;

						try {
							// Das Event setzen wir	auch auf das Entfernen des Suchkriteriums, daher muessen wir auch dies finden
							var r = YAHOO.util.Selector.query("img.suchkriteriumEntf", findClass(found, "suchkriterium"), true)[0];

							// Wir bauen ein Objekt, welches wir an die Funktion, die beim
							// onChange der Selectbox oder Entfernen der Zeile aufgerufen wird,
							// uebergeben, so dass das Hinzufuegen moeglich ist. Dies enthaelt
							// den Optionswert, den Optionstext, die Selectbox, in welche eingefuegt wird
							// und eine fortlaufende Eventnummer. Welchen Zweck die hat, findet sich in der
							// Funktion, welche die Optionen wieder einfuegt.

							obj = { ov : bezeichner_select_options[k].value,
									ot : bezeichner_select_options[k].text,
									s : bezeichner_select,
									e : ++eNum };
							
							// onChange und onClick-Events setzen, ausser fuer suchennach
							if(found != null) {
								$E.on(found, "change", YAHOO.hmmh.Suche.pushOption, obj );
								$E.on(r, "click", YAHOO.hmmh.Suche.pushOption, obj );
								found.id = $E.generateId(found);
								entfVal.push({ id: found.id, o : bezeichner_select_options[k], s : bezeichner_select, e : ++eNum });
							}
							if(YAHOO.env.ua.ie) {
								// Fuer den IE ist die Entferung eines Options etwas schwieriger...
								for (i = 0; i < bezeichner_select.length; i++) {
									if(bezeichner_select_options[k].value == bezeichner_select.options[i].value) {
										bezeichner_select.options[i] = null;
									}
								}
							} else {
								// Fuer den FF
								bezeichner_select.removeChild(bezeichner_select_options[k]);
							}
						} catch(e) { }
						// Zum Abfangen des Fehlers, dass f kein Element enthaelt.
					}
				}
			}

			// Hier nochmal pruefen, ob "Suchen nach" korrekt vorhanden/nicht vorhanden ist
			YAHOO.hmmh.Suche.checkSuchennach();
		},

		pushOption : function (a, b) {
			// Wir verhindern das erneute Durchfuehren des Events,
			// entfernen kann man ein Event scheinbar noch nicht
			// Die Eventnummer kommt in das "gefeuert"-Array und
			// wenn sie bereits dortdrin enthalten ist, wird sie
			// nicht mehr erneut benutzt
			if(b.e)
				if(in_array(eFired, b.e))
					return false;

			eFired.push(b.e);

			// Die Option neu erstellen
			b.o = new Option(b.ot, b.ov);

			// Select-Feld b.s, Option b.o
			if(b.o.value != 'suchennach' || YAHOO.util.Selector.query('#kosSuchkriterien .suchkriterium').length == 1)
				b.s[b.s.length] = b.o;

			// Die Selectbox neu sortieren
			YAHOO.hmmh.Suche.reorderSelect(b.s);
		},

		reorderSelect : function(select) {
			
			// Merken, was selektiert ist
			preselected = select.value;

			// Das Array durchlaufen, alle Optionen in einem Array speichern
			memory = {};
			for(i=0, j = select.length; i < j;i++) {
				memory[select.options[i].value] = new Option(select.options[i].text, select.options[i].value, false, select.options[i].selected);
			}

			// Alle Optionen aus der Selectbox entfernen
			while(select[0])
				select[0] = null;

			// Kriterien holen
			crit = YAHOO.hmmh.Suche.getCriteria();
			
			// Durchlaufen, wenn das Kriterium auch in der
			// Selectbox vorhanden ist, muss es wieder eingefuegt werden
			for(var item in crit) {
				if(memory[item])
					select[select.length] = memory[item];
			}

			// Zu guter letzt noch einmal den alten Wert der Selectbox waehlen
			select.value = preselected;

			return true;
		},

		getParentByClassName: function(elm, classname) {
			if (elm.parentNode) {
			return ($D.hasClass(elm, classname)) ? elm : this.getParentByClassName(elm.parentNode, classname);
			} else {
				return null;
			}
		},

		getParentByTagName: function(elm, tag) {
			if (elm.parentNode) {
				return (elm.nodeName.toLowerCase()==tag) ? elm : this.getParentByTagName(elm.parentNode, tag);
			} else {
				return null;
			}
		},

		json2html: function(dataSrc, uncheck) {
			if(!uncheck)
				var uncheck = false;

			var inputElem = "";

			var kriterien = this.getCriteria();

			dataSrc = kriterien[dataSrc];
			var extrahiereAttribute = function(attributarray) {
				if(attributarray.dflt)
					attributarray.value = attributarray.dflt;

				var $attribute_string = '';
				for (var i in attributarray) {
					$attribute_string += ' ' + i + '="' +  attributarray[i] + '"';
				}
				return $attribute_string;
			};

			if (dataSrc) {

				var tag = dataSrc["elmTyp"];
				var tagid = dataSrc["elmNam"];
				var attrib = dataSrc["attrib"];

				var retval = "";

				if (attrib) {
					var fieldset = ((attrib['type']=="radio")||(attrib['type']=="checkbox"))?true:false;
				}

				retval = fieldset?"<fieldset>":"";

				if (tag != "") {

					if (tag == "input") {
						if (attrib['type']=="text") {
							retval +='<' + tag + ' id="' + tagid + '" name="' + tagid + '" class="text"';
							retval += extrahiereAttribute(attrib);
							retval +='>';
						}

						if (attrib['type']=="radio") {
							for (var i in dataSrc["optnen"]) {
								if(!dataSrc["optnen"][i]["elmBez"]) continue;

								//why id="... +".o" ??? also:: changed "." to ""
								//retval += '<input type="radio" name="' + tagid +'" id="' + tagid + ".o" + i + '" value="' + dataSrc["optnen"][i]["value"] + '"';

								retval += '<input type="radio" name="' + tagid + '" id="' + tagid + "" + i + '" value="' + dataSrc["optnen"][i]["value"] + '"';
								retval += dataSrc["optnen"][i]["checked"] && !uncheck && init?" checked":"";
								retval += ' class="' + dataSrc["optnen"][i]["class"] + '"';
								retval += ' onchange="updateBoxValue(this.id);">';

								retval += ' <label for="' + tagid + "" + i +'">' + dataSrc["optnen"][i]["elmBez"] + '</label> ';
							}
						}

						if (attrib['type']=="checkbox") {
							for (var i in dataSrc["optnen"]) {
								if(!dataSrc["optnen"][i]["elmBez"]) continue;
								//id="o ???? also: changed "." to ""
								//retval += '<input type="checkbox" name="' + tagid + "." + i +'" id="o' + tagid + i + '" value="' + dataSrc["optnen"][i]["val"] + '"';

								retval += '<input type="checkbox" name="' + tagid + "" + i +'" id="' + tagid + i + '" value="' + dataSrc["optnen"][i]["value"] + '"';
								retval += dataSrc["optnen"][i]["checked"]&& !uncheck && init?" checked":"";
								retval += ' class="' + dataSrc["optnen"][i]["class"] + '"';
								retval += ' onchange="updateBoxValue(this.id);">';

								//retval += ' <label for="' + tagid + "." + i +'">' + dataSrc["optnen"][i]["elmBez"] + '</label> ';
								retval += ' <label for="' + tagid + "" + i +'">' + dataSrc["optnen"][i]["elmBez"] + '</label> ';
							}
						}
					}

					if (tag == "select") {
						retval +='<select id="' + tagid + '" name="' + tagid + '">';
						for (var i in dataSrc["optnen"]) {
							if(!dataSrc["optnen"][i]["elmBez"]) continue;
								retval += '<option value="' + dataSrc["optnen"][i]["value"] + '">' + dataSrc["optnen"][i]["elmBez"] + '</option>';
						}
						retval +='</select>';

					}
				}
				retval += fieldset?"</fieldset>":"";

				return (retval);
			} else {
				$log("keine dataSrc", dataSrc);
			}
		},

		removeOtherClass: function(ev, ele) {
			if(ele.value == ele.alt)
				ele.value = "";

			$D.removeClass(ele, "empty");
		},

		appendOtherClass: function(ev, ele) {
			if(ele.value == "" || ele.alt == ele.value) {
				$D.addClass(ele, "empty");
				ele.value = ele.alt;
			}
		},

		getSearchHeight: function() {
			/* Check the element height to set the "margin-bottom" of the teaser  */
			searchHeight = $D.getStyle("erweitertesuche","height");
			
			/* Check the element content to hide the teaser */
			if (YAHOO.util.Selector.query("#teaserFloatId div").length == 0) {
				$D.setStyle("teaserFloatId", "display","none");
				$D.setStyle("suche", "margin-right","0");
			}
			
			if(searchHeight) {
				searchHeight = searchHeight.substr(0, 3);
				var suchkriterien = YAHOO.util.Selector.query("tr.suchkriterium", "kosSuchkriterien");
				var extendedForm = YAHOO.util.Selector.query("#suche #erweitertesuche .extendedForm", null, true)[0];
				var isExtendedForm = $D.hasClass(extendedForm, 'ausgeblendet');
				
				var cdDetail = YAHOO.util.Selector.query("#mainCol", null, true)[0];
				var isCdDetail = $D.hasClass(cdDetail, 'cdDetail');
				
				if(window.location.href != "") {
					var teilstrings = YAHOO.hmmh.Suche.getLocationHref();
				}
				if(teilstrings) {
					var switchCase = teilstrings;
				} else {
					imageSize = $D.get("liste");
					if(!imageSize) return false;
					var switchCase = imageSize.getAttribute("class");
				}
				switch (switchCase) {
					case "s": var mb = 14; var mbDefault = 8; var mbFirstStep = 34; var mbExtendedHidden = 74; var cddt = -4; var cddtHidden = 42;
					break;
					case "m": var mb = 33; var mbDefault = -4; var mbFirstStep = 148; var mbExtendedHidden = 176; var cddt = 30; var cddtHidden = -4;
					break;
					case "l": var mb = 137; var mbDefault = 132; var mbFirstStep = 160; var mbExtendedHidden = 188; var cddt = 133; var cddtHidden = 99;
					break;
					default: var mb = 33; var mbDefault = -4; var mbFirstStep = 148; var mbExtendedHidden = 176; var cddt = 30; var cddtHidden = -4;
				    break;
				}
				
				if(YAHOO.env.ua.webkit != 0 && suchkriterien.length <= 1){
					mbDefault = mbDefault-3;
				} else if(YAHOO.env.ua.webkit != 0 && suchkriterien.length >= 2) {
					mbDefault = mbDefault-16;
				} 
				
				var checkEmptyTeaser = $D.get('teaserFloatId');
				if(checkEmptyTeaser == null) {
					mb = 0;
					mbDefault = 0; 
					mbFirstStep = 0; 
					mbExtendedHidden = 0; 
					cddt = 0; 
					cddtHidden = 0;
					var changeSearchWidth = $D.get('suche');
					if(changeSearchWidth) {
						$D.setStyle(changeSearchWidth, "margin-right", "0");
					}
				}
	
				if (searchHeight > 290 && searchHeight < 320) {
					if (isCdDetail == true){
						var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
						$D.setStyle("teaserFloatId", "margin-bottom", cddtHidden+"px");
						$D.setStyle(seitenNavCD, "margin-right", "180px");
					} else {
						if (YAHOO.env.ua.webkit != 0){
							mb = mb-20;
						}
						$D.setStyle("teaserFloatId", "margin-bottom", mb+"px");
						$D.setStyle("seitenNavBilderId", "margin-right", "0px");
					}	
				} else if (searchHeight > 320 && searchHeight < 420) {
					if (isCdDetail == true){
						var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
						$D.setStyle(seitenNavCD, "margin-right", "180px");
						$D.setStyle("teaserFloatId", "margin-bottom", "0px");
					} else {
						$D.setStyle("teaserFloatId", "margin-bottom", mbFirstStep+"px");
						$D.setStyle("seitenNavBilderId", "margin-right", "0px");
					}
				} else if (searchHeight >= 437) {
					if (isCdDetail == true){
						var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
						$D.setStyle(seitenNavCD, "margin-right", "0px");
						$D.setStyle("teaserFloatId", "margin-bottom", "0px");
					} else {
						$D.setStyle("teaserFloatId", "margin-bottom", "0px");
						$D.setStyle("seitenNavBilderId", "margin-right", "0px");
					}	
				} else if (isExtendedForm == true) {
					if (isCdDetail == true){
						var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
						$D.setStyle("teaserFloatId", "margin-bottom", cddtHidden+"px");
						$D.setStyle(seitenNavCD, "margin-right", "180px");
					} else {
						$D.setStyle("teaserFloatId", "margin-bottom", mbExtendedHidden+"px");
						$D.setStyle("seitenNavBilderId", "margin-right", "0px");
					}
				} else if (isCdDetail == true) {
					var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
					$D.setStyle("teaserFloatId", "margin-bottom", cddt +(suchkriterien.length-1)*25+"px");
					$D.setStyle(seitenNavCD, "margin-right", "180px");
				} else if (isCdDetail == false && suchkriterien.length >= 2) {
					var mbNew = mbDefault +(suchkriterien.length-1)*25;
					
					$D.setStyle("teaserFloatId", "margin-bottom", mbNew+"px");
					$D.setStyle("seitenNavBilderId", "margin-right", "0px");
				} else if (isCdDetail == true && suchkriterien.length <= 1) {
					var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
					$D.setStyle("teaserFloatId", "margin-bottom", cddt+"px");
					$D.setStyle(seitenNavCD, "margin-right", "180px");	
				} else if (isCdDetail == true && suchkriterien.length >= 2 || isCdDetail == true && searchHeight <= 437) {
					var seitenNavCD = YAHOO.util.Selector.query("#mainCol .seitennav", null, true)[0];
					$D.setStyle("teaserFloatId", "margin-bottom", cddt +(suchkriterien.length-1)*25+"px");
					$D.setStyle(seitenNavCD, "margin-right", "180px");
				} else {
					$D.setStyle("teaserFloatId", "margin-bottom", mbDefault+"px");
					$D.setStyle("seitenNavBilderId", "margin-right", "0px");
				}	
			}
		},
		
		changeSelectboxColor: function() {
		
		},
		getLocationHref: function() {
			QUERYSTRING = window.location.href;
			var teilstrings = QUERYSTRING.split("&");
			var tmpVar = 0;
			for(i=0;i<teilstrings.length;i++) {
				if(teilstrings[i].match(/\bsortBy=collection\b/g)) {
					tmpVar = 1;
				}
			}

			if(tmpVar = 0 || window.location.href.contains("compact_discs_detail")) {
				for(i=0;i<teilstrings.length;i++) {
					//if(typeof deineVariable!='undefined') {
						result = teilstrings[i].match(/\bresultsSize=\b/g);
						if(result!=null) {
							teilstrings = teilstrings[i];
							teilstrings = teilstrings.split("=");
							teilstrings = teilstrings[teilstrings.length-1];
							return (teilstrings);
						}

					//}
				}
			}

		}

	};
}();

function updateBoxValue(elId) {
	var currEl = document.getElementById(elId);
	if (currEl!=null) {
		if (currEl.checked==false){
			currEl.value = "";
		} else {
			currEl.value = currEl.id;
			//IMPORTANT :: for the fonts platform search, we need to uncheck and "unvalue" the other platform!!
			if (currEl.id == "font.qsearch.platform0") {
				var otherEl = document.getElementById("font.qsearch.platform1");
				if (otherEl!=null) {
					otherEl.value = "";
				}
			} else if (currEl.id == "font.qsearch.platform1") {
				var otherEl = document.getElementById("font.qsearch.platform0");
				if (otherEl!=null) {
					otherEl.value = "";
				}
			}

			// ALSO :: if this is a format thats checked (and its not OT) the "just OT" box has to be unchecked
			if (currEl.id == "font.search.format.choice0" || currEl.id == "font.search.format.choice1") {
				var otherEl = document.getElementById("optopentype");
				otherEl.checked = false;
				otherEl.value = "";
			}

		}
	}
}

YAHOO.util.Event.onContentReady("suche", YAHOO.hmmh.Suche.init, YAHOO.hmmh.Suche);

//$E.on(window, 'load', YAHOO.hmmh.Suche.init, YAHOO.hmmh.Suche, true);