

//==================================================================================
//==================================================================================
//
// Tools-MODUL Projektbezogene Methoden und Objekte
// OO-PROGRAMMIERUNG
// AUTOR: DF
// ERSTELLT: 09.05.2005
//
//==================================================================================
//==================================================================================

// ============================================================
// Klasse Tools
// ============================================================

function Tools() {
}

// ------------------------------------------------------------
// Private Klasseneigenschaften
// ------------------------------------------------------------

// ------------------------------------------------------------
// Private Instanzmethoden
// ------------------------------------------------------------

// ------------------------------------------------------------
// öffentliche Instanzmethoden
// ------------------------------------------------------------

// ------------------------------------------------------------
// öffentliche Klasseneigenschaften
// ------------------------------------------------------------

// ------------------------------------------------------------
// Private Klassenmethoden
// ------------------------------------------------------------

// ------------------------------------------------------------
// öffentliche Klassenmethoden
// ------------------------------------------------------------

Tools.openMicrosite = function(htmlElement, properties) {
  if (!arguments.length) {
    return false;
  }
  var url = '';
  var docSource = '';
  var tagName = htmlElement['tagName'];
  tagName = tagName.toLowerCase();
  if (tagName == 'form'){
    var nameValuePeer = [];
    for (var i=0; i<htmlElement.elements.length; i++){
      nameValuePeer[i] = {};
      if (htmlElement.elements[i].name && htmlElement.elements[i].name.length){
        if (htmlElement.elements[i].type == 'select-one'){
            nameValuePeer[i]['name'] = htmlElement.elements[i].name;
            nameValuePeer[i]['value'] = htmlElement.elements[i].options[htmlElement.elements[i].selectedIndex].value;
        } else if (htmlElement.elements[i].type == 'select-multiple'){
          nameValuePeer[i]['name'] = htmlElement.elements[i].name;
          nameValuePeer[i]['value'] = [];
          for (var ii=0; ii<htmlElement.elements[i].options.length; ii++){
            if (htmlElement.elements[i].options[ii].selected){
              nameValuePeer[i]['value'][ii] = htmlElement.elements[i].options[ii].value;
            }
          }
        } else if (htmlElement.elements[i].type == 'radio'){
          nameValuePeer[i]['name'] = htmlElement.elements[i].name;
          if (htmlElement.elements[i].length){
            nameValuePeer[i]['value'] = [];
            for (var ii=0; ii<htmlElement.elements[i].length; ii++){
              if (htmlElement.elements[i][ii].checked){
                nameValuePeer[i]['value'][ii] = htmlElement.elements[i][ii].value;
              }
            }
          } else {
            if (htmlElement.elements[i].checked){
              nameValuePeer[i]['value'] = htmlElement.elements[i].value;
            }
          }
        } else if (htmlElement.elements[i].type == 'checkbox'){
          nameValuePeer[i]['name'] = htmlElement.elements[i].name;
          if (htmlElement.elements[i].length){
            nameValuePeer[i]['value'] = [];
            for (var ii=0; ii<htmlElement.elements[i].length; ii++){
              if (htmlElement.elements[i][ii].checked){
                nameValuePeer[i]['value'][ii] = htmlElement.elements[i][ii].value;
              }
            }
          } else {
            if (htmlElement.elements[i].checked){
              nameValuePeer[i]['value'] = htmlElement.elements[i].value;
            }
          }
        } else {
          nameValuePeer[i]['name'] = htmlElement.elements[i].name;
          nameValuePeer[i]['value'] = htmlElement.elements[i].value;
        }
      }
    }
    if (!htmlElement.method || htmlElement.method.toLowerCase() != 'post'){
      url += htmlElement.action + '?';
      for (var f=0; f<nameValuePeer.length; f++){
        if (typeof nameValuePeer[f]['value'] == 'object'){
          for (var ff=0; ff<nameValuePeer[f]['value'].length; ff++){
            if (nameValuePeer[f]['value'][ff]){
              url += '&' + encodeURIComponent(nameValuePeer[f]['name']);
              url += '=' + encodeURIComponent(nameValuePeer[f]['value'][ff]);
            }
          }
        } else {
          if (nameValuePeer[f]['value']){
            url += '&' + encodeURIComponent(nameValuePeer[f]['name']);
            url += '=' + encodeURIComponent(nameValuePeer[f]['value']);
          }
        }
      }
    } else {
      var charsetting = 'ISO-8859-1';
      if (document.charset){
        if (document.charset != charsetting){
          charsetting = document.charset;
        }
      } else if (document.characterSet){
        if (document.characterSet != charsetting){
          charsetting = document.characterSet;
        }
      }
      docSource += '<html>\n<head><title></title><meta http-equiv="content-type" content="text/html; charset='+ charsetting +'"/></head>\n<body background-color="#ffffff" onload="document.forms[\'myform\'].submit();"><div style="display: none;">\n';
      docSource += '<form name="myform" action="'+ htmlElement.action +'" method="post">\n';
      for (var f=0; f<nameValuePeer.length; f++){
        if (typeof nameValuePeer[f]['value'] == 'object'){
          for (var ff=0; ff<nameValuePeer[f]['value'].length; ff++){
            if (nameValuePeer[f]['value'][ff]){
              docSource += '<input type="checkbox" name="'+ nameValuePeer[f]['name'] +'" value="'+ nameValuePeer[f]['value'][ff] +'" checked="checked"/>\n';
            }
          }
        } else {
          if (nameValuePeer[f]['value']){
            docSource += '<input type="checkbox" name="'+ nameValuePeer[f]['name'] +'" value="'+ nameValuePeer[f]['value'] +'" checked="checked"/>\n';
          }
        }
      }
      docSource += '</form>\n</div></body>\n</html>';
    }
    try {
      htmlElement.reset();
    } catch(e){
    }
  } else if (tagName == 'a' || tagName == 'area'){
    url += htmlElement.href;
  }
  var windowProps = '';
  if (arguments[1]){
    windowProps = properties;
  } else {
    windowProps = 'width=800,height=600,scrollbars=yes,locationbar=no,menubar=no';
  }
  var fenster = window.open(url, 'Micorsite', windowProps);
  if (docSource.length){
    var doc = fenster.document;
    doc.open();
    doc.write(docSource);
    doc.close();
  }
  fenster.focus();
  return false;
}

Tools.getCookieValue = function(cookieName){
  var cookieValue = '';
  if (! navigator.cookieEnabled){
    alert('Ihr Browser erlaubt keine Cookies!');
    return cookieValue;
  }
  if (! cookieName){
    return cookieValue;
  }
  var allCookies = document.cookie;
  var allCookiesArr = allCookies.split(/\;/);
  var regExp = new RegExp('^' + cookieName + '=');
  for (var i=0; i<allCookiesArr.length; i++){
    var _val = Tools.stripSpace(allCookiesArr[i]);
    if (! _val.match(regExp)){
      continue;
    }
    cookieValue = _val.replace(regExp,'');
  }
  if (cookieValue.match(/^"/) && cookieValue.match(/"$/)){
    cookieValue = cookieValue.replace(/^"/,'');
    cookieValue = cookieValue.replace(/"$/,'');
  }
  cookieValue = cookieValue.replace(/###/,';');
  return cookieValue;
}

Tools.setCookieValue = function(cookieValue, cookieName, expiresDate, path, version, valueType){
  if (! navigator.cookieEnabled){
    alert('Ihr Browser erlaubt keine Cookies!');
    return false;
  }
  if (! cookieValue.length){
    //return false;
  }
  if(! cookieName){
    cookieName = 'myCookie';
  }
  var expDate = Tools.DateToGMTStringCookie(expiresDate);
  if (cookieValue.length >= 4000){
    alert('Das Cookie kann nicht gespeichert werden.\nDie Datenmenge übersteigt die maximal zu speichernde Datenmenge eines Cookies.\nBitte überprüfen Sie Ihre Daten.');
    return false;
  }
  cookieValue = cookieValue.replace(/;/,'###');
  var cookieStr = '';
  if (valueType == 'int'){
    cookieStr = cookieName +'=' + cookieValue +';';
  } else {
    cookieStr = cookieName +'="' + cookieValue +'";';
  }
  if (expDate){
    cookieStr += ' expires='+ expDate +';';
  }
  if (path){
    cookieStr += ' path='+ path + ';';
  }
  version = 3;
  if (version && version.toString().length){
    cookieStr += ' version="'+ version + '";';
  }
  document.cookie = cookieStr;
}

Tools.DateToGMTStringCookie = function(date){
  if (! date){
    return false;
  }
  var str = '';
  var gtm = '';
  var gtmJS = date.toGMTString();
  var gtmArr = gtmJS.split(/ /);
  for (var i=0; i<gtmArr.length; i++){
    if (i>1 && i<4){
      gtm += '-';
    } else if (i > 0){
      gtm += ' ';
    }
    gtm += gtmArr[i];
  }
  return gtm;
}

Tools.confirmURL = function(url){
  if (! url){
    return false;
  }
  var conf = confirm('Möchten Sie den Datensatz wirklich löschen?');
  if (conf) {
    return url;
  }
}

Tools.checkRequiredData = function(htmlElement) {
  if (!arguments.length) {
    return false;
  }
  var _dataType = new RegExp(' \\[datatype\\=');
  var _required = new RegExp(' \\[required');
  var _requiredOn = new RegExp(' \\[requiredOn\\]');
  var _requiredOr = new RegExp(' \\[requiredOr\\]');
  var tagName = htmlElement['tagName'];
  tagName = tagName.toLowerCase();
  if (tagName == 'form'){
    for (var i=0; i<htmlElement.elements.length; i++){
      var idRequiredOn = undefined;
      var elemRequiredOn = undefined;
      var idRequiredOr = undefined;
      var elemRequiredOr = undefined;
      var mulitple = undefined;
      if(htmlElement.elements[i].nodeName.toLowerCase() == 'fieldset'){
        continue;
      }
      if (!htmlElement.elements[i].name.length || (!htmlElement.elements[i].className.length || (!htmlElement.elements[i].className.toString().match(_required) && !htmlElement.elements[i].className.toString().match(_dataType))) ){
        continue;
      }
      var requiredElemHasValue = false;
      var dataTypeElemHasDataTypeValue = true;
      if (htmlElement.elements[i].className.toString().match(_dataType)){
        if (! Tools.checkDataTypeElement(htmlElement.elements[i])) {
          dataTypeElemHasDataTypeValue = false;
        }
      }
      if (htmlElement.elements[i].className.toString().match(_requiredOn)){
        idRequiredOn = htmlElement.elements[i].className.toString().split(_requiredOn)[1].toString().replace(/[\[\]]/gi,'');
        elemRequiredOn = document.getElementById(idRequiredOn);
        if (Tools.checkRequiredElement(elemRequiredOn)){
          requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
        } else {
          requiredElemHasValue = true;
        }
      } else if (htmlElement.elements[i].className.toString().match(_requiredOr)){
        idRequiredOr = htmlElement.elements[i].className.toString().split(_requiredOr)[1].toString().replace(/[\[\]]/gi,'');
        var requiredOrHasValue = false;
        var elemRequiredOr = idRequiredOr.split(/\@/);
        for (var ro=0; ro<elemRequiredOr.length; ro++) {
          var _elemRequiredOr = document.getElementById(elemRequiredOr[ro]);
          if (Tools.checkRequiredElement(_elemRequiredOr)){
            requiredOrHasValue = true;
          }
        }
        if (requiredOrHasValue){
          requiredElemHasValue = true;
        } else {
          requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
        }
      } else if (htmlElement.elements[i].className.toString().match(_required)){
        requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
      } else {
        requiredElemHasValue = true;
      }
      if (!requiredElemHasValue){
        var shownElemName = htmlElement.elements[i].name;
        if (htmlElement.elements[i].title){
          shownElemName = htmlElement.elements[i].title;
        }
        if (elemRequiredOr != undefined){
          var alertTXT = 'Bitte füllen Sie das Feld >>' + shownElemName +'<<';
          for (var ro=0; ro<elemRequiredOr.length; ro++) {
            var _elemRequiredOr = document.getElementById(elemRequiredOr[ro]);
            var _shownElemNameOr = _elemRequiredOr.name;
            if (_elemRequiredOr.title){
              _shownElemNameOr = _elemRequiredOr.title;
            }
            alertTXT += ' oder >>'+ _shownElemNameOr +'<<';
          }
          alertTXT += ' aus!';
          alert(alertTXT);
        } else {
          alert('Bitte füllen Sie das Feld >>'+ shownElemName +'<< aus!');
        }
        if (htmlElement.elements[i].type != 'hidden') {
          htmlElement.elements[i].focus();
        }
        return false;
      }
      if (!dataTypeElemHasDataTypeValue){
        var shownElemName = htmlElement.elements[i].name;
        if (htmlElement.elements[i].title){
          shownElemName = htmlElement.elements[i].title;
        }
        if (htmlElement.elements[i].type != 'hidden') {
          htmlElement.elements[i].focus();
        }
        return false;
      }
    }
    return true;
  }
}

Tools.checkRequiredDataFormFragment = function(htmlElement, elem) {
  if (arguments.length != 2) {
    return false;
  }
  var _dataType = new RegExp(' \\[datatype\\=');
  var _required = new RegExp(' \\[required');
  var _requiredOn = new RegExp(' \\[requiredOn\\]');
  var _requiredOr = new RegExp(' \\[requiredOr\\]');
  var tagName = htmlElement['tagName'];
  tagName = tagName.toLowerCase();
  if (tagName == 'form'){
    for (var i=0; i<htmlElement.elements.length; i++){
      var idRequiredOn = undefined;
      var elemRequiredOn = undefined;
      var idRequiredOr = undefined;
      var elemRequiredOr = undefined;
      if(htmlElement.elements[i].nodeName.toLowerCase() == 'fieldset'){
        continue;
      }
      if (!htmlElement.elements[i].name.length || (!htmlElement.elements[i].className.length || (!htmlElement.elements[i].className.toString().match(_required) && !htmlElement.elements[i].className.toString().match(_dataType))) ){
        continue;
      }
      if (! Tools.isChildOfElement(elem, htmlElement.elements[i])) {
        continue;
      }
      var requiredElemHasValue = false;
      var dataTypeElemHasDataTypeValue = true;
      if (htmlElement.elements[i].className.toString().match(_dataType)){
        if (! Tools.checkDataTypeElement(htmlElement.elements[i])) {
          dataTypeElemHasDataTypeValue = false;
        }
      }
      if (htmlElement.elements[i].className.toString().match(_requiredOn)){
        var idRequiredOn = htmlElement.elements[i].className.toString().split(_requiredOn)[1].toString().replace(/[\[\]]/gi,'');
        var elemRequiredOn = document.getElementById(idRequiredOn);
        if (Tools.checkRequiredElement(elemRequiredOn)){
          requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
        } else {
          requiredElemHasValue = true;
        }
      } else if (htmlElement.elements[i].className.toString().match(_requiredOr)){
        idRequiredOr = htmlElement.elements[i].className.toString().split(_requiredOr)[1].toString().replace(/[\[\]]/gi,'');
        var requiredOrHasValue = false;
        var elemRequiredOr = idRequiredOr.split(/\@/);
        for (var ro=0; ro<elemRequiredOr.length; ro++) {
          var _elemRequiredOr = document.getElementById(elemRequiredOr[ro]);
          if (Tools.checkRequiredElement(_elemRequiredOr)){
            requiredOrHasValue = true;
          }
        }
        if (requiredOrHasValue){
          requiredElemHasValue = true;
        } else {
          requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
        }
      } else if (htmlElement.elements[i].className.toString().match(_required)){
        requiredElemHasValue = Tools.checkRequiredElement(htmlElement.elements[i]);
      } else {
        requiredElemHasValue = true;
      }
      if (!requiredElemHasValue){
        var shownElemName = htmlElement.elements[i].name;
        if (htmlElement.elements[i].title){
          shownElemName = htmlElement.elements[i].title;
        }
        if (elemRequiredOr != undefined){
          var alertTXT = 'Bitte füllen Sie das Feld >>' + shownElemName +'<<';
          for (var ro=0; ro<elemRequiredOr.length; ro++) {
            var _elemRequiredOr = document.getElementById(elemRequiredOr[ro]);
            var _shownElemNameOr = _elemRequiredOr.name;
            if (_elemRequiredOr.title){
              _shownElemNameOr = _elemRequiredOr.title;
            }
            alertTXT += ' oder >>'+ _shownElemNameOr +'<<';
          }
          alertTXT += ' aus!';
          alert(alertTXT);
        } else {
          alert('Bitte füllen Sie das Feld >>'+ shownElemName +'<< aus!');
        }
        if (htmlElement.elements[i].type != 'hidden') {
          htmlElement.elements[i].focus();
        }
        return false;
      }
      if (!dataTypeElemHasDataTypeValue){
        var shownElemName = htmlElement.elements[i].name;
        if (htmlElement.elements[i].title){
          shownElemName = htmlElement.elements[i].title;
        }
        if (htmlElement.elements[i].type != 'hidden') {
          htmlElement.elements[i].focus();
        }
        return false;
      }
    }
    return true;
  }
}

Tools.isChildOfElement = function(parentElem, childElem) {
  if (arguments.length != 2) {
    return false;
  }
  var nextElem = childElem;
  while (nextElem && nextElem.nodeName.toLowerCase() != 'body'){
    if (nextElem == parentElem){
      return true;
    }
    nextElem = nextElem.parentNode;
  }
  return false;
}

Tools.checkDataTypeElement = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var _dataTypeDE = new RegExp(' \\[datatype\\=Date\\_DE\\]');
  var _dataTypeCMS = new RegExp(' \\[datatype\\=Date\\_CMS\\]');
  var _dataTypeMail = new RegExp(' \\[datatype\\=Mail\\]');
  var _dataTypeAge = new RegExp(' \\[datatype\\=Age\\]');
  var _dataTypeLedgerNr = new RegExp(' \\[datatype\\=LedgerNr\\]');
  var _dataTypeLedgerNr2 = new RegExp(' \\[datatype\\=LedgerNr2\\]');  
  var _dataTypeBLZ = new RegExp(' \\[datatype\\=BLZ\\]');
  var _dataTypeInteger = new RegExp(' \\[datatype\\=Integer\\]');
  var _value = '';
  var _label = elem.name;
  if (elem.title){
    _label = elem.title;
  }
  if (elem.type == 'select-one'){
    if (elem.selectedIndex < 0){
      return false;
    }
    _value = Tools.stripSpace(elem.options[elem.selectedIndex].value);
  } else if (elem.type == 'select-multiple'){
    for (var ii=0; ii<elem.options.length; ii++){
      if (elem.options[ii].selected){
        _value += Tools.stripSpace(elem.options[ii].value);
      }
    }
  } else if (elem.type == 'radio'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          _value += Tools.stripSpace(elem[ii].value);
        }
      }
    } else {
      if (elem.checked){
        _value = Tools.stripSpace(elem.value);
      }
    }
  } else if (elem.type == 'checkbox'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          _value += Tools.stripSpace(elem[ii].value);
        }
      }
    } else {
      if (elem.checked){
        _value = Tools.stripSpace(elem.value);
      }
    }
  } else {
    _value = Tools.stripSpace(elem.value);
  }
  if (! _value.length){
    return true;
  }
  if (elem.className.toString().match(_dataTypeDE)){
    return Tools.validateDateFormat(_value, 'DE', _label);
  }
  if (elem.className.toString().match(_dataTypeCMS)){
    return Tools.validateDateFormat(_value, 'CMS', _label);
  }
  if (elem.className.toString().match(_dataTypeMail)){
    return Tools.validateMailFormat(_value, _label);
  }
  if (elem.className.toString().match(_dataTypeLedgerNr)){
    return Tools.validateLedgerNumber(_value, _label);
  }
  if (elem.className.toString().match(_dataTypeLedgerNr2)){
    return Tools.validateLedgerNumber2(_value, _label);
  }
  if (elem.className.toString().match(_dataTypeAge)){
    return Tools.validateAge(_value, _label);
  }
  if (elem.className.toString().match(_dataTypeInteger)){
    return Tools.validateInteger(_value, _label);
  }
  if (elem.className.toString().match(_dataTypeBLZ)){
    return Tools.validateBLZ(_value, _label);
  }
  return true;
}

Tools.getDataValue = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var _value = '';
  if (elem.type == 'select-one'){
    if (elem.selectedIndex < 0){
      return false;
    }
    _value = Tools.stripSpace(elem.options[elem.selectedIndex].value);
  } else if (elem.type == 'select-multiple'){
    for (var ii=0; ii<elem.options.length; ii++){
      if (elem.options[ii].selected){
        _value += Tools.stripSpace(elem.options[ii].value);
      }
    }
  } else if (elem.type == 'radio'){
      if (elem.checked){
        _value = Tools.stripSpace(elem.value);
      }
  } else if (elem.type == 'checkbox'){
      if (elem.checked){
        _value = Tools.stripSpace(elem.value);
      }
  } else if (elem.length) {
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          _value += Tools.stripSpace(elem[ii].value);
        }
      }
  } else {
    _value = Tools.stripSpace(elem.value);
  }
  return _value;
}

Tools.setDataValue = function(elem, value) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var _value = '';
  if (elem.type == 'select-one'){
    for (var ii=0; ii<elem.options.length; ii++){
      if (elem.options[ii].value == value){
        elem.options[ii].selected = 'selected';
      }
    }
  } else if (elem.type == 'select-multiple'){
    for (var ii=0; ii<elem.options.length; ii++){
      if (elem.options[ii].value == value){
        elem.options[ii].selected = 'selected';
      }
    }
  } else if (elem.type == 'radio'){
      if (elem.value == value){
        elem.checked = 'checked';
      }
  } else if (elem.type == 'checkbox'){
      if (elem.value == value){
        elem.checked = 'checked';
      }
  } else if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].value == value){
          elem[ii].checked = 'checked';
        }
      }
  } else {
    elem.value = value;
  }
  return true;
}

Tools.getCheckedElements = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var arr = [];
  if (elem.type == 'radio'){
      if (elem.checked){
        arr.push(elem);
      }
  } else if (elem.type == 'checkbox'){
      if (elem.checked){
        arr.push(elem);
      }
  } else if (elem.length) {
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          arr.push(elem[ii]);
        }
      }
  }
  return arr;
}

Tools.validateInteger = function(value, label) {
  if (! arguments.length) {
    return;
  }
  if (! value.match(/^[+-]?\d\d*$/)) {
    alert(label + ': Bitte geben Sie nur ganze Zahlen ein!');
    return false;
  }
  return true;
}

Tools.validateAge = function(value, label) {
  if (! arguments.length) {
    return;
  }
  if (! Tools.validateInteger(value)) {
    return false;
  }
  if (! (parseInt(value) > 0 && parseInt(value) < 130)) {
    var str = '';
    if (parseInt(value) > 120){
      str += 'Herzlichen Glückwunsch zu Ihrem sehr hohen Alter!!\n'
    } else {
      str += 'Sie sind leider noch nicht geboren!!\n';
    }
    str += label + ': Bitte geben Sie eine Zahl zwischen 1 und 130 ein!'
    alert(str);
    return false;
  }
  return true;
}

Tools.validateLedgerNumber2 = function(value, label) {
  if (! arguments.length) {
    return;
  }
  if (! value.match(/\d/)) {
    alert(label + ': Bitte geben Sie nur Zahlen und optional Minuszeichen ein!');
    return false;
  }
  if (value.match(/[^-\d]/)) {
    alert(label + ': Bitte geben Sie nur Zahlen und optional Minuszeichen ein!');
    return false;
  }
  return true;
}

Tools.validateLedgerNumber = function(value, label) {
  if (! arguments.length) {
    return;
  }
  if (! value.match(/^(\d\d?\d?\d?\d?\d?\d?\d?\d?\d?)$/)) {
    alert(label + ': Bitte geben Sie eine Zahl mit 1 - 10 Stellen ein!');
    return false;
  }
  return true;
}

Tools.validateBLZ = function(value, label) {
  if (! arguments.length) {
    return;
  }
  if (! value.match(/^(\d\d\d\d\d\d\d\d)$/)) {
    alert(label + ': Bitte geben Sie eine Zahl mit 8 Stellen ein!');
    return false;
  }
  return true;
}

Tools.validateDateFormat = function(value, variant, label) {
  if (! arguments.length) {
    return;
  }
  if (variant == 'CMS'){
    if (! value.match(/^(\d\d\d\d)\-(\d\d)\-(\d\d)$/)) {
      alert(label + ': Bitte geben Sie das Datum im Format jjjj-mm-dd an!');
      return false;
    }
  } else {
    if (! value.match(/^(\d\d?)\.(\d\d?)\.(\d\d\d\d)$/)) {
      alert(label + ': Bitte geben Sie das Datum im Format tt.mm.jjjj an!');
      return false;
    }
  }
  return true;
}

Tools.validateMailFormat = function(value, label) {
  if (!arguments.length) {
    return false;
  }
  var regEx = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)(\\@)([a-zA-Z0-9\\-\\.]+)(\\.)([a-zA-Z]{2,4})$');
  if (! value.match(regEx)){
    alert(label + ': Bitte geben Sie eine gültige E-Mail-Adresse an!');
    return false;
  }
  return true;
}

Tools.checkRequiredElement = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var _multipleRegEx = new RegExp(' \\[multiple\\]');
  var _multiple = false;
  if(elem.className.toString().match(_multipleRegEx)){
    _multiple = true;
  }
  if (_multiple){
    return Tools.checkRequiredElementMultiple(elem);
  }
  return Tools.checkRequiredElementSingle(elem);
}

Tools.checkRequiredElementMultiple = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var requiredValue = '';
  var arr = document.getElementsByName(elem.name);
  for (var i=0; i<arr.length; i++) {
    var multipleElem = arr[i];
    if (! Tools.checkRequiredElementSingle(multipleElem)){
      continue;
    }
    return true;
  }
  return false;
}

Tools.checkRequiredElementSingle = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  var requiredValue = '';
  if (elem.type == 'select-one'){
    if (elem.selectedIndex < 0){
      return false;
    }
    requiredValue = Tools.stripSpace(elem.options[elem.selectedIndex].value);
  } else if (elem.type == 'select-multiple'){
    for (var ii=0; ii<elem.options.length; ii++){
      if (elem.options[ii].selected){
        requiredValue += Tools.stripSpace(elem.options[ii].value);
      }
    }
  } else if (elem.type == 'radio'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          requiredValue += Tools.stripSpace(elem[ii].value);
        }
      }
    } else {
      if (elem.checked){
        requiredValue = Tools.stripSpace(elem.value);
      }
    }
  } else if (elem.type == 'checkbox'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        if (elem[ii].checked){
          requiredValue += Tools.stripSpace(elem[ii].value);
        }
      }
    } else {
      if (elem.checked){
        requiredValue = Tools.stripSpace(elem.value);
      }
    }
  } else {
    requiredValue = Tools.stripSpace(elem.value);
  }
  if (!requiredValue.length){
    return false;
  }
  return true;
}

Tools.resetForm = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  if (! elem.elements) {
    return false;
  }
  for (var i=0; i<elem.elements.length; i++){
    Tools.resetFormElement(elem.elements[i]);
  }
  return true;
}

Tools.resetFormElement = function(elem) {
  if (!arguments.length) {
    return false;
  }
  if (elem == undefined){
    return false;
  }
  if (elem.type == 'submit') {
    return false;
  }
  var requiredValue = '';
  if (elem.type == 'select-one'){
    elem.options[0].selected = 'selected';
  } else if (elem.type == 'select-multiple'){
    elem.options[0].selected = 'selected';
  } else if (elem.type == 'radio'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        elem[ii].checked = false;
      }
    } else {
      elem.checked = false;
    }
  } else if (elem.type == 'checkbox'){
    if (elem.length){
      for (var ii=0; ii<elem.length; ii++){
        elem[ii].checked = false;
      }
    } else {
      elem.checked = false;
    }
  } else {
    elem.value = '';
  }
  return true;
}

Tools.stripSpace = function(attr){
  var result = '';
  if (attr){
    attr = new String(attr);
    result = attr.replace(/^\s+/,'');
    result = result.replace(/\s+$/,'');
  }
  return result;
}

Tools.checkDataSize = function(elem, size) {
  if (!arguments.length) {
    return false;
  }
  var _type = elem.type.toLowerCase();
  var _value = Tools.stripSpace(elem.value);
  //if (_type == 'textarea'){
    if (_value.length > size){
      elem.value = _value.substring(0, size);
      alert('Sie dürfen maximal ' + size + ' Zeichen eingeben.');
    }
  //}
}

Tools.validateEmail = function(elem) {
  if (!arguments.length) {
    return false;
  }
  var _value = Tools.stripSpace(elem.value);
  var regEx = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)(\\@)([a-zA-Z0-9\\-\\.]+)(\\.)([a-zA-Z]{2,4})$');
  if (! _value.match(regEx)){
    alert('Bitte geben Sie eine gültige E-Mail-Adresse an!');
    elem.focus();
  }
}

Tools.validateURL = function(elem) {
  if (!arguments.length) {
    return false;
  }
  var _value = Tools.stripSpace(elem.value);
  var regEx = new RegExp('^(http:\/\/|https:\/\/|mailto:\/\/|ftp:\/\/|\/)');
  if (! _value.match(regEx)){
    alert('Bitte geben Sie eine gültige URL an!\nEine gültige URL mu? mit http://, https://, etc. anfangen');
    elem.focus();
  }
}

Tools.openLinkinOpener = function(url) {
  if (!arguments.length) {
    return false;
  }
  var root;
  if (window.opener){
    root = window.opener;
  }
  if (parent.opener){
    root = parent.opener;
  }
  if (parent.top.opener){
    root = parent.top.opener;
  }
  if (! root){
    return true;
  }
  root.location = url;
  root.focus();
  return false;
}

Tools.submitQuichsearch = function(htmlElement) {
  if (!arguments.length) {
    return false;
  }
  var tagName = htmlElement['tagName'];
  tagName = tagName.toLowerCase();
  if (tagName == 'form'){
    var regExp = new RegExp('Stichwort|Stichwort eingeben|Suchwort|Suchwort eingeben|Suchbegriff|Suchbegriff eingeben');
    for (var i=0; i<htmlElement.elements.length; i++){
      var _value = Tools.stripSpace(htmlElement.elements[i].value);
      if(! _value.match(regExp)){
        continue;
      }
      htmlElement.elements[i].value = '';
    }
    return true;
  }
}

Tools.formatCashFloat = function(n){
  cash_float = parseFloat(new String(n).replace(/\,/,'.'));
  cash_float = parseFloat(cash_float * 100);
  cash_float = parseFloat(Math.round(cash_float) / 100);
  cash_float = new String(cash_float);
  if (!cash_float.match(/\./)){
    cash_float = cash_float + '.00';
  }
  if (cash_float.split(/\./)[1].length == 1){
    cash_float = cash_float + '0';
  }
  cash_float = cash_float.replace(/\./,',');
  return cash_float;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.addEvent = function(oneEvent, obj, handler, bol, ieWindow){
  if (arguments.length < 3) {
    focus();
    throw new Error('Tools.addEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.addEventListener){
    // Other
    obj.addEventListener(oneEvent, handler, bol);
  } else if(obj.attachEvent){
    // IE
    var win = window;
    if (ieWindow) {
      win = ieWindow;
    }
    obj['e' + oneEvent + handler] = handler;
    obj[oneEvent + handler] = function() { obj['e' + oneEvent + handler] ( win.event ); win.event.cancelBubble = true;};
    obj.attachEvent('on' + oneEvent, obj[oneEvent + handler]);
  }
  return true;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.removeEvent = function(oneEvent, obj, handler, bol){
  if (arguments.length < 3) {
    focus();
    throw new Error('Tools.removeEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.removeEventListener){
    // Other
    obj.removeEventListener(oneEvent, handler, bol);
  } else if(obj.detachEvent){
    // IE
    obj.detachEvent( "on"+ oneEvent, obj[oneEvent + handler] );
    obj[oneEvent + handler] = undefined;
    obj["e" + oneEvent + handler] = undefined;
  }
  return true;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.eventStopPropagation = function(event){
  if (arguments.length!=1){
    focus();
    throw new Error("Tools:eventStopPropagation: Falsche Anzahl von Argumenten!");
  }
  if (event.stopPropagation){
    // Other
    event.stopPropagation();
  } else {
    // IE
    event.cancelBubble = true;
  }
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.eventPreventDefault = function(event){
  if (arguments.length!=1){
    focus();
    throw new Error("Tools:eventPreventDefault: Falsche Anzahl von Argumenten!");
  }
  if (event.preventDefault){
    // Other
    event.preventDefault();
  } else {
    // IE
    event.returnValue = false;
  }
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.jumpForwardInput = function(e, elem){
 if (arguments.length != 2) {
   focus();
   throw new Error('Tools.jumpForwardInput: Falsche Anzahl von Argumenten!');
 }
 if (! elem){
   return;
 }
 Tools.eventPreventDefault(e);
 if (! window.addEventListener)  {
  // IE
  e = window.event;
  key = e.keyCode;
 } else {
   // OTHER
   key = e.which;
 }
 if (key != 8 && key < 48 || key > 122){
   return;
 }
 var idPostfix = elem.id.toString().replace(/_token/,'');
 if (key == 8){
   var nextIdx = '_token' + parseFloat(parseFloat(idPostfix) - 1);
   var nextElem = document.getElementById(nextIdx);
   if (elem.value){
     elem.value = '';
     return;
   }
 } else {
   var nextIdx = '_token' + parseFloat(parseFloat(idPostfix) + 1);
   var nextElem = document.getElementById(nextIdx);
   elem.value = String.fromCharCode(key);
 }
 if (nextElem){
   nextElem.focus();
   return;
 }
 var submitBut = document.getElementById('submit-form');
 if (submitBut && parseFloat(idPostfix) >= 4){
   submitBut.focus();
 }
 return;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.reloadCounter = 0;

Tools.reloadCodeField = function(url){
  if (arguments.length != 1) {
    return;
  }
  Ajax.cursorWait();
  Tools.reloadCounter++;
  url += '&__RC=' + Tools.reloadCounter;
  //alert('aufruf: ' + url);
  var img = new Image();
  img.className = "form-code-validate-secure";
  img.onload = function () {Tools.drawCodeField(this);}
  img.src = url;
  return false;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.drawCodeField = function(img){
  if (arguments.length != 1) {
    return;
  }
  //alert('nach bild-onload: ' + img.src);
  img.onload = '';
  var elem = document.getElementById('_sicherheitscode_');
  elem.innerHTML = '';
  elem.appendChild(img);
  /*
  var str = '<img src="'+ img.src +'" border="0" class="form-code-validate-secure" /><br />';
  elem.innerHTML = str;
  */
  Ajax.cursorFinished();
  return false;
}

Tools.setBank = function(elem, url){
  if (arguments.length != 2) {
    return;
  }
  var reqUrl = url + elem.value;
  Ajax.cursorWait();
  var myAjax = Ajax.createInstance();
  myAjax.setAsynchron(false);
  myAjax.setMethod('GET');
  myAjax.setURL(reqUrl);
  myAjax.open();
  myAjax.sendNull();
  var setBank = Tools._setBank(myAjax, elem);
  Ajax.cursorFinished();
}

Tools._setBank = function(ajax, elem){
  if (arguments.length != 2) {
    return;
  }
  if (ajax.getReadyState() != 4){
    return Ajax.cursorWait();
  }
  if (ajax.getReadyState() == 4){
    Ajax.cursorFinished();
    var xml = ajax.getReadableXMLNode();
    //alert(ajax.getResponseText());
    //alert(xml);
    if (! xml){
      alert('Es ist ein Fehler aufgetreten!');
      return;
    }
    var bankAnzeigeElem = document.getElementById('_Kreditinstitut_');
    var bankCGIElem = document.getElementById('konto_bank');
    var code = ajax.getSingleNodeValue('code');
    if (code == 'fail'){
      alert('Die Bankleitzahl konnte nicht ermittelt werden.\nBitte überprüfen Sie Ihre Angaben');
      bankAnzeigeElem.innerHTML = 'wird automatisch eingefügt';
      bankCGIElem.value = '';
      elem.value = '';
      elem.focus();
      return false;
    }
    var bankName = ajax.getSingleNodeValue('bank');
    bankCGIElem.value = bankName;
    if (bankAnzeigeElem) {
      bankAnzeigeElem.innerHTML = bankName;
    }
  }
  return true;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementDocumentPositionTop = function(elem){
  var pos = 0;
  if (elem.nodeName.toLowerCase() == 'area'){
    elem = elem.parentNode;
  }
  if (elem.nodeName.toLowerCase() == 'map'){
    elem = elem.parentNode;
  }
  var nextElem = elem;
  pos += nextElem.offsetTop;
  while (nextElem.offsetParent) {
    pos += nextElem.offsetParent.offsetTop;
    nextElem = nextElem.offsetParent;
  }
  return parseFloat(pos);
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementDocumentPositionLeft = function(elem){
  var pos = 0;
  if (elem.nodeName.toLowerCase() == 'area'){
    elem = elem.parentNode;
  }
  if (elem.nodeName.toLowerCase() == 'map'){
    elem = elem.parentNode;
  }
  var nextElem = elem;
  pos += nextElem.offsetLeft;
  while (nextElem.offsetParent) {
    pos += nextElem.offsetParent.offsetLeft;
    nextElem = nextElem.offsetParent;
  }
  return parseFloat(pos);
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementDocumentPositionRight = function(elem){
  var pos = 0;
  pos += Tools.getElementDocumentPositionLeft(elem) + elem.offsetWidth;
  return parseFloat(pos);
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementDocumentPositionBottom = function(elem){
  var pos = 0;
  pos += Tools.getElementDocumentPositionTop(elem) + elem.offsetHeight;
  return parseFloat(pos);
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getScreenHeight = function() {
  var height = 0;
  if (document.documentElement != undefined && document.documentElement.clientHeight != undefined) {
     height = parseFloat(document.documentElement.clientHeight);
  } else {
     height = parseFloat(window.innerHeight);
  }
  return height;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getScreenWidth = function() {
  var width = 0;
  if (document.documentElement != undefined && document.documentElement.clientWidth != undefined) {
     width = parseFloat(document.documentElement.clientWidth);
  } else {
     width = parseFloat(window.innerWidth);
  }
  return width;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getScrollPositionTop = function() {
  var pos = 0;
  if (document.documentElement != undefined && document.documentElement.scrollTop != undefined) {
     pos = parseFloat(document.documentElement.scrollTop);
  } else {
     pos = parseFloat(window.pageYOffset);
  }
  return pos;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementWidth = function(elem) {
  width = 0;
  if (!elem){
    return width;
  }
   width = parseFloat(elem.offsetWidth);
   return width;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getElementHeight = function(elem) {
  height = 0;
  if (!elem){
    return height;
  }
   height = parseFloat(elem.offsetHeight);
   return height;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Tools.getCssUnit = function(n) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Tools.getCssUnit: Falsche Anzahl von Argumenten!');
  }
  var n = parseFloat(n);
  if (typeof n != "number") {
    return "";
  }
  if (n > 0) {
    n += 'px';
  } else {
    n += 'px';
  }
  return n;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
