var m_svnLastChangedRevisionProperty = "$LastChangedRevision: 5299 $";
var m_svnLastChangedRevisionValue = m_svnLastChangedRevisionProperty.replace(/\D+(\d+)\D+/, "$1"); 
var APSREQUEST_JS_VER = "2.0." + m_svnLastChangedRevisionValue;
var DEFAULT_LANGUAGE = "de";
var ajaxrequest = new Array();
var apssession = new Array();
var searchstate = "NEW";
var Query = new Object();
Query.lastDDUpdate = new Object();
var selectedEntityPrefix = undefined;
var SuggestCancel = false;
var m_strLastApsRequest = '';
var m_strLastSearchDefineRequest = '';
var m_nWindowResizeDelay = 500;
var suggestTimeout = 0;
var DrillChildsTimeout = 0;
var Details = new Object();
var APSSuggestDelay = 650;
var DrillChildResizeDelay = 50;
var slider_offset = 0;
var slider_total = 0;
var slider_lpx = 0;
var slider_cmd = "";
var slider_count = 0;
var SWFInstance = null;
var LP = "";
var WK = "";
var WKOrder = "";
var WKOrderPersistent = false;
var WKOrderDifferent = false;
var WKcmt = "";
var Lang = DEFAULT_LANGUAGE;
var ExtraMenu = false;
var DMode='';
var listcount = 0;
var nLoadingCounter = 0;
/*
var sBBLoadTarget = '';
var sBBLoadCmd = '';
*/

var m_nLastBodyWidth = 0
var m_nLastBodyHeight = 0;
var firstInit = true;

var bpreloaded = false;


Error.prototype.toString = function() {
	return this.message;
}

//Default Werte für die Sortierung 
//kommen durch den init request von APS
var m_sSortField = "";
var m_sSortDirection = "";

function loadTopic(sTopicSubPath) {
	URLRequest('/texte/topics/' + Lang + '/' + sTopicSubPath + '.xml')
}

function ApsSearch(sQueryStr, sortCol, sortDir) {
	if (typeof(sQueryStr)=='string') {
		if (typeof(sortCol)=='string') {
			if (m_sSortField != sortCol) {
				m_sSortField = sortCol;
			}
		}
		if (typeof(sortDir)=='string') {
			sortDir = sortDir.toLowerCase();
			if (sortDir == 'asc' || sortDir == 'desc') {
				if (m_sSortDirection != sortDir) {
					m_sSortDirection	= sortDir;
				}
			}
		}
	}
	APSRequest('searchdefine?query=' + sQueryStr)
}

function sortFieldChanged() {
	var sortFieldSelector = document.getElementById('sortFieldSelect');
	if (sortFieldSelector) {
		var iSelectedFieldIndex = sortFieldSelector.selectedIndex;
		var sSelectedFieldValue = sortFieldSelector.options[iSelectedFieldIndex].value;
		if (m_sSortField != sSelectedFieldValue) {
			m_sSortField = sSelectedFieldValue;
			if (m_strLastSearchDefineRequest != '') {
				APSRequest(m_strLastSearchDefineRequest);
			}
		}
	}
}

/**
 * @param {String} sDir ASC, DESC
 */
function sortDirectionChanged(sDir) {
	if (sDir == 'asc' || sDir == 'desc') {
		if (sDir != m_sSortDirection) {
			m_sSortDirection = sDir;
			if (m_strLastSearchDefineRequest != '') {
				APSRequest(m_strLastSearchDefineRequest);
			}
		}
	}
}

function resizeEventListener() {
	
	var nNewBodyWidth = getBodyWidth();
	var nNewBodyHeight = getBodyHeight();
	
	if ((nNewBodyHeight != m_nLastBodyHeight) || (nNewBodyWidth != m_nLastBodyWidth)) {
		m_nLastBodyHeight = nNewBodyHeight;
		m_nLastBodyWidth = nNewBodyWidth;
		window.setTimeout(resizeEventListener, m_nWindowResizeDelay);
	} 
	else {
		performResize();
	}
	
}

/**
 * Lädt dynamsich ein (CSS) Stylesheet zur Laufzeit nach 
 * @param {String} sCssUrl
 */
function loadStylesheet(sCssUrl){
    var xhr = getXmlHttpRequestObj();
	if (!xhr) {
		return false;
	}
    xhr.onreadystatechange = function(){
        if (this.readyState == 4) {
            if (this.status == 200 || this.status == 0) {
                bb.html.addStyleSheet(this.responseText);
            }
        }
    }
}

function performResize() {
	if (m_strLastApsRequest.search(/displayresultgalery/) >=0 || m_strLastApsRequest.search(/displayresultlist/) >=0) {
		var nNewListCount = undefined;
		if (m_strLastApsRequest.search(/displayresultgalery/) >=0) {
			nNewListCount = getListCount('galery');
		}
		else if (m_strLastApsRequest.search(/displayresultlist/) >=0) {
			nNewListCount = getListCount('list');
		}
		if ((nNewListCount > 0) && (listcount > 0) && (nNewListCount != listcount)) {
			listcount = nNewListCount;
			APSRequest(m_strLastApsRequest);
		}
	}
	resizeDrillChilds();
}



/**
 * Formatiert das Datum anhand eines Format-Strings
 * Folgende Kürzel können verwendet werden:
 * dd    Tag des Monats (immer 2-stellig)
 * MM    Monat des Jahres (immer 2-stellig)
 * yy    Jahr (2-stellig);
 * yyyy  Jahr (4-stellig)
 * hh    Stunden (immer 2-stellig) 
 * mm    Minuten (immer 2-stellig) 
 * ss    Sekunden (immer 2-stellig)
 * @param {String} sFormat Der Formatstring
 * @return {String} formatierter String 
 */
Date.prototype.formatDate = function(sFormat) {
	var addZero = function(vNumber) { 
    	return ((vNumber < 10) ? "0" : "") + vNumber; 
	};
	var vDay              = addZero(this.getDate()); 
    var vMonth            = addZero(this.getMonth()+1); 
    var vYearLong         = addZero(this.getFullYear()); 
    var vYearShort        = addZero(this.getFullYear().toString().substring(3,4)); 
    var vYear             = (sFormat.indexOf("yyyy")>-1?vYearLong:vYearShort); 
    var vHour             = addZero(this.getHours()); 
    var vMinute           = addZero(this.getMinutes()); 
    var vSecond           = addZero(this.getSeconds()); 
    var vDateString       = sFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{1,4}/g, vYear);
    vDateString           = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond); 
    return vDateString;
}

document.getImagesByName = function(sName) {
	var nodeList = this.getElementsByName(sName);
	if (nodeList.length == 0) {
		var nodeList = new Array();
		for (var i=0; i<this.images.length; i++) {
			if (this.images[i].name == sName) {
				nodeList.push(this.images[i]);
			}
		}
	}	
	return nodeList;
}

/**
 * initAPS
 * Initialisiert APS vie AJAX. Funktion wird am Ende der Index.html aufgerufen.
 */
function initAPS(preloaded) {
	bb.command.trace(null, "initAPS start");

	Query.media = "";
	Query.mediaID = "";
	Query.archive = "";
	Query.archiveID = "";
	Query.base = "";
	Query.catalog = "";
	Query.maps = "";
	Query.mapstxt = "";
	Query.mapslvl = "";
    Query.lastDDUpdate.catalog = "";
    Query.lastDDUpdate.tastr = "";
    Query.lastDDUpdate.start = "";
    var b = BrowserDetect.browser;
    var dosearch = true;
    
	if (typeof(onInitAPS)=='function') {
		onInitAPS(preloaded);
	}
	
	if (preloaded) {
		bpreloaded = preloaded;
	}
	
	
	
    if (firstInit) { 
        //Statischen Seiten & Cookies laden, ggf. Stylesheets nachladen
        loadLanguageCookie();
        URLRequest('/texte/static/' + Lang + '.xml');
		
        if (bb.browser.webkit) {
            loadStylesheet('/css/safari.css');
        }
	
		//Aps init
       if (!preloaded && location.search==='') {
		   APSRequest("init?:media=ALL&:archiv=ALL&:dmode=galery&:browser=" + escape(b));
	   } else if (!preloaded && location.search.indexOf('?ARCHIV_')== 0) {
		   var thearchive = location.search.substring(8);
   		   dosearch = false;
	       APSRequest("archivselect?option=preloaded&:dmode=galery&:archiv=" + thearchive + "&:browser=" + escape(b));
	   } else if (!preloaded && location.search.indexOf('?MEDIA_')== 0) { 
		   var themedia = location.search.substring(7);
		   dosearch = false;
		   APSRequest("mediaselect?option=preloaded&:archiv=ALL&:dmode=galery&:media=" + themedia + "&:browser=" + escape(b));
	   } else {
		   APSRequest("init?option=preloaded&:archiv=ALL&:media=ALL&:dmode=galery&:browser=" + escape(b)+"&pathname=" + escape(location.pathname));
	   }
		
       //kopieren des obj12345678 ins result div
       if (preloaded) {
//    	   if (bb.browser.ie && bb.browser.version == '7') {
//    		   window.setTimeout("alert('test7500');copyDivContent('noscript', 'result', false)", 7500);
//    	   } 
//    	   else {
//    		   copyDivContent('noscript', 'result', false);
//    	   }
    	   hideDiv('noscript');
       } 
       else { 
    	   clearDiv('noscript');
       }
		
	   bb.command.trace(null, "initAPS before initializeStatusfromCookie");
	   initializeStatusfromCookie();
	
	   bb.command.trace(null, "initAPS after initializeStatusfromCookie");
	   if (location.search !== '' && location.search != '?NOSEARCH' && dosearch) {
		   var s = unescape(location.search);
		   s = s.replace(/^\?/, "");
		   var numberParam = "&number=";
		   if (s.indexOf(numberParam) != -1) {
			   var q = s.substring(0, s.indexOf(numberParam));
			   var no = s.substring(s.indexOf(numberParam) + numberParam.length);
			   if (parseInt(no) == NaN) {
				   no = 1;
			   }
			   APSRequest("searchdefine?:archiv=ALL&query=" + escape(q) + "&no=" + no, 1, true);
		   }
		   else {
			   APSRequest("searchdefine?:archiv=ALL&query=" + s, 1, true);
		   }
	   }
	   bb.command.trace(null, "initAPS done");
	   firstInit = false;
	   showOldBrowserHint();
	   if (ImageScaler) {
		   ImageScaler.startResizeImagesInterval('thumbImage', 150);
	   }
	} 
    else {
      APSRequest("init?:media=ALL&:archiv=ALL&:dmode=galery&:browser=" + escape(b));
    }  
}

/**
 * Hide div with given id 
 * @param {String} id
 * @return {void}
 */
function hideDiv(id) {
	showDiv(id, false);
}

/**
 * @param {String} id
 * @return {Node} the node or null
 */
function getViewNodeById(id) {
	var oModelNode = bb.document.getElementById(id);
	var oViewNode = document.getElementById(id);
	if (oModelNode) {
		if (oModelNode.viewNode) {
			oViewNode = oModelNode.viewNode;
		}
	}
	if (typeof(oViewNode)=='undefined') {
		oViewNode = null;
	}
	return oViewNode;
}

/**
 * copies content using innerHTML Operations
 * @param {String} srvDivId id of the source
 * @param {String} tgtDivId id of the target
 * @param {Boolean} doMove [OPTIONAL] true if the content should be moved, not copied (defaults to false)
 * @return {void}
 */
function copyDivContent(srvDivId, tgtDivId, doMove) {
	doMove = parseBoolean(doMove);
	var srcViewNode = getViewNodeById(srvDivId); 
	var tgtViewNode = getViewNodeById(tgtDivId);
	if (srcViewNode && tgtViewNode) {
		var htmlSrc = srcViewNode.innerHTML;
		tgtViewNode.innerHTML = htmlSrc;
		if (doMove === true) {
			srcViewNode.innerHTML = "";
		}
	}
}

function showOldBrowserHint() {
		if ((bb.browser.ie && bb.browser.version <=6)) {
			var sTitle = '<strong>Internet Explorer - Aktualisierung empfohlen</strong>';
			var aMsgs = [
				'Sehr geehrte Nutzerin, sehr geehrter Nutzer des Bildindex der Kunst und Architektur,',
				'wir haben festgestellt, dass Sie den Internet Explorer Version 6 verwenden. Wir empfehlen Ihnen dringend, diesen am 27. August 2001 erschienenen Browser durch eine aktuelle Version zu ersetzen!',
				'Ihre Vorteile werden in einer deutlich verbesserten Performance, verbesserter Funktionalität und Stabilität sowie deutlich erhöhter Sicherheit liegen. Einen aktualisierten Internet Explorer erhalten Sie kostenlos unter der Adresse <a href="http://www.microsoft.com/ie" target="_blank">http://www.microsoft.com/ie</a> . Bitten Sie ggf. Ihren Administrator um Unterstützung!',
				'Mit freundlichen Grüßen<br/>Bildarchiv Foto Marburg - Deutsches Dokumentationszentrum für Kunstgeschichte'
			];
			showMessageBox(sTitle, aMsgs, 400, 280);
		}
}

/**
 * @param {String} sTitle Titel der Box als String (erlaubt HTML Tags)
 * @param {Array} aMessages Ein Array von Strings (dürfen HTML Tags enthalten). Für jeden String beginnt ein neuer Paragraph.
 * @param {Number} nWidth Breite der Messagebox in px, wenn nicht gegeben oder <=0, wird der default Wert von 400 genommen
 * @param {Number} nHeight Höhe der Messagebox in px, wenn nicht gegeben oder <=0, wird der default Wert von 300 genommen
 */
function showMessageBox(sTitle, aMessages, nWidth, nHeight) {
	var winWidth = 400;
	if (typeof(nWidth)=='number') {
		if (nWidth > 0) {
			winWidth = nWidth;
		}
	}
	var winHeight = 300;
	if (typeof(nHeight)=='number') {
		if (nHeight > 0) {
			winHeight = nHeight;
		}
	}
	
	var winPosX = 0;
	if ((getBodyWidth()/2 - winWidth/2)>0) {
		winPosX = getBodyWidth()/2 - winWidth/2;
	}
	var winPosY = 0;
	if ((getBodyHeight()/2 - winHeight/2)>0) {
		winPosY = getBodyHeight()/2 - winHeight/2;
	}
	
	var msgBox = '<b:window id="modalMsgBox" open="true" buttons="close"'
	msgBox += ' xmlns:b="http://www.backbase.com/2006/btl" xmlns:e="http://www.backbase.com/2006/xel" xmlns:c="http://www.backbase.com/2006/command" xmlns="http://www.w3.org/1999/xhtml"';
	msgBox += ' for="id(\'layoutRoot\')" dragConstraint="id(\'layoutRoot\')"';
	msgBox += ' width="' + winWidth + 'px"';
	msgBox += ' height="' + winHeight + 'px"';
	msgBox += ' top="' + winPosY + 'px"';
	msgBox += ' left="' + winPosX + 'px"';
	msgBox += '>';
	msgBox += '<b:label><span style="font-size:10px;font-family:sans-serif;">';
	msgBox += sTitle;
	msgBox += '</span></b:label>';
	msgBox += '<div style="font-size:10px;font-family:sans-serif;">';
	if (aMessages) {
		if (aMessages.length) {
			for (var i=0; i<aMessages.length; i++) {
				msgBox += '<p>' + aMessages[i] + '</p>';
			}
		}
	}
	msgBox += '</div>';
	msgBox += '<div style="position:absolute;right:0px;bottom:0px;height:20px;font-size:10px;font-family:sans-serif;text-align:right;">';
	msgBox += '<input type="button" value="OK">';
	msgBox += '<e:handler event="click" propagate="stop">';
	msgBox += '<e:if test="$event/property::button=0">';
	msgBox += '<e:call method="close" with="id(\'modalMsgBox\')"/>';
	msgBox += '</e:if>';
	msgBox += '</e:handler>'; 
	msgBox += '</input>';
	msgBox += '</div>';
	msgBox += '<e:handler event="open" propagate="stop" type="application/javascript">'
	msgBox += 'showDiv("loadingOverlay",true);';
	msgBox += '</e:handler>';
	msgBox += '<e:handler event="close" propagate="stop" type="application/javascript">'
	msgBox += 'showDiv("loadingOverlay",false);';
	msgBox += '</e:handler>';
	msgBox += '</b:window>';
		
	var targetNode = bb.document.getElementById('layoutRoot');
	var existingBox = bb.document.getElementById('modalMsgBox');
	if (existingBox) {
		bb.command.destroy(existingBox);
	}
	bb.command.create(msgBox, targetNode, 'appendChild');var targetNode = bb.document.getElementById('layoutRoot');
	var existingBox = bb.document.getElementById('modalMsgBox');
	if (existingBox) {
		bb.command.destroy(existingBox);
	}
	bb.command.create(msgBox, targetNode, 'appendChild');
}

/**
 * setStatus
 * Aktualisierung der Statusfelder, mit AJAX-Feedback
 */
 function setStatus(text,katalog,zeit) {
	try {
		var spans = document.getElementsByTagName('span');
		var tmpDate = new Date(zeit);
		for (var i = 0; i < spans.length; i++) {
			var curSpan = spans[i];
			if (curSpan["className"] == 'status') {
				curSpan["innerHTML"] = text;
			}
			else if (curSpan["className"] == 'time' && zeit !== '') {
				sTime = '';
				if (Lang=='en') {
					sTime = tmpDate.formatDate("yyyy-MM-dd hh:mm:ss");  				
				}
				else if (Lang == 'de') {
					sTime = tmpDate.formatDate("dd.MM.yyyy hh:mm:ss");
				}
				//usw...
				else {
					//nix
				}
				curSpan["innerHTML"] = sTime;
			}
		}
		if (katalog !== '') {
			var div_katalog	= document.getElementById("katalogname");
			if (katalog == 'NONE') {
				div_katalog["innerHTML"] = '';
			} else {
				div_katalog["innerHTML"] = ': ' + katalog;
			}
		}
	} catch (ex) {
		LOG("Error during setStatus");
		LOG(ex)
	}
}

function ShowLoading() {
	nLoadingCounter++;
	showDiv("loadingOverlay",true);
	showDiv("loadingContent",true);
	showDiv("cancelRequest", true);
}


function HideLoading() {
	nLoadingCounter--;
	if (nLoadingCounter <= 0) {
		showDiv("loadingOverlay", false);
		showDiv("loadingContent", false);
		showDiv("cancelRequest", false);		
	}
}
/**
 * APSRequest
 * @param {string} cmd Der Requeststring
 * @param {string} session Session-ID
 */
function APSRequest(cmd,session,history) {
	if (typeof(session) == 'undefined') {
		session = 1;
	}
	if (!session) {
		session = 1;
	}
	if (session == 1 || session == 3) {
		showDiv('suggestBox',false);
		cancelRunningSuggestRequest();
		if (cmd.search(/displayresultgalery/) >=0) {
			listcount = getListCount('galery');
		}
		else if (cmd.search(/displayresultlist/) >=0) {
			listcount = getListCount('list');
		}
			
		if (!history) {
			if (cmd.search(/searchdefine|searchdefinenq/) >= 0) {
				addSearchHistory('query', cmd, Query);
			} 
			else if (cmd.search(/searchreset/) >= 0) {
				addSearchHistory('searchreset','',Query);
				m_strLastSearchDefineRequest = '';
			}
			else if (cmd.search(/catalogselect/) >= 0) {
				addSearchHistory('catalog', cmd, Query);
			}
			else if (cmd.search(/mediaselect/) >= 0) {
				addSearchHistory('media', cmd, Query);
			}
			else if (cmd.search(/archivselect/) >= 0) {
				addSearchHistory('archiv', cmd, Query);
			}
			else if (cmd.search(/displaylichtpult/) >= 0) {
				addSearchHistory('lichtpult', cmd, Query);
			}
			else if (cmd.search(/warenkorb/) >= 0) {
				addSearchHistory('warenkorb', cmd, Query);
			}
			else if (cmd.search(/info/) >= 0) {
				addSearchHistory('info', cmd, Query);
			}
		}
		m_strLastApsRequest = cmd;
		
		showDiv('suggestBox',false);
		
		if (cmd.search(/searchdefine|searchdefinenq/) >= 0) {
			m_strLastSearchDefineRequest = cmd;
		}
		
		if (m_sSortField!= "" && m_sSortDirection != "" && (cmd.search(/\?/) > 1)) {
			cmd += '&sortby=' + m_sSortField + '&sort=' + m_sSortDirection;
		}
		if ((listcount > 0) && (cmd.search(/\?/) > 1)) {
			cmd += '&:listcount=' + listcount;
		}
	}
	URLRequest(apsRequestBaseUrls[location.host] + "/" + cmd, session,false,false);
}

function cancelRunningSuggestRequest(){
    if (typeof(ajaxrequest[2]) != 'undefined') {
	    ajaxrequest[2].abort();
		ajaxrequest[2] = undefined;
    }
}

function cancelRunningApsRequest(){
    if (typeof(ajaxrequest[1]) != 'undefined') {
        if (ajaxrequest[1].readyState !== 4 && typeof(ajaxrequest[1].abort) == 'function') {
            ajaxrequest[1].abort();
            HideLoading();
			unLockUIControls();
        }
    }
}

function unLockUIControls() {
	try {
		document.getElementById("submitButton").disabled = false;
		document.getElementById("selector").disabled = false;
		document.getElementById("pattern").disabled = false;
		document.getElementById("ANDConnector").disabled = false;
		document.getElementById("NANDConnector").disabled = false;
		document.getElementById("NEWQUERY").disabled = false;
		if (document.getElementById('sortFieldSelect')) {
			document.getElementById('sortFieldSelect').disabled =false;
		}
	}
	catch(ex){
		LOG("Error during unlockUIControls");
		LOG(ex);
	}
}

function lockUIControls() {
	try {
	    document.getElementById("submitButton").disabled = "disabled";
		document.getElementById("selector").disabled = "disabled";
		document.getElementById("pattern").disabled = "disabled";
		document.getElementById("ANDConnector").disabled = "disabled";
		document.getElementById("NANDConnector").disabled = "disabled";
		document.getElementById("NEWQUERY").disabled = "disabled";
		if (document.getElementById('sortFieldSelect')) {
			document.getElementById('sortFieldSelect').disabled ="disabled";
		}
	} catch (ex) {
		LOG("Error during lockUIControls");
		LOG(ex);
	}
}

function getXmlHttpRequestObj() {
	var hr = false;
	if (window.XMLHttpRequest) {
		hr = new XMLHttpRequest();
		if (hr.overrideMimeType) {
			hr.overrideMimeType("text/xml");
		}
	} else {
		if (window.ActiveXObject) { // IE
			try {
				hr = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (ex) {
				try {
					hr = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (ex) {
					LOG("Fehler: XMLHTTP nicht verfügbar [3].","","");
					hr = false;
				}
			}
		}
	}
	if (!hr) {
		LOG("Fehler: XMLHTTP nicht verfügbar [4].","","");
		hr = false;
	}
	return hr;
}

/**
 * URLRequest
 * @param {string} url Aufzurufende URL
 * @param {string} session Session-ID
 * @return xmlhttp objekt
 */
function URLRequest(url,session,sync,hist) {
	var hr = getXmlHttpRequestObj();
	if (!hr) {
		return false;
	}
	if (!session) {
		session = 0;
	}
	if (typeof(hist) == 'undefined') {
		hist = false;
	}
	setStatus("Bitte warten ...","","");
	
	if (url.search(/\.xml/)>= 0 && hist!=true) {
		addSearchHistory('xml',url,Query);
	}
	
	if (session > 0) {
		if (apssession.length < session + 1) {
			apssession[session] = "sid={02f71717-e5e9-49b1-b204-b80362c75aec};path=" + apsRequestBaseUrls[location.host] +";";
		}
		document.cookie = apssession[session];
	}
	

	if (!sync) {
		if (session == 1 || session == 3) {
			ShowLoading();
		}
		hr.onreadystatechange = function() {
			if (hr.readyState == 4) {
				if (hr.status == 200 || hr.status === 0) {
					var xmlDate = hr.getResponseHeader("Date");
					
					if (session > 0) {
						var xmlCookie = hr.getResponseHeader("X-APS-SID");
						apssession[session] = xmlCookie;
					}
					var xmlResponse = hr.responseXML;
					if (xmlResponse == null || xmlResponse == undefined) {
						try {
							xmlResponse = new DOMParser().parseFromString(hr.responseText);
						}
						catch (exSaS) {
							LOG("Error parsing XmlHttpResponse to XML");
							LOG(exSaS);
						}
					}
					
					var xmlNode = xmlResponse.documentElement;
					if (xmlNode.nodeName == 'parsererror') {
						setStatus("Fehler: " + xmlNode.textContent,xmlDate);
					}
					else {
						interpreteResult(xmlNode, url);
						setStatus("Bereit.","",xmlDate);
					}
					
				} else {
					setStatus("Fehler " + hr.status + " aufgetreten.","","");
				}
				if (session == 1 || session == 3) {
					HideLoading();
				}
			}
			resizeDrillChilds();
		};
		hr.open("GET", url, true);
		hr.send(null);
		ajaxrequest[session] = hr;
	} else {
		hr.open("GET", url, false);
		hr.send(null);
		return hr.responseText;
	}
}

/**
 * wertet den AJAX Response aus und arbeitet ihn ein
 * @param xmlNode der von XMLHTTPResult ausgewertete  Knoten
 */
function interpreteResult(xmlNode,url) {
//	try {
	for (var i = 0; i < xmlNode.childNodes.length; i++) {
		var nodeName = xmlNode.childNodes[i].nodeName;
		
		//Kunden/Knotenspezifische Zusatzaktionen auslösen
		if (nodeName.charAt(0) != '#') {
			//Knotennamen die mit # beginnen werden ausgeschlossen.
			//Es handelt sich hierbei um Text oder Kommentarknoten
			//bspw. 
			var nodeSpecificFunc = undefined;
			try  {
				nodeSpecificFunc = eval('onResponseNode_' + nodeName);
			}
			catch(exNSF) {
				//Wenn eval fehlschlägt gibt es 
				//die Funktion nicht und es wird eine
				//Security Ecxeption geworfen, weil es
				//nicht erlaubt mit eval funktionen anzulegen
				//die noch nicht existieren 
			}
			if (typeof(nodeSpecificFunc) == 'function') {
				nodeSpecificFunc(xmlNode.childNodes[i]);
			}
		}
		
		switch (nodeName) {
			case 'alert':
				alert(xmlNode.childNodes[i].firstChild.nodeValue);
				break;
			case 'loadURL':
				URLRequest(xmlNode.childNodes[i].firstChild.nodeValue,0,false,true);
				break;
			case 'Logo':
				try {
					var ilogo = document.getElementById("Logo");
					var lsrc = xmlNode.childNodes[i].getAttribute("img");
					var atxt = xmlNode.childNodes[i].getAttribute("alttext");
					if (ilogo.src != lsrc) {
						ilogo.src = lsrc;
						ilogo.alt = atxt;
					}
				} 
				catch (ev) {
					LOG("Error setting logo");
					LOG(ev);
				};
				break;
			case  'sortfield':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		m_sSortField = "";
			   	} else {
					Field = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'sortdirection':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Direction = "";
			   	} else {
			   		Direction = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'query_base':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.base = "";
			   	} else {
					Query.base = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'mediaID':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.mediaID = "";
			   	} else {
					Query.mediaID = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'query_media':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.media = "";
			   	} else {
					Query.media = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'query_catalog':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.catalog = "";
			   	} else {
					Query.catalog = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'archiveID':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.archiveID = "";
			   	} else {
					Query.archiveID = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case  'query_archive':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.archive = "";
			   	} else {
					Query.archive = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
			   	}
			   	break;
			case   'query_maps':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		Query.maps = "";
			   		Query.mapstxt = "";
			   		Query.mapslvl = "";
			   	} else {
					Query.maps = unescape(trim(xmlNode.childNodes[i].firstChild.nodeValue));
				   	try {
				   		document.getElementById("query_maps").innerHTML = Query.mapstxt;
				   	} catch(ex) {
						LOG("Error during query_maps");
						LOG(ex);
					};
			   	}
			   	break;
			case 'registersearchdefine':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		m_strLastSearchDefineRequest  = "";
			   	} else {
			   		m_strLastSearchDefineRequest   = trim(xmlNode.childNodes[i].firstChild.nodeValue);
			   	}
			   	break;
			case 'searchstate':
			   	if (xmlNode.childNodes[i].childNodes.length === 0) {
			   		searchstate = "";
			   	} else {
			   		searchstate = trim(xmlNode.childNodes[i].firstChild.nodeValue);
			   	}
			   	break;
			case 'reRegisterSliderEvent':
				slider_offset = xmlNode.childNodes[i].getAttribute("offset");
				slider_total = xmlNode.childNodes[i].getAttribute("total");
				slider_lpx = xmlNode.childNodes[i].getAttribute("lpx");
				slider_cmd = xmlNode.childNodes[i].getAttribute("cmd");
				slider_count = xmlNode.childNodes[i].getAttribute("count");
				slider_mover = xmlNode.childNodes[i].getAttribute("moverid");
				try {
					slider_lichtpult = xmlNode.childNodes[i].getAttribute("LP");
					if (slider_lichtpult) {
						slider_LP = slider_lichtpult.split('|');
						slider_useLP = true;
					}
				} catch (elp) {
					LOG("Error registering LP Slider");
					LOG(elp);
					slider_useLP = false;
				}
				try {
					bb.document.getElementById(slider_mover).addEventListener('mousedown', function(event){initSlider(event);},false);
					bb.document.getElementById(slider_mover).addEventListener('mouseup', function(event){releaseSlider(event);},false);
				}
				catch(ex) {
					try {
						//Lets try the classic way
						var mover = document.getElementById(slider_mover);
				   		addEvent(mover,"mousedown",initSlider);
				   		addEvent(mover,"mouseup",releaseSlider);	
					}
					catch(ex2) {
						LOG("Error in register SliderEvents: " + ex2);
					}
				}
			   	fnReleaseCallback = function(iLeft) {
			   		var dok = Math.round(((iLeft - slider_offset) * slider_total / slider_lpx) + 1);
			   		if (slider_useLP) {
			   			APSRequest(slider_cmd + slider_LP[dok - 1]);
			   		} else {
				   		APSRequest(slider_cmd + "?no=" + dok);
				   	}
			   	};
				fnMoveCallback = function(iLeft, tooltip) {
			   		var dok = Math.round(((iLeft - slider_offset) * slider_total / slider_lpx) + 1);
			   		var todok;
			   		todok = dok + Number(slider_count) - 1;
			   		if (todok > slider_total) {
			   		   todok = slider_total;
			   		}
			   		if (dok == todok) {
						tooltip.innerHTML = 'Dokument: ' + dok;
			   		} else {
						tooltip.innerHTML = 'Dokument: ' + dok + " - " + todok;
					}
				};
				break;
			case 'RegisterSuggestEvent':
				try {
					/*
					var patterninput = document.getElementById("pattern");
					addEvent(patterninput,"keyup",RequestSuggest);
					*/
					bb.document.getElementById("pattern").addEventListener('keyup', function(event){RequestSuggest(event);},false);
				} catch (ex) {
					try {
						//OK, lets try the "classic" way if bb.event registration failes
						var patterninput = document.getElementById("pattern");
						addEvent(patterninput,"keyup",RequestSuggest);
					}
					catch (ex2) {
						LOG("Error in RegisterSuggestEvent: " + ex2);
					}
				}
				break;
			case 'refreshCatalog':
				DDRefresh(Query.base, false);
				break;
			case 'searchReset':
				Query.media = "";
				Query.archive = "";
				Query.base = "";
				Query.catalog = "";
				Query.maps = "";
				Query.mapstxt = "";
				Query.mapslvl = "";
			    Query.lastDDUpdate.catalog = "";
			    Query.lastDDUpdate.tastr = "";
			    Query.lastDDUpdate.start = "";
			    searchstate = "NEW";
				break;
			case 'suggesthits':			
				try {
					if (!SuggestCancel) {
						var divsuggestBox = document.getElementById("suggestBox");
						if (xmlNode.childNodes[i].firstChild.nodeValue > 0) {
							divsuggestBox.style.display = "block";
						} else {
							divsuggestBox.style.display = "none";
						}
					}
				} 
				catch (ex) {
				    LOG("Error in suggesthits");
					LOG(ex);
				}
				
				break;
			case 'displayresultlist':
				var no = xmlNode.childNodes[i].getAttribute("no");
				APSRequest("displayresultlist?no=" + no);
				break;
			case 'displayresultdocument':
				var no = xmlNode.childNodes[i].getAttribute("no");
				APSRequest("displayresultdocument?no=" + no);
				break;
			case 'displayresultdocumentmap':
				var no = xmlNode.childNodes[i].getAttribute("no");
				APSRequest("displayresultdocumentmap?no=" + no);
				break;
			case 'displayresultdocumentinfo':
				var no = xmlNode.childNodes[i].getAttribute("no");
				APSRequest("displayresultdocumentinfo?no=" + no);
				break;
			case 'displayresultzoom':
				var no = xmlNode.childNodes[i].getAttribute("no");
				var medium =  xmlNode.childNodes[i].getAttribute("medium");
				APSRequest("displayresultzoom?no=" + no + "&medium=" + medium);
				break;				
			case 'displayresultgalery':
				var no = xmlNode.childNodes[i].getAttribute("no");
				APSRequest("displayresultgalery?no=" + no);
				break;
			case 'displayresultmap':
				var no = xmlNode.childNodes[i].getAttribute("no");
				if (DMode=='map') {
					APSRequest("displayresultmap?no=" + no + "&map=reinit");
				} else {
					APSRequest("displayresultmap?no=" + no + "&map=init");
				}
				break;
			case 'scrollTop':
				window.scrollTo(0,0);
				break;
			case 'suggestRefresh':
				var sRtastr = xmlNode.childNodes[i].getAttribute("tastr");
				var sRsuggstart = xmlNode.childNodes[i].getAttribute("suggstart");
				var sRstart = xmlNode.childNodes[i].getAttribute("start");
				var sRsugg20 = xmlNode.childNodes[i].getAttribute("sugg20");
				var sRsuggcmd = xmlNode.childNodes[i].getAttribute("suggcmd");
				var sRmax = xmlNode.childNodes[i].getAttribute("max");
				var sRdir = xmlNode.childNodes[i].getAttribute("dir");
				var sInitialstart = xmlNode.childNodes[i].getAttribute("initialstart");
				APSSuggestNav(sRtastr,sRstart,sRdir,sRsuggstart,sRsugg20,sRsuggcmd,'',sRmax,sInitialstart);				
				break;
			case 'resetDetails':
			    resetDetails();
			    break;
			case 'displayDetail':
				var Detailid= xmlNode.childNodes[i].getAttribute("id");
				toggleDetail(Detailid,'','');
				break;
			case 'checkStatus':
				checkStatus();
				break;
			case 'WKLoadAdresses':
				WKLoadAdresses();
				break;
			case 'WKResetWK':
				WK='';
				WKcmt='';
				updateStatusCookie();
				refreshStatusHeadline();
				break;
			case 'resizeDrillChilds':
				resizeDrillChilds();
				break;
			case 'ExtraMenuSync':
				var path = xmlNode.childNodes[i].getAttribute("path");
				var def = xmlNode.childNodes[i].getAttribute("def");
				ExtraMenuSync(path,def,true);
				break;
			case 'MapInit':
				resizeMap();
				var lat = xmlNode.childNodes[i].getAttribute("lat");
				var lng = xmlNode.childNodes[i].getAttribute("lng");
				var zoom = xmlNode.childNodes[i].getAttribute("zoom");
				var map = xmlNode.childNodes[i].getAttribute("map");
				var lookup = xmlNode.childNodes[i].getAttribute("lookup") == 'true';
				mapinit(lat, lng, zoom, map, lookup);
				if (lookup) {
					maploadmarker();
				}
				break;
			case 'MapAddMarker':
				var lat = xmlNode.childNodes[i].getAttribute("lat");
				var lng = xmlNode.childNodes[i].getAttribute("lng");
				var motxt = xmlNode.childNodes[i].getAttribute("motxt");
				var cc = xmlNode.childNodes[i].getAttribute("colorcode");
				var dynload = xmlNode.childNodes[i].getAttribute("dynload") == 'true';
				var divid = xmlNode.childNodes[i].getAttribute("divid");				
				var des = "";
				if (document.importNode) {
					des = document.importNode(xmlNode.childNodes[i], true).innerHTML;
				} else {
					des = xmlNode.childNodes[i].childNodes[0].xml;
				}
				mapaddmarker(lat,lng,des,motxt,cc,dynload,divid);
				break;
			case 'MapDeleteMarker':
				mapdeletemarker();
				break;
			case 'MapGenerateMarker':
				mapgeneratemarker();
				break;
			case 'MapMarkerOverflow':
				mapmarkeroverflow();
				break;
			case 'SWFObject':
				var soswf = xmlNode.childNodes[i].getAttribute("swf");
				var soid = xmlNode.childNodes[i].getAttribute("id");
				var sowidth = xmlNode.childNodes[i].getAttribute("width");
				var soheight = xmlNode.childNodes[i].getAttribute("height");
				var sover = xmlNode.childNodes[i].getAttribute("version");
				var sobgcol = xmlNode.childNodes[i].getAttribute("background");
				SWFInstance = null;
				SWFInstance = new SWFObject(soswf,soid,sowidth,soheight,sover,sobgcol);
				break;
			case 'SWFObjectAddVariable':
				var sok = xmlNode.childNodes[i].getAttribute("key");
				var sov = xmlNode.childNodes[i].getAttribute("value"); 			
				SWFInstance.addVariable(sok,sov);
				break;
			case 'SWFObjectAddParam': 
				var pok = xmlNode.childNodes[i].getAttribute("key");
				var pov = xmlNode.childNodes[i].getAttribute("value"); 			
				SWFInstance.addParam(pok,pov);
				break;
			case 'SWFObjectWrite':
				var t = xmlNode.childNodes[i].getAttribute("target");
				SWFInstance.write(t);
				resizeZoomify();
				break;
			case 'DMode':
				DMode = xmlNode.childNodes[i].getAttribute("mode");
				break;
			case 'RefreshStatusHeadLine':
				refreshStatusHeadline();
				break;
			case 'partnerLogo':
				var partnerImgSrc = xmlNode.childNodes[i].getAttribute("src");
				var partnerImgNode = document.getElementById('partnerlogo');
				if (partnerImgNode != null) {
					if (partnerImgSrc != null && partnerImgSrc != undefined) {
						partnerImgNode.src = partnerImgSrc;
						partnerImgNode.style.display = 'block';
					}
					else {
						partnerImgNode.style.display = 'none';
					}				
				}
				break;
			case 'scaleImages': 
				var maxSideLength = parseInt(xmlNode.childNodes[i].getAttribute("to"));
				var imgNodeName = xmlNode.childNodes[i].getAttribute("name");
				if (ImageScaler) {
					if (maxSideLength > 0 && imgNodeName) {
						ImageScaler.startResizeImagesInterval(imgNodeName, maxSideLength);
					}
				}
				break;
			case 'entity': {
				selectedEntityPrefix = xmlNode.childNodes[i].getAttribute("prefix");
				break;
			}
			case 'setSortField': {
				m_sSortField = xmlNode.childNodes[i].getAttribute("name");
				break;
			}
			case 'setSortDirection': {				
				m_sSortDirection = xmlNode.childNodes[i].getAttribute("direction");
				break;
			}
			default:
				try {
 					var resultContainer = xmlNode.childNodes[i];
					var oParent = bb.document.getElementById(nodeName);
					var sParentNodeName = undefined;
					if (oParent != null) {
						sParentNodeName = oParent.viewNode.nodeName;
					}
					else {
						oParent = document.getElementById(nodeName);
						sParentNodeName = oParent.nodeName;
					}
					
					
					
					if (resultContainer.childNodes.length == 0 && nodeName != '#text' && nodeName != '#comment') {
						showDiv(nodeName, false);
					}
					else {
						//Zielknoten befüllen
						var iCounter = 0;
				
                       for (var k = 0; k < resultContainer.childNodes.length && nodeName != '#text' && nodeName != '#comment'; k++) {
                    	   var xml = bb.xml.serialize(resultContainer.childNodes[k], false);
								var curInsertNode = resultContainer.childNodes[k];
								if (curInsertNode.nodeName != '#comment') {
									if (xml.search(/\</) >= 0) {
										var bCounts = (xml.search(/^\<e:/) < 0);
										var sMode = 'appendChild';
										if (iCounter == 0) {
											sMode = 'replaceChildren';
											if (bpreloaded) {
												clearDiv(nodeName);
											}
										}
										try {
											if (bb.browser.ie) {
												xml = new DOMParser().parseFromString(xml, 'text/xml');
												if (bb.document.modelNode.importNode) {
													try {
														xml = bb.document.modelNode.importNode(xml, true);
													} 
													catch (exSaS2) {
													}
												}
												bb.command.create(xml.documentElement, oParent, sMode);
											}
											else {
												bb.command.create(curInsertNode, oParent, sMode);
											}
										}
										catch(ecBBCreate)  {
											LOG("ERROR DURING bb.command.create");
										}
										if (bCounts) {
											iCounter++;
										}									
									}
								}
						}
						
						if (nodeName=='infotext' || nodeName=='result') {
							var oPrintNode = document.getElementById('print');
							var sPrintContents = document.getElementById(nodeName).innerHTML;
							sPrintContents = sPrintContents.replace(/id="([^"]+)/g, "id=print_$1");
							oPrintNode.innerHTML = sPrintContents;							
						}
						
						// set container visible
						if (nodeName.charAt(0)!='#') {
							if (nodeName != 'fmpartnermenu') {
								showDiv(nodeName, true);
							}
							if (nodeName == 'infotext') {
								showDiv('result', false);
							}
							else if (nodeName == 'result') {
								showDiv('infotext', false);
							}
						}
					}	
				} catch (ex) {
					if (nodeName != '#text' && nodeName != '#comment') {
						LOG("Error during default insertion");
						LOG(ex);
					}
				}
				performResize();
				break;
		}
	}
	
	ExtraMenuSync(url);
//	} catch (ex) {
//	}
}

function showHideDiv(id) {
	
	var node = bb.document.getElementById(id);
	bb.command.showHide(node);
	
	/*if (bb.document.getElementById(id)) {
		n = bb.document.getElementById(id);
	} else {
		n = document.getElementById(id);
	}
	if (n) {
		if (BrowserDetect.bb_browser != 'ie') {
			showDiv(id, n.style.display=='none');
		} else {
			showDiv(id, n.style.getAttribute('display')=='none');
		}
	}*/
}
/**
 * showDiv
 * @param {String} id ID des anzuzeigenden Elements
 * @param {boolean} Sichtbarkeit an /aus (default an)
 */
/**
 * showDiv
 * @param {String} id ID des anzuzeigenden Elements
 * @param {boolean} visible Sichtbarkeit
 */
function showDiv(id,visible) {
	try {
		if (typeof(visible)!='boolean') {
			visible = true;
		}
		var node = null;
		if (bb.document.getElementById(id)) {
			node = bb.document.getElementById(id);
			if (visible) {
				bb.command.show(node);
				if (typeof(onShowNode)=='function') {
					onShowNode(node);
				}
			} 
			else {
				bb.command.hide(node);
				if (typeof(onHideNode)=='function') {
					onHideNode(node)
				}
			}
		}
		else if (document.getElementById(id)) {
			node = document.getElementById(id);
			if (visible) {
				node.style.display = "block";
				if (typeof(onShowNode)=='function') {
					onShowNode(node);
				}		
			}
			else {
				node.style.display = "none";
				if (typeof(onHideNode)=='function') {
					onHideNode(node);
				}		
			}
		}
		else {
			delete node;
		}
	} 
	catch (ex) {
	    LOG("Error during showdiv id ");   
		LOG(ex);
	}
	resizeDrillChilds();
}

function clearDiv(id) {
	try {
		var oNode = document.getElementById(id);
		if (oNode) {
			oNode = document.getElementById(id);
			oNode.innerHTML = "";
		}
	}
	catch(ex) {
	    LOG("ERROR during cleardiv for id " + id);
		LOG(ex);
	};
}

/**
 * @param {String} strNodeid the node id
 * @param {String} strOverflowMode the overflow mode, either: 'auto' or 'scroll' or 'hidden' (default: 'auto')
 */
function setOverflow(strNodeid,strOverflowMode) {
	if (strOverflowMode !== 'auto' && strOverflowMode !== 'scroll' && strOverflowMode!='hidden') {
		strOverflowMode = 'auto';
	}
	try {
		//Der Weg über Backbase
		var oNode = bb.document.getElementById(strNodeid);
		bb.command.setStyle(oNode, {'overflow':strOverflowMode, 'overflow-x':strOverflowMode, 'overflow-y':strOverflowMode});
	}
	catch(ex) {
		LOG('ERROR during set overflow (backbase way)');
		//Wenn der Weg über Backbase nicht geht, dann wird der
		//"klassisiche" Weg über DOM veruscht
		try {
			var oNode = document.getElementById(strNodeid);
			oNode.style.overflow = strOverflowMode;
			oNode.style.overflowX = strOverflowMode;
			oNode.style.overflowX = strOverflowMode;
		}
		catch(ex2) {
		    LOG('ERROR during set overflow (classic way)');
			LOG(ex2);
		}
	};
}

function toggleResultSection(blkid,headid) {
	var blkNode   = bb.document.getElementById(blkid)
	if (blkNode) {
		blkNode = blkNode.viewNode;
	}
	else {
		blkNode = document.getElementById(blkid);
	}
	
	var headNode = bb.document.getElementById(headid);
	if (headNode) {
		headNode = headNode.viewNode;
	}
	else {
		headNode = document.getElementById(headid);
	}
	
	if (headNode && blkNode) {
		var bShowBlk = (bb.html.getStyle(blkNode, 'display') == 'none');
		showDiv(blkid, bShowBlk);
		
		var sHeadCls = 'collapsedHeading';
		if (bb.html.hasClass(headNode, 'collapsedHeading')) {
			sHeadCls = 'expandedHeading';
		}
		bb.html.setClass(headNode, sHeadCls);
		resizeDrillChilds();
	}
}

function Bildkarte(imgurl,blkid,headid) {
	var divname = document.getElementById(blkid);
	if (divname.style.display == "none") {
	    divname.style.display = "block";
	    divname.innerHTML = '<img src="' + imgurl + '" onload="resizeDrillChilds()" onerror="this.src=\'/images/Scan-not-available.gif\'";/>';
	} else {
	    divname.style.display = "none";
	}
	var headname = document.getElementById(headid);
	if (headname.className == "expandedBildkarte") {
	   headname.className = "collapsedBildkarte";
	} else {
	   headname.className = "expandedBildkarte";
	}
	resizeDrillChilds();
}

function execSimpleSearch(sIndex, sValue) {
	APSRequest('searchdefine?query='+sIndex+':"'+sValue+'"' + '&katalog=NONE');
}

/**
 * submitSearch
 * Eine Suche absetzen
 * @param suggestIndex wenn aus Suggest aufgerufen: Indexname
 * @param suggestPattern wenn aus Suggest aufgerufen: Descriptor 
 */
function submitSearch(suggestIndex,suggestPattern) {
	
	
    var nodeSpecificFunc = undefined;
    if (typeof(onSubmitSearch) == 'function') {
        onSubmitSearch(suggestIndex, suggestPattern);
    }
	
	// Suggest abschalten
	showDiv("suggestBox",false);
	
	var inputPattern = trim(document.getElementById("pattern").value);
	if (typeof(suggestPattern)=='string') {
		if (suggestPattern.length>0) {
			inputPattern = suggestPattern
		}
	}
	
	lockUIControls();
		
	var inputIndex = document.getElementById("selector").value;
	var opStr = "AND";
	var inputWords = new Array();
	
	inputPattern = trim(inputPattern);
	if (!(inputIndex == 'negnr' || inputIndex == 'pnegnr' || inputIndex == 'qnegnr'
	|| inputIndex == 'iconcl' || inputIndex == 'piconcl' || inputIndex == 'qiconcl')) {
		var rReplaceChars = /[,\.\:\\\/\(\)\{\}\[\]\&\!\<\>\'\"]+/g;
		if (inputPattern.search(rReplaceChars) >= 0) {
			inputPattern = inputPattern.replace(rReplaceChars, " ");
		}
		if (inputIndex == 'freitext' || inputIndex == 'motiv') {
			inputPattern = trim(inputPattern.replace(/[\:\"\'\,]/g,' '));
		}
		inputPattern = inputPattern.replace(/\s+/g, " ");
		if (arguments.length == 0) {
			if (inputPattern[0] == '"' ) {
				inputWords[0] = inputPattern;
			} else {
				inputWords = inputPattern.split(/\s/);
			}
		} else {
			inputPattern = suggestPattern;
			inputIndex = suggestIndex;
			inputWords[0] = '"' + inputPattern + '"';
		}
	} else {
		inputPattern = trim(inputPattern.replace(/[\"\']/g,' '));
        inputWords[0] = '"' + inputPattern + '"';
	}
	try {
		if (document.getElementById("NANDConnector").checked) {
			opStr = "NOT";
		}
	} catch (ex) {
		LOG("id 'NANDConnector' n/a");
		LOG(ex);
	};
	
	try {
		if (document.getElementById("NEWQUERY").checked) {
			Query.base = '';
		    Query.lastDDUpdate.tastr = "";
		    Query.lastDDUpdate.start = "";
		    searchstate = "NEWQUERY";
		}
	} catch (ex) {
	    LOG("id 'NEWQUERY' n/a");
		LOG(ex);
	};
	
	if (searchstate != 'NEW' && searchstate != 'NEWQUERY') {
		var querystring = "";
		for (var i = 0; i < inputWords.length;i++) {
			if (inputWords[i] != "") {
				querystring += " ";
				if (opStr == 'AND') {
					querystring += "+";
				} else {
					querystring += "-";
				}
				if (inputIndex == '_spaeter') {
					querystring +=  "datierun>" + escape(inputWords[i]);
				} else if (inputIndex == '_frueher') {
					querystring += "datierun<" + escape(inputWords[i]);
				} else if (inputIndex == 'fr-datum') {
					querystring += "fr-datum>" + escape(inputWords[i]);
				} else if (inputIndex == 'pfr-datum') {
					querystring += "pfr-datum>" + escape(inputWords[i]);
				} else if (inputIndex == 'qfr-datum') {
					querystring += "qfr-datum>" + escape(inputWords[i]);
				} else if (inputIndex == 'sp-datum') {
					querystring += "sp-datum<" + escape(inputWords[i]);
				} else if (inputIndex == 'psp-datum') {
					querystring += "psp-datum<" + escape(inputWords[i]);
				} else if (inputIndex == 'qsp-datum') {
					querystring += "qsp-datum<" + escape(inputWords[i]);
				} else {
					querystring += inputIndex + ":" + escape(inputWords[i]);
				}
			}
		}
		basequery = escape(Query.base) + " " + querystring;
		querystring = escape(trim(Query.media + " " + Query.archive + " " + Query.maps) + " " ) + basequery + escape(" " + Query.catalog);
		if (querystring != '') {
			APSRequest("searchdefine?query=" + querystring);
		}
	} else {
		var querystring = "";
		for (var i = 0; i < inputWords.length;i++) {
			if (inputWords[i] != "") {
				querystring += " ";
				if (opStr == 'AND') {
					querystring += "+";
				} else {
					querystring += "-";
				}
					if (inputIndex == '_spaeter') {
						querystring +=  "datierun>" + escape(inputWords[i]);
					} else if (inputIndex == '_frueher') {
						querystring += "datierun<" + escape(inputWords[i]);
					} else if (inputIndex == 'fr-datum') {
						querystring += "fr-datum>" + escape(inputWords[i]);
					} else if (inputIndex == 'pfr-datum') {
						querystring += "pfr-datum>" + escape(inputWords[i]);
					} else if (inputIndex == 'qfr-datum') {
						querystring += "qfr-datum>" + escape(inputWords[i]);
					} else if (inputIndex == 'sp-datum') {
						querystring += "sp-datum<" + escape(inputWords[i]);
					} else if (inputIndex == 'psp-datum') {
						querystring += "psp-datum<" + escape(inputWords[i]);
					} else if (inputIndex == 'qsp-datum') {
						querystring += "qsp-datum<" + escape(inputWords[i]);
					} else {
						querystring += inputIndex + ":" + escape(inputWords[i]);
					}
			}
		}
		basequery = escape(Query.base) + " " + querystring;
		querystring = escape(trim(Query.media + " " + Query.archive + " " + Query.maps) + " ") + basequery + escape(" " + Query.catalog);
		if (querystring !='%20 %20') {
			if (searchstate == 'NEW') {
				APSRequest("searchdefine?query=" + querystring);
			} else {
				APSRequest("searchdefinenq?query=" + querystring);
			}
		} else {
			unLockUIControls();
		}	
	}
	if (Query.catalog) {
		DDRefresh(basequery,false);
	}
}


/**
 * trim
 * Einen String trimmen
 * @param instr der String
 * @return {string} der getrimmte String
 */
function trim(instr) {
	try {
		var r = instr.replace(/\s+/g," ");
		r = r.replace(/^\s+/,"");
		r = r.replace(/\s+$/,"");
		return r;
	} catch (ex) {
		return '';
	}
}

 
function RequestSuggest(evt) {

	var keycode;
	
	try {
		keycode = evt.keyIdentifier.toUpperCase();
	} 
	catch (f) {
		LOG("Error getting keyIdentifier for suggest onkeyup event");
		LOG(f);
	};
	switch (keycode) {
		case "U+001B": // ESC
			showDiv("suggestBox",false);
			return false;
			break;
		case "DOWN": // Down
			showDiv("suggestBox",false);
			return false;
			break;
		case "UP": // Up
			APSSuggest();
			return false;
			break;
		case "HOME": // Pos1
			var but = document.getElementById("SuggA");
			but.onclick();
			return false;
			break;
		case "END": // Ende
			var but = document.getElementById("Sugg4");
			but.onclick();
			return false;
			break;
		case "PAGEUP": // PgUp
			var but = document.getElementById("Sugg2");
			but.onclick();
			return false;
			break;
		case "PAGEDOWN": // PgDw
			var but = document.getElementById("Sugg3");
			but.onclick();
			return false;
			break;
		case 'ENTER': //
			submitSearch();
			return false;
			break;
		default:
			if (suggestTimeout > 0) {
			   clearTimeout(suggestTimeout);
			   suggestTimeout = 0;
			}
			suggestTimeout = setTimeout("APSSuggest()",APSSuggestDelay);
	}
}

/**
 * APSSuggest
 * Einen Suggest-Request absetzen
 */

function APSSuggest() {

	clearTimeout(suggestTimeout);
	
	var inputPattern = document.getElementById("pattern").value;
	var inputIndex = document.getElementById("selector").value;
	
	inputPattern = trim(inputPattern);
	//	var inputWords = inputPattern.split(/\s/);
	
	// Zeichen wie ,.;" entfernen
	inputPattern = inputPattern.replace(/[\"]/g,' ');
	inputPattern = inputPattern.replace(/\s+/g,' ');
	
	var basequerystring = "";
	
	if (Query.base||Query.media||Query.archive||Query.catalog) {
		var nq = false;
		try {
			nq = document.getElementById("NEWQUERY").checked;
		} catch (ex) {
			LOG("id NEWQUERY n/a");
			LOG(ex);
			nq = false;
		}
		if (nq) {
		    // basequerystring = Query.media + ' ' + Query.archive + ' ' +  Query.catalog;
			// basequerystring = "&query=" + escape(basequerystring) ;
			basequerystring = "";
		} else {
		    basequerystring = trim(Query.media + ' ' + Query.archive + ' ' + Query.maps + ' ' + Query.base + ' ' + Query.catalog);
			basequerystring = "&query=" + escape(basequerystring) ;
		}
	}
	
	//if (inputWords[0] != '') {
	//	APSRequest("suggest?tastr=" + inputIndex + "&start=" + escape(inputWords[0]) + "&max=20" + basequerystring,2);
	//}
	
	// Suggest für descriptorenweisen Index mit mehreren Worten zulassen
	if (inputPattern != '') {
		SuggestCancel = false;
		APSRequest("suggest?tastr=" + inputIndex + "&start=" + escape(inputPattern) + "&max=20" + basequerystring,2);
	}
		
}

/**
 * APSSuggestNav
 * APSSuggest-Navigation
 */
function APSSuggestNav(tastr,start,dir,suggstart,sugg20,suggcmd,thelkuplast,max,query) {
	var req = "suggest?";
	req += "tastr=" + tastr;
	req += "&start=" + escape(start);
	if (dir) {
		req += "&dir=" + dir;
	}
	if (suggstart) {
		req += "&suggstart=" + escape(suggstart);
	}
	if (sugg20) {
		req += "&sugg20=" + escape(sugg20);
	}
	req += "&suggcmd=" + suggcmd;
	if (thelkuplast) {
		req += "&thelkuplast=" + escape(thelkuplast);
	}
	req += "&max=" + max;
	if (query) {
	   req += "&query=" + escape(query);
	}
	APSRequest(req,2);
						
   
}

/**
 * getStyle
 * gibt den berechneten Stylesheetwert zurück
 */
function getStyle(elem, IEStyleProp, CSSStyleProp) {
	if (window.getComputedStyle) {
		var compStyle = window.getComputedStyle(elem, "");
		return compStyle.getPropertyValue(CSSStyleProp);
	} else if (elem.runtimeStyle) {
		return elem.runtimeStyle[IEStyleProp];
	} else if (elem.currentStyle) {
		return elem.currentStyle[IEStyleProp];
	}
	return "";
}

/**
 * resizeDrillChilds
 * Bei Resize das Drilldownmenü anpassen.
 */
function resizeDrillChilds() {
	try {
		resizeZoomify();
		resizeMap();
		resizeDrillChildsWorker();
		if (DrillChildsTimeout > 0) {
			clearTimeout(DrillChildsTimeout);
			DrillChildsTimeout = 0;
		}
		DrillChildsTimeout = setTimeout("resizeDrillChildsWorker()",DrillChildResizeDelay);
	}
	catch (ex) {
		LOG("Error during resize drillchilds");
		LOG(ex);
	}
} 

function resizeDrillChildsWorker() {

	clearTimeout(DrillChildsTimeout);
	
	var debug = new Object();
	var search;
	var drillChilds = bb.document.getElementById("drillChilds");
	if (drillChilds) {
		drillChilds = drillChilds.viewNode;
	}
	else {
		drillChilds = document.getElementById("drillChilds");
	}
	
	if (drillChilds) {
		search = bb.document.getElementById("search");
		if (search) {
			search = search.viewNode;
		}
		else {
			search = document.getElementById("search");
		}
		if (search) {
			var iUpperHeight = 0;
			var iLogoHeight = 120;
			var iSearchHeight = 0;
			
			var iArchiveHeight = 0;

			if (Query.archiveID) {
				if (Query.archiveID != 'ALL' && Query.archiveID != 'NONE') {
					iArchiveHeight = 69;
				}
			}
			
			if (search.offsetHeight) {
				iSearchHeight = search.offsetHeight;
			} else if (search.clientHeight) {
				iSearchHeight = search.clientHeight;
			}
			
			iUpperHeight = iLogoHeight + iSearchHeight + iArchiveHeight;

			var catalog = bb.document.getElementById("catalog");
			if (catalog) {
				catalog = catalog.viewNode;
			}
			else {
				catalog = document.getElementById("catalog");
			}
			var childs = catalog.childNodes;
			for (var i = 0; i < childs.length; ++i) {
			
				if (childs[i] != drillChilds) {
					var iLiHeight = 0;
					// checking for nodeType == Element
					if (childs[i].nodeType == 1) {
						if (childs[i].offsetHeight) {
							iLiHeight += childs[i].offsetHeight;
						} else if (childs[i].clientHeight) {
							iLiHeight += childs[i].clientHeight;
						}

						debug['catalogLI' + i + "/" + childs[i].className] = iLiHeight;
						iUpperHeight += iLiHeight;
					}
				}
			}
			// 32px abzug, wegen margin von li[@class=caption]
			iUpperHeight += 32;
			var iBodyHeight;
			var browser = BrowserDetect.browser;
			var version = BrowserDetect.version + "";
			if (window.innerHeight) {
				iBodyHeight = window.innerHeight;
			} else if (document.documentElement && document.documentElement.innerHeight){
				iBodyHeight = document.documentElement.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight){
				iBodyHeight = document.documentElement.clientHeight;
			} else if (document.body && document.body.clientHeight){
				iBodyHeight = document.body.clientHeight;
			} else if (document.getElementsByTagName("body")[0].clientHeight) {
				iBodyHeight = document.getElementsByTagName("body")[0].clientHeight;
			}

			if (browser == "Explorer" && version.indexOf('6') != -1) {
				iUpperHeight -= 11; //IE6
			}

			if (browser == "Explorer" && version.indexOf('7') != -1) {
				iUpperHeight -= 11; //IE7
			}

			drillChilds.style.top = iUpperHeight - iLogoHeight + "px";
			var iNewHeight = iBodyHeight - iUpperHeight;
			
			try {
				drillChilds.style.height = iNewHeight + "px";
			} catch(ex) {
				LOG("Error during resizeDrillChildsWorker");
				LOG(ex);
			}
		}
	}
}

// The constructor function: creates a cookie object for the specified
// document, with a specified name and optional attributes.
// Arguments:
//   document: The Document object that the cookie is stored for. Required.
//   name:     A string that specifies a name for the cookie. Required.
//   hours:    An optional number that specifies the number of hours from now
//             that the cookie should expire.
//   path:     An optional string that specifies the cookie path attribute.
//   domain:   An optional string that specifies the cookie domain attribute.
//   secure:   An optional Boolean value that, if true, requests a secure cookie.
//
function Cookie(document, name, hours, path, domain, secure)
{
    // All the predefined properties of this object begin with '$'
    // to distinguish them from other properties which are the values to
    // be stored in the cookie.
    this.$document = document;
    this.$name = name;
    if (hours)
        this.$expiration = new Date((new Date()).getTime() + hours*3600000);
    else this.$expiration = null;
    if (path) this.$path = path; else this.$path = null;
    if (domain) this.$domain = domain; else this.$domain = null;
    if (secure) this.$secure = true; else this.$secure = false;
}

// This function is the store() method of the Cookie object.
Cookie.prototype.store = function () {
    // First, loop through the properties of the Cookie object and
    // put together the value of the cookie. Since cookies use the
    // equals sign and semicolons as separators, we'll use colons
    // and ampersands for the individual state variables we store 
    // within a single cookie value. Note that we escape the value
    // of each state variable, in case it contains punctuation or other
    // illegal characters.
    var cookieval = "";
    for(var prop in this) {
        // Ignore properties with names that begin with '$' and also methods.
        if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) 
            continue;
        if (cookieval != "") cookieval += '&';
        cookieval += prop + ':' + escape(this[prop]);
    }

    // Now that we have the value of the cookie, put together the 
    // complete cookie string, which includes the name and the various
    // attributes specified when the Cookie object was created.
    var cookie = this.$name + '=' + cookieval;
    if (this.$expiration)
        cookie += '; expires=' + this.$expiration.toGMTString();
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    if (this.$secure) cookie += '; secure';

    // Now store the cookie by setting the magic Document.cookie property.
    this.$document.cookie = cookie;
};

// This function is the load() method of the Cookie object.
Cookie.prototype.load = function() { 
    // First, get a list of all cookies that pertain to this document.
    // We do this by reading the magic Document.cookie property.
    var allcookies = this.$document.cookie;
    if (allcookies == "") return false;

    // Now extract just the named cookie from that list.
    var start = allcookies.indexOf(this.$name + '=');
    if (start == -1) return false;   // Cookie not defined for this page.
    start += this.$name.length + 1;  // Skip name and equals sign.
    var end = allcookies.indexOf(';', start);
    if (end == -1) end = allcookies.length;
    var cookieval = allcookies.substring(start, end);

    // Now that we've extracted the value of the named cookie, we've
    // got to break that value down into individual state variable 
    // names and values. The name/value pairs are separated from each
    // other by ampersands, and the individual names and values are
    // separated from each other by colons. We use the split method
    // to parse everything.
    var a = cookieval.split('&');    // Break it into array of name/value pairs.
    for(var i=0; i < a.length; i++)  // Break each pair into an array.
        a[i] = a[i].split(':');

    // Now that we've parsed the cookie value, set all the names and values
    // of the state variables in this Cookie object. Note that we unescape()
    // the property value, because we called escape() when we stored it.
    for(var i = 0; i < a.length; i++) {
        this[a[i][0]] = unescape(a[i][1]);
    }

    // We're done, so return the success code.
    return true;
};

// This function is the remove() method of the Cookie object.
Cookie.prototype.remove = function() {
    var cookie;
    cookie = this.$name + '=';
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

    this.$document.cookie = cookie;
};


function parseBoolean(val) {
	var bRes = false;
	switch(typeof(val)) {
		case 'boolean': {
			bRes = val;
			break;
		}
		case 'number': {
			if (val == 1) {
				bRes = true;
			}
			else {
				bRes = false;
			}
			break;
		}
		case 'string': {
			val = val.toLowerCase();
			if (val == 'true') {
				bRes = true;
			}
			else {
				bRes = false;
			}
			break;
		}
		default: {
			bRes = false;
			break;
		}
	}
	return bRes;
}

function DDSelect(catalog,tastr,start,isMultiPath) {
   DDUpdate(catalog,tastr,start,'',parseBoolean(isMultiPath));
}

function DDUpdate(catalog,tastr,start,catalogquery,isMultiPath) {
   isMultiPath = parseBoolean(isMultiPath);
   LOG("DDUpdate")
   LOG("catalog="+catalog);
   LOG("tastr="+tastr);
   LOG("start="+start);
   LOG("catalogquery="+catalogquery);
   LOG("isMultiPath="+isMultiPath);
   
   var DDsearch = "";
   var DDthequery = "";
   
   if (Query.base || catalogquery) {
	   
	   Query.base = Query.base.replace(/\+xdbdoctype!obj/,"");
	   Query.base = Query.base.replace(/\+xdbdoctype!foto/,"");
	   Query.base = Query.base.replace(/\+xdbdoctype!ico/,"");
	   catalogquery = catalogquery.replace(/\+xdbdoctype!obj/,"");
	   catalogquery = catalogquery.replace(/\+xdbdoctype!foto/,"");
	   catalogquery = catalogquery.replace(/\+xdbdoctype!ico/,"");
	   
      if (!catalogquery) {catalogquery="";};
       var dt = "";
       var ds = "";
	   if (catalog == 'THEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!obj";
	   }
	   else if (catalog == 'FOTOTHEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!foto";
	   }
	   else if (catalog == 'PREMIUMTHEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!foto";
	   }
      DDthequery = escape(trim(Query.media + " " + Query.maps + " " + Query.base) + " ");
      DDthequery += catalogquery;
      DDthequery += dt;
      if (Query.archive) {
    	  DDthequery += " " + Query.archive;
      }
      DDsearch = escape(Query.base) + " " + catalogquery + ds;
      if (Query.archive) {
    	  DDsearch += " " + Query.archive;
      }
   }
   Query.catalog = unescape(catalogquery);
   Query.lastDDUpdate.catalog = catalog;
   Query.lastDDUpdate.tastr = tastr;
   Query.lastDDUpdate.start = start;
//   if (tastr != '') {
	    //TODO ggf. Query mit "!" ???
	    /*DDthequery = escape(unescape(DDthequery).replace(/:/g, '!'));*/
	    APSRequest('catalognavigate?:katalog=' + catalog + '&tastr=' + tastr + '&dir=strict&start=' + start + "&query=" + DDthequery)
   //}
   DDsubmitSearch(DDsearch);   
}

function DDRefresh(basequery,sh) {
	var catalog = Query.lastDDUpdate.catalog;
   	var tastr = Query.lastDDUpdate.tastr;
   	var start = Query.lastDDUpdate.start;
   	var dt = "";
   	var thequery = '' 
        var dt = "";
    var ds = "";
	   basequery = basequery.replace(/\+xdbdoctype!obj/,"");
	   basequery = basequery.replace(/\+xdbdoctype!foto/,"");
//	   catalogquery = catalogquery.replace(/\+xdbdoctype!obj/,"");
//	   catalogquery = catalogquery.replace(/\+xdbdoctype!foto/,"");
	   basequery = basequery.replace(/\+xdbdoctype!ico/,"");
	   catalog = catalog.replace(/\+xdbdoctype!obj/,"");
	   catalog = catalog.replace(/\+xdbdoctype!foto/,"");
	   catalog = catalog.replace(/\+xdbdoctype!ico/,"");

	   if (catalog == 'THEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!obj";
	   }
	   if (catalog == 'FOTOTHEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!foto";
	   }
	   if (catalog == 'PREMIUMTHEMEN'){
		   dt = " +xdbdoctype!ico";
		   ds = " +xdbdoctype!foto";
	   }
	if (sh) {
		thequery = "&" + basequery;
	} else {
		if (Query.catalog || Query.media || Query.archive) {
			thequery = "&query=" + escape(Query.media) + " " + escape(Query.maps) + " " + " " + escape(Query.archive) + " " + basequery + " " + escape(Query.catalog);
   		}
	}
	//TODO ggf. Query mit "!" ???
	//thequery = escape(unescape(thequery).replace(/:/g, '!'));
	APSRequest('catalognavigate?:katalog=' + catalog + '&tastr=' + tastr + '&start=' + start + thequery + dt);
}   

function DDReset() {
	Query.catalog = "";
	Query.lastDDUpdate.catalog = "";
    Query.lastDDUpdate.tastr = "";
    Query.lastDDUpdate.start = "";
}

function DDResetCatalog() {
	Query.catalog='';
	APSRequest('cataloglist');
	if (Query.base) {
		APSRequest("searchdefine?query=" + escape(Query.base) + "&:katalog=NONE");
	} else {
		APSRequest("searchreset?:katalog=NONE");
	}
}

function DDsubmitSearch(querystring) {
    if (querystring) {
		//ABKA-114 Alle Bäume sind nicht normalisiert, daher müssen ! als Trenner für die Queries verwendet werden (anstelle von :)
		//APSRequest("searchdefine?query=" + escape(unescape(querystring).replace(/\:/g, '!')));
		APSRequest("searchdefine?query=" + escape(unescape(querystring)));
	}
}

function CatalogSelect(id,tastr,catalogquery) {
	//Query.archive = '';
	//Query.archiveID = '';
	Query.media = '';
	Query.mediaID = '';
	
    var dquery = '';
    var wquery= '';
    if (Query.base || Query.archive) {
    	wquery = "&query=" + escape(Query.base)+ " " + escape(Query.archive);
	   	dquery = escape(Query.base)+ " " + escape(Query.archive);
    }
    
    Query.lastDDUpdate.catalog = id;
    Query.lastDDUpdate.tastr = tastr;
    Query.lastDDUpdate.start = "*";
	APSRequest('catalogselect?media=ALL&:katalog=' + id + '&start=*&tastr=' + tastr + wquery);
    Query.catalog = catalogquery;	

    // Einführungstext anzeigen, ansonsten Query nachladen.
    if (Query.base != '' || Query.archive != '') {
	    DDsubmitSearch(dquery + escape(' ') + escape(catalogquery));
	}
}

if (!Array.xpush) {
	Array.prototype.xpush = function(elem) {
		this[this.length++] = elem;
	};
}

var BrowserDetect = {
	
	init: function() {
		if (typeof(bb)!='undefined') {
			this.bb_browser = "unknown";
			this.bb_version = "unknown";
			this.bb_inQuirksMode = bb.browser.quirks;
			if (bb.browser.opera) {
				this.bb_browser="opera";
				this.bb_version=bb.browser.version;
			}
			else if (bb.browser.gecko) {
				this.bb_browser="gecko";
				this.bb_version=bb.browser.version;
			}
			else if (bb.browser.webkit) {
				this.bb_browser="webkit"
				this.bb_version=bb.browser.version;
			}
			else if (bb.browser.ie) {
				this.bb_browser="ie";
				this.bb_version=bb.browser.version;
			}
		}
		this.initOld();
	},

	initOld: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]
};
BrowserDetect.init();

var debug = "";
function importNode(node, allChildren) {
	//alert(node);
//	return;
	debug += ".";	
	if (document.importNode) {
		//alert("Returning");
		return document.importNode(node, allChildren);
	} else {
		debug += "[" + node.nodeType + "]";
		switch (node.nodeType) {
			case 1: /* NODE_ELEMENT */
				var newNode = document.createElement(node.nodeName);
				/* does the node have any attributes to add? */
				if (node.attributes && node.attributes.length > 0) {
					for (var i = 0, il = node.attributes.length; i < il; ++i) {
						var nodeName = node.attributes[i].nodeName;
						var nodeValue = node.getAttribute(node.attributes[i].nodeName);
						/* if attrib is an eventhandler -> register event */
						if (nodeName.indexOf("on") == 0) {
							var sEvent = nodeName.replace(/^on/,'');
								debug += nodeName + ":" + nodeValue + "(" + sEvent + ")\n";
							
							//addEvent(newNode, sEvent, function(ex) {
								// pass the event reference to the window object
//								window.e = e;
//								eval(nodeValue);
 //							});
						}
						
						/* anyway add the attrib */
						else {
							newNode.setAttribute(nodeName, "\""+nodeValue+"\"");
						}
					}
				}

				/* are we going after children too, and does the node have any? */
				if (allChildren && node.childNodes && node.childNodes.length > 0) {
					var il = node.childNodes.length;
					for (var i = 0; i < il; ++i) {
						newNode.appendChild(importNode(node.childNodes[i], allChildren));
					}
				}
				return newNode;
				break;
	
			case 3: /* NODE_TEXT */
			case 4: /* NODE_CDATA_SECTION */
				return document.createTextNode(node.nodeValue);
				break;
		}
	}
	alert(debug);
	debug="";
}

function resetDetails() {
   Details = new Object;
}
function toggleDetail(divid,tastr,tdesc) {
	if (!Details[divid]) {
	   Details[divid] = "hidden";
	   if (tdesc != undefined && tastr != undefined) {
	   	  //ABKA-19654
		  APSRequest('detail?tastr=' + tastr + '&tdesc=' + tdesc + '&no=1&normalize=off&divid=' + divid);
		  return;
	   }
	} 
	if (Details[divid] == "hidden") {	
		Details[divid] = "visible";
		showDiv(divid,true);
	} 
	else {
		Details[divid] = "hidden";
		showDiv(divid,false);
	}
	resizeDrillChilds();
}

/****
*
* Lichtpult & Warenkorb
*****/

function toggleStatus(collection,picture) {
	try{
		if (collection == "LP") {
			CollectionVar = LP;
			divname = "LP" + picture;
			activepicture = "/images/img_addtoportfolio_active.gif";
			activetitle = "Bild aus dem Lichtpult entfernen";
			inactivepicture = "/images/img_addtoportfolio.gif";
			inactivetitle = "Bild dem Lichtpult hinzufügen";
		} else {
			CollectionVar = WK;
			divname = "WK" + picture;
			activepicture = "/images/img_buy_active.gif";
			activetitle = "Bild aus dem Warenkorb entfernen";
			inactivepicture = "/images/img_buy.gif";
			inactivetitle = "Bild dem Warenkorb hinzufügen";
		}
		//div = document.getElementById(divname);
		var divlst = document.getImagesByName(divname);
		var bPicAdded = false;
		for (var i=0; i < divlst.length; i++) {
			var div = divlst[i];
			if (div.src.indexOf(inactivepicture) > -1) {
			   div.src = activepicture;
			   div.title = activetitle;
			   if (bPicAdded == false) {
				   if (CollectionVar != "") {
				      CollectionVar += "|";
				   }
		 	   	   CollectionVar += picture;
		  	   	   bPicAdded = true;
			   }
			} else {
			   div.src = inactivepicture;
			   div.title = inactivetitle;
			   if (CollectionVar.indexOf(picture) >= 0) {
				   c = CollectionVar.substring(0,CollectionVar.indexOf(picture) - 1) + CollectionVar.substring(CollectionVar.indexOf(picture) + picture.length,CollectionVar.length);
				   CollectionVar = c;
				   CollectionVar = CollectionVar.replace(/\|\|/g,"|");
				   if (CollectionVar === "|") {
						CollectionVar = "";
				   }
				   if (CollectionVar.indexOf("|") == 0) {
				      CollectionVar = CollectionVar.substring(1,CollectionVar.length);
				   }
			   }
			}
		}
		if (collection == "LP") {
			LP = CollectionVar;
		} else {
			WK = CollectionVar;
		}
		updateStatusCookie();
		refreshStatusHeadline();
	}
	catch (ex) {
		LOG("Error during toggleStatus");
		LOG(ex);
	}
}

function checkStatus() {
	var LPpictures = new Array;
	var WKpictures = new Array;

		
	LPpictures = LP.split("|");
	WKpictures = WK.replace(/\[\d,\d,\d,\d\]/g,'').split("|");
	
	var activepicture = "/images/img_addtoportfolio_active.gif";
	var activetitle = "Bild aus dem Lichtpult entfernen";
	for (var i= 0; i<LPpictures.length;i++) {
	    if (LPpictures[i] != "") {
		    var divname = "LP" + LPpictures[i];
		    try {
		       //div = document.getElementById(divname);
	   	   	   var divlst = document.getImagesByName(divname);
	    	   for (var j=0; j<divlst.length; j++) { 
	    	   	  div = divlst[j];
		       	  div.src = activepicture;
		       	  div.title = activetitle;
		       }
		    } catch (ex) {
				LOG("Error setting active LP Picture Icon");
				LOG(ex);
			};
		}
	}

	activepicture = "/images/img_buy_active.gif";
	activetitle = "Bild aus dem Warenkorb entfernen";
	for (var i= 0; i<WKpictures.length;i++) {
	    if (WKpictures[i] != "") {
		    var divname = "WK" + WKpictures[i];
		    try {
	    	   //div = document.getElementById(divname);
	    	   var divlst = document.getImagesByName(divname);
	    	   for (var j=0; j<divlst.length; j++) { 
	    	      div = divlst[j];
		          div.src = activepicture;
		          div.title = activetitle;
		       }
		    } catch (ex) {
		        LOG("Error setting active WK Picture Icon");
				LOG(ex);
	    	};
	    }
	}
}

function loadLanguageCookie() {
	Lang = '';
	try {
		var cArray = document.cookie.split(";");
		for (var i = 0; i < cArray.length; i++) {
			var ts = trim(cArray[i]);
			if (ts.indexOf("lang=") == 0) {
				Lang = ts.substring(5, ts.length);
			}
		}
	}
	catch(ex2){
	    LOG("Error loading lang cookie");
		LOG(ex2);
	}
	if (Lang == '') {
		Lang = DEFAULT_LANGUAGE;
	}
	storeLanguageCookie();
}


function storeLanguageCookie() {
	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	if (Lang != '') {
		document.cookie = trim("lang=" + Lang + ";expires=" + nextYear.toGMTString());
	}
	else {
		document.cookie = trim("lang=" + DEFAULT_LANGUAGE + ";expires=" + nextYear.toGMTString());
	}
}

function setLanguage(sLanguage) {
	if (sLanguage != undefined && sLanguage != null && sLanguage != '') {
		Lang = sLanguage;
		storeLanguageCookie();
	}
}

function updateStatusCookie() {
	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	document.cookie = trim("WK=" + WK + ";expires=" + nextYear.toGMTString());
	document.cookie = trim("LP=" + LP + ";expires=" + nextYear.toGMTString());
	if (WKOrderPersistent) {
		document.cookie = trim("WKOrder=" + escape(WKOrder) + ";expires=" + nextYear.toGMTString());
	} else {
		document.cookie = trim("WKOrder=" + escape(WKOrder));
	}
	var WKcmttmp = WKcmt.replace(/\x0A/g,"$!$");
	document.cookie = "WKcmt=" + escape(trim(WKcmttmp));
}



function initializeStatusfromCookie() {
	bb.command.trace(null, "initializeStatusfromCookie start");
	var allCookies = document.cookie;
	var cArray = allCookies.split(";");
	LP = "";
	WK = "";
	WKOrder = "";
	WKcmt = "";
	for (var i = 0; i < cArray.length; i++) {
		var ts = trim(cArray[i]);
		if (ts.indexOf("LP=") == 0) {
			LP = ts.substring(3,ts.length);
		} else if (ts.indexOf("WK=") == 0) {
			WK = ts.substring(3,ts.length);
		} else if (ts.indexOf("WKOrder=") == 0) {
			WKOrder = unescape(ts.substring(8,ts.length));
		}
	}
	bb.command.trace(null, "initializeStatusfromCookie before refreshStatusHeadline");

	refreshStatusHeadline();
	bb.command.trace(null, "initializeStatusfromCookie done");

}

function refreshStatusHeadline() {
	try {
		var my_l = document.getElementById("lichtpult");
		var my_w = document.getElementById("warenkorb");
		
		var lc = 0;
		var wc = 0;
		
		if (LP.length > 5) {
			lc = LP.split("|").length;
		}
		if (WK.length > 5) {
			wc = WK.split("|").length;
		}
		if (my_l != undefined && my_l != null) {
			//Damit hier nicht statisch "Lichtpult" steht, 
			//gehen wir davon aus, dass der Begriff bereits in dem Link
			//steht, entweder ohne Anzahl in Klammern, oder mit
			var sLPTinkText = my_l.innerHTML;
			
			if (sLPTinkText.indexOf('(') < 0) {
				my_l.innerHTML += " (" + lc + ")";
			}
			else {
				var strTxt = trim(sLPTinkText.substring(0, sLPTinkText.indexOf('(')));
				my_l.innerHTML = strTxt + " (" + lc + ")";
			}
		}
		if (my_w != undefined && my_w != null) {
			//Damit hier nicht statisch "Warenkorb" steht, gehen wir 
			//davon aus, dass der Begriff bereits in dem Link
			//steht, entweder ohne Anzahl in Klammern, oder mit
			var sWKLinkText = my_w.innerHTML;
			if (sWKLinkText.indexOf('(') < 0) {
				my_w.innerHTML += " (" + wc + ")";
			}
			else {
				var strTxt = trim(sWKLinkText.substring(0, sWKLinkText.indexOf('(')));
				my_w.innerHTML = strTxt + " (" + wc + ")";
			}
		}
}
	catch (e1) {
	    LOG("Error during refreshStatusHeadline");
		LOG(e1);
	};
}

function ResetCollection(col) {
	if (col=='LP') {
	   LP = "";
	} else if (col=='WK') {
	   WK = "";
	}
	updateStatusCookie();
	refreshStatusHeadline();
	if (col=='LP') {
	    APSRequest("displaylichtpult?LP=");
	} else if (col=='WK') {
		APSRequest("warenkorb?WK=");
	}
}


function WKapplySettings() {
	var WKpictures = WK.replace(/\[\d,\d,\d,\d\]/g,'').split("|");
	
	//Anzahl
	var divno = false;
	try {
		var sID =  "WKno"+WKpictures[0];
		var bbSelect = bb.document.getElementById(sID);
		var htSelect = bbSelect.viewNode;
		divno = htSelect.value;
	}
	catch(ex){
		LOG("Error during WKapplySettings, Anzahl");
		LOG(ex);
	}
	
	//Produkt
	var divproduct = false;
	try {
		var sID =  "WKproduct"+WKpictures[0];
		var bbSelect = bb.document.getElementById(sID);
		var htSelect = bbSelect.viewNode;
		divproduct = htSelect.value;
	}
	catch(ex){
	    LOG("Error during WKapplySettings, Produkt");
		LOG(ex);
	}
	
	//Format
	var divformat = false;
	try {
		var sID =  "WKformat"+WKpictures[0];
		var bbSelect = bb.document.getElementById(sID);
		var htSelect = bbSelect.viewNode;
		divformat = htSelect.value;
	} 
	catch (ex){
	    LOG("Error during WKapplySettings, Format");    
		LOG(ex);
	}
	
	//Verwendung
	var divusage = false;
	try {
		var sID =  "WKusage"+WKpictures[0];
		var bbSelect = bb.document.getElementById(sID);
		var htSelect = bbSelect.viewNode;
		divusage = htSelect.value;
	}
	catch(ex){
	    LOG("Error during WKapplySettings, Verwendung");
		LOG(ex);
	}
	
	for (var i = 1; i < WKpictures.length; i++) {
		if (divno !== false) {
			var sID= "WKno" + WKpictures[i];
			var bbSelect = bb.document.getElementById(sID);
			bbSelect.setProperty('value', divno);
		}	
		if (divproduct !== false) {
			var sID= "WKproduct" + WKpictures[i];
			var bbSelect = bb.document.getElementById(sID);
			bbSelect.setProperty('value', divproduct);
		}
		if (divusage !== false) {
			var sID= "WKusage" + WKpictures[i];
			var bbSelect = bb.document.getElementById(sID);
			bbSelect.setProperty('value', divusage);
		}
		if (divformat !== false) {
			var sID= "WKformat" + WKpictures[i];
			var bbSelect = bb.document.getElementById(sID);
			bbSelect.setProperty('value', divformat);
		}
	}
}
function saveWarenkorb(step, updateWkPictures) {
	if (step<=1) {
		var WKpictures = undefined;
		if (typeof(updateWkPictures) != 'undefined') {
			WKpictures = updateWkPictures;
		}
		else {
			WKpictures = WK.replace(/\[\d,\d,\d,\d\]/g,'').split("|");
		}
		WK = "";	
		for (var i = 0; i < WKpictures.length; i++) {		
			//Anzahl
			var divno = 1;
			try {
				var sId = "WKno"+WKpictures[i];
				var bbSelectNode = bb.document.getElementById(sId);
				var oSelectNode = bbSelectNode.viewNode;
				divno = oSelectNode.value;
			}
			catch(ex){
				LOG("Error during saveWarenkorb, Anzahl");
				LOG(ex);
			}
			
			//Produkt
			var divproduct = 1;
			try {
				var sId = "WKproduct" + WKpictures[i];
				var bbSelectNode = bb.document.getElementById(sId);
				var oSelectNode = bbSelectNode.viewNode;
				divproduct = oSelectNode.value;
			}
			catch(ex){
			    LOG("Error during saveWarenkorb, Produkt");
				LOG(ex);
			}
			
			//Format
			var divformat = 1;
			try {
				var sId = "WKformat"+WKpictures[i];
				var bbSelectNode = bb.document.getElementById(sId);
				var oSelectNode = bbSelectNode.viewNode;
				divformat = oSelectNode.value;
			} 
			catch (ex){
			    LOG("Error during saveWarenkorb, Format");
				LOG(ex);
			}
			
			//Verwendung
			var divusage = 1;
			try {
				var sId = "WKusage"+WKpictures[i];
				var bbSelectNode = bb.document.getElementById(sId);
				var oSelectNode = bbSelectNode.viewNode;
				divusage = oSelectNode.value;
			}
			catch(ex){
				Log("Error during saveWarenkorb, Verwendung");
				LOG(ex);
			}
			
			
			WKpictures[i] += "[" + divno + "," + divproduct + "," + divformat + "," + divusage + "]";
			if (divno > 0) {
				if (WK != '') {
					WK += "|";
				}
				WK += WKpictures[i];
			}
		}
		updateStatusCookie();
		refreshStatusHeadline();
		if (step==1) {
			APSRequest('warenkorb');
		}
	} else if (step==2) {
		WKSaveAdresses();
		updateStatusCookie();
		APSRequest('warenkorb?step=2');
	}
}

function checkoutWarenkorb() {
	/* 1. Alle WK Elemente abfragen
		2. Neuen WK Cookie setzen
		3. Step 2 aufrufen
		Wichtig: Alle Bestellangaben haben definitive IDs
	*/
	saveWarenkorb(0);
	APSRequest('warenkorb?step=2');
}

function checkOrder() {
	var bAreAdressesSeperated = bb.document.getElementById("WKCbx1").viewNode.checked;
	var res = "";
	var es = bb.document.getElementById("WKname1").viewNode;
	if (trim(es.value) == '') {
		res += "Vorname";
	}
	es = bb.document.getElementById("WKname2").viewNode;
	if (trim(es.value) == '') {
		if (res != '') res += ', ';
		res += "Nachname";
	}
	es = bb.document.getElementById("WKadr2").viewNode;
	if (trim(es.value) == '') {
		if (res != '') res += ', ';
		res += "Anschrift";
	}
	es = bb.document.getElementById("WKplzort").viewNode;
	if (trim(es.value) == '') {
		if (res != '') res += ', ';
		res += "Postleitzahl & Ort";
	}
	es = bb.document.getElementById("WKtel").viewNode;
	if (trim(es.value) == '') {
		if (res != '') res += ', ';
		res += "Telefon (wird nur für Rückfragen verwendet)";
	}
	es = bb.document.getElementById("WKemail").viewNode;
	if (trim(es.value) == '' || es.value.length < 8 || es.value.indexOf('@') < 1 || es.value.indexOf('.') < 1) {
		if (res != '') res += ', ';
		res += "E-Mail";
	}
	email = es.value;
	if (bAreAdressesSeperated) {
		es = bb.document.getElementById("WKREname1").viewNode;
		if (trim(es.value) == '') {
			if (res != '') res += ', ';
			res += "Name (Rechnungsanschrift)";
		}
		es = bb.document.getElementById("WKREadr2").viewNode;
		if (trim(es.value) == '') {
			if (res != '') res += ', ';
			res += "Anschrift (Rechnungsanschrift)";
		}	
		es = bb.document.getElementById("WKREplzort").viewNode;
		if (trim(es.value) == '') {
			if (res != '') res += ', ';
			res += "Postleitzahl & Ort (Rechnungsanschrift)";
		}	
	}
	if (res == '') {
		bb.command.create('<div xmlns="http://www.w3.org/1999/xhtml" id="checkOrderFeedback"><!-- alle eingaben ok --></div>', bb.document.getElementById("checkOrderFeedback"), "replace");
		WKSaveAdresses();
		APSRequest('warenkorb?step=3&:orderemail=' + escape(email));
	} 
	else {
		bb.command.create('<div xmlns="http://www.w3.org/1999/xhtml" id="checkOrderFeedback">' + bb.string.escapeXml(res) + '</div>', bb.document.getElementById("checkOrderFeedback"), "replace");
	}
};

function WKtoggleAnschriften(adressdifferent) {
	var oldHeadingLI = bb.document.getElementById('WKLI');
	var cbx1 = document.getElementById("WKCbx1");
	cbx1.checked = adressdifferent;
	var newHeadingLI = undefined;
	if (adressdifferent) {
		newHeadingLI = '<td xmlns="http://www.w3.org/1999/xhtml" class="adrheading2" id="WKLI">Lieferanschrift</td>';
		showDiv("WKRE", true);
		showDiv("WKRE1", true);
		showDiv("WKRE1b", true);
		showDiv("WKRE2", true);
		showDiv("WKRE2b", true);
		showDiv("WKRE3", true);
		showDiv("WKRE4", true);
		showDiv("WKRE5", true);
		showDiv("WKRE6", true);
		showDiv("WKRE7", true);
	} 
	else {
		newHeadingLI = '<td xmlns="http://www.w3.org/1999/xhtml" class="adrheading2" id="WKLI">Liefer- und Rechnungsanschrift</td>';
		showDiv("WKRE", false);
		showDiv("WKRE1", false);
		showDiv("WKRE1b", false);
		showDiv("WKRE2", false);
		showDiv("WKRE2b", false);
		showDiv("WKRE3", false);
		showDiv("WKRE4", false);
		showDiv("WKRE5", false);
		showDiv("WKRE6", false);
		showDiv("WKRE7", false);
	}
	if (newHeadingLI && oldHeadingLI) {
		bb.command.create(newHeadingLI, oldHeadingLI, "replace");
	}
}

function WKLoadAdresses() {
	var t = WKOrder.split('|');
	if (t.length != 22) {
	   return -1;
	}
	bb.document.getElementById("WKname1").viewNode.value = t[0];
	bb.document.getElementById("WKname2").viewNode.value = t[1];
	bb.document.getElementById("WKadr1").viewNode.value = t[2];
	bb.document.getElementById("WKadr2").viewNode.value = t[3];
	bb.document.getElementById("WKadr3").viewNode.value = t[4];
	bb.document.getElementById("WKplzort").viewNode.value = t[5];
	bb.document.getElementById("WKland").viewNode.value = t[6];
	bb.document.getElementById("WKtel").viewNode.value = t[7];
	bb.document.getElementById("WKfax").viewNode.value = t[8];
	bb.document.getElementById("WKemail").viewNode.value = t[9];
	bb.document.getElementById("WKREname1").viewNode.value = t[10];
	bb.document.getElementById("WKREname2").viewNode.value = t[11];
	bb.document.getElementById("WKREadr1").viewNode.value = t[12];
	bb.document.getElementById("WKREadr2").viewNode.value = t[13];
	bb.document.getElementById("WKREadr3").viewNode.value = t[14];
	bb.document.getElementById("WKREplzort").viewNode.value = t[15];
	bb.document.getElementById("WKREland").viewNode.value = t[16];
	bb.document.getElementById("WKREtel").viewNode.value = t[17];
	bb.document.getElementById("WKREfax").viewNode.value = t[18];
	bb.document.getElementById("WKREemail").viewNode.value = t[19];
	WKOrderPersistent = t[20]=='1';
	bb.document.getElementById("WKCbx2").viewNode.checked = WKOrderPersistent;
	WKOrderDifferent = t[21]=='1';
	bb.document.getElementById("WKCbx1").viewNode.checked = WKOrderDifferent;
    bb.document.getElementById("WKcmt").viewNode.value = WKcmt;
	WKtoggleAnschriften(WKOrderDifferent);
}

function WKSaveAdresses() {
	var result = bb.document.getElementById("WKname1").viewNode.value + '|' + 
				 bb.document.getElementById("WKname2").viewNode.value + '|' +
			  	 bb.document.getElementById("WKadr1").viewNode.value  + '|' +
     			 bb.document.getElementById("WKadr2").viewNode.value  + '|' +
				 bb.document.getElementById("WKadr3").viewNode.value + '|' +
				 bb.document.getElementById("WKplzort").viewNode.value + '|' +
				 bb.document.getElementById("WKland").viewNode.value + '|' +
				 bb.document.getElementById("WKtel").viewNode.value + '|' +
				 bb.document.getElementById("WKfax").viewNode.value + '|' +
				 bb.document.getElementById("WKemail").viewNode.value + '|' +
				 bb.document.getElementById("WKREname1").viewNode.value + '|' +
				 bb.document.getElementById("WKREname2").viewNode.value + '|' +
				 bb.document.getElementById("WKREadr1").viewNode.value + '|' +
				 bb.document.getElementById("WKREadr2").viewNode.value + '|' +
				 bb.document.getElementById("WKREadr3").viewNode.value + '|' +
				 bb.document.getElementById("WKREplzort").viewNode.value + '|' +
				 bb.document.getElementById("WKREland").viewNode.value + '|' +
				 bb.document.getElementById("WKREtel").viewNode.value + '|' +
				 bb.document.getElementById("WKREfax").viewNode.value + '|' +
				 bb.document.getElementById("WKREemail").viewNode.value + '|';
    if (bb.document.getElementById("WKCbx2").viewNode.checked) {
    	result += '1|';
    	WKOrderPersistent = true;
    } else {
    	result += '0|';
    	WKOrderPersistent = false;
    }
    if (bb.document.getElementById("WKCbx1").viewNode.checked) {
    	result += '1';
    	WKOrderDifferent = true;
    } else {
    	result += '0';
    	WKOrderDifferent = false;
    }
    WKOrder = result;
    WKcmt = bb.document.getElementById("WKcmt").viewNode.value;
	updateStatusCookie();
}

function CreateBookmarkLink(strTitle, strURL) {
        if (window.sidebar) { 
        // Mozilla Bookmark
        window.sidebar.addPanel(strTitle, strURL,"");
    } 
    else if(window.external) { 
        // IE Favorite
        window.external.AddFavorite( strURL, strTitle); 
    }
    else if(
        window.opera && window.print) { 
        // Opera Hotlist
        var mbm = document.createElement('a');
        mbm.setAttribute('rel','sidebar');
        mbm.setAttribute('href',strURL);
        mbm.setAttribute('title',strTitle);
        mbm.click();
    }
}
function ExtraMenuSelect(id,fn,noreload) {
	if (!ExtraMenu) {
		// Laden des Extramenüs, falls noch nicht vorhanden.
		ExtraMenuLoad(fn);
	}
	// Level zur ID feststellen
	if (id != 0) {
		lvl = ExtraMenu.Level[id];
	} else {
		lvl = 0;
	}
	resizeDrillChilds();
	
	document.getElementById("result")["innerHTML"] = "";
	document.getElementById("browsing")["innerHTML"] = "";
	
	var CatalogSection = document.getElementById("catalog");
	var Menu = '<li class="caption"><a href="javascript:void(0)" onclick="DDResetCatalog()"><img src="/images/close_filled.gif" title="Katalog schließen"/></a><h3 id="katalog">Katalog </h3></li>';	
	u = "'0.'";
	currentMenu = '<li class="drillTop ExtraMenu"><a href="javascript:void(0)" onclick="ExtraMenuSelect('+ u +');">'+ ExtraMenu.Text['0.'] + '</a></li>';
	Menu += currentMenu;
	var lc = 0;
	var idc = "";
	if (lvl > 0) {
		var es = id.split(/\./);
		// Falls dieser Level keine Childs hat, eine Ebene weniger, später dann eine Ebene mehr ausführen
		if (!ExtraMenu.Text[id + "1."]) {
		   lc = 1;
		}
		for (i=0;i<(es.length - lc) && i < (lvl - lc);i++) {
				currentid = "";
				for (j = 0;j<=i;j++) {
					currentid += es[j] + ".";
				}
				u = "'" + currentid + "'";
				currentMenu = '<li class="drillParent"><a href="javascript:void(0)" onclick="ExtraMenuSelect('+ u + ');">'+ ExtraMenu.Text[currentid] + '</a></li>';
				Menu += currentMenu;
		}
		Menu += '<li id="drillChilds" style="top: 344px; height: 209px;"><ul>';
		var t = "1";
		if (lc == 0) {
		   idc = id;
		} else {
		   idc = id.replace(/\d+\.$/,'');
		}
		
		while(ExtraMenu.Text[idc + t + "."]) {
			currentid = idc + t + '.';
			u = "'" + currentid + "'";
			var c = "";
			if (currentid == id) {
			    c = ' class="active"';
			}
			currentMenu = '<li' + c + '><a href="javascript:void(0)" onclick="ExtraMenuSelect('+ u + ');">'+ ExtraMenu.Text[currentid] + '</a></li>';
			Menu += currentMenu;
			t++;
		}
		Menu += '</ul></li>';
		
	} else {
		Menu += '<li id="drillChilds" style="top: 344px; height: 209px;"><ul>';
		var t = "1";
		while(ExtraMenu.Text[t + "."]) {
			u = "'" + t + ".'";
			currentMenu = '<li><a href="javascript:void(0)" onclick="ExtraMenuSelect('+ u + ');">'+ ExtraMenu.Text[t + '.'] + '</a></li>';
			Menu += currentMenu;
			t++;
		}
		Menu += '</ul></li>';
	}
	CatalogSection.innerHTML = Menu;
	resizeDrillChilds();
	
	var ResultSection = document.getElementById("result");
	ResultSection.innerHTML = "";
	if (!noreload) {
		URLRequest(ExtraMenu.File[id],0,false,false);
	}

	// Drilldown entsprechend der ID gestalten
	// Asynchones Laden des Dokuments auslösen
}

function ExtraMenuLoad(fn) {
	try {
	ExtraMenu = new Object;
	ExtraMenu.Text = new Object;
	ExtraMenu.File = new Object;
	ExtraMenu.Level = new Object;
	var menudef = URLRequest(fn,0,true,false);
	var lines = menudef.split(/\n/g);
	var lastlevel = 0;
	var levelcounter = new Array(0,0,0,0,0,0,0,0,0,0,0);
	for (i=0;i<lines.length;i++) {
		if (trim(lines[i]) != '') {
			e = lines[i].split(/\\=/);
			f = e[1].split(/:/);
			lvl = e[0];
			fil = f[0];
			txt = f[1];
			levelcounter[lvl] ++;
			if (lvl < lastlevel) {
			    for (j = lastlevel; j > lvl; j--) {
					levelcounter[j] = 0;
				}
			}
			lastlevel = lvl;
			levelstr = "";
			for (j = 1; j <= lvl; j++) {
				levelstr += levelcounter[j] + ".";
			}
			if (levelstr == "") {
				levelstr= '0.';
			}
			ExtraMenu.Text[levelstr] = txt;
			ExtraMenu.File[levelstr] = fil;
			ExtraMenu.Level[levelstr] = lvl;
		}
	}
	}
	catch (e) {
	    LOG("Error loading extramenu");
		LOG(e);
	};
}

function ExtraMenuSync(path,fn,force) {
	if (!force && path.indexOf(".xml") < 0) {
	   return;
	}
	var xmlfn = path.replace(/\.html$/,".xml");
	xmlfn = xmlfn.replace(/^\//,"");
	if (!ExtraMenu) {
		// Laden des Extramenüs, falls noch nicht vorhanden.
		if (!fn) {
		   fn = "extramenu.def";
		}
		ExtraMenuLoad(fn);
	}
	// Über ExtraMenu.File iterieren um levelstr zu finden
	levelstr = "";
	for (l in ExtraMenu.File) {
		if (ExtraMenu.File[l] == xmlfn) {
		   levelstr = l;
		   break;
		}
	}
	
	// Mit levelstr ExtraMenuSelect aufrufen
	if (levelstr != "") {
		ExtraMenuSelect(levelstr,fn,true);
	}
}

function resizeZoomify() {
	try {
		
		var swf = bb.document.getElementById("theMovie");
		if (swf) {
			swf = swf.viewNode;
		}
		else {
			swf = document.getElementById("theMovie");
		}
		if (swf) {
			var iBodyHeight = 0;
			var browser = BrowserDetect.browser;
			if (window.innerHeight) {
				iBodyHeight = window.innerHeight;
			}
			else 
				if (document.documentElement && document.documentElement.innerHeight) {
					iBodyHeight = document.documentElement.innerHeight;
				}
				else if (document.documentElement && document.documentElement.clientHeight) {
					iBodyHeight = document.documentElement.clientHeight;
				}
				else if (document.body && document.body.clientHeight) {
					iBodyHeight = document.body.clientHeight;
				}
				else if (document.getElementsByTagName("body")[0].clientHeight) {
					iBodyHeight = document.getElementsByTagName("body")[0].clientHeight;
				}
			if (iBodyHeight > 600) {
				swf.style.height = iBodyHeight - 200 + "px";
			}
			else {
				swf.style.height = "400px";
			}
		}
	} catch (ex) {
	    LOG("Error during resizeZoomify");
		LOG(ex);
	}
}

function resizeMap() {
	try {
		var map = bb.document.getElementById("map");
		if (map) {
			map = map.viewNode;
		}
		else {
			map = document.getElementById('map');
		}
		if (map) {
			var iBodyHeight;
			var browser = BrowserDetect.browser;
			if (window.innerHeight) {
				iBodyHeight = window.innerHeight;
			}
			else 
				if (document.documentElement && document.documentElement.innerHeight) {
					iBodyHeight = document.documentElement.innerHeight;
				}
				else 
					if (document.documentElement && document.documentElement.clientHeight) {
						iBodyHeight = document.documentElement.clientHeight;
					}
					else 
						if (document.body && document.body.clientHeight) {
							iBodyHeight = document.body.clientHeight;
						}
						else 
							if (document.getElementsByTagName("body")[0].clientHeight) {
								iBodyHeight = document.getElementsByTagName("body")[0].clientHeight;
							}
			if (iBodyHeight > 600) {
				map.style.height = iBodyHeight - 200 + "px";
			}
			else {
				map.style.height = "400px";
			}
		}
	} catch (ex) {
		LOG("Error during resizeMap");
		LOG(ex);
	}
}



function getBodyWidth() {
	var iBodyWidth = window.innerWidth;
	if (bb.browser.ie) {
		iBodyWidth = document.body.clientWidth;
	}
	return iBodyWidth;
}

function getBodyHeight() {
	var iBodyHeight = window.innerHeight;
	if (bb.browser.ie) {
		iBodyHeight = document.body.clientHeight;
	}
	return iBodyHeight;
}

/**
 * @param {String} strDisplayMode Name des Darstellungsmodus (list/galery)
 * @return {Number} Die Anzahl der Elemente, die in die Ergebnisfläche passen
 */
function getListCount(strDisplayMode) {
		
		
		var nResultListCount = undefined;
		
		var sideTextWidth = SIDETEXT_MIN_WIDTH;
		if (sideTextWidth == undefined) {
			sideTextWidth = 0;
		}
		
	
		var resultAreaHeight = document.getElementById('contentContainer').clientHeight;
		var resultAreaWidth = getBodyWidth() -270 -sideTextWidth -30;
		var numCols = undefined;
		var numRows = undefined;
		
	
		if (strDisplayMode == 'list') {
			numCols = Math.floor((resultAreaWidth - 8) / 388);
			numRows = Math.floor((resultAreaHeight - 8) / 216);
		}
		else if (strDisplayMode == 'galery') {
			
 			numCols = Math.floor((resultAreaWidth - 8) / 182);
			numRows = Math.floor((resultAreaHeight - 8) / 227);
		}
		
		if (numCols != undefined && numRows != undefined) {
			nResultListCount = (numRows * numCols);
		}
		return nResultListCount;
}

function CoordinateLookup(level) {
	var coordstring = "";
	var boundstring = "";
	if (Query.maps) {
		coordstring = escape(' ' + Query.maps);
		boundstring=coordstring.replace(/^\%20\+koordinaten\d\%5B/,'');
	} else {
		boundstring = mapgetbounds() + ',' + level;
		coordstring = escape(' +koordinaten' + level) + '[' + boundstring;
	}
	var querystring = escape(trim(Query.media + " " + Query.archive) + " ") + coordstring + " " + escape(Query.base)  + escape(" " + Query.catalog);
//	var querystring = escape(trim(Query.media + " " + Query.archive) + " ") + escape(Query.base)  + escape(" " + Query.catalog);
	APSRequest("coordinatelookup?tastr=koordinaten" + level + "&start=" + boundstring + "&query=" + querystring);
}

function submitLocationSearch(lat,lng,level,id,motxt) {
	var coordstring = escape(' +koordinaten' + level) + '[' + lat + ',' + lng + ',' + lat + ',' + lng + ',' + level;
	var querystring = escape(trim(Query.media + " " + Query.archive) + " ") + coordstring + " " +  escape(Query.base)  + escape(" " + Query.catalog);
	Query.mapstxt = motxt;
	Query.mapslvl = level;
	APSRequest("maplookup?query=" + querystring + "&target=" + id,3);
}

function submitLocationQuery(query,dmode,no) {
	var querystring = query;
	APSRequest("searchdefine?query=" + querystring + "&dmode="+ dmode + "&no=" + no);
}	

function maplookupnavigate(no,id) {
	APSRequest("maplookupnavigate?no=" + no + "&target=" + id,3);
}

/* Search History mit Backbase */

var SH = new Array();

function addSearchHistory(atype, a1, a2) {
	i = SH.length;
	SH[i] = new Object;
	SH[i].requesttype = atype;
	SH[i].param1 = a1;
	SH[i].param2 = CopyQuery(a2);
	bb.history.add('|' + i, document.title + " (" + i + ")");
}

function APSHistory(evnt) {
	if (evnt.bookmark == "|home" || evnt.bookmark =='') {
		initAPS();
	} else {
		i = evnt.bookmark.substr(1);
		if (!(i >= 0)) {return;};
		switch(SH[i].requesttype) {
			case 'searchreset':
				initAPS();
				break;
			case 'plain':
				Query = CopyQuery(SH[i].param2);
				APSRequest(SH[i].param1 + "&:media="+ Query.mediaID + "&:archiv=" + Query.archiveID,1,true);
				break;
			case 'archiv':
				Query = CopyQuery(SH[i].param2);
				APSRequest(SH[i].param1 + "&:media="+ Query.mediaID,1,true);
				break;
			case 'media':
				Query = CopyQuery(SH[i].param2);
				APSRequest(SH[i].param1 + "&:archiv=" + Query.archiveID,1,true);
				break;
			case 'query':
				Query = CopyQuery(SH[i].param2);
				APSRequest(SH[i].param1 + "&:media="+ Query.mediaID + "&:archiv=" + Query.archiveID,1,true);
				var t = SH[i].param1.replace(/searchdefine\?/,'');
				DDRefresh(t,true);
			case 'info':
			case 'warenkorb':
			case 'lichtpult':
			case 'catalog':
				Query = CopyQuery(SH[i].param2);
				APSRequest(SH[i].param1,1,true);
				break;
			case 'xml':
				Query = CopyQuery(SH[i].param2);
				URLRequest(SH[i].param1,1,false,true);
				break;
		}
	} 
}

/**
 * Gibt eine Log Meldung aus
 * @param {Object} msg Die Nachricht.
 */
function LOG(msg) {
	if (typeof(msg)=='undefined') {
		msg = 'undefined';
	}
	else {
		if (typeof(msg.toString)=='function') {
			msg = msg.toString();
		}
		else {
			msg = msg + '';
		}
	}
	msg = '[ApsRequest] ' + msg;
	if (typeof(bb)!='undefined') {
		if (typeof(bb.command)!='undefined') {
			if (typeof(bb.command.trace)=='function') {
				bb.command.trace(null, msg);
			}
		}
	}
	if (typeof(console)!='undefined') {
		if (typeof(console.log)=='function') {
			console.log(msg);
		}
	}
}

function CopyQuery(q) {
	var r = new Object;
	r.lastDDUpdate = new Object;
	r.lastDDUpdate.tastr = q.lastDDUpdate.tastr;
	r.lastDDUpdate.catalog = q.lastDDUpdate.catalog;
	r.lastDDUpdate.start = q.lastDDUpdate.start;
	r.catalog = q.catalog;
	r.media = q.media;
	r.mediaID = q.mediaID;
	r.base = q.base;
	r.archive = q.archive;
	r.archiveID = q.archiveID;
	r.maps = q.maps;
	r.mapstxt = q.mapstxt;
	r.mapslvl = q.mapslvl;
	
	return r;
}
/*
function APSBBLoad() {
	alert(sBBLoadTarget);
	alert(sBBLoadCmd);
	bb.callFunction('BBLoad', [sBBLoadTarget, sBBLoadCmd]);
	sBBLoadTarget = '';
	sBBLoadCmd = '';
}*/
	
	/**
	 * Registriert / Deregistriert den History Event Handler
	 * @param {Boolean} bDoRegister, true = register, false = deregister; default: true
	 */
	function regHistoryEventHandler(bDoRegister) {
		if (typeof(bDoRegister)!='boolean') {
			bDoRegister = true;
		}
		if (bDoRegister === true) {
			bb.document.addEventListener('history', APSHistory, false);
		} else {
			bb.document.removeEventListener('history', APSHistory, false);
		}
	}
	
	/**
	 * Registriert / Deregistriert den Resize Event Handler
	 * @param {Boolean} bDoRegister, true = register, false = deregister; default: true
	 */
	function regResizeEventHandler(bDoRegister) {
		if (typeof(bDoRegister)!='boolean') {
			bDoRegister = true;
		}
		if (bDoRegister === true) {
			bb.document.addEventListener('resize', resizeEventListener,false);
		} else {
			bb.document.removeEventListener('resize', resizeEventListener, false);
		}
	}
	
	/**
	 * Scrollt zu einem benamten Anchor unter umgehung der BB History
	 * @param {Object} sAnchorName Name des Anchors
	 */
	function scrollToAnchor(sAnchorName){
		if (sAnchorName && DMode == 'doc') {
			regHistoryEventHandler(false);
			sBBHistUrlUrl = null;
			sAnchorUrl = window.location.href;
			if (window.location.hash) {
				sAnchorUrl = sAnchorUrl.replace(window.location.hash, "");
				sBBHistUrlUrl = window.location.href;
			}
			sAnchorUrl = sAnchorUrl + "#" + sAnchorName;
			window.location.replace(sAnchorUrl);
			if (sBBHistUrlUrl) {
				window.location.replace(sBBHistUrlUrl)
			}
			regHistoryEventHandler(true);
		}
	}