
// den undefinierten Wert deklarieren
var undefined;

// ============================================================
// Klasse Util
// ============================================================
//
// Methoden:
// ---------
//   + Util.getDocumentFragment(html:string) : DocumentFragment
//

// ------------------------------------------------------------
// Konstruktor
// ------------------------------------------------------------

function Util() {
}

// ------------------------------------------------------------
// Öffentliche Klassenmethoden
// ------------------------------------------------------------

// ------------------------
// Util.getDocumentFragment
// ------------------------
//
// Beschreibung:
// -------------
//   Wandelt einen HTML-String in ein DocumentFragment um.
//
// Beispiel:
// ---------
//   var f = Util.getDocumentFragment(html);
//   var f = Util.getDocumentFragment(html, document);
//
Util.getDocumentFragment = function(html, doc) {
  if (!doc) {
    doc = document;
  }
  if (html.substr(0,6) == "<tbody" || html.substr(0,3) == "<tr") {
    html = "<table>" + html + "</table>";
    var elem = doc.createElement("div");
    elem.innerHTML = html;
    var f = doc.createDocumentFragment();
    if (elem.childNodes.length>1) {
      throw new Error("Fehler mit <tgroup>");
    }
    elem = elem.firstChild;
    while (elem.firstChild) {
      f.appendChild(elem.firstChild);
    }
    return f;
  }
  var elem = doc.createElement("div");
  elem.innerHTML = html;
  var f = doc.createDocumentFragment();
  while (elem.firstChild) {
    f.appendChild(elem.firstChild);
  }
  return f;
}

// ------------------------
// Util.replaceDocumentNode
// ------------------------
//
// Beschreibung:
// -------------
//   Ersetzt eine Node durch eine neue.
//   Übergeben wird dazu ein HTML-String, der genau ein Wurzel-Element haben muss.
//
// Beispiel:
// ---------
//   var f = Util.replaceDocumentNode(id, html);
//   var f = Util.replaceDocumentNode(id, html, document);
//
Util.replaceDocumentNode = function(id, html, doc) {
  if (!doc) {
    doc = document;
  }
  var f = Util.getDocumentFragment(html, doc);
  if (f.childNodes.length>1) {
    throw new Error("HTML-String muß genau ein Wurzel-Element haben:\n" + html);
  }
  var target = doc.getElementById(id);
  if (!target) {
    throw new Error("Element-ID not found in document: " + id + '\nDocument: ' + doc.URL);
  }
  target.parentNode.replaceChild(f, target);
}

// --------------
// Util.getIndent
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getIndent(level);
//
Util.getIndent = function(level) {
  if (! level) {
    return "";
  }
  indent = "  ";
  result = "";
  for (var i=0; i<level; i++) {
    result += indent;
  }
  return result;
}

// --------------
// Util.getSalutationTimeOfDay
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getSalutationTimeOfDay();
//
        
Util.getSalutationTimeOfDay = function(){
  var salutation = '';
  var now = new Date();
  if (now.getHours() >= 5 && now.getHours() < 12){
    salutation = 'Guten Morgen';
  } 
  else if (now.getHours() >= 12 && now.getHours() < 18){
    salutation = 'Guten Tag';
  } 
  else if (now.getHours() >= 18 && now.getHours() < 23){
    salutation = 'Guten Abend';
  }
  else if (now.getHours() >= 0 && now.getHours() < 5){
    salutation = 'Gute Nacht';
  }
  return salutation;
}

// --------------
// Util.checkDay
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkDay(day);
//
        
Util.checkDay = function(day, month, year){
  day = parseFloat(Util.stripSpace(day));
  month = parseFloat(Util.stripSpace(month));
  year = parseFloat(Util.stripSpace(year));
  var months = new Array;
  months[1] = 31;
  months[2] = Util.getDaysFebruar(year);
  months[3] = 31;
  months[4] = 30;
  months[5] = 31;
  months[6] = 30;
  months[7] = 31;
  months[8] = 31;
  months[9] = 30;
  months[10] = 31;
  months[11] = 30;
  months[12] = 31;
  if (day && month){
    if (day >= 1 && day <= months[month]){
      return true;
    }
  }
  return false;
}

// --------------
// Util.getDaysFebruar
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getDaysFebruar(day);
//

Util.getDaysFebruar = function(year){
  year = parseFloat(Util.stripSpace(year));
  if (((year % 4 == 0) && (year % 100 != 0))||(year % 400 == 0)){
    return 29;
  }
  else{
    return 28;
  }
}  

// --------------
// Util.checkMonth
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkMonth(month);
//
        
Util.checkMonth = function(month){
  month = parseFloat(Util.stripSpace(month));
  if (month){
    if (month >= 1 && month <= 12){
      return true;
    }
  }
  return false;
}

// --------------
// Util.formatDate
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.formatDate(date);
//
        
Util.formatDate = function(date){
  date = Util.stripSpace(date);
  var ausdruck = '';
  var check = '';
  var datum = '';
  
  // DD.MM.YYYY
  if (date.match(/^(\d\d?)\.(\d\d?)\.(\d\d\d\d)$/)) {
    ausdruck = /^(\d\d?)\.(\d\d?)\.(\d\d\d\d)$/;
    check = ausdruck.exec(date);
    for (var i=check.length-1; i>0; i--){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i > 1){
        datum += '' + check[i] + '-';
      } else {
        datum += '' + check[i];
      }
    }
    if (Util.checkMonth(check[2]) && Util.checkDay(check[1],check[2],check[3])){
      return datum;
    } else {
      return false;
    }
  }
  // MM/DD/YYYY
  else if (date.match(/^(\d\d?)\/(\d\d?)\/(\d\d\d\d)$/)) {
    ausdruck = /^(\d\d?)\/(\d\d?)\/(\d\d\d\d)$/;
    check = ausdruck.exec(date);
    for (var i=check.length-1; i>0; i--){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i > 1){
        datum += '' + check[i] + '-';
      } else {
        datum += '' + check[i];
      }
    }
    if (Util.checkMonth(check[1]) && Util.checkDay(check[2],check[1],check[3])){
      return datum;
    } else {
      return false;
    }
  }
  // YYYYMMDD
  else if (date.match(/^(\d\d\d\d)(\d\d)(\d\d)$/)) {
    ausdruck = /^(\d\d\d\d)(\d\d)(\d\d)$/;
    check = ausdruck.exec(date);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        datum += '' + check[i] + '-';
      } else {
        datum += '' + check[i];
      }
    }
    if (Util.checkMonth(check[2]) && Util.checkDay(check[3],check[2],check[1])){
      return datum;
    } else {
      return false;
    }
  } 
  // YYYY-MM-DD
  else if (date.match(/^(\d\d\d\d)-(\d\d?)-(\d\d?)$/)) {
    ausdruck = /^(\d\d\d\d)-(\d\d?)-(\d\d?)$/;
    check = ausdruck.exec(date);
    if (Util.checkMonth(check[2]) && Util.checkDay(check[3],check[2],check[1])){
      return date;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

// --------------
// Util.checkHour
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkHour(hour);
//
        
Util.checkHour = function(hour){
  hour = parseFloat(Util.stripSpace(hour));
  if (hour >= 0 && hour <= 24){
    return true;
  }
  return false;
}

// --------------
// Util.checkMinute
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkMinute(minute);
//
        
Util.checkMinute = function(minute){
  minute = parseFloat(Util.stripSpace(minute));
  if (minute >= 0 && minute <= 59){
    return true;
  }
  return false;
}

// --------------
// Util.checkSecond
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkSecond(minute);
//
        
Util.checkSecond = function(sec){
  sec = parseFloat(Util.stripSpace(sec));
  if (sec >= 0 && sec <= 59){
    return true;
  }
  return false;
}

// --------------
// Util.formatTime
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.formatTime(time);
//

/*
INTERN    HHMMSS      /^(\d\d)(\d\d)$/
EUR, ISO  HH.MM.SS    /^(\d\d?)\.(\d\d?)$/
JIS       HH:MM:SS    /^(\d\d?):(\d\d?)$/
*/
       
Util.formatTime = function(time){
  time = Util.stripSpace(time);
  var ausdruck = '';
  var check = '';
  var zeit = '';  
  // HH.MM
  if (time.match(/^(\d\d?)\.(\d\d)$/)) {
    ausdruck = /^(\d\d?)\.(\d\d)$/;
    check = ausdruck.exec(time);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        zeit += '' + check[i] + ':';
      } else {
        zeit += '' + check[i]+':00';
      }
    }
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2])){
      return zeit;
    } else {
      return false;
    }
  }
  // HH.MM.SS
  else if (time.match(/^(\d\d?)\.(\d\d)\.(\d\d)$/)) {
    ausdruck = /^(\d\d?)\.(\d\d)\.(\d\d)$/;
    check = ausdruck.exec(time);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        zeit += '' + check[i] + ':';
      } else {
        zeit += '' + check[i];
      }
    }
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2]) && Util.checkSecond(check[3])){
      return zeit;
    } else {
      return false;
    }
  }
  // HHMM
  else if (time.match(/^(\d\d)(\d\d)$/)) {
    ausdruck = /^(\d\d)(\d\d)$/;
    check = ausdruck.exec(time);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        zeit += '' + check[i] + ':';
      } else {
        zeit += '' + check[i]+':00';
      }
    }
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2])){
      return zeit;
    } else {
      return false;
    }
  }
  // HHMMSS
  else if (time.match(/^(\d\d?)(\d\d)(\d\d)$/)) {
    ausdruck = /^(\d\d?)(\d\d)(\d\d)$/;
    check = ausdruck.exec(time);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        zeit += '' + check[i] + ':';
      } else {
        zeit += '' + check[i];
      }
    }
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2]) && Util.checkSecond(check[3])){
      return zeit;
    } else {
      return false;
    }
  }
  // HH:MM
  else if (time.match(/^(\d\d?):(\d\d)$/)) {
    ausdruck = /^(\d\d?):(\d\d)$/;
    check = ausdruck.exec(time);
    for (var i=1; i<check.length; i++){
      if (new String(check[i]).length < 2){
        check[i] = '0' + check[i];
      }
      if (i < check.length-1){
        zeit += '' + check[i] + ':';
      } else {
        zeit += '' + check[i]+':00';
      }
    }
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2])){
      return zeit;
    } else {
      return false;
    }
  }
  // HH:MM:SS
  else if (time.match(/^(\d\d?):(\d\d):(\d\d)$/)) {
    ausdruck = /^(\d\d?):(\d\d):(\d\d)$/;
    check = ausdruck.exec(time);
    if (Util.checkHour(check[1]) && Util.checkMinute(check[2]) && Util.checkSecond(check[3])){
      return time;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

// --------------
// Util.getDateFromFormattedDate
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getDateFromFormattedDate(date);
//
       
Util.getDateFromFormattedDate = function(date){
  date = Util.stripSpace(date);
  var datum = '';
  if (date){
    var ausdruck = /(\d\d\d\d)-(\d\d)-(\d\d)/;
    var check = ausdruck.exec(date);
    if (check){
      for (var i=check.length-1; i>0; i--){
        if (new String(check[i]).length < 2){
          check[i] = '0' + check[i];
        }
        if (i > 1){
          datum += '' + check[i] + '.';
        } else {
          datum += '' + check[i];
        }
      }
    }
  }
  return datum;
}  

// --------------
// Util.getDateFromDateTime
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getDateFromDateTime(dateTime);
//
        
Util.getDateFromDateTime = function(dateTime){
  dateTime = Util.stripSpace(dateTime);
  var datum = '';
  if (dateTime){
    var datumArr = dateTime.split(' ');
    if (datumArr[0]){
      datum = Util.getDateFromFormattedDate(datumArr[0]);
    }
  }  
  return datum;
}

// --------------
// Util.getTimeFormDateTime
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getTimeFormDateTime(dateTime);
//
        
Util.getTimeFormDateTime = function(dateTime){
  dateTime = Util.stripSpace(dateTime);
  var time = '';
  if (dateTime){
    var datumArr = dateTime.split(' ');
    if (datumArr[1]){
      time = datumArr[1].substring(0,datumArr[1].length-3);
    }
  }  
  return time;
}

// --------------
// Util.getTimeFromFormattedTime
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.getTimeFromFormattedTime(dateTime);
//
        
Util.getTimeFromFormattedTime = function(time){
  var result = '';
  var mytime = Util.stripSpace(time);
  if (mytime){
    if (mytime.match(/^(\d\d\d\d)-(\d\d?)-(\d\d?) (\d\d?):(\d\d):(\d\d)$/)){
      result = mytime.split(' ')[1].substring(0,mytime.split(' ')[1].length-3);
    } else if (mytime.match(/^(\d\d?):(\d\d):(\d\d)$/)){
      result = mytime.substring(0,mytime.length-3);
    }  
  }
  return result;
}

// --------------
// Util.stripSpace
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.stripSpace(number or string);
//
        
Util.stripSpace = function(attr){
  var result = '';
  if (attr){
    attr = new String(attr);
    result = attr.replace(/^\s+/,'');
    result = result.replace(/\s+$/,'');
  }
  return result;
}

// --------------
// Util.column2float
// --------------
//
// Beschreibung:
// -------------
// Wandelt eine Kolonnenzahl (euro/usa) in Float um.
// Wird keine Kolonnenzahl erkannt, wird der Ursprungswert zurueckgegeben.
// Bei wissenschaftlicher Notation (1,000.00e4) werden Kolonnen nicht erkannt.
// 1,00      -    1
// 1.00      -    1
// 1,000     - 1000 (Sonderfall bei genau 3 Stellen hinter dem Komma)
// 1.000     - 1000 (Sonderfall bei genau 3 Stellen hinter dem Punkt)
// 1,0000    -    1
// 1.0000    -    1
// 1.000,0+  - 1000
// 1,000.0+  - 1000
//
// Beispiel:
// ---------
// var f = Util.column2float(number);
//
 

Util.column2float = function(number){
  var result = '';
  if (number){
    result = Util.stripSpace(number);
    
    // Sonderfall euro: 1.000 soll 1000 sein
    if (result.match(/^[+-]?\d{1,3}\.\d\d\d$/)) {
      result =  result.replace(/\./g,'');
    }
    // Sonderfall usa: 1,000 soll 1000 sein
    else if (result.match(/^[+-]?\d{1,3},\d\d\d$/)){
      result =  result.replace(/\,/g,'');
    }
    // normale euro-Kommazahl (1,0)
    else if (result.match(/^[+-]?\d*,\d+$/)){
      result =  result.replace(/\,/g,'.');
    }
    // euro-Kolonne (1.000,00 oder 1.000.000)
    else if (result.match(/^[+-]?\d{1,3}(\.\d\d\d)+(,\d+)?$/)){
      result =  result.replace(/\./g,'');
      result =  result.replace(/\,/g,'.');
    }
    // usa-Kolonne (1,000.00 oder 1,000,000)
    else if (result.match(/^[+-]?\d{1,3}(,\d\d\d)+(\.\d+)?$/)){
      result =  result.replace(/\,/g,'');
    }
    
  }
  return result;
}

// --------------
// Util.float2column
// --------------
//
// Beschreibung:
// -------------
// Wandelt eine Decimal in eine Kolonnenzahl (euro) um.
// Erwartet Argument number als Float mit Punktnotation
// BSP: 1000.00 (EUR)
//
// Beispiel:
// ---------
// var f = Util.float2column(number);
//
 

Util.float2column = function(number){
  var result = '';
  if (number){
    number = Util.stripSpace(number);
    number = parseFloat(number.replace(/\,/,'.'));
    var numberStr = new String(number);
    var strEnd = numberStr.length;
    var numberAfterPoint = '';
    if (numberStr.match(/\./)){
      strEnd = numberStr.indexOf(numberStr.match(/\./));
      numberAfterPoint = numberStr.substring(numberStr.indexOf(numberStr.match(/\./))+1,numberStr.length);
    }
    var numberBeforePoint = numberStr.substring(0,strEnd);
    var tempNumber = '';
    var count = 0;
    for (var i=numberBeforePoint.length-1; i>=0; i--){
      if (count%3 == 0 && count>0){
        tempNumber = numberBeforePoint.charAt(i) +'.'+ tempNumber;
      } else {
        tempNumber = numberBeforePoint.charAt(i) + tempNumber;
      }  
      count++;
    } 
    if (numberAfterPoint.length){
      result = tempNumber + ',' + numberAfterPoint;
    } else {
      result = tempNumber;
    }  
  }
  return result;
}

// --------------
// Util.checkInteger
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkInteger(number);
//
        
Util.checkInteger = function(number){
  number = Util.stripSpace(number);
  if (number.match(/^[+-]?\d\d*$/)){
    return number;
  }
  return undefined;
}

// --------------
// Util.checkDecimal
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkDecimal(number);
//
        
Util.checkDecimal = function(number){
  number = Util.stripSpace(number);
  number = Util.column2float(number);
  // akzeptiert wird: [+/-]d und [+/-].d und [+/-]d.d
  if (number.match(/^[+-]?(?=\d|\.\d)(\d*)(?:\.(\d*))?$/)){
    return number;
  }
  return undefined;
}

// --------------
// Util.checkFloat
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.checkFloat(number);
//
        
Util.checkFloat = function(number){
  number = Util.stripSpace(number);
  number = Util.column2float(number);
  // akzeptiert wird: ±d und ±.d und ±d.d und  ±d.dE+/-d
  if (number.match(/^[+-]?(?=\d|\.\d)(\d*)(?:\.(\d*))?([Ee]([+-]?\d+))?$/)){
    return parseFloat(number);
  }
  return undefined;
}

// --------------
// Util.formatNumberDEKolonne
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.formatNumberDEKolonne(number);
//
        
Util.formatNumberDEKolonne = function(number){
  var result = '';
  if (number){
    number = Util.stripSpace(number);
    number = Util.column2float(number);
    result = Util.float2column(number);
  }
  return result;
}

// --------------
// Util.formatNumberDE
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.formatNumberDE(number);
//
        
Util.formatNumberDE = function(number){
  var result = '';
  if (number){
    number = Util.stripSpace(number);
    number = Util.column2float(number);
    result = parseFloat(number.replace(/\,/g,'.'));
    result = number.replace(/\./g,',');
  }
  return result;
}

// --------------
// Util.formatNumberSystem
// --------------
//
// Beschreibung:
// -------------
//   ...
//
// Beispiel:
// ---------
//   var f = Util.formatNumberSystem(number);
//
        
Util.formatNumberSystem = function(number){
  var result = '';
  if (number){
    number = Util.stripSpace(number);
    result = parseFloat(Util.column2float(number));
    result = result.toString();
  }
  return result;
}
