//this function works in IE only as UPPER CASE input mask
//example: <INPUT TYPE="text" NAME="aField" ONKEYPRESS="return keyToUpperCase(this, event)">
function keyToUpperCase(field, evt) {
  if (document.all) {
    var c = event.keyCode;
    var C = String.fromCharCode(c).toUpperCase().charCodeAt(); 
    event.keyCode = C;
    return true;
  }
  else 
    return true;
}

//this function works as UPPER CASE input mask
//Example: <input type="text" onkeypress="return changeKey(this, event, lettersToUpperCase);">
function lettersToUpperCase (keyCode, key) {
  var newKey = key.toUpperCase();
  if (newKey != key) {
    return { replaceKey: true, newKeyCode: newKey.charCodeAt(), newKey:
newKey };
  }
  else {
    return { cancelKey: false };
  }
}

//this function changes all digital key into X 
//example: <input type="text" onkeypress="return changeKey(this, event, digitsToX);">
function digitsToX (keyCode, key) {
  if ("0123456789".indexOf(key) != -1) {
    return { replaceKey: true, newKeyCode: "X".charCodeAt(), newKey: "X" };
  }
  else {
    return { cancelKey: false };
  }
}

//German one letter umlauts should be replaced with two letter ASCII sequence (only for Mozilla):
//example: <input type="text" onkeypress="return changeKey(this, event, umlautsToASCII);">
function umlautsToASCII (keyCode, key) {
  var asciiUmlauts = {
    "ä": "ae",
    "ö": "oe",
    "ü": "ue",
    "Ä": "Ae",
    "Ö": "Oe",
    "Ü": "Ue"
  };
  if ("äöüÄÖÜ".indexOf(key) != -1) {
    return { replaceKey: true, newKeyCode: keyCode, newKey:
asciiUmlauts[key] };
  }
  else {
    return { cancelKey: false };
  }
}
    
//this function prevents all digital key 
//example: <input type="text" onkeypress="return changeKey(this, event, cancelDigits);">
function cancelDigits (keyCode, key) {
  return { cancelKey: "0123456789".indexOf(key) != -1 };
}

//core function for change key code in INPUT and TEXTEARE
function changeKey (textControl, evt, keyChecker) {
  var keyCode = evt.keyCode ? evt.keyCode :
                evt.charCode ? evt.charCode :
		evt.which ? evt.which : void 0;
  var key;
  if (keyCode) {
    key = String.fromCharCode(keyCode);
  }
  var keyCheck = keyChecker(keyCode, key);
  if (keyCode && window.event && !window.opera) {
    if (keyCheck.cancelKey) {
      return false;
    }
    else if (keyCheck.replaceKey) {
      window.event.keyCode = keyCheck.newKeyCode;
      if (window.event.preventDefault) {
        window.event.preventDefault();
      }
      return true;
    }
    else {
      return true;
    }
  }
  else if (typeof textControl.setSelectionRange != 'undefined') {
    if (keyCheck.cancelKey) {
      if (evt.preventDefault) {
        evt.preventDefault();
      }
      return false;
    }
    else if (keyCheck.replaceKey) {
	// cancel the key event and insert the newKey for the current selection
      if (evt.preventDefault) {
	  evt.preventDefault();
      }
      var oldSelectionStart = textControl.selectionStart;
      var oldSelectionEnd = textControl.selectionEnd;
      var selectedText = textControl.value.substring(oldSelectionStart,oldSelectionEnd);
      var newText = typeof keyCheck.newKey != 'undefined' ? keyCheck.newKey : String.fromCharCode(keyCheck.newKeyCode);
      textControl.value = 
        textControl.value.substring(0, oldSelectionStart) +
        newText +
        textControl.value.substring(oldSelectionEnd);
      textControl.setSelectionRange(oldSelectionStart + newText.length, oldSelectionStart + newText.length);
      return false;
    }
    else {
      return true;
    } 
  }
  else if (keyCheck.cancelKey) {
    if (evt.preventDefault) {
      evt.preventDefault();
    }
    return false;
  }
  else {
    return true;
  }
}


