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 DEFAULT_RESHIGHLIGHT = '1';
var ajaxrequest = new Array();
var apssession = new Array();
var searchstate = "NEW";
var m_sCurArea = '1';
var Query = new Object();
Query.lastDDUpdate = new Object();
Query.toString = function() {
  var sQuery = "";
  if (typeof(this.base)=='string') {
    sQuery += " " + this.base;
  }
  if (typeof(this.archive)=='string') {
    sQuery += " " + this.archive;
  }
  if (typeof(this.catalog)=='string') {
    sQuery += " " + this.catalog;
  }
  if (typeof(this.maps)=='string') {
    sQuery += " " + this.maps;
  }
  if (typeof(this.media)=='string') {
    sQuery += " " + this.media;
  }
  return sQuery.normalizeSpace();
}
var m_areaInfos = new Array();
var selectedEntityPrefix = undefined;
var SuggestCancel = false;
var m_strLastApsRequest = '';
var m_strLastSearchDefineRequest = '';
var m_strLastCatalogNavigateRequest = '';
var m_strLastSession1Request = '';
var m_strLastLichtpultDocRequest = '';
var m_nWindowResizeDelay = 750;
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 m_bResHighlightEnabled = DEFAULT_RESHIGHLIGHT;
var ExtraMenu = false;
var DMode='';
var listcount = 10;
var nLoadingCounter = 0;
var clientDictionary = {};
var hitListToggles = {};
var m_curDocType = '';
var m_curDocNumber = '';
var m_lastTopic = '';


/*
 * var sBBLoadTarget = ''; var sBBLoadCmd = '';
 */

var m_nLastBodyWidth = 0
var m_nLastBodyHeight = 0;
var firstInit = true;

var m_permanentlyHiddenNodeIDs = new Array();

var bpreloaded = false;

var m_bOnlyDigitManuscripts = false;

String.prototype.trim = function() {
  return this.replace(/^\s*(.*)\s*$/, "$1")
}

String.prototype.normalizeSpace = function() {
  return this.replace(/\s+/g, " ").trim();
}

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 showHSK(sHSKNum) {
  if (typeof(sHSKNum)=='string') {
    if (sHSKNum) {
      APSRequest('displaydocument?no=1&tastr=xdb_hsk&tdesc=HSK'+sHSKNum+'.htm&fromlp=1&backToInfo=1');
    }
  }
}

function loadTopic(sTopicSubPath) {
  if (typeof(sTopicSubPath) == 'string') {
    if (sTopicSubPath.length > 0) {
      oTopicInfo = getTopicInfo(sTopicSubPath);
      m_lastTopic = sTopicSubPath;
      URLRequest('/texte/' + oTopicInfo.subFolder  + '/' + Lang + '/' + oTopicInfo.path + '.xml');
    }
  }
}

function getTopicInfo(sTopicSubPath) {
  var oTopicInfo = {
    'subFolder':'',
    'path':''
  };
  if (typeof(sTopicSubPath) == 'string') {
    if (sTopicSubPath.length > 0) {
      var nPseudoProtPartIdx = sTopicSubPath.search(/:/);
      var texteSubFolderName = 'topics';
      var sPath = sTopicSubPath;
      if (nPseudoProtPartIdx > 0) {
        texteSubFolderName = sTopicSubPath.substring(0,nPseudoProtPartIdx);
        sPath = sTopicSubPath.substring(nPseudoProtPartIdx+1);
      }
    }
    oTopicInfo.subFolder = texteSubFolderName;
    oTopicInfo.path = sPath;
  }
  return oTopicInfo;
}

function showLastTopic() {
  if (m_lastTopic) {
    if (isDefaultTopic(m_lastTopic)) {
      initAPS();
    }
    else {
      loadTopic(m_lastTopic);
    }
  }
}

function selectTabNo(nTabNo) {
  var tabNode = bb.evaluateSmart("a["+nTabNo+"]",getViewNodeById('tabs'));
  if (tabNode) {
    selectTab(tabNode);
  }
}

function selectTab(oSelectedTabNode, overrideTopic) {
  var arrTabNodes = bb.evaluateSmart("[a]",getViewNodeById('tabs'));
  for (var i=0; i<arrTabNodes.length; i++) {
    var oCurTabNode = arrTabNodes[i];
    var sCurNodeID = oCurTabNode.getAttribute('id');
    var sCurNodeArea = sCurNodeID.substring(4); // substring-after ('tab_')
    if (oCurTabNode ==  oSelectedTabNode) {
      m_sCurArea = sCurNodeArea;
      bb.html.setClass(oCurTabNode,'activeTab');
      sCmd = 'searchreset';
      if (overrideTopic) {
        sCmd += "?overrideTopic=" + overrideTopic;
      }
      APSRequest(sCmd);
    }
    else {
      bb.html.setClass(oCurTabNode,'tab');
    }

  }
}

function ApsSearch(sQueryStr, sortCol, sortDir) {
  if (typeof(sQueryStr)=='string') {
    if (typeof(sortCol)=='string') {
      if (sortCol.length > 0) {
        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 listCountChanged() {
  var sortFieldSelector = document.getElementById('listCountSelect');
  if (sortFieldSelector) {
    var iSelectedFieldIndex = sortFieldSelector.selectedIndex;
    var sSelectedFieldValue = sortFieldSelector.options[iSelectedFieldIndex].value;
    var nSelectedFieldValue = parseInt(sSelectedFieldValue);
    if (nSelectedFieldValue > 0 && nSelectedFieldValue != listcount) {
      listcount = nSelectedFieldValue;
      if (m_strLastCatalogNavigateRequest != '') {
        APSRequest(m_strLastCatalogNavigateRequest);
      }
      if (m_strLastSearchDefineRequest != '') {
        APSRequest(m_strLastSearchDefineRequest);
      }
    }
  }
}

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_strLastCatalogNavigateRequest != '') {
        APSRequest(m_strLastCatalogNavigateRequest);
      }
      else if (m_strLastSearchDefineRequest != '') {
        APSRequest(m_strLastSearchDefineRequest);
      }
    }
  }
}

function toggleHitList(nContainerDID,no,did) {

  if (typeof(nContainerDID)=='number') {
    if (nContainerDID > 0) {
      var headerNode = getViewNodeById('LISTROOT'+nContainerDID);
      var listNode = getViewNodeById('LIST'+nContainerDID);
      if (headerNode && listNode) {
        if (headerNode.className.search('collapsedHitListHeading')>=0) {
          APSRequest('displayHitListOutline?containerdid='+nContainerDID+'&no='+no+'&excludeddid='+did);
          headerNode.className = 'expandedHitListHeading';
          showDiv('LIST'+nContainerDID, true);
        }
        else if (headerNode.className.search('expandedHitListHeading')>=0) {
          headerNode.className = 'collapsedHitListHeading';
          showDiv('LIST'+nContainerDID, false);
        }
        
      }
    }
  }
}

/**
 * @param {Boolean}
 *            bEnabled
 * @return {void}
 */
function setResultHighlightingEnabled(bEnabled) {
  m_bResHighlightEnabled = bEnabled?'1':'0';
  storeResultHighlightingCookie();
  if (m_strLastApsRequest != '') {
    APSRequest(m_strLastApsRequest);
  }
}

/**
 * @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);
      }
    }
  }
}


/**
 * 
 * @param {Node}
 *            oFilterCheckbox
 * @param {boolean}
 *            bActive
 * @param {number}
 *            nDeleteElemPos
 * @return {void}
 */
function switchFilter(oFilterCheckbox, nDeleteElemPos) {
  var sQueryElem = oFilterCheckbox.value;
  // Ersetzen von RegEx relevanten Sonderzeichen
  var regExpQueryElem = sQueryElem.replace(/\+/g,'\\+');
  regExpQueryElem = regExpQueryElem.replace(/\[/g,'\\[');
  regExpQueryElem = regExpQueryElem.replace(/\]/g,'\\]');
  regExpQueryElem = regExpQueryElem.replace(/\(/g,'\\(');
  regExpQueryElem = regExpQueryElem.replace(/\)/g,'\\)');
  regExpQueryElem = regExpQueryElem.replace(/\{/g,'\\{');
  regExpQueryElem = regExpQueryElem.replace(/\}/g,'\\}');
  regExpQueryElem = regExpQueryElem.replace(/\?/g,'\\?');
  regExpQueryElem = regExpQueryElem.replace(/\\/g,'\\\\');
  regExpQueryElem = regExpQueryElem.replace(/\$/g,'\\$');
  regExpQueryElem = regExpQueryElem.replace(/\^/g,'\\^');
  if (oFilterCheckbox.checked) {
    // Wenn Query den Filter nicht enthält, hinzufügen
    if (Query.toString().search(regExpQueryElem)<0) {
      Query.base += sQueryElem;
    }
    // Suche ausführen
    APSRequest('searchdefine?query=' + Query.toString());
  }
  else {
    // Suchelement mit Filter aus vorhandener Query löschen & neu suchen
    if (nDeleteElemPos > 0) {
      APSRequest("searchdelete?no="+nDeleteElemPos);
    }
    else {
      LOG("FEHLER; setOnlyDigitManuscripts; searchDelete no <= 0");
    }
  }
}

function getActiveFilterCheckboxes() {
  var filterCBoxes = document.getElementsByName("cbFilter");
  var activeFilterCBoxes = Array();
  for (var i=0; i<filterCBoxes.length; i++) {
    if (filterCBoxes[i].checked) {
      activeFilterCBoxes.push(filterCBoxes[i]);
    }
  }
  return activeFilterCBoxes;
}

/**
 * Diese Funktion wird beim "resize" Event ausgelöst
 * 
 * @return {void}
 */
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() {
  var ffZoomWindow = bb.document.getElementById('ffFullScreenZV');
  if (ffZoomWindow) {
    ffZoomWindow.maximize();
  }
  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");
  m_sCurArea  = '1';
  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 = "";
    Query.lastDDUpdate.filter = "";
    var b = BrowserDetect.browser;
    var dosearch = true;
    
  if (typeof(onInitAPS)=='function') {
    onInitAPS(preloaded);
  }
  
  if (preloaded) {
    bpreloaded = preloaded;
  }
  
  setInnerHTML('infotext', '');
  
  m_strLastCatalogNavigateRequest = '';
  m_strLastSearchDefineRequest = '';
  
    if (firstInit) { 
      //Auswahl der Area  
      if (!preloaded && location.search.indexOf("?AREA_")==0) {
        var s = unescape(location.search);
        m_sCurArea = s.replace(/^\?AREA_/,'');
      }
      var overrideTopic = null;
      if (location.search.indexOf("?INFO_")==0) {
       var s = unescape(location.search);
       overrideTopic = s.replace(/^\?INFO_/,'');
    } 
      selectTab(getViewNodeById('tab_' + m_sCurArea),overrideTopic);
      
      
        // Statischen Seiten & Cookies laden, ggf. Stylesheets nachladen
        loadLanguageCookie();
        loadResultHighlightingCookie();
        URLRequest('/texte/static/' + Lang + '.xml');
        if (bb.browser.webkit) {
            loadStylesheet('/css/safari.css');
        }
        AppCookie.set('renderingEngineName',bb.browser.name);
        AppCookie.set('renderingEngineVersion',bb.browser.version);
  
    // Aps init
     if (!preloaded && (location.search==='' || location.search.indexOf("?AREA_")==0 || location.search.indexOf("?INFO_")==0)) {
         var sCmd = "init?:media=ALL&:archiv=ALL&:dmode=galery&:browser=" + escape(b) + "&doSearch=0";
         if (overrideTopic) {
           sCmd += "&overrideTopic=" + escape(overrideTopic);
         }
           APSRequest(sCmd);
     }
     else if (!preloaded && location.search!='')  {
       var sCmd = "init?:media=ALL&:archiv=ALL&:dmode=galery&:browser=" + escape(b) + "&doSearch=1";
       

       // Suche
       var s = unescape(location.search);
           s = s.replace(/^\?/,'');
           var params = s.split(/\&/);
           var query = params[0];
           var sAdditionalParams = "";
       for (var i=1; i<params.length; i++) {
           var curParam = params[i];
           var curParamSplit = curParam.split("=");
           var curParamName = curParamSplit[0];
           var curParamValue = curParamSplit[1];
           switch(curParamName) {
               case 'dmode': {
                   if (!curParamValue) {
                       curParamValue = "list";
                   }
                   sAdditionalParams += '&forcedmode=' + curParamValue;
                   break;
               }
               case 'no':
               case 'number': {
                   if (!parseInt(curParamValue)) {
                       curParamValue = 1;
                   }
                   sAdditionalParams += '&no=' + curParamValue;
                   break;
               }
               case 'scan':
               case 'page': {
                   if (curParamValue) {
                       sAdditionalParams += '&mediumID=' + curParamValue;
                   }
                   break;
               }
           }
       }
       sCmd += "&query=" + escape(unescape(query)) + sAdditionalParams;
       
       APSRequest(sCmd,1,true);
       }
       /*
     * 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; var sCmd =
     * "mediaselect?option=preloaded&:archiv=ALL&:dmode=galery&:media=" +
     * themedia + "&:browser=" + escape(b); APSRequest(sCmd); }
     */
       else {
         // preloaded
         dosearch = false;
         var sCmd = "init?option=preloaded&:archiv=ALL&:media=ALL&:dmode=galery&:browser=" + escape(b)+"&pathname=" + escape(location.pathname);
         APSRequest(sCmd);
       }
       if (preloaded) {
         hideDiv('noscript');
       } 
       else { 
         clearDiv('noscript');
       }
    
     bb.command.trace(null, "initAPS before initializeStatusfromCookie");
     initializeStatusfromCookie();
     bb.command.trace(null, "initAPS after initializeStatusfromCookie");
     bb.command.trace(null, "initAPS done");
     firstInit = false;
     showOldBrowserHint();
     if (ImageScaler) {
       ImageScaler.startResizeImagesInterval('thumbImage', 150);
     }
  } 
    else {
      selectTab(getViewNodeById('tab_' + m_sCurArea));
    var sCmd = "init?:media=ALL&:archiv=ALL&:dmode=galery&:browser=" + escape(b);
    APSRequest(sCmd);
    }  
}


function showHideByDocImages(btnImgId, moreImgsClz){
  lockUIControls();
  ShowLoading();
  var a = bb.document.getElementById(btnImgId);
  var viewNodeA = undefined;
  if (!a) {
    a = getViewNodeById(btnImgId);
    viewNodeA = a;
  } 
  else {
    viewNodeA = a.viewNode;
  }
  
  if (a) {
    if (bb.html.hasClass(viewNodeA,"moreImages")) {
      bb.command.setText(a, clientDictionary[Lang]['showLessImages'], 'replaceChildren')
      bb.command.replaceClass(a, "moreImages", "lessImages");
    }
    else {
      bb.command.setText(a, clientDictionary[Lang]['showMoreImages'], 'replaceChildren')
      bb.command.replaceClass(a, "lessImages", "moreImages");
    }
  }
  
  var elemsTmp = document.getElementsByTagName('div');
  var elems = new Array();
  for (var i=0; i<elemsTmp.length; i++) {
    if (bb.html.hasClass(elemsTmp[i],moreImgsClz)) {
      elems.push(elemsTmp[i]);
    }
  }
  for (var i=0; i<elems.length; i++) {
    bb.command.showHide(elems[i]);
  }
  unLockUIControls();
  HideLoading();
}

/**
 * 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 der Manuscripta Mediaevalia,',
        '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 || session == 4) {
    showDiv('suggestBox',false);
    cancelRunningSuggestRequest();
      
    if (!history) {
      if (cmd.search(/searchdefine|searchdefinenq/) >= 0) {
        addSearchHistory('query', cmd, Query);
      } 
      else if (cmd.search(/searchreset/) >= 0) {
        addSearchHistory('searchreset','',Query);
        m_strLastSearchDefineRequest = '';
        m_strLastCatalogNavigateRequest = '';
      }
      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);
      }
    }
    
    showDiv('suggestBox',false);
    m_strLastApsRequest = cmd;
    
    
    
    if (session == 4) {
      if (cmd.search(/toPDF|toRTF|toPS|toFO/) >= 0) {
        cmd += "&lastForeignRequest=" + encodeURIComponent(m_strLastSession1Request);
      }
    }
    
    if (cmd.search('displaylichtpultrvxml') >= 0 || cmd.search('displaylichtpultzoom')>=0 || cmd.search('displaylichtpultdocument') >= 0 || cmd.search('displaylichtpultpics') >=0) {
      m_strLastLichtpultDocRequest = cmd;
      m_strLastLichtpultDocRequest = m_strLastLichtpultDocRequest.replace('displaylichtpultrvxml','displaylichtpultdocument');
      m_strLastLichtpultDocRequest = m_strLastLichtpultDocRequest.replace('displaylichtpultpics','displaylichtpultdocument');
      m_strLastLichtpultDocRequest = m_strLastLichtpultDocRequest.replace('displaylichtpultzoom','displaylichtpultdocument');
      m_strLastLichtpultDocRequest = m_strLastLichtpultDocRequest.replace('blkdisplay=0','');
    }
    else if (cmd.search('displayresult') >=0 || cmd.search('displaylichtpult') >=0 || cmd.search('init') >=0  ||  cmd.search('displayRichViewXML') >=0 ) {
      m_strLastLichtpultDocRequest = '';
    }
    
    
    if (cmd.search('detail') >= 0 && (m_strLastSession1Request.search('lichtpult') >=0 || m_strLastSession1Request.search('fromlp=1') >= 0)) {
      if ((cmd.search(/\?/) > 1)) {
        cmd  += '&';
      }
      else {
        cmd += '?';
      }
      cmd  += 'fromlp=1';
    }
    
    
    if (cmd.search(/searchdefine|searchdefinenq/) >= 0) {
      m_strLastSearchDefineRequest = cmd;
    }
    if (cmd.search(/catalognavigate/) >= 0) {
      m_strLastCatalogNavigateRequest = cmd;
    }
    if (session != 4) {
      if (m_sSortField!= "" && m_sSortDirection != "" && (cmd.search(/\?/) > 1)) {
        cmd += '&sortby=' + m_sSortField + '&sort=' + m_sSortDirection;
      }
      if ((listcount > 0) && (cmd.search(/\?/) > 1)) {
        cmd += '&:listcount=' + listcount;
      }
      if (parseBoolean(AppCookie.get('useUiV2'))) {
        if ((cmd.search(/\?/) > 1)) {
          cmd  += '&';
        }
        else {
          cmd += '?';
        }
        cmd  += ':area=' + m_sCurArea;
      }
    }
    if (session == 1) {
      m_strLastSession1Request = cmd;
    }
  }
  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 {
    if (document.getElementById("submitButton")) {
      document.getElementById("submitButton").disabled = false;
    }
    if (document.getElementById("selector")) {
      document.getElementById("selector").disabled = false;
    }
    if (document.getElementById("pattern")) {
      document.getElementById("pattern").disabled = false;
    }
    if (document.getElementById("ANDConnector")) {
      document.getElementById("ANDConnector").disabled = false; 
    }
    if (document.getElementById("NANDConnector")) {
      document.getElementById("NANDConnector").disabled = false;
    }
    if (document.getElementById("NEWQUERY")) {
      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 {
    if (document.getElementById("submitButton")) {
      document.getElementById("submitButton").disabled = "disabled";
    }
    if (document.getElementById("selector")) {
      document.getElementById("selector").disabled = "disabled";
    }
    if (document.getElementById("pattern")) {
      document.getElementById("pattern").disabled = "disabled";
    }
    if (document.getElementById("ANDConnector")) {
      document.getElementById("ANDConnector").disabled = "disabled";  
    }
    if (document.getElementById("NANDConnector")) {
      document.getElementById("NANDConnector").disabled = "disabled";
    }
    if (document.getElementById("NEWQUERY")) {
      document.getElementById("NEWQUERY").disabled = "disabled";
    }
    if (document.getElementById('sortFieldSelect')) {
      document.getElementById('sortFieldSelect').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 {number}
 *            session Nummer der Session
 * @param {boolean}
 *            sync Request synchron (nicht asynchron ausführen?) Default: false
 * @param {hist}
 *            Request in BB History aufnehmen (default: false)
 * @return xmlhttp objekt
 */
function URLRequest(url,session,sync,hist) {
  LOG("URLRequest: " + url);
  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 (session != 4){
    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) {
              if (xmlNode.nodeName == 'parsererror') {
                setStatus("Fehler: " + xmlNode.textContent,xmlDate);
              }
              else {
                interpreteResult(xmlNode, url);
                setStatus("Bereit.","",xmlDate);
              }
            }
            else {
              LOG("Response node was " + typeof(xmlNode));
            }
            
          } 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;
    }
  }
  else {
    LOG("url=" + url);
    LOG("loc=" + location.protocol + "//" + location.host + "" + url);
    window.location = location.protocol + "//" + location.host + "" + url;
  }
}

/**
 * wertet den AJAX Response aus und arbeitet ihn ein
 * 
 * @param xmlNode
 *            der von XMLHTTPResult ausgewertete Knoten
 */
function interpreteResult(xmlNode,url) {
// try {
  var childNodes = null;
  if (xmlNode.childNodes.length>0) {
    childNodes = xmlNode.childNodes;
  }
  else if (xmlNode) {
    childNodes = new Array();
    childNodes.push(xmlNode);
  }
  for (var i = 0; i < childNodes.length; i++) {
    var nodeName = 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(childNodes[i]);
      }
    }
    
    switch (nodeName) {
      case  'DocumentInfo': {
        var sDT = childNodes[i].getAttribute("docType");
        var sDN = childNodes[i].getAttribute("docNumber");
        if (typeof(sDT)=='string' && typeof(sDN)=='string') {
          m_curDocType = sDT;
          m_curDocNumber = sDN;
        }
        else {
          m_curDocType = '';
          m_curDocNumber = '';
        }
        break;
      }
      case 'setText': {
        var sID = childNodes[i].getAttribute("id");
        var sText = trim(childNodes[i].firstChild.nodeValue);
        var sMode = childNodes[i].getAttribute("mode");
        if (sMode != 'replace' && sMode!='firstChild ' && sMode!='insertBefore' && sMode!='insertAfter' && sMode!='replaceChildren' && sMode!='lastChild' && sMode!='appendChild') {
          sMode = 'replaceChildren';
        }
        if (typeof(sID)=='string' && typeof(sText)=='string') {
          if (sID.length > 0 && sText.length >0) {
            var oNode = bb.document.getElementById(sID);
            if (oNode) {
              bb.command.setText(oNode, sText, sMode);
            }
          }
        }
        break;
      }
      case 'areaInfo': {
        var sArea = childNodes[i].getAttribute("area");
        var sTopic = childNodes[i].getAttribute("topic");
        var sLabel = childNodes[i].getAttribute("label");
        var oAreaInfo = {
          area:sArea,
          topic:sTopic,
          label:sLabel
        };
        m_areaInfos.push(oAreaInfo);
        break;
      }
      case 'addDictEntry': {
        var lang = childNodes[i].getAttribute("lang");
        var key = childNodes[i].getAttribute("key");
        var value = childNodes[i].getAttribute("value");
        if (lang && key && value) {
          if (typeof(clientDictionary) == 'undefined') {
            clientDictionary = {}; 
          }
          if (typeof(clientDictionary[lang]) == 'undefined') {
            clientDictionary[lang] = {};    
          }
          clientDictionary[lang][key] = value;
        }
        break;
      }
      case 'removeDictEntry': {
        var lang = childNodes[i].getAttribute("lang");
        var key = childNodes[i].getAttribute("key");
        if (lang && key) {
          if (typeof(clientDictionary) != 'undefined') {
            if (typeof(clientDictionary[lang]) != 'undefined') {
              clientDictionary[lang][key] = undefined;      
            } 
          }
        }
        break;
      }
      case 'alert':
        alert(childNodes[i].firstChild.nodeValue);
        break;
      case 'loadURL':
        URLRequest(childNodes[i].firstChild.nodeValue,0,false,true);
        break;
      case 'Logo':
        try {
          var ilogo = document.getElementById("Logo");
          var lsrc = childNodes[i].getAttribute("img");
          var atxt = 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 (childNodes[i].childNodes.length === 0) {
            m_sSortField = "";
          } else {
          Field = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'sortdirection':
          if (childNodes[i].childNodes.length === 0) {
            Direction = "";
          } else {
            Direction = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'query_base':
          if (childNodes[i].childNodes.length === 0) {
            Query.base = "";
          } else {
          Query.base = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'mediaID':
          if (childNodes[i].childNodes.length === 0) {
            Query.mediaID = "";
          } else {
          Query.mediaID = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'query_media':
          if (childNodes[i].childNodes.length === 0) {
            Query.media = "";
          } else {
          Query.media = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'query_catalog':
          if (childNodes[i].childNodes.length === 0) {
            Query.catalog = "";
          } else {
          Query.catalog = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'archiveID':
          if (childNodes[i].childNodes.length === 0) {
            Query.archiveID = "";
          } else {
          Query.archiveID = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case  'query_archive':
          if (childNodes[i].childNodes.length === 0) {
            Query.archive = "";
          } else {
          Query.archive = unescape(trim(childNodes[i].firstChild.nodeValue));
          }
          break;
      case   'query_maps':
          if (childNodes[i].childNodes.length === 0) {
            Query.maps = "";
            Query.mapstxt = "";
            Query.mapslvl = "";
          } else {
          Query.maps = unescape(trim(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 (childNodes[i].childNodes.length === 0) {
            m_strLastSearchDefineRequest  = "";
          } else {
            m_strLastSearchDefineRequest   = trim(childNodes[i].firstChild.nodeValue);
          }
          break;
      case 'searchstate':
          if (childNodes[i].childNodes.length === 0) {
            searchstate = "";
          } else {
            searchstate = trim(childNodes[i].firstChild.nodeValue);
          }
          break;
      case 'reRegisterSliderEvent':
        slider_offset = childNodes[i].getAttribute("offset");
        slider_total = childNodes[i].getAttribute("total");
        slider_lpx = childNodes[i].getAttribute("lpx");
        slider_cmd = childNodes[i].getAttribute("cmd");
        slider_count = childNodes[i].getAttribute("count");
        slider_mover = childNodes[i].getAttribute("moverid");
        try {
          slider_lichtpult = 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, parseBoolean(childNodes[i].getAttribute("sh")));
        break;
      case 'searchReset':
        searchReset();
        break;
      case 'suggesthits':     
        try {
          if (!SuggestCancel) {
            var divsuggestBox = document.getElementById("suggestBox");
            if (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 = childNodes[i].getAttribute("no");
        APSRequest("displayresultlist?no=" + no);
        break;
      case 'displayresultdocument':
        var no = childNodes[i].getAttribute("no");
        APSRequest("displayresultdocument?no=" + no);
        break;
      case 'displayresultdocumentmap':
        var no = childNodes[i].getAttribute("no");
        APSRequest("displayresultdocumentmap?no=" + no);
        break;
      case 'displayresultdocumentinfo':
        var no = childNodes[i].getAttribute("no");
        APSRequest("displayresultdocumentinfo?no=" + no);
        break;
      case 'displayresultzoom':
        var no = childNodes[i].getAttribute("no");
        var mediumID =  childNodes[i].getAttribute("mediumID");
        var strReq = "displayresultzoom?no=" + no;
        if (mediumID) {
          strReq += "&mediumID=" + mediumID;
        }
        APSRequest(strReq);
        break;        
      case 'displayresultgalery':
        var no = childNodes[i].getAttribute("no");
        APSRequest("displayresultgalery?no=" + no);
        break;
      case 'displayresultmap':
        var no = 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 = childNodes[i].getAttribute("tastr");
        var sRsuggstart = childNodes[i].getAttribute("suggstart");
        var sRstart = childNodes[i].getAttribute("start");
        var sRsugg20 = childNodes[i].getAttribute("sugg20");
        var sRsuggcmd = childNodes[i].getAttribute("suggcmd");
        var sRmax = childNodes[i].getAttribute("max");
        var sRdir = childNodes[i].getAttribute("dir");
        var sInitialstart = childNodes[i].getAttribute("initialstart");
        APSSuggestNav(sRtastr,sRstart,sRdir,sRsuggstart,sRsugg20,sRsuggcmd,'',sRmax,sInitialstart);       
        break;
      case 'resetDetails':
          resetDetails();
          break;
      case 'displayDetail':
        var Detailid= 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 = childNodes[i].getAttribute("path");
        var def = childNodes[i].getAttribute("def");
        ExtraMenuSync(path,def,true);
        break;
      case 'MapInit':
        resizeMap();
        var lat = childNodes[i].getAttribute("lat");
        var lng = childNodes[i].getAttribute("lng");
        var zoom = childNodes[i].getAttribute("zoom");
        var map = childNodes[i].getAttribute("map");
        var lookup = childNodes[i].getAttribute("lookup") == 'true';
        mapinit(lat, lng, zoom, map, lookup);
        if (lookup) {
          maploadmarker();
        }
        break;
      case 'MapAddMarker':
        var lat = childNodes[i].getAttribute("lat");
        var lng = childNodes[i].getAttribute("lng");
        var motxt = childNodes[i].getAttribute("motxt");
        var cc = childNodes[i].getAttribute("colorcode");
        var dynload = childNodes[i].getAttribute("dynload") == 'true';
        var divid = childNodes[i].getAttribute("divid");        
        var des = "";
        if (document.importNode) {
          des = document.importNode(childNodes[i], true).innerHTML;
        } else {
          des = 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 = childNodes[i].getAttribute("swf");
        var soid = childNodes[i].getAttribute("id");
        var sowidth = childNodes[i].getAttribute("width");
        var soheight = childNodes[i].getAttribute("height");
        var sover = childNodes[i].getAttribute("version");
        var sobgcol = childNodes[i].getAttribute("background");
        SWFInstance = null;
        SWFInstance = new SWFObject(soswf,soid,sowidth,soheight,sover,sobgcol);
        break;
      case 'SWFObjectAddVariable':
        var sok = childNodes[i].getAttribute("key");
        var sov = childNodes[i].getAttribute("value");      
        SWFInstance.addVariable(sok,sov);
        break;
      case 'SWFObjectAddParam': 
        var pok = childNodes[i].getAttribute("key");
        var pov = childNodes[i].getAttribute("value");      
        SWFInstance.addParam(pok,pov);
        break;
      case 'SWFObjectWrite':
        var t = childNodes[i].getAttribute("target");
        SWFInstance.write(t);
        resizeZoomify();
        break;
      case 'DMode':
        DMode = childNodes[i].getAttribute("mode");
        break;
      case 'RefreshStatusHeadLine':
        refreshStatusHeadline();
        break;
      case 'scaleImages': 
        var maxSideLength = parseInt(childNodes[i].getAttribute("to"));
        var imgNodeName = childNodes[i].getAttribute("name");
        if (ImageScaler) {
          if (maxSideLength > 0 && imgNodeName) {
            ImageScaler.startResizeImagesInterval(imgNodeName, maxSideLength);
          }
        }
        break;
      case 'entity': {
        selectedEntityPrefix = childNodes[i].getAttribute("prefix");
        break;
      }
      case 'setSortField': {
        m_sSortField = childNodes[i].getAttribute("name");
        break;
      }
      case 'setSortDirection': {        
        m_sSortDirection = childNodes[i].getAttribute("direction");
        break;
      }
      case 'APSSearch':{
        ApsSearch(childNodes[i].getAttribute("query"), childNodes[i].getAttribute("sort-column"), childNodes[i].getAttribute("sort-direction"));
        break;
      }
      case 'loadTopic': {
        var sTopic =  childNodes[i].getAttribute("topic");
        if (typeof(sTopic)=='string') {
          if (sTopic.length > 0) {
            loadTopic(sTopic);
          }
        }
        break;
      }
      case 'hide': {
        var sID =  childNodes[i].getAttribute("id");
        var bPermanent = parseBoolean(childNodes[i].getAttribute("permanent"));
        if (sID) {
          hideById(sID, bPermanent);
        }
        break;
      }
      case 'show': {
        var sID =  childNodes[i].getAttribute("id");
        if (sID) {
          unhideById(sID);
        }
        break;
      }
      case 'ApsRequest': {
        var sCMD = childNodes[i].getAttribute("cmd");
        if (sCMD) {
          APSRequest(sCMD);
        }
        break;
      }
      case 'setHeight':  {
        var to = childNodes[i].getAttribute("to");
        var sID = childNodes[i].getAttribute("id");
        LOG("setHeight for id "  + sID + " to " +  to);
        if (to && sID) {
        var oNode = getViewNodeById(sID);
          if (oNode) {
            LOG("exec");
            bb.command.setStyle(getViewNodeById(sID), {'height':to});
          }
        }
        break;
      }
      default:
        try {
          if (nodeName.charAt(0)!='#') {
            var resultContainer = childNodes[i];
            var oParent = bb.document.getElementById(nodeName);
            if (!oParent) {
              getViewNodeById(nodeName);
            }
            if (resultContainer.childNodes.length == 0) {
              showDiv(nodeName, false);
            }
            else {
              // Zielknoten befüllen
              var iCounter = 0;
              var sHTML = resultContainer.innerHTML;
              if (!sHTML) {
                sHTML = "";
                for (var k = 0; k < resultContainer.childNodes.length && !bInnerHTMLApplied; k++) {
                  sHTML += bb.xml.serialize(resultContainer.childNodes[k], false);
                }
              }
              var bInnerHTMLApplied = false;
              if (!bb.browser.ie && nodeName.search(/^ID[A-F0-9]{32}$/) == 0) {
                bInnerHTMLApplied = setInnerHTML(nodeName,sHTML);
              }
              var iCounter = 0;
              setOverflow('contentContainer', resultContainer.getAttribute('overflow'));
              
        
              for (var k = 0; k < resultContainer.childNodes.length && nodeName != '#text' && nodeName != '#comment' && !bInnerHTMLApplied; 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');
                        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;
                var oCContainer = getViewNodeById('contentContainer');
                oCContainer.scrollTop = 0;
              }
              
              // set container visible
              if (nodeName != 'fmpartnermenu') {
                showDiv(nodeName, true);
              }
              if (nodeName == 'infotext') {
                showDiv('result', false);

                
                if (m_lastTopic) {
                  oTopicInfo = getTopicInfo(m_lastTopic);
                  if (oTopicInfo.subFolder=='topics') {
                    var oPermalink = bb.document.getElementById('permalink');
                    if (oPermalink) {
                      bb.command.destroy(oPermalink);
                    }
                    var oInfotext = bb.document.getElementById("infotext");
                    var sLink = 'http://' + location.hostname + '/';
                    if(isDefaultTopic(m_lastTopic)) {
                      // alles OK, link stimmt
                    }
                    else if (getAreaInfoByTopic(m_lastTopic)) {
                      var areaInfo = getAreaInfoByTopic(m_lastTopic)
                      sLink += 'area/' + areaInfo.area + '/' + areaInfo.label + '.html';
                    }
                    else {
                      sLink += 'info/'+ oTopicInfo.path + ".html";
                    }
                    var sPermalink = '<div id="permalink" xmlns="http://www.w3.org/1999/xhtml">';
                    sPermalink += 'Permalink: ' + sLink;  
                    sPermalink += '</div>'; 
                    oPermalink = bb.command.create(sPermalink, oInfotext,'appendChild');
                  }
                }
              }
              else if (nodeName == 'result') {
                showDiv('infotext', false);
              }
              // other operations
                if (nodeName == 'suggestBox') {
                              var patternBox = bb.html.getBoxObject(getViewNodeById("pattern"));
                              var sPanelBox = bb.html.getBoxObject(getViewNodeById("searchPanel"));
                              var suggestTop = (patternBox['y'] - sPanelBox['y']) + patternBox['h'] - 8;
                              var suggestLeft = 5;
                              var sBoxNode = getViewNodeById("suggestBox");
                              sBoxNode.style.top = suggestTop + 'px'; 
                                sBoxNode.style.left = suggestLeft + 'px';
              }
                scrollToAnchor(resultContainer.getAttribute('jumpTo'));
            } 
          }
        } catch (ex) {
          if (nodeName != '#text' && nodeName != '#comment') {
            LOG("Error during default insertion");
            LOG(ex);
          }
        }
        performResize();
        break;
    }
  }
  
  ExtraMenuSync(url);
// } catch (ex) {
// }
}

function isDefaultTopic(sTopicSubPath) {
  oTopicInfo = getTopicInfo(sTopicSubPath);
  oDefaultTopicInfo = getTopicInfo(m_areaInfos[0].topic);
  return (oTopicInfo.path == oDefaultTopicInfo.path);
}

function getAreaInfoByTopic(sTopicSubPath) {
  var areaInfo = null;
  oTopicInfo = getTopicInfo(sTopicSubPath);
  for (var i=0; i<m_areaInfos.length && areaInfo==null; i++) {
    var oCurAreaTI = getTopicInfo(m_areaInfos[i].topic);
    if (oTopicInfo.path == oCurAreaTI.path) {
      areaInfo = m_areaInfos[i];
    }
  }
  return areaInfo;
}

function unhideById(sID) {
  if (bb.array.indexOf(m_permanentlyHiddenNodeIDs, sID) > -1) {
    bb.array.removeObject(m_permanentlyHiddenNodeIDs,sID);
  }
  showDiv(sID, true);
}

function hideById(sID, bPermanent) {
  if (typeof(bPermanent)!='boolean') {
    bPermanent = false;
  }
  if (bPermanent && bb.array.indexOf(m_permanentlyHiddenNodeIDs, sID) == -1) {
    m_permanentlyHiddenNodeIDs.push(sID);
  }
  showDiv(sID, false);
}

function showHideDiv(id) {
  
  var node = bb.document.getElementById(id);
  if (node && !bb.browser.ie) {
    bb.command.showHide(node);
  } 
  else {
    var n = undefined;
    if (bb.document.getElementById(id)) {
      n = bb.document.getElementById(id);
      n = n.viewNode;
    } 
    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}
 *            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) {
        if (bb.array.indexOf(m_permanentlyHiddenNodeIDs, id) == -1) {
          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) {
        if (bb.array.indexOf(m_permanentlyHiddenNodeIDs, id) == -1) {
          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   = getViewNodeById(blkid);
  var headNode = getViewNodeById(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 (true /* typischerweise inputIndex!='a' && inputIndex !='b' */) {
    if (inputIndex == 'signa') {
        // Punkt wird im Signaturenindex durch space ersetzt
        inputPattern = inputPattern.replace(/\./g, " ");
    }
    
    var rReplaceChars = /[,\°\.\:\\\/\(\)\{\}\[\]\&\!\<\>\']+/g;
    if (inputPattern[0]!='"' && inputPattern[inputPattern.length-1]!='"') {
      var rReplaceChars = /[,\°\.\:\\\/\(\)\{\}\[\]\&\!\<\>\'\"]+/g;
    }
    if (inputPattern.search(rReplaceChars) >= 0) {
      inputPattern = inputPattern.replace(rReplaceChars, " ");
    }
    
    inputPattern = inputPattern.replace(/\s+/g, " ");
    if (arguments.length == 0) {
      if (inputPattern[0] == '"' && inputPattern[inputPattern.length-1]=='"') {
        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) {
      searchReset();
// Query.base = '';
// Query.lastDDUpdate.tastr = "";
// Query.lastDDUpdate.start = "";
// searchstate = "NEWQUERY";
      var activeFilters = getActiveFilterCheckboxes();
      for (var i=0; i<activeFilters.length; i++) {
        Query.base += activeFilters[i].value;
      }
    }
  } 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' || searchstate=='NEWQUERY') {
        APSRequest("searchdefine?query=" + querystring);
      } else {
        APSRequest("searchdefinenq?query=" + querystring);
      }
    } else {
      unLockUIControls();
    } 
  }
  if (Query.catalog) {
    DDRefresh(basequery,false);
  }
}


function searchReset() {
  try {
    Query.media = "";
    Query.archive = "";
    Query.base = "";
    Query.catalog = "";
    Query.maps = "";
    Query.mapstxt = "";
    Query.mapslvl = "";
      Query.lastDDUpdate.catalog = "";
      Query.lastDDUpdate.tastr = "";
      Query.lastDDUpdate.start = "";
      Query.lastDDUpdate.filter = "";
      searchstate = "NEW";
  }
  catch (srEx) {
    LOG("ERROR during searchReset()")
    LOG(srEx);
  }
}
  

/**
 * 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 searchPanel = getViewNodeById("searchPanel");
  var drillChilds = getViewNodeById("drillChilds");
  if (drillChilds && searchPanel) {
    var searchPanelBox = bb.html.getBoxObject(searchPanel);
    var drillChildsBox = bb.html.getBoxObject(drillChilds);
    var drillChildsHeight = searchPanelBox['h'] - (drillChildsBox['y'] - searchPanelBox['y']);
    bb.html.setStyle(drillChilds, 'height', drillChildsHeight + 'px');
  }
}

// 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,filter) {
   DDUpdate(catalog,tastr,start,'',filter);
}

function DDUpdate(catalog,tastr,start,catalogquery,filter) {
   
   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 (filter) {
     Query.lastDDUpdate.filter = filter;
   }
// if (tastr != '') {
      // TODO ggf. Query mit "!" ???
      /* DDthequery = escape(unescape(DDthequery).replace(/:/g, '!')); */
      var catReq = 'catalognavigate?:katalog=' + catalog + '&tastr=' + tastr + '&dir=strict&start=' + start + "&query=" + DDthequery;
      if (filter) {
        //catReq += '&filter=' + escape(filter);
      }
      APSRequest(catReq)
   // }
   DDsubmitSearch(DDsearch);   
}

function DDRefresh(basequery,sh) {
  var catalog = Query.lastDDUpdate.catalog;
    var tastr = Query.lastDDUpdate.tastr;
    var start = Query.lastDDUpdate.start;
    var filter = Query.lastDDUpdate.filter;
    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 = "&query=" + basequery;
  } 
  else {
    if (Query.catalog || Query.media || Query.archive || basequery) {
      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, '!'));
  var catReq = 'catalognavigate?:katalog=' + catalog + '&tastr=' + tastr + '&dir=strict&start=' + start + thequery + dt;
  if (filter) {
        //catReq += '&filter=' + escape(filter);
      }
      APSRequest(catReq)
}   

function DDReset() {
  Query.catalog = "";
  Query.lastDDUpdate.catalog = "";
    Query.lastDDUpdate.tastr = "";
    Query.lastDDUpdate.start = "";
}

function DDResetCatalog() {
  DDReset();
  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";
     // ABKA-19654
     if (tdesc != undefined && tastr != undefined) {
      //AMM-528
      if (unescape(tdesc).search('<span class="highlighted">') >= 0) {
    	  tdesc = unescape(tdesc);
    	  tdesc = tdesc.replace('<span class="highlighted">','');
    	  tdesc = tdesc.replace('</span>','');
    	  tdesc = escape(tdesc);
      }
      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 displayLastLpDoc() {
  if (m_strLastLichtpultDocRequest != '') {
    APSRequest(m_strLastLichtpultDocRequest);
  }
  else {
    LOG("Last LP Document Request not restorable. Fallback to LP");
    APSRequest('displaylichtpult')
  }
}

function toggleStatus(collection,picture) {
  try{
  
    var dictKeyAdd = undefined;
    var dictKeyRemove = undefined;
    var CollectionVar = undefined;
    var elemName = undefined;
    if (collection == "LP") {
      CollectionVar = LP;   
      dictKeyAdd='add_lichtpult';
      dictKeyRemove='remove_lichtpult';
      elemName = "LP" + picture;
      
    } else {
      CollectionVar = WK;
      dictKeyAdd='add_basket';
      dictKeyRemove='remove_basket';
      elemName = "WK" + picture;
    }
    
    if (dictKeyAdd && dictKeyRemove && elemName) {
      var bPicAdded = false;
      var divlst = document.getElementsByName("LP" + picture);
      
      var strAdd = clientDictionary[Lang][dictKeyAdd];
      var strRemove = clientDictionary[Lang][dictKeyRemove];
      
      
      for (var i=0; i < divlst.length; i++) {
        var div = divlst[i];
        var bHasAddClass = bb.html.hasClass(div,'addToCollection');
        var bHasRemoveClass = bb.html.hasClass(div,'removeFromCollection');
        if (bHasAddClass) {
           bb.html.replaceClass(div,'addToCollection','removeFromCollection');
           bb.command.setText(div,strRemove,'replaceChildren');
           if (bPicAdded == false) {
             if (CollectionVar != "") {
              CollectionVar += "|";
             }
             CollectionVar += picture;
             bPicAdded = true;
           }
        } 
        else if (bHasRemoveClass) {
           bb.html.replaceClass(div,'removeFromCollection','addToCollection');
           bb.command.setText(div,strAdd,'replaceChildren');
           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 loadResultHighlightingCookie() {
  m_bResHighlightEnabled = '';
  try {
    var cArray = document.cookie.split(";");
    for (var i = 0; i < cArray.length; i++) {
      var ts = trim(cArray[i]);
      if (ts.indexOf("resHighlightEnabled=") == 0) {
        m_bResHighlightEnabled = ts.substring(20, ts.length);
      }
    }
  }
  catch(ex2){
      LOG("Error loading result highlighting cookie");
    LOG(ex2);
  }
  if (m_bResHighlightEnabled != '1' && m_bResHighlightEnabled != '0') {
    m_bResHighlightEnabled = DEFAULT_RESHIGHLIGHT;
  }
  storeResultHighlightingCookie();
}


function storeResultHighlightingCookie() {
  var nextYear = new Date();
  nextYear.setFullYear(nextYear.getFullYear() + 1);
  if (m_bResHighlightEnabled != '') {
    document.cookie = trim("resHighlightEnabled=" + m_bResHighlightEnabled + ";expires=" + nextYear.toGMTString());
  }
  else {
    document.cookie = trim("resHighlightEnabled=" + DEFAULT_RESHIGHLIGHT + ";expires=" + nextYear.toGMTString());
  }
}

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);
    if (menudef) {
      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: " + 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) {
  return;
  if (evnt.bookmark == "|home" || evnt.bookmark =='') {
    initAPS();
  } else if (evnt.bookmark.charAt(0)='|') {
    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 {String}
   *            sAnchorName Name des Anchors
   */
  function scrollToAnchor(sAnchorName){
    if (sAnchorName && DMode == 'doc') {
      var anchorNodes = document.getElementsByName(sAnchorName);
      if (anchorNodes.length > 0) {
        var anchorNode = anchorNodes[1];
        var boxAnchorNode = bb.html.getBoxObject(anchorNode);
        
        var ccContainerNode = getViewNodeById('contentContainer');
        var boxCcContainerNode = bb.html.getBoxObject(ccContainerNode);
        
        var scrollToPos = boxAnchorNode["y"] - boxCcContainerNode["y"] - 100;
        if (scrollToPos < 0) {
          scrollToPos = 0;
        }
        
        ccContainerNode.scrollTop = scrollToPos;
      }
    }
  }
  
  /**
   * Sets "innerHTML" Property to given HTML String for the node with the
   * given id.
   * 
   * @param {String}
   *            sID id of the node of which to set innerHTML
   * @param {String}
   *            sHTML new HTML Contents
   * @return {Boolean} true if applied, otherwise false
   */
  function setInnerHTML(sID, sHTML) {
    var bRes = false;
    try {
      var vNode = bb.document.getElementById(sID);
      if (vNode) {
        if (vNode.viewNode) {
          vNode = vNode.viewNode;
        }
      }
      else {
        vNode = document.getElementById(sID);
      }
      if (typeof(sHTML) == 'string' && vNode) {
        if ((sHTML.search(/\.*<e:.*/) < 0) && (sHTML.search(/.*\<b:.*/) < 0) && (sHTML.search(/.*\<c:.*/) < 0) && (sHTML.search(/.*\<mm:.*/) < 0)) {
          vNode.innerHTML = sHTML;
          bRes = true;
        }
      }
    }
    catch(exsih) {
      bRes = false;
      LOG ("ERROR during setInnerHTML()");
      LOG(exsih);
    }
    return bRes;
  }
  
  /**
   * Wird vom ZoomViewer aufgerufen um PDF aus den Hadschriftenkatalogen zu
   * erzeugen
   * @param sPage Medien ID
   */
  function zvHskPageToPDF(sPage) {
    if (sPage) {
      var s1SID = apssession[1];
      if (typeof(s1SID)=='string') {
        s1SID = s1SID.substring(s1SID.search("{"),s1SID.search("}")+1);
        if (s1SID) {
          APSRequest('toPDF?foreignSID='+s1SID+'&docType=hsk&docNum='+escape(m_curDocNumber)+'&docMode=hsk-chapter&chapterPage=' + sPage, 4);
        }
      }
    }
  }
  
  /**
   * Pseudo Fullscrenn wegen OOP in FF >3.5
   * @param sPage Medien ID
   */
  function zvFFFullscreen(sPage) {
    if (sPage) {
      var ffZoomWindow = bb.document.getElementById('ffFullScreenZV');
      if (!ffZoomWindow) {
        ffZoomWindow = getViewNodeById('ffFullScreenZV'); 
      }
      if (ffZoomWindow) {
        bb.command.destroy(ffZoomWindow);
      }
      var sWindow = '<b:window buttons="close" zIndex="10000" xmlns="http://www.w3.org/1999/xhtml" xmlns:b="http://www.backbase.com/2006/btl" position="absolute" top="0px" left="0px" id="ffFullScreenZV">';
      sWindow += '<div style="height:98%;width:100%;" id="ffZoom">';
      sWindow += '</div>';
      sWindow += '</b:window>';
      ffZoomWindow = bb.command.create(sWindow,bb.document.getElementById('layoutRoot'),'appendChild');
      ffZoomWindow.maximize();
      ffZoomWindow.resizable=false;
      APSRequest(m_strLastApsRequest.replace(/mediumID=[^&]+/,"mediumID="+sPage) + '&ffZoom=1' );     
    }
  }
  
  function zvFFCloseFullscreen(sPage) {
    var ffZoomWindow = bb.document.getElementById('ffFullScreenZV');
      if (ffZoomWindow) {
        ffZoomWindow.close(); 
      }
  }

