
//
// JavaScript-Funktionen fuer das WK-Portal
// (c) doctronic GmbH & Co. KG
//

//
// den Anwendungsrootframe finden
//
function rootF(oRoot)
{
  if (!oRoot)
  {
    oRoot = top;
  }

  for (var i = 0; i < oRoot.frames.length; i++)
  {
    if (oRoot.frames[i].name == top.oRootName)
    {
      return oRoot.frames[i];
    }
  }
  for (var i = 0; i < oRoot.frames.length; i++)
  {
    var oFrame = rootF(oRoot.frames[i]);
    if (oFrame)
    {
      return oFrame;
    }
  }

  return null;
};

//
// eine Frame ueber seinen Namensteil finden
//
function FF(oRoot,oName)
{
  if (oRoot)
  {
    for (var i = 0; i < oRoot.frames.length; i++)
    {
      var oFName = oRoot.frames[i].name;
      if ( (oFName.length >= oName.length) && 
           (oFName.substr(oFName.length - oName.length) == oName) )
      {
        return oRoot.frames[i];
      }
    }
  }

  return null;
}

// Findet den XaverCommunicationFrame
function FComF(oRoot)
{
  if (!oRoot)
  {
    oRoot = top;
  }

  for (var i = 0; i < oRoot.frames.length; i++)
  {
    if (oRoot.frames[i].name.substr(0,18) == 'xaverKommunikation')
    {
      return oRoot.frames[i];
    }
  }

  return null;
}

//
// fuehrt einen Reload des MainFrame aus
//
function reloadMain(oRoot)
{
  var oFObj = FF(oRoot,'mainFrame');
  if (oFObj)
  { 
    var oReq = oFObj.location.href;
    var oRE = /&tm=[^&]*&/;
    if (oReq.search(oRE) != -1)
    {
      oReq = oReq.replace(oRE,"&");
      oRE = /&tid=[^&]*&/;
      oReq = oReq.replace(oRE,"&");

      oFObj.location.href = oReq;
    }
    else
    {
      oFObj.location.reload();
    }
  }
};

//
// Funktion wird aufgerufen, um die Anzeige des aktuellen Trefferhighlights
// anzuschalten
//
function highTerm(oDok,nCnt)
{
  if (oDok && (nCnt >= 0))
  {
    var oSpan = oDok.getElementById("hit" + nCnt);
    if (oSpan)
    {
      if (top.bMSIE5)
      {
        var oAllObj = oDok.all[oSpan.id];
        if (oAllObj && (oAllObj.className != "nohitterm"))
        {
          oAllObj.className = "hittermactive";
        }
      }
      else
      {
        var oOldClass = oSpan.getAttributeNode("class");
        if (oOldClass && (oOldClass.nodeValue != "nohitterm"))
        {
          var oNewClass = document.createAttribute("class");
          oNewClass.nodeValue = "hittermactive";
          oSpan.setAttributeNode(oNewClass);
        }
      }
    }
  }
};

//
// Funktion wird aufgerufen, um die Anzeige des aktuellen Trefferhighlights
// auszuschalten
//
function lowTerm(oDok,nCnt)
{
  if (oDok && (nCnt >= 0))
  {
    var oSpan = oDok.getElementById("hit" + nCnt);
    if (oSpan)
    {
      if (top.bMSIE5)
      {
        var oAllObj = oDok.all[oSpan.id];
        if (oAllObj && (oAllObj.className != "nohitterm"))
        {
          oAllObj.className = "hitterm";
        }
      }
      else
      {
        var oOldClass = oSpan.getAttributeNode("class");
        if (oOldClass && (oOldClass.nodeValue != "nohitterm"))
        {
          var oNewClass = document.createAttribute("class");
          oNewClass.nodeValue = "hitterm";
          oSpan.setAttributeNode(oNewClass);
        }
      }
    }
  }
};

//
// Treffertermhervorhebungen an- bzw. ausschalten
//
function toggleHighlights(oWin,oObj)
{
  if (!oWin || !oObj) return;

  var oTxtDok = FF(rootF(),'mainFrame');
  if (!oTxtDok) return;
  oTxtDok = oTxtDok.document;

  if (oObj.id == "dms1")
  {
    var nLast = getLastTermNr(oTxtDok);
    for (var i = getFirstTermNr(oTxtDok); i <= nLast; ++i)
    {
      var oSpan = oTxtDok.getElementById("hit" + i);
      if (oSpan)
      {
        if (top.bMSIE5)
        {
          var oAllDok = oTxtDok.all[oSpan.id];
          if (oAllDok)
          {
            oAllDok.className = "nohitterm";
          }
        }
        else
        {
          var oNewClass = oTxtDok.createAttribute("class");
          oNewClass.nodeValue = "nohitterm";
          oSpan.setAttributeNode(oNewClass);
        }
      }
    }

    var oOld = oWin.document.getElementById("dms0");
    if (oOld) oOld.style.display = "inline";
    oObj.style.display = "none";
  }
  else
  {
    var nLast = getLastTermNr(oTxtDok);
    for (var i = getFirstTermNr(oTxtDok); i <= nLast; ++i)
    {
      var oSpan = oTxtDok.getElementById("hit" + i);
      if (oSpan)
      {
        if (top.bMSIE5)
        {
          var oAllDok = oTxtDok.all[oSpan.id];
          if (oAllDok)
          {
            oAllDok.className = "hitterm";
          }
        }
        else
        {
          var oNewClass = oTxtDok.createAttribute("class");
          oNewClass.nodeValue = "hitterm";
          oSpan.setAttributeNode(oNewClass);
        }
      }
    }
    
    highTerm(oTxtDok,top.nCurPos);

    var oOld = oWin.document.getElementById("dms1");
    if (oOld) oOld.style.display = "inline";
    oObj.style.display = "none";
  }
};

//
// Nummer des ersten Trefferterms ermitteln
//
function getFirstTermNr(oDok)
{
  if (!oDok) return -1;

  var oAnchors = oDok.getElementsByTagName("a");
  if (oAnchors)
  {
    for (var i = 0; i < oAnchors.length; ++i)
    {
      if (oAnchors[i].name.substr(0,2) == "ht")
      {
        return Number(oAnchors[i].name.substr(2));
      }
    }
  }

  return -1;
}

//
// Nummer des letzten Trefferterms ermitteln
//
function getLastTermNr(oDok)
{
  if (!oDok) return -1;

  var oAnchors = oDok.getElementsByTagName("a");
  if (oAnchors)
  {
    for (var i = oAnchors.length - 1; i >= 0; --i)
    {
      if (oAnchors[i].name.substr(0,2) == "ht")
      {
        return Number(oAnchors[i].name.substr(2));
      }
    }
  }

  return -1;
}

//
// Nummer des nächsten Trefferterms ermitteln
//
function getNextTermNr(oDok)
{
  if (!oDok || (top.nCurPos == -1))
  {
    return -1;
  }

  var nNextNr = -1;
  for (var i = 0; i < oDok.links.length; ++i)
  {
    var nPos = oDok.links[i].href.indexOf('#ht');
    if (nPos != -1)
    {
      var nNr = Number(oDok.links[i].href.substr(nPos+3));
      if (nNr > top.nCurPos)
      {
        nNextNr = nNr;
        break;
      }
    }
  }
  if (nNextNr != -1)
  {
    var nLast = getLastTermNr(oDok);
    while (nNextNr <= nLast)
    {
      if (oDok.getElementById("hit" + nNextNr))
      {
        return nNextNr;
      }
      nNextNr++;
    }
  }

  return -1;
}

//
// Nummer des vorherigen Trefferterms ermitteln
//
function getPrevTermNr(oDok)
{
  if ( !oDok || (top.nCurPos == -1) || !top.nPrevPosList || (top.nPrevPosList.length == 0) )
  {
    return -1;
  }

  return top.nPrevPosList[top.nPrevPosList.length - 1];
}

//
// Gibt es noch einen weiteren Trefferterm?
//
function isNextTerm(oDok)
{
  return (getNextTermNr(oDok) != -1);
};

//
// Gibt es noch einen vorherigen Trefferterm?
//
function isPrevTerm(oDok)
{
  return (getPrevTermNr(oDok) != -1);
};

//
// den aktuellen Trefferterm anspringen
//
function jumpToTerm(oDok)
{
  if (oDok)
  {
    var oURL = oDok.location.href;
    if (oURL.indexOf('#ht0') != -1)
    {
      if (top.nCurPos > 0)
      {
        var nPos = oURL.lastIndexOf('#');
        if (nPos != -1)
        {
          oURL = oURL.substr(0,nPos);
        }
        oURL = oURL + "#ht" + top.nCurPos;
        oDok.location.href = oURL;
      }
    }
  }
}

//
// zum nächsten Trefferterm springen
//
function jumpToNextTerm()
{
  var oFObj = FF(rootF(),'mainFrame');
  if (oFObj)
  {
    var oDok = oFObj.document;
    if (isNextTerm(oDok))
    {
      lowTerm(oDok,top.nCurPos);

      top.nPrevPosList.push(top.nCurPos);
      top.nCurPos = Number(getNextTermNr(oDok));

      var oURL = oDok.location.href;
      var nPos = oURL.lastIndexOf('#');
      if (nPos != -1)
      {
        oURL = oURL.substr(0,nPos);
      }
      oURL = oURL + "#ht" + top.nCurPos;

      hasTerm("prevTerm",true);
      hasTerm("nextTerm",isNextTerm(oDok));

      oDok.location.href = oURL;
      highTerm(oDok,top.nCurPos);
    }
  }
};

//
// den Next/PrevTerm-Button abhaengig vom Parameter schalten
//
function hasTerm(oName,bNext)
{
  var oFObj = FF(rootF(),'XaverStaticHeader');
  if (oFObj)
  {
    var oDok = oFObj.document;
    var oObj1 = oDok.getElementById(oName);
    var oObj2 = oDok.getElementById(oName + "0");
    if (oObj1 && oObj2)
    {
      if (bNext)
      {
        if (oObj1.style.display != "inline") oObj1.style.display = "inline";
        if (oObj2.style.display != "none") oObj2.style.display = "none";
      }
      else
      {
        if (oObj1.style.display != "none") oObj1.style.display = "none";
        if (oObj2.style.display != "inline") oObj2.style.display = "inline";
      }
    }
  }
};

//
// Funktion wird aufgerufen um zum vorherigen Trefferterm zu
// scrollen
//
function jumpToPrevTerm()
{
  var oFObj = FF(rootF(),'mainFrame');
  if (oFObj)
  {
    var oDok = oFObj.document;
    if (isPrevTerm(oDok))
    {
      lowTerm(oDok,top.nCurPos);

      top.nCurPos = Number(getPrevTermNr(oDok));
      top.nPrevPosList.pop();

      var oURL = oDok.location.href;
      var nPos = oURL.lastIndexOf('#');
      if (nPos != -1)
      {
        oURL = oURL.substr(0,nPos);
      }
      oURL = oURL + "#ht" + top.nCurPos;

      hasTerm("prevTerm",isPrevTerm(oDok));
      hasTerm("nextTerm",true);

      oDok.location.href = oURL;
      highTerm(oDok,top.nCurPos);
    }
  }
};

// ----------------------------------------------------------
// ein paar Stringoperationen
// ----------------------------------------------------------

// Leerzeichen vorne und hinten entfernen
function strip(oStr)
{
  return oStr.replace(/^\s+/,"").replace(/\s+$/,"");
}

// Text als Suchphrase setzen
function AddPhrase(oObj)
{
  var oStr = strip(oObj.value);
  if (oStr.length > 0)
  {
    var oNStr = "";
    for (var i = 0; i < oStr.length; ++i)
    {
      var c = oStr.charAt(i);
      if ( (c == '+') || (c == '-') || (c == '"') || (c == "'") )
      {
        oNStr += " ";
      }
      else
      {
        oNStr += c;
      }
    }
    oObj.value = '"' + strip(oNStr.replace(/\s\s+/g," ")) + '"';
  }
}

// evtl. Suchphrase entfernen
function RemPhrase(oObj)
{
  var oStr = oObj.value;
  while ( (oStr.length > 0) && ( (oStr.charAt(0) == ' ') || (oStr.charAt(0) == '"')))
  {
    oStr = oStr.slice(1);
  }
  while ( (oStr.length > 0) && ( (oStr.charAt(oStr.length-1) == ' ') || (oStr.charAt(oStr.length-1) == '"')))
  {
    oStr = oStr.substr(0,oStr.length - 1);
  }
  oObj.value = oStr;
}

// SID aus einem Xaver-Request isolieren
function getSID(oURL)
{
  return (oURL.search(/([?]|&|^)SID=([^&]*)(&|$)/) != -1) ? RegExp.$2 : "";
}

// Zeichenkette saeubern
function normalize(oStr)
{
  return strip(oStr).toLowerCase().replace(/[^0-9a-zäöüß\s]/g," ").replace(/\s{2,}/g," ");
}

// Xaver-Datum -> String
function dat2Str(oDat)
{
  var nDat = Number(oDat);
  return (nDat % 100).toString() + "." +
         (Math.floor(nDat / 100) % 100).toString() + "." +
         Math.floor(nDat / 10000).toString();
}

// String -> Xaver-Datum
function str2Dat(oStr,bRoundUp)
{
  var oParts = oStr.replace(/[\/:-]/g,".").replace(/ /g,"").split(".");

  var nYear = Number(oParts[oParts.length - 1]);
  if ( (nYear < 1) || (nYear > 2999) || isNaN(nYear))
  {
    alert("Ungültiges Datum!\nVerwenden Sie bitte nur Jahre von 1900 bis 2999.");
    return -1; 
  }
  else if (nYear < 1900)
  {
    nYear += (nYear < 30) ? 2000 : 1900;
  }
  var nDat = nYear * 10000;

  if (oParts.length >= 2)
  {
    var nMonth = Number(oParts[oParts.length - 2]);
    if ( (nMonth > 12) || (nMonth < 1) || isNaN(nMonth))
    {
      alert("Ungültiges Datum!\nVerwenden Sie bitte nur Monate von 1 bis 12.");
      return -1; 
    }
    nDat += nMonth * 100;

    if (oParts.length == 3)
    {
      var nDay = Number(oParts[0]) 
      if ( (nDay > 31) || (nDay < 1) || isNaN(nDay))
      {
        alert("Ungültiges Datum!\nVerwenden Sie bitte nur Tage von 1 bis 31.");
        return -1; 
      }
      nDat += nDay;
    }
    else if (oParts.length > 3)
    {
      alert("Ungültiges Datum!\nVerwenden Sie [tt.][mm.][jjjj].");
      return -1;
    }
    else // == 2
    {
      nDat += (bRoundUp ? 31 : 1);
    }
  }
  else
  {
    nDat += (bRoundUp ? 1231 : 101);
  }

  return nDat;
}

// NOCA aus einem Xaver-Request isolieren
function dtGetNOCA(oURL)
{
  return (oURL.search(/([?]|&|^)noca=([0-9]+)(&|$)/) != -1) ? RegExp.$2 : "";
}

// SID aus einem Xaver-Request isolieren
function dtGetSID(oURL)
{
  return (oURL.search(/([?]|&|^)SID=([^&]*)(&|$)/) != -1) ? RegExp.$2 : "";
}

// zum Setzen von Xaver-Variablen
function dtSetXaverVar(oName,oValue)
{
  var oComF = FComF();
  if (oComF)
  {
    var oSID = dtGetSID(window.location.search);
    if (oSID == "") oSID = dtGetSID(top.location.search);
    if (oSID != "") oSID = "SID=" + oSID + "&";

    var oHREF = top.location.pathname.replace(/\/[^\/]+\.xav$/,"/preferences.xav?" + oSID + "tf=&hlf=&tocf=&qmf=&name=dummy&back=&set=&bk=" + top.oURI + "&") + oName + "=" + escape(oValue);
    for (var i = 2; i < dtSetXaverVar.arguments.length - 1; i += 2)
    {
      oHREF = oHREF + "&" + dtSetXaverVar.arguments[i] + "=" + escape(dtSetXaverVar.arguments[i + 1]);
    }
    oComF.location.replace(oHREF); 
  }
}

// ein Frameset anhand seines ID-Suffix finden
function dtFindFSbyID(oNameSuffix,oRoot)
{
  if (!oRoot)
  {
    oRoot = top;
  }

  var oFSList = oRoot.document.getElementsByTagName('frameset');
  for (var i = 0; i < oFSList.length; i++)
  {
    var oFS = oFSList[i];
    if (oFS.id && 
        ( (oFS.id.length >= oNameSuffix.length) && 
          (oFS.id.substr(oFS.id.length - oNameSuffix.length) == oNameSuffix) ) )
    { 
      return oFS;
    }
  }

  for (var i = 0; i < oRoot.frames.length; i++)
  {
    var oFS = dtFindFSbyID(oNameSuffix,oRoot.frames[i]);
    if (oFS)
    {
      return oFS;
    }
  }

  return null;
}

// AppNav und NSR schliessen
function dtCloseNaviFrames()
{
  var oNSRFrameset = dtFindFSbyID('XaverInnerFrame');
  if (oNSRFrameset)
  {
    oNSRFrameset.rows = "0,*";
  }

  var oAppnavFrameset = dtFindFSbyID('globalFrameset');
  if (oAppnavFrameset)
  {
    var oHeightList = oAppnavFrameset.rows.split(",");
    oAppnavFrameset.rows = oHeightList[0] + ",0px," + oHeightList[2];
  }
}

// AppNav oeffnen
function dtOpenAppnav()
{
  var oAppnavFrameset = dtFindFSbyID('globalFrameset');
  if (oAppnavFrameset)
  {
    var oHeightList = oAppnavFrameset.rows.split(",");
    oAppnavFrameset.rows = oHeightList[0] + ",40px," + oHeightList[2];
  }
}

// TOC oeffnen
function dtOpenTOC(oTOCUrl)
{
  var oTOCFrameset = dtFindFSbyID('tocFrameset');
  if (oTOCFrameset)
  {
    var oWidthList = oTOCFrameset.cols.split(",");
    var oTOCWidth = oTOCFrameset.tocWidth;
    if (!oTOCWidth)
    {
      oTOCWidth = '35%';
      oTOCFrameset.tocWidth = oTOCWidth;
    }
    if (oWidthList[0] != oTOCWidth)
    {
      oTOCFrameset.cols = oTOCWidth + "," + oWidthList[1];
      if (oTOCFrameset.firstChild.src != oTOCUrl)
      {
        oTOCFrameset.firstChild.src = oTOCUrl;
      }
    }
  }
}
 
function dtCloseTOC()
{
  var oTOCFrameset = dtFindFSbyID('tocFrameset');
  if (oTOCFrameset)
  {
    var oWidthList = oTOCFrameset.cols.split(",");
    if (oWidthList[0] != '0px')
    {
      oTOCFrameset.cols = "0px," + oWidthList[1];
      oTOCFrameset.tocWidth = oWidthList[0];
    }
  }
}
 
// ggf. das aktuelle (first class-) Modul richtig setzen
function dtAdjustModule(oCurIntModule,oCurIntModuleName)
{
  if ((oCurIntModule != 'modul_basis') && (oCurIntModule != 'modul_aktuell'))
  {
    if ((top.oCurModule || top.oCurModule == ''))
    {
      top.oCurModule = oCurIntModule;
      dtSetXaverVar('col:curModule',oCurIntModule,'col:curModuleName',oCurIntModuleName);
    }
  }
}

// in einem Objekt ein HREF-Attribut setzen
function dtSetObjectHREF(oFrame,oObjID,oURL)
{
  if (oFrame)
  {
    var oObj = oFrame.document.getElementById(oObjID);
    if (oObj)
    {
      oObj.href = oURL;
    }
  }
}

//
// XML/DOM-Support
//

function dtGetNodeText(oNode)
{
  var oText = "";

  if (oNode)
  {
    if (oNode.nodeType == 3) // Text
    {
      oText = nodeValue;
    }
    else if (oNode.nodeType == 1) // Element
    {
      for (var j = 0; j < oNode.childNodes.length; j++)
      {
        var oChildNode = oNode.childNodes[j];
        if (oChildNode.nodeType == 3) // Text
        {
          oText += oChildNode.nodeValue;
        }
        else
        {
          oText += " ";
        }
      }
    }
  }

  return strip(oText).replace(/\s\s/g," ");
}

function dtFindNodeByName(oRoot,oNodeName)
{
  if (oRoot)
  {
    if (oRoot.nodeName == oNodeName)
      return oRoot;

    if (oRoot.nodeType == 1) // Element
    {
      for (var j = 0; j < oRoot.childNodes.length; j++)
      {
        var oChildNode = oRoot.childNodes[j];
        if (oChildNode.nodeType == 1)
        {
          var oNode = dtFindNodeByName(oChildNode,oNodeName);
          if (oNode != null)
            return oNode;
        }
      }
    }
  }
  
  return null;
}

