/*global DoUserCheck, getValidators */

if (!String.trim) {
  String.prototype.trim = function () {
    var result = this;
    while (result.length > 0 && result.charAt(0) === ' ') {
      result = result.substr(1);
    }
    while (result.length > 0 && result.charAt(result.length - 1) === ' ') {
      result = result.substr(0, result.length - 1);
    }
    return result;
  };
}

function popup(popurl) {
  var winpop = window.open("", "settings", "");
  winpop.close();
  winpop = window.open(popurl, "settings", "width=400,height=400,scrollbars,left=80,top=50,resizeable=yes");
}

function getDim(el) {
  for (var lx = 0, ly = 0; el !== null; lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent) {}
  return {x: lx, y: ly};
}

function show(message, obj) {
  var h, dim;
  try {
    document.getElementById("helptext").innerHTML = message;
    h = document.getElementById("help");
    dim = getDim(obj);
    h.style.left = dim.x;
    h.style.top = dim.y + 20;
    h.style.visibility = "visible";
  } catch (e) {}
}

function hide() {
  try {
    document.getElementById("help").style.visibility = "hidden";
  } catch (e) {}
}

function is_numeric(val) {
  return !isNaN(val) && val.length;
}

//-- validation of input ------------------------------------------------------------------
function checkValid(f) {
  var val = null, i, j, elem, value, valid, ex, elem2;

  // try to get validators, if not possible: do user checks, only
  try {
    val = getValidators();
  } catch (ex) {
    return DoUserCheck(1, f);
  }

  // evaluate validators
  try {
    for (i = 0; i < val.length; ++i) {
      // extra check for txm-fields with id
      if (f[val[i].key] == null) {
        elem = document.getElementById(val[i].key);
        if (elem == null) {
          alert(val[i].key);
        } else {
          valid = false;
          elem = document.getElementById(val[i].key + '_de');
          if (elem != null) {
            valid = val[i].validate(elem.value);
            if (!valid && elem.style.display == 'inline') {
              elem2 = elem;
            }
          }
          if (!valid) {
            elem = document.getElementById(val[i].key + '_en');
            if (elem != null) {
              valid = val[i].validate(elem.value);
              if (!valid && elem.style.display == 'inline') {
                elem2 = elem;
              }
            }
          }
          if (!valid) {
            alert(val[i].error);
            if (elem2 != null) {
              elem2.focus();
            }
            return false;
          }
        }
      } else {
        // multi validators
        if (f[val[i].key].length != null && f[val[i].key].type == null) {
          // alert('multi ???:' + val[i].key);
          valid = true;
          for (j = 0; j < f[val[i].key].length && valid; ++j) {
            elem = f[val[i].key][j];
            valid &= val[i].validate(elem.value);
          }
          if (!valid) {
            alert(val[i].error);
            elem.focus();
            return false;
          }
        // single validators
        } else {
          value = f[val[i].key].value;
          if (f[val[i].key].type == 'checkbox') {
            if (!f[val[i].key].checked) {
              value = '';
            }
          }
          valid = val[i].validate(value);
          if (valid) {
            valid = DoUserCheck(2, f[val[i].key]);
          }
          if (!valid) {
            alert(val[i].error);
            f[val[i].key].focus();
            return false;
          }
        }
      }
    }
    return DoUserCheck(1, f);
  } catch (ex) {
    alert(ex);
    return false;
  }
}

function DoUserCheck(mode, elem) {
  try {
    return UserCheck(mode, elem);
  } catch (e) {
//    alert(e);
  }
  return true;
}

/**
 * Create a validator.
 *
 * @param key The key to connect with right datafield.
 * @param error The message to be displayed on error!
 * @param regex The regular expression to check with.
 * @param required Is any input required or not?
 * @param minLength The minimum input length.
 * @return bool True, if input is ok, otherwise false.
 */
function Validator (key, error, regex, required, minLength) {
  /**
   * The regular expression.
   * @var string
   */
  this.regex = regex;
  /**
   * The error message.
   * @var string
   */
  this.error = error;
  /**
   * The key to connect with data field.
   * @var string
   */
  this.key = key;
  /**
   * Is any input required or not?
   * @var bool
   */
  this.required = required;
  /**
   * The minimum input length.
   * @var integer
   */
  this.minLength = minLength;
  /**
   * An additional check function.
   * The function has two parameter:<dl>
   * <dd>string value</dd><dt>The value to check.</dt>
   * <dd>bool valid</dd><dt>The current validation state.</dt>
   * </dl>
   * @var function
   */
  this.additionalCheck = null;

  /**
   * Do validation of input.
   *
   * @param string value The input to check.
   * @return bool True, if input is ok, otherwise false.
   */
  this.validate = function (value) {
    var valid = false;

    // check length, regex, required
    if (value.length >= this.minLength) {
      valid = this.regex.test(value) || (!this.required && value == "");
    }

    // do some additional checks if set
    if (this.additionalCheck != null) {
      valid = this.additionalCheck(value, valid);
    }

    // return result
    return valid;
  }


  this.setAdditionalCheckings = function (jsBody) {
    this.additionalCheck = new Function('value', 'valid', jsBody);
    return this;
  }
}

/**
 * Check the date of an input field.
 *
 * @param string id The id of the input field.
 * @return bool True, if input is ok, otherwise false.
 */
function hasValidDate(id) {
  var elem = document.getElementById(id);
  return elem == null ? false : isValidDate(elem.value);
}

/**
 * Check a date string.
 *
 * @param string val The value to check.
 * @return bool True, if value is ok, otherwise false.
 */
function isValidDate(val) {
  var ok = val.match(/^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$/);
  if (ok) {
    // numbers like 05 are interpreted as octal numbers
    //   09 is invalid, day is 0
    //   date is last day of prev month
    var d = parseInt('1' + val.substring(0,2)) - 100,
        m = parseInt('1' + val.substring(3,5)) - 101,
        y = parseInt(val.substring(6,10)),
        dat = new Date(y, m, d);
//      alert(dat.getFullYear() + '/' + y + '\n' + dat.getMonth() + '/' + m + '\n' + dat.getDate() + '/' + d);
    ok = y == dat.getFullYear() && m == dat.getMonth() && d == dat.getDate();
  }
  return ok;
}

//-- language support -----------------------------------------------------------
function txmSetLanguage(select) {
  var sels = document.getElementsByName('txm_select_language[]'), i, index = -1;
  if (sels != null) {
    for (i = 0; i < sels.length; ++i)
      if (sels[i] == select) {
        index = i;
        break;
      }
  }
  if (index >= 0) {
    var cnt = select.options.length;
    for (i = 0; i < cnt; ++i) {
      var name = 'tmi_eingabe_' + select.options[i].text + '[]',
          inps = document.getElementsByName(name);
      if (inps != null && inps.length >= index) {
        inps[index].style.display = (select.options[i].text == select.options[select.selectedIndex].text ? 'inline' : 'none');
        if (select.options[i].text == select.value)
          inps[index].focus();
      }
    }
  }
}

function txmSetLanguageX(select, index) {
  var cnt = select.options.length;
  for (var i = 0; i < cnt; ++i) {
    var id = select.options[i].text + '_' + index,
        elem = document.getElementById(id);
    elem.style.display = (select.options[i].text == select.options[select.selectedIndex].text ? 'inline' : 'none');
  }
}

/**
 * Select a language for a txm-field.
 *
 * @param index The index of the txm-field.
 * @param newLang The language to show.
 * @param allLangs All language codes.
 */
function txmSetLanguageSel(index, newLang, allLangs) {
  var langs = allLangs.split('|'), id, elem;
  for (var i = 0, i2 = langs.length; i < i2; ++i) {
    id = langs[i] + '_' + index;
    elem = document.getElementById(id);
    elem.style.display = (langs[i] == newLang ? 'inline' : 'none');
  }
}

//-- get bounds of an element -------------------------------------------------
function getPos(elem, stopper) {
  var x = 0, y = 0, w = 0, h = 0;
  if (elem != null) {
    if (elem.offsetHeight) {
      h = elem.offsetHeight;
    }
    if (elem.offsetWidth) {
      w = elem.offsetWidth;
    }
  }
  while (elem != null) {
    if (elem.offsetLeft) {
      x += elem.offsetLeft;
    }
    if (elem.scrollLeft) {
      x -= elem.scrollLeft;
    }
    if (elem.offsetTop) {
      y += elem.offsetTop;
    }
    if (elem.scrollTop) {
      y += elem.scrollTop;
    }
    if (elem.offsetParent) {
      elem = elem.offsetParent;
    } else {
      elem = null;
    }
    if (stopper != null && elem == stopper) {
      elem = null;
    }
  }
  return {'x': x, 'y': y, 'width': w, 'height': h};
}

//-- help: field infos --------------------------------------------------------
var fieldInfos = new Object();
function addFieldInfo(id, message) {
  fieldInfos[id] = message;
}

function initFieldInfo() {
  for (var id in fieldInfos) {
    var fld = document.getElementById(id);
    if (fld != null) {
      fld.onfocus = handleFieldInfoShow;
      fld.onblur = handleFieldInfoHide;
    }
  }
}
function handleFieldInfoShow(ev) {
  if (!ev) var ev = window.event;
  var field = ev.target ? ev.target : ev.srcElement,
      info = document.getElementById('field_info');
  if (field != null && info != null) {
    var pos = getPos(field);
    info.innerHTML = fieldInfos[field.id];
    info.style.left = pos.x;
    info.style.top = pos.y + (pos.height > 0 ? pos.height + 2 : 20);
    info.style.display = 'block';
  }
}
function handleFieldInfoHide(ev) {
  var info = document.getElementById("field_info");
  if (info != null)
    info.style.display = 'none';
}

//-- grid --------------------------------------------------------------------------
// on input field change handler
function jst_change(table, row, column) {
  var col = 0, id, elem, check, check2;

  // check input
  id = 'jst_' + table + '_' + row + '_' + column;
  if (null != (elem = document.getElementById(id))) {
    switch (elem.className) {
      case 'jstd_B':
        if (isNaN(check = _jst_get(elem.value)))
          check = 0;
        check2 = _jst_fmt(check);
        elem.value = check2;
        break;
      case 'jstd_Z':
        if (isNaN(check = parseInt(elem.value)))
          check = 0;
        elem.value = check;
        break;
    }
  }

  // check for formulas and sums
  do {
    id = 'jst_' + table + '_' + row + '_' + (++col);
    if (null != (elem = document.getElementById(id))) {
      var formula = elem.getAttribute('formula');
      if (formula != null) {
        var f = formula.split(' '), newFormula = '', work, i;
        for (i = 0; i < f.length; ++i) {
          work = _jst_getValue(table, row, f[i]);
          if (isNaN(work))
            newFormula += f[i] + ' ';
          else
            newFormula += work + ' ';
        }
        elem.value = _jst_fmt(eval(newFormula));
      }
      if (elem.className == 'jstd_S') {
        var colS = 0, idS, elemS, sum = 0;
        do {
          idS = 'jst_' + table + '_' + row + '_' + (++colS);
          if (null != (elemS = document.getElementById(idS))) {
            if (elemS.className == 'jstd_B')
              sum += _jst_get(elemS.value);
          }
        } while (elemS != null);
        elem.value = _jst_fmt(sum);
      }
    }
  } while (elem != null);
}

// get value of a name from row
function _jst_getValue(table, row, name) {
  var col = 0, id, elem;
  do {
    id = 'jst_' + table + '_' + (++col);
    if (null != (elem = document.getElementById(id))) {
      var attr = elem.getAttribute('column_name');
      if (attr == name) {
        id = 'jst_' + table + '_' + row + '_' + col;
        if (null != (elem = document.getElementById(id))) {
          return _jst_get(elem.value);
        }
      }
    }
  } while (elem != null);
  return NaN;
}

// get numeric value of an amount
function _jst_get(val) {
  return parseFloat(val.replace(',', '.'));
}

// format numeric value as an amount
function _jst_fmt(val) {
  var v = String(Math.round(val * 100)), l;
  while (v.length < 3) {
    v = '0' + v;
  }
  l = v.length;
  return v.substr(0, l - 2) + ',' + v.substr(l - 2, 2);
}

//-- tabcontrol -----------------------------------------------------
// select right tab
function tcSelect(name) {
  var elem, i, lastSel = tcSelected, imageDir = '',
      showRow = navigator.appName != 'Microsoft Internet Explorer' ? 'table-row' : 'block';

  // reselect is not neccessary
  if (tcSelected == name)
    return;

  // get dir of images
  if ((elem = document.getElementById('tch_' + name)) != null)
    imageDir = elem.getAttribute('imagedir');

  // hide last selection, set tab
  if (tcSelected != null) {
    if ((elem = document.getElementById('tcp_' + tcSelected)) != null)
      elem.style.display = 'none';
    if ((elem = document.getElementById('tc_' + tcSelected)) != null)
      elem.className = 'tc_tab';
    if ((elem = document.getElementById('tcb_' + tcSelected)) != null)
      elem.className = 'tc_tab_button';
    tcSelected = null;
  }

  // show new selection, set tab
  tcSelected = name;
  if ((elem = document.getElementById('tcp_' + name)) != null)
    elem.style.display = showRow;
  if ((elem = document.getElementById('tc_' + name)) != null)
    elem.className = 'tc_tab_selected';
  if ((elem = document.getElementById('tcb_' + name)) != null)
    elem.className = 'tc_tab_button_selected';

  // set helper columns
  if (lastSel != null)
    _tcSelect(lastSel, imageDir);
  _tcSelect(name, imageDir);
}

// do selection of helper columns
function _tcSelect(name, imageDir) {
  var elem = document.getElementById('tc_' + name), selected,
      prev, next, elem1, imgL, imgR;

  if (elem != null) {
    selected = elem.className == 'tc_tab_selected';
    imgL = 'l' + (selected ? '1' : '0');
    imgR = 'r' + (selected ? '1' : '0');

    prev = elem.getAttribute('prevColumn');
    if (prev != null)
      if ((elem1 = document.getElementById('tc_' + prev)) != null)
        imgL = 'r' + (elem1.className == 'tc_tab_selected' ? '1' : '0') + imgL;
    if ((elem1 = document.getElementById('tci_' + name)) != null)
      elem1.src = imageDir + imgL + '.gif';

    next = elem.getAttribute('nextColumn');
    if (next != null) {
      if ((elem1 = document.getElementById('tc_' + next)) != null)
        imgR += 'l' + (elem1.className == 'tc_tab_selected' ? '1' : '0');
      if ((elem1 = document.getElementById('tci_' + next)) != null)
        elem1.src = imageDir + imgR + '.gif';
    }
  }
}

//-- change-request -------------------------------------------------
function crOk(nameSet, value, idDel, aen_id, idDiv) {
  var elemSets = document.getElementsByName(nameSet);
  if (elemSets != null && elemSets.length == 1) {
    elemSets[0].value = value;
    crCancel(idDel, aen_id, idDiv);
  }
}
function crOkX(nameSet, value, display, idDel, aen_id, idDiv) {
  var setHidden = document.getElementById(nameSet + '_name'),
      setValue = document.getElementById(nameSet + '_id'),
      setInfo = document.getElementById(nameSet + '_div'),
      set = document.getElementById(nameSet);

  // set search fields
  if (setHidden != null && setValue != null && setInfo != null) {
    setValue.value = value;
    setHidden.value = display;
    setInfo.innerHTML = display;
    crCancel(idDel, aen_id, idDiv);
  // set search plz_ort
  } else if (set != null) {
    set.value = value;
    crCancel(idDel, aen_id, idDiv);
  }
}

function crCancel(idDel, aen_id, idDiv) {
  var aenDel = document.getElementById(idDel);
  if (aenDel != null) {
    aenDel.value = aen_id;
    _crHide(idDiv);
  }
}
function _crHide(id) {
  var elem = document.getElementById(id);
  if (elem != null) {
    elem.style.display = 'none';
  }
}
function alert2(text) {
  alert(unescape(text));
}

//-- mouseover images --------------------------------------
var imageInfo = {};

function prepareImage(id, curImage, overImage) {
  var img = document.getElementById(id);
  if (img != null) {
    img.onmouseover = imageEventHandler;
    img.onmouseout = imageEventHandler;
    imageInfo[id] = {'mouseover': overImage, 'mouseout': curImage};
  }
}
function imageEventHandler(event) {
  if (!event)  var event = window.event;
  if (event != null) {
    var elem = event.target ? event.target : event.srcElement ? event.srcElement : null;
    if (elem != null && elem.id && imageInfo[elem.id] && imageInfo[elem.id][event.type])
      elem.src = imageInfo[elem.id][event.type];
  }
}

// -- handle on change after javascript events ----------------------------------------------------
/**
 * handle on change event for javascript changes.
 *
 * @param node elem The element to handle.
 * @param string value The new value.
 */
function handleOnChange(elem, value) {
  var handler = elem.getAttribute('onchange');
  if (handler != null && handler != '') {
    opener == null ? eval(handler) : opener.eval(handler);
  }
}

// -- calendar -------------------------------------------------------------------------------
function openCalendar(elid) {
  var cal = new calendar1(document.getElementById(elid));
  cal.year_scroll = true;
  cal.time_comp = false;
  cal.popup();
}

function openCalendarTS(elid) {
  var cal = new calendar1(document.getElementById(elid));
  cal.year_scroll = true;
  cal.time_comp = true;
  cal.show_seconds = false;
  cal.popup();
}
function openCalendarTS2(elid) {
  var cal = new calendar1(document.getElementById(elid));
  cal.year_scroll = true;
  cal.time_comp = true;
  cal.popup();
}
//-- calendar -------------------------------------------------------------------------------
