




// #############################################################################
// ### Protoypes:
// #############################################################################

  String.prototype.removeWhiteSpaces = function() {return(this.replace(/\s+/g,""));};
  String.prototype.leftTrim = function() {return(this.replace(/^\s+/,""));};
  String.prototype.rightTrim = function() {return(this.replace(/\s+$/,""));};
  String.prototype.basicTrim = function() {return(this.replace(/\s+$/,"").replace(/^\s+/,""));};
  String.prototype.superTrim = function() {return(this.replace(/\s+/g," ").replace(/\s+$/,"").replace(/^\s+/,""));};

  Array.prototype.indexOf = function(obj) {var i,idx=-1;for(i=0;i<this.length;i++){if(this[i]==obj){idx=i;break;}}return idx;};
  Array.prototype.lastIndexOf = function(obj) {this.reverse();var i,idx=-1;for(i=0;i<this.length;i++){if(this[i]==obj){idx=(this.length-1-i);break;}}this.reverse();return idx;};
  Array.prototype.contains = function(obj) {var i,listed=false;for(i=0;i<this.length;i++){if(this[i]==obj){listed=true;break;}}return listed;};

// #############################################################################
// ### toggleElement:
// #############################################################################
function toggleElement( selector) {
  var els = $(selector);
  if ( selector.indexOf("tr[")==0) {
    if (els.css("visibility")=='hidden') {
      els.css({'visibility':'visible','display':''});
    }
    else {
      els.css({'visibility':'hidden','display':'none'});
    }
  }
  else {
    if (els.css("display")=='none') {
      els.show('fast');
    }
    else {
      els.hide('fast');
    }
  }
  return;
}

// #############################################################################
// ### toggleImage:
// #############################################################################
function toggleImage( selector) {
  var els = $(selector);
  if ( els.attr("title") == "-") {
    els.attr( { src: "/misc_/zms/pl.gif", title: "+"});
  }
  else 
  if ( els.attr("title") == "+") {
    els.attr( { src: "/misc_/zms/mi.gif", title: "-"});
  }
  return;
}

// #############################################################################
// ### toggleCookie:
// #############################################################################
function toggleCookie( key) {
  try {
    var value = $.cookies.get(key);
    if (value==null || value=='0') {
      $.cookies.set(key,'1');
    }
    else {
      $.cookies.del(key);
    }
  }
  catch(e) {
  } 
}

// #############################################################################
// ### getRelativeUrl:
// #############################################################################
function getRelativeUrl(path, url) {
  var currntPath = path;
  if (currntPath.indexOf('http://www.kolping-hildesheim.de')==0)
    currntPath = currntPath.substr(33);
  else if (currntPath.indexOf('/')==0)
    currntPath = currntPath.substr(1);
  var targetPath = url;
  if (targetPath.indexOf('http://www.kolping-hildesheim.de')==0)
    targetPath = targetPath.substr(33);
  else if (targetPath.indexOf('/')==0)
    targetPath = targetPath.substr(1);
  while ( currntPath.length > 0 && targetPath.length > 0) {
     var i = currntPath.indexOf( '/');
     var j = targetPath.indexOf( '/');
     if ( i < 0)
       currntElmnt = currntPath;
     else
       currntElmnt = currntPath.substring( 0, i);
     if ( j < 0)
       targetElmnt = targetPath;
     else 
       targetElmnt = targetPath.substring( 0, j);
     if ( currntElmnt != targetElmnt)
       break;
     if ( i < 0)
       currntPath = '';
     else
       currntPath = currntPath.substring( i + 1);
     if ( j < 0)
       targetPath = '';
     else
       targetPath = targetPath.substring( j + 1);
  }
  while ( currntPath.length > 0) {
     var i = currntPath.indexOf( '/');
     if ( i < 0) {
       currntElmnt = currntPath;
       currntPath = '';
     }
     else {
       currntElmnt = currntPath.substring( 0, i);
       currntPath = currntPath.substring( i + 1);
     }
     targetPath = '../' + targetPath;
  }
  url = './' + targetPath;
  return url;
}

// #############################################################################
// ### getCoords
// #############################################################################
function getCoords(theElement) {
  var coords = {x: 0, y: 0};
  var element = theElement;
  while (element) {
    coords.x += element.offsetLeft;
    coords.y += element.offsetTop;
    element = element.offsetParent;
  }
  return coords;
}

// #############################################################################
// ### scrollToElement
// ### @see http://radio.javaranch.com/pascarello/2005/01/09/1105293729000.html
// #############################################################################
function scrollToElement(theElement) {
  var selectedPosX = 0;
  var selectedPosY = 0;
  while(theElement != null){
    selectedPosX += theElement.offsetLeft;
    selectedPosY += theElement.offsetTop;
    theElement = theElement.offsetParent;
  }
  window.scrollTo(selectedPosX,selectedPosY);
}

// #############################################################################
// ### fireEvent
// ### @see http://www.rakshith.net/blog/?p=35
// #############################################################################
function fireEvent( el, evtName) {
  //On IE
  if( el.fireEvent)
  {
    el.fireEvent('on'+evtName);
  }
  //On Gecko based browsers
  if(document.createEvent)
  {
    var evt = document.createEvent('HTMLEvents');
    if(evt.initEvent)
    {
      evt.initEvent(evtName, true, true);
    }
    if ( el.dispatchEvent)
    {
      el.dispatchEvent(evt);
    }
  }
}

/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 * +- [ZMI] Manage Preview
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */

  function manage_preview() {
    var divs = $('div');
    for ( var i = 0; i < divs.length; i++) {
      var div = $(divs[i]);
      var id= div.attr('id');
      if (id!=undefined) {
        if (id.indexOf('pageelement')==0 || id.indexOf('pageregion')==0) {
          var mdiv = document.getElementById(id);
          var ldiv = document.createElement( "div");
          ldiv.appendChild( document.createTextNode(id));
          mdiv.appendChild( ldiv);
          div.css( { border:"5px solid black" ,background:"red"});
        }
      }
    }
  }

  function do_manage_preview() { 
    window.setTimeout("manage_preview()",100);
  }

/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 * +- [ZMI] Highlight Text
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */

  function capitalize(Text) {
    c=Text.split(""); c[0]=c[0].toUpperCase(); return c.join("");
  }

  function highlight_text(text) {
    var exp = "";
    for (var i = 0; i < text.length; i++) {
      var ch = text.charAt(i);
      if ( ch != '*') {
        exp += "(" + ch + "|" + text.toUpperCase().charAt(i) + "|" + text.toLowerCase().charAt(i) + ")";
      }
    }
    var regexp = new RegExp( "(" + exp + ")", "g");
    var el = $('body');
    $('*',el)
        .andSelf()
        .contents()
        .filter(function(){
            return this.nodeType === 3;
        })
        .filter(function(){
            // Only match when contains 'simple string' anywhere in the text
            return this.nodeValue.match(regexp);
        })
        .each(function(){
            // Do something with this.nodeValue
            $(this).parent().html($(this).parent().html().replace( regexp, "<span class=\"highlight\">$1</span>"));
        });
     var els = document.getElementsByName('highlight');
     if ( els.length>0) {
       scrollToElement(els[0]);
     }
  }

  function do_highlight(text) { 
    window.setTimeout("highlight_text('"+text+"')",100);
  }


/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 * +- [ZMI] Character Format
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */

var selectedText = "";

/*
 * manage_browseObjsBtnClick:
 * @param elTitleName (@deprecated)
 */
function manage_browseObjsBtnClick(fmName, elUrlName, elTitleName, lang)
{
  var title = "Please%20choose%20an%20object";
  var url = "manage_browse_objs";
  var elUrlValue = "";
  if (fmName.length>0 && elUrlName.length>0)
  {
    elUrlValue = document.forms[ fmName].elements[ elUrlName].value;
  }
  params = 'lang=' + lang;
  params += '&fmName=' + escape( fmName);
  params += '&elUrlName=' + escape( elUrlName);
  params += '&elUrlValue=' + escape( elUrlValue);
  if ( selectedText) {
    params += '&selectedText=' + escape( selectedText);
  }
  open_frame(title,url,params,420,360,",resizable=yes,scrollbars=yes");
  return false;
}

/*
 * browseObjsBtnClick:
 * @param elTitleName (@deprecated)
 */
function browseObjsBtnClick(fmName, elUrlName, elTitleName, lang)
{
  var title = "Please%20choose%20an%20object";
  var url = "f_browse_objs";
  var elUrlValue = "";
  if (fmName.length>0 && elUrlName.length>0)
  {
    elUrlValue = document.forms[ fmName].elements[ elUrlName].value;
  }
  params = 'lang=' + lang;
  params += '&fmName=' + escape( fmName);
  params += '&elUrlName=' + escape( elUrlName);
  params += '&elUrlValue=' + escape( elUrlValue);
  if ( selectedText) {
    params += '&selectedText=' + escape( selectedText);
  }
  open_frame(title,url,params,420,360,",resizable=yes,scrollbars=yes");
  return false;
}


/**
 */
function selectObject(path, title) 
{
  if (path.indexOf('{$')==0 && path.lastIndexOf('}')==path.length-1)
    path = '<'+'dtml-var expr="getLinkUrl(\''+path+'\',REQUEST)"/>';
  var fTag = 'a';
  var aTag = '<'+fTag+' href="'+path+'">';
  var eTag = '</'+fTag+'>';
  tagSelectedText( aTag, eTag);
}

/**
 * Remove tags from given string.
 */
function untag( s) {
  return s.replace( /<(..*?)>/g, '');
}

/**
 * Get tagged index of untagged string in given string.
 */
function taggedStart( s1, s2)
{
  var r = '';
  var b = true;
  for (var i = 0; i < s1.length; i++) {
    var c = s1.charAt( i);
    if ( b && c == '<')
      b = false;
    else if ( !b && c == '>')
      b = true;
    else if ( b)
      r += c;
    if ( r == s2)
      return i;
  }
  return -1;
}

/**
 * Tag selected text.
 */
function tagSelectedText( aTag, eTag) {
  var input = self.el;
  /* internet explorer */
  if( typeof document.selection != 'undefined') {
    var range = document.selection.createRange();
    var selText = range.text;
    /* Strip trailing blanks */
    var trailingBlanks = '';
    while ( selText.length > 0 && selText.charAt( selText.length - 1) == ' ') {
      selText = selText.substr( 0, selText.length - 1);
      trailingBlanks += ' ';
    }
    if ( selText.length > 0) {
      /* Apply value */
      var newText;
      if ( aTag.length > 0 && typeof eTag == 'undefined')
        newText = aTag + trailingBlanks;
      else
        newText = aTag + selText + eTag + trailingBlanks;
      range.text = newText;
      /* Anpassen der Cursorposition */
      range = document.selection.createRange();
      range.moveStart('character', newText.length);
      range.select();
    }
  }
  /* newer gecko-based browsers */
  else if( typeof input.selectionStart != 'undefined') {
    var start = self.selectionStart;
    var end = self.selectionEnd;
    var inpValue = input.value;
    var selText = inpValue.substring( start, end);
    // Strip trailing blanks
    var trailingBlanks = '';
    while ( selText.length > 0 && selText.charAt( selText.length - 1) == ' ') {
      selText = selText.substr( 0, selText.length - 1);
      trailingBlanks += ' ';
    }
    if ( selText.length > 0) {
      /* Apply value */
      var newText;
      if ( aTag.length > 0 && typeof eTag == 'undefined')
        newText = aTag + trailingBlanks;
      else
        newText = aTag + selText + eTag + trailingBlanks;
      input.value = input.value.substr( 0, start) + newText + input.value.substr( end);
      /* Anpassen der Cursorposition */
      var pos = start + newText.length;
      input.selectionStart = pos;
      input.selectionEnd = pos;
    }
  }
}

/**
 * Untag selected text.
 * Returns true if selected text was untagged, false otherwise.
 */
function untagSelectedText( fTag, fAttrs, ld, rd, lang) {
  var input = self.el;
  /* internet explorer */
  if( typeof document.selection != 'undefined') {
    var range = document.selection.createRange();
    var selText = range.text;
    var startTag = ld+fTag;
    var endTag = ld+'/'+fTag+rd;
    if ( selText.indexOf(startTag) == 0 && selText.lastIndexOf(endTag) == selText.length - endTag.length) {
      selText = selText.substr( startTag.length + 1, selText.lastIndexOf( endTag) - startTag.length - 1); 
      /* Apply value */
      range.text = selText;
      return true;
    }
    else {
      range.moveStart('character', -(startTag.length+1));
      range.moveEnd('character', endTag.length);
      var taggedText = range.text;
      if ( taggedText.indexOf(startTag) == 0 && taggedText.lastIndexOf(endTag) == taggedText.length - endTag.length) {
        /* Apply value */
        range.text = selText;
        return true;
      }
      else if ( fAttrs.length > 0) {
        startTag += fAttrs;
        range.moveStart('character', -fAttrs.length);
        var taggedText = range.text;
        if ( taggedText.indexOf(startTag) == 0 && taggedText.lastIndexOf(endTag) == taggedText.length - endTag.length) {
          /* Apply value */
          range.text = selText;
          return true;
        }
      }
    }
  }
  /* newer gecko-based browsers */
  else if( typeof input.selectionStart != 'undefined') {
    var start = self.selectionStart;
    var end = self.selectionEnd;
    var inpValue = input.value;
    var selText = inpValue.substring( start, end);
    var tagStart = inpValue.substr( 0, start);
    var i = tagStart.length;
    var c = tagStart.charAt( i - 1);
    if ( c == '>') {
      /* Handle DTML in a.href */
      i--;
      var l = 1;
      while ( l > 0 && i > 0) {
        c = tagStart.charAt( i - 1);
        if ( c == rd)
          l++;
        if ( c == ld)
          l--;
        i--;
      }
      if ( i >= 0) {
        var tag = tagStart.substr( i);
        tagStart = tagStart.substr( 0, i);
        if ( tag.indexOf(ld+fTag) == 0 && tag.indexOf(rd) > 0) {
          var tagEnd = inpValue.substr( end);
          if ( tagEnd.indexOf(rd) > 0) {
            var tag = tagEnd.substr( 0, tagEnd.indexOf(rd) + 1);
            tagEnd = tagEnd.substr( tagEnd.indexOf(rd) + 1);
            if ( tag.indexOf(ld+'/'+fTag+rd) == 0) {
              input.value = tagStart + selText + tagEnd;
              return true;
            }
          }
        }
      }
    }
  }
  return false;
}

/**
 * Set text-format.
 */
function setTextFormat( fTag, ld, rd, lang) 
{
  var fAttrs = '';
  if (fTag.indexOf( ' ') > 0) {
    fAttrs = fTag.substring( fTag.indexOf( ' '));
    fTag = fTag.substring( 0, fTag.indexOf( ' '));
  }
  var input = self.el;
  selectedText = '';
  /* internet explorer */
  if( typeof document.selection != 'undefined') {
    var range = document.selection.createRange();
    selectedText = range.text;
  }
  /* newer gecko-based browsers */
  else if( typeof input.selectionStart != 'undefined') {
    self.selectionStart = input.selectionStart;
    self.selectionEnd = input.selectionEnd;
    var start = self.selectionStart;
    var end = self.selectionEnd
    selectedText = input.value.substring( start, end);
  }
  if ( selectedText.length == 0)
    return;
  if ( !untagSelectedText( fTag, fAttrs, ld, rd, lang)) {
    if (fTag == 'a' && selectedText.indexOf('http://') < 0 && selectedText.indexOf('@') < 0) {
      if ( self.fm)
        browseObjsBtnClick('','','',lang);
      else
        browseObjsBtnClick('None','','',lang);
    } 
    else {
      var aTag = ld
      aTag += fTag;
      if (fTag == 'a') {
        if (selectedText.indexOf("@")>0)
          aTag += ' href="mailto:' + selectedText + '"';
        else if (selectedText.indexOf("http://") < 0)
          aTag += ' href="http://' + selectedText + '" target="_blank"';
        else
          aTag += ' href="' + selectedText + '" target="_blank"';
      }
      else {
        aTag += fAttrs;
      }
      aTag += rd;
      var eTag = ld+'/'+fTag+rd;
      tagSelectedText( aTag, eTag, lang);
    }
  }
}

/**
 * Insert tab into richedit-textarea.
 */
function zmiRicheditInsertTab( fmName, elName) 
{
    var doc = document;
    var fm = doc.forms[ fmName];
    var input = fm.elements[ elName];
    input.focus();
    var insText = '\t';
    /* internet explorer */
    if( typeof doc.selection != 'undefined') {
      var range = doc.selection.createRange();
      // insert text
      range.text = insText;
    }
    /* newer gecko-based browsers */
    else if( typeof input.selectionStart != 'undefined') {
      // insert text
      var start = input.selectionStart;
      var end = input.selectionEnd;
      input.value = input.value.substr(0, start) + insText + input.value.substr(end);
      // cursor-position
      var pos = start + insText.length;
      input.selectionStart = pos;
      input.selectionEnd = pos;
    }
}

/**
 * Set text-format for input.
 */
function setTextFormatInput( fTag, fmName, elName, lang) 
{
  self.fm = document.forms[ fmName];
  self.el = self.fm.elements[ elName];
  if (typeof self.el == 'undefined') {
    self.el = document.getElementsByName(elName)[0];
  }
  setTextFormat( fTag, '<', '>', lang);
}

/**
 * Store caret.
 */
function storeCaret( textEl) 
{
  if (textEl.createTextRange)
    textEl.caretPos = document.selection.createRange().duplicate();
}


/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 * +- [ZMI] Dimensions
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */

function getBodyDimensions() {
  if (document.body && document.body.offsetWidth) {
    var div = $('body>div');
    return {width: div.attr('offsetWidth'), height: div.attr('offsetHeight')};
  } else {
    return {width: 0, height: 0};
  }
}

function getInnerDimensions() {
  if (window.innerWidth) { // Mozilla/Firefox
    return {width: window.innerWidth, height: window.innerHeight};
  } else if (document.documentElement && document.documentElement.clientWidth) { // IE6/IE8
    return {width: document.documentElement.clientWidth, height: document.documentElement.clientHeight};
  } else if (document.body && document.body.clientWidth) {
    return {width: document.body.clientWidth, height: document.body.clientHeight};
  } else {
    return {width: 0, height: 0};
  }
}


// #############################################################################
// ### open_frame:
// #############################################################################
function open_frame(title,url,params,width,height,options)
  {
    href = "f_frame";
    href += "?" + params;
    href += "&p_url=" + url;
    href += "&p_title=" + title;
    if ( height > screen.availHeight || width > screen.availWidth) {
      if ( options.indexOf( "scrollbars=") < 0) {
        if ( height > screen.availHeight)
          height = screen.availHeight;
        if ( width > screen.availWidth)
          width = screen.availWidth;
        options += ",scrollbars=yes";
      }
    }
    var name = url;
    var i = name.lastIndexOf( "/");
    if ( i > 0) {
      name = name.substring(i+1);
    }
    else {
      name = url;
    }
    i = name.indexOf("?");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    i = name.indexOf("-");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    i = name.indexOf(".");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    var msgWindow = open(href,name,"width=" + width + ",height=" + height
      + ",screenX=" + (screen.width-width)/2
      + ",screenY=" + (screen.height-height)/2
      + ",dependent=yes"
      + ",left=" + (screen.width-width)/2
      + ",top=" + (screen.height-height)/2
      + options
      );
    if ( msgWindow) {
      msgWindow.focus();
      if ( msgWindow.opener == null) {
        msgWindow.opener = self;
      }
    }
  }


// #############################################################################
// ### open_function:
// #############################################################################
function open_function(url,width,height,options)
  {
    if ( height > screen.availHeight || width > screen.availWidth) {
      if ( options.indexOf( "scrollbars=") < 0) {
        if ( height > screen.availHeight)
          height = screen.availHeight;
        if ( width > screen.availWidth)
          width = screen.availWidth;
        options += ",scrollbars=yes,resizable=yes";
      }
    }
    var name = url;
    var i = name.lastIndexOf( "/");
    if ( i > 0) {
      name = name.substring(i+1);
    }
    else {
      name = url;
    }
    i = name.indexOf("?");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    i = name.indexOf("-");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    i = name.indexOf(".");
    if ( i > 0) {
      name = name.substring(0,i);
    }
    var left = ( screen.width  - width  ) / 2;
    var top  = ( screen.height - height ) / 2;
    var msgWindow = open(url, name, "width=" + width + ",height=" + height
      + ",screenX=" + left
      + ",screenY=" + top
      + ",dependent=yes"
      + ",left=" + left
      + ",top=" + top
      + options
      );
    if ( msgWindow) {
      msgWindow.focus();
      if ( msgWindow.opener == null) {
        msgWindow.opener = self;
      }
    }
  }




