var UNDEF = -1;
var UNDEFINED = -1;

/**
* invokes the onsubmit method of the given form
*/
function validateBeforeSubmit(srcForm)
{
  if(srcForm.onsubmit())
  {
    srcForm.submit();
  }
}

/**
* displays a confirmation prompt. if the user says yes => gets the link
*/
function confirmBeforeGetLink(message, link)
{
  if(confirm(message)) {
    location.href = link;
  }
}

/**
* extracts the filename (without extension) of the given source inputfield
* and writes it into the given destination inputfield
*/
function extractName(srcField, destField)
{
  var fileName;
  var path = new String(srcField.value).replace(/\//, '\\');
  
  if(!checkFileExtension(srcField, 'pdf'))
  {
    alert('Bitte eine PDF-Datei auswählen.');
    destField.value = '';
    return;
  }
  else
  {
    fileName = path.substring(path.lastIndexOf('\\')+1, path.lastIndexOf('.'));
    destField.value = fileName;
  }
}

/**
* checks if extension of filename in the given inputfield
* matches the given extension. if false and message defined, alerts message
*/
function checkFileExtension(srcField, ext, message)
{
  var path = srcField.value;
  var idx = path.lastIndexOf('.');
  if(path.substring(idx+1, path.length).toUpperCase() != ext.toUpperCase())
  {
    if(message != undefined)
    {
      alert(message);
    }
    return false;
  }
  
  return true;
}

/**
* gets keycode from the last occurred key event
*/
function getKeyCode(e)
{
  if(window.event) {
    return window.event.keyCode;
  } else if(e) {
    return e.which;
  } else {
    return 0;
  }
}

function getButtonCode(e)
{
  if(window.event) {
    return window.event.button;
  } else if(e) {
    return e.which;
  } else {
    return 0;
  }
}

function getEventSrc(e)
{
  if(window.event)
  {
    return window.event.srcElement;
  } else if(e) {
    return e.target;
  } else {
    return 0;
  }
}

function getMousePosition(e, screen)
{
  var x,y
  
  if(window.event)
  {
    x = window.event.clientX;
    y = window.event.clientY;
    if(!screen) {
      x += document.body.scrollLeft;
      y += document.body.scrollTop;
    }
  } 
  else if(e)
  {
    if(screen) {
      x = e.screenX;
      y = e.screenY;
    } else {
      x = e.pageX;
      y = e.pageY;
    }
  }
  
  return [x,y];  
}

function parseInteger(a, b)
{
  return isNaN(b = parseInt(a))? 0 : b;
}

function getLayerPosition(objLayer)
{
  var x,y;
  
  if(document.layers)
  {
    x = objLayer.pageX || 0;
    y = objLayer.pageY || 0;
  }
  else
  {
    x = 0;
    y = 0;
    
    while(objLayer)
    {
      x += parseInteger(objLayer.offsetLeft);
      y += parseInteger(objLayer.offsetTop);
      
      objLayer = objLayer.offsetParent || null;
    }
  }
  
  return [x,y];
}

function getLayerDimensions(objLayer)
{
  var w,h;
  
  if(document.layers)
  {
    w = parseInt(objLayer.clip.width || 0);
    h = parseInt(objLayer.clip.height || 0);
  }
  else
  {
    if(objLayer.offsetWidth)
    {
      w = parseInt(objLayer.offsetWidth || 0);
      h = parseInt(objLayer.offsetHeight || 0);
    }
    else if(objLayer.style.pixelWidth)
    {
      w = parseInt(objLayer.style.pixelWidth || 0);
      h = parseInt(objLayer.style.pixelHeight || 0);
    }
    else if(objLayer.style.width)
    {
      w = parseInt(objLayer.style.width || 0);
      h = parseInt(objLayer.style.height || 0);
    }
  }
  
  return [w,h];
}

function setLayerPosition(objLayer, intX, intY) {
  if(document.layers) {
    if(intX != UNDEFINED) {
      objLayer.left = intX;
    }                  
    if(intY != UNDEFINED) {
      objLayer.top = intY;
    }                  
  } else {             
    if(intX != UNDEFINED) {
      objLayer.style.left = intX + "px";
    }                  
    if(intY != UNDEFINED) {
      objLayer.style.top = intY + "px";
    }                  
  }                    
}

function setTransparency(objLayer, alpha)
{
  if(document.all) {
    if(alpha == 100) {
      objLayer.style.filter = "";
    } else {
      objLayer.style.filter = "Alpha(opacity=" + alpha + ")";
    }
  } else {
    objLayer.style.MozOpacity = alpha/100;
  
  }
}

/**
 * ensures safe priting of a string in sql command
 */
function util_makeSQLSafe(input)
{
  input = input.replace(/'/g, "\\'");
  input = input.replace(/\r/g, "\\r");
  input = input.replace(/\n/g, "\\n");
  return input;
}

/**
 * ensures safe priting of a string in javascript
 */
function util_makeJavaScriptSafe(input)
{
  input = input.replace(/"/g, "\\\"");
  input = input.replace(/\r/g, "\\r");
  input = input.replace(/\n/g, "\\n");
  return input;
}

function util_cutStringAsNeeded(str, maxLength)
{
  if(str.length > maxLength)
  {
    return str.substr(0, maxLength-3) + "...";
  }
  
  return str;
}

function trim(s)
{
  var o = s.charCodeAt(0);
  while(o == 32 || 0 == 9 || o == 160)
  {
    s = s.substring(1,s.length);
    o = s.charCodeAt(0);
  }
   var o = s.substring(s.length-1);
  while(o == 32 || 0 == 9 || o == 160)
  {
    s = s.substring(0,s.length-1);
    o = s.charCodeAt(s.length-1);
  }
  return s;
}

function removeFromArray(aOrig, idx)
{
  var len = aOrig.length-1;
  for(var i = idx; i < len; i++)
  {
    aOrig[i] = aOrig[i+1];
  }
    
  aOrig.length--;
  return aOrig;
}

/**
* Selektiert in einer Selectbox den angegebenen Wert
*/
function util_setSelectionValue(elSel, sValue)
{
  for(var i = 0; i < elSel.options.length; i++)
  {
    if(elSel.options[i].value == sValue)
    {
      elSel.options[i].selected = true;
      return true;
    }
  }
  
  elSel.selectedIndex = -1;
  return false;
}

/**
* Generiert aus dem übergebenen Array einen HTML-String mit Optionen für eine SelectBox
*/
function util_getSelectOptionsFromArray(aOptions, sSelectedValue)
{
  var sHtml = '';
  for(var i = 0; i < aOptions.length; i++)
  {
    sHtml += '<OPTION value="' + util_makeJavaScriptSafe(aOptions[i][0]) +
      '" ' + (aOptions[i][0] == sSelectedValue ? 'selected' : '') + '>' + 
      util_makeJavaScriptSafe(aOptions[i][1]) + '</OPTION>';
  }
  return sHtml;
}

/**
* Gibt alle gewählten Werte einer Selectbox als kommagetrennte Liste zurück.
*/
function util_getSelectBoxMultipleValuesAsCSV(selEl)
{
  var csv = '';
  var cnt = 0;
  for(var i = 0; i < selEl.options.length; i++)
  {
    if(selEl.options[i].selected)
    {
      if(cnt > 0) {
        csv += ',';
      }
      csv += selEl.options[i].value;
      cnt++;
    }
  }
  return csv;
}

/**
* Konvertiert Dezimalzahlen in einen Hex-String (mit übergebener Länge (pad) wenn nötig)
*/
function util_decToHex(dec, pad)
{
  var hex = '';
  while(dec > 0)
  {
    dig = dec & 0xF;
    dig = dig < 10 ? dig+48 : dig+55;
    hex = String.fromCharCode(dig) + hex;
    dec >>= 4;
  }
  
  if(pad) {
    if(hex.length < pad) {
      for(i = hex.length; i < pad; i++) {
        hex = '0' + hex;
      }
    }
  }
  
  return hex;
}

/**
* Konvertiert einen Hexstring in eine Dezimalzahl
*/
function util_hexToDec(hex)
{
  var dec = 0;
  for(i = 0; i < hex.length; i++)
  {
    dig = hex.charCodeAt(i);
    dig = dig > 64 ? dig-55 : dig-48;
    dec = (dec << 4) | dig;
  }
  
  return dec;
}

/**
* Überprüft ob der übegebene String ein korrekter Hexwert ist
*/
function util_checkHexColor(hex)
{
  hex = hex.toUpperCase();
  if(hex.length != 6) {
    return false;
  } else {
    for(i = 0; i < hex.length; i++) {
      c = hex.charCodeAt(i);
      if(c < 48 || (c > 57 && c < 65) || c > 70) {
        return false;
      }
    }
  }
  
  return true;
}

/**
* Wandelt ein Integer-CMYK-Wert in ein Array mit den einzelnen CMYK-Komponenten um
*/
function util_decToCmyk(intCmykColor)
{
  var c = Math.max(Math.min(((intCmykColor >> 24) & 0xFF), 100), 0);
  var m = Math.max(Math.min(((intCmykColor >> 16) & 0xFF), 100), 0);
  var y = Math.max(Math.min(((intCmykColor >> 8) & 0xFF), 100), 0);
  var k = Math.max(Math.min((intCmykColor & 0xFF), 100), 0);
  
  return [c,m,y,k];
}

function util_cmykToDec(aCmyk)
{
  if(aCmyk.length == 1) {
    return -1;
  } else {
    return ((aCmyk[0] << 24) | (aCmyk[1] << 16) | (aCmyk[2] << 8) | aCmyk[3]);
  }
}

/**
* Wandelt einen CMYK-Wert in einen RGB-Wert um
*/
function util_cmykToRgb(aCmyk)
{
  var c = Math.round(aCmyk[0] * 2.55);
  var m = Math.round(aCmyk[1] * 2.55);
  var y = Math.round(aCmyk[2] * 2.55);
  var k = Math.round(aCmyk[3] * 2.55);
  var r = 0;
  var g = 0;
  var b = 0;
  
  if((c + k) < 255) {
    r = 255 - (c + k);
  }
  if((m + k) < 255) {
    g = 255 - (m + k);
  }
  if((y + k) < 255) {
    b = 255 - (y + k);
  }
  
  return ((r << 16) | (g << 8) | b);
}

/**
* Überprüft ob der übergebene Wert im übergebenen Array vorkommt
*/
function util_inArray(aSearch, val)
{
  for(var i = 0; i < aSearch.length; i++)
  {
    if(aSearch[i] == val) {
      return i;
    }
  }
  
  return false;
}

/**
* Setzt die Hintergrundfarbe eines Elements
*/
function util_setElementBackgroundColor(elementID, sHexColor)
{
  var el = document.getElementById(elementID);
  if(el) {
    el.style.backgroundColor = "#" + sHexColor;
  }
}

/**
* Entfernt alle Kindknoten eines HTML-Elements
*/
function util_elementRemoveAllChildNodes(el)
{
  if(el.hasChildNodes())
  {
    while(el.hasChildNodes())
    {
      el.removeChild(el.firstChild);
    }
  }
}

/**
* Öffnet ein Pop-Up-Window
*/
var utilWindowCnt = 0;
function util_openWindow(sUrl, left, top, width, height, fullscreen, centered)
{
  if(fullscreen)
  {
    width = screen.availWidth;
    height = screen.availWidth;
  }
  
  if(centered)
  {
    left = (width - screen.availWidth) / 2;
    top = (height - screen.availHeight) / 2;
  }
  
  var winObj = window.open(sUrl, "WIN"+utilWindowCnt, "width="+width+",height="+height+",left="+left+",top="+top+
    ",scrollbars=no,hotkeys=no,location=no,menubar=no,resizable=yes,status=no,toolbar=no");
  utilWindowCnt++;
  winObj.focus();
  return winObj;
}

/**
* Parsed einen Listenstring und gibt ein Array zurück
*/
function util_parseDelimitedString(sIn, cDelim)
{
  var aRet = [];
  
  for(var i = 0; i < sIn.length; )
  {
    var s = i;
    var e = s;
    
    var c = sIn.charAt(i);
    if(c == '"' || c == "'")
    {
      s++;
      e = sIn.indexOf(c, s);
      var val = sIn.substring(s, e);
      aRet[aRet.length] = val;
      
      s = e;
      e = sIn.indexOf(cDelim, s);
      if(e == -1) {
        e = sIn.length;
      }
    }
    else
    {
      e = sIn.indexOf(cDelim, s);
      if(e == -1) {
        e = sIn.length;
      }
      var val = sIn.substring(s, e);
      aRet[aRet.length] = val;
    }
    
    i = e+1;
  }
  
  return aRet;
}

/**
* Generiert aus einem übergebenen Formular einen URL-Query-String
*/
function util_formToQueryString(frm)
{
  var queryString = "";
  for(var i = 0; i < frm.elements.length; i++)
  {
    if(i > 0) {
      queryString += "&";
    }
    
    queryString += encodeURIComponent(frm.elements[i].name) + "=" + encodeURIComponent(frm.elements[i].value);
  }
  return queryString;
}

/**
* Toggle-Button
*/
function util_toggleButton(buttonID, aImage, aText)
{
  var buttonEl = document.getElementById(buttonID);
  if(buttonEl.className == "toggleButtonOff")
  {
    buttonEl.className = "toggleButtonOn";
    if(aImage) {
      buttonEl.firstChild.src = "images/" + aImage[1];
    }
    if(aText) {
      buttonEl.lastChild.innerHTML = aText[1];
    }
  }
  else
  {
    buttonEl.className = "toggleButtonOff";
    if(aImage) {
      buttonEl.firstChild.src = "images/" + aImage[0];
    }
    if(aText) {
      buttonEl.lastChild.innerHTML = aText[0];
    }
  }
}

/**
* Seiten Scroll-Position
*/
function util_getPageScroll(w)
{
  if(document.all) {
    return [w.document.body.scrollLeft, w.document.body.scrollTop];
  } else {
    return [w.pageXOffset, w.pageYOffset];
  }
}

/**
* Seiten Dimensionen
*/
function util_getPageDimensions(w)
{
  if(document.all) {
    return [w.document.body.clientWidth, w.document.body.clientHeight];
  } else {
    return [w.innerWidth, w.innerHeight];
  }
}

/**
* Fügt den angegebenen Event-Handler zum Element hinzu
*/
function util_addEventHandler(el, type, fn)
{
  if(el.addEventListener)
  {
    el.addEventListener(type, fn, false);
  }
  else if (el.attachEvent)
  {
    el["e"+type+fn] = fn;
    el[type+fn] = function() { el["e"+type+fn](window.event); }
    el.attachEvent("on"+type, el[type+fn]);
  }
}

/**
* Synchronisiert zwei Scrollelemente
*/
function util_onScrollSyncHandler(elSrc, elDest) {
  elDest.scrollLeft = elSrc.scrollLeft;
}

/**
* Entfernt alle Kindknoten des DOM-Elements
*/
function util_removeChildNodes(node) {
  var l = node.childNodes.length;
  for(var k = 0; k < l; k++) {
    node.removeChild(node.childNodes[0]);
  }
}

/**
* Überprüft eine E-Mail-Adresse auf Fültigkeit
*/
function util_checkEmail(email)
{
  var usr = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
  var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
  var pattern = "^"+usr+"\@"+domain+"$";
  var re = new RegExp(pattern);
  var check = (re.test(email));
  return check;
}

/**
 * markiert alle Checkboxen
 */ 
function util_checkAll()
{
  var aElements = document.getElementsByTagName("input");
  for(var i = 0; i < aElements.length; i++)
  {
    if(aElements[i].type == 'checkbox')
    {
      aElements[i].checked = 'checked';
    }
  }
}

/**
 * löscht die Markierung aller Checkboxen
 */ 
function util_unCheckAll()
{
  var aElements = document.getElementsByTagName("input");
  for(var i = 0; i < aElements.length; i++)
  {
    if(aElements[i].type == 'checkbox')
    {
      aElements[i].checked = '';
    }
  }
}


/**
 * gibt Start & Endposition zurück
 */ 
function util_getSelection( el )
{
  if ( el.selectionStart == undefined )
  {
    var r = document.selection.createRange();
    return new Array( r.start, r.end );
  }
  else
  {
    return new Array( el.selectionStart, el.selectionEnd );
  }
}

/**
* Max Length für Textareas
*/
function util_textarea_setMaxLength() {
  var x = document.getElementsByTagName('textarea');
  var counter = document.createElement('div');
  counter.className = 'counter';
  for (var i=0;i<x.length;i++) {
    if (x[i].getAttribute('maxlength')) {
      var counterClone = counter.cloneNode(true);
      counterClone.relatedElement = x[i];
      counterClone.innerHTML = '<span class=text>0</span><span class=text>/' + 
        x[i].getAttribute('maxlength') + '</span>';
      x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
      x[i].relatedElement = counterClone.getElementsByTagName('span')[0];

      x[i].onkeyup = x[i].onchange = util_textarea_checkMaxLength;
      x[i].onkeyup();
    }
  }
}

function util_textarea_checkMaxLength() {
  var maxLength = this.getAttribute('maxlength');
  var currentLength = this.value.length;
  if (currentLength > maxLength)
    this.relatedElement.className = 'text_toomuch';
  else
    this.relatedElement.className = 'text';
  this.relatedElement.firstChild.nodeValue = currentLength;
  // not innerHTML
}
