/*
 * Javascript KeyHandler Library 0.0.0.3 
 *
 * Author: Tom Pennings (tom@pennings.be)
 * Credits: methods used from other pages are credited prior to the method with their URL
 * Legal: use of these methods is absolutely free when appropriate credit is provided
 */

var KH_fields;
var lastCharacterCode;
var number = '0123456789';
var lower = 'abcdefghijklmnopqrstuvwxyz';
var upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var DEBUG_ENABLED = false;

function KH_init(fields) {
  KH_fields = fields;
  KH_resetFields();
}

function KH_onKeyPress(e, entermethod, fieldNumber) {
  var fieldObject = document.getElementById(KH_fields[fieldNumber]);
  if (fieldObject.value ==  KH_generateString('.', KH_getFieldMaxLength(fieldNumber))) {
    KH_clearFields();
  }

  KH_handleInput(e, entermethod, fieldNumber); 
}

function KH_clearFields() {
  for (i in KH_fields) {
    var fieldObject = document.getElementById(KH_fields[i]);
    fieldObject.value = '';
    fieldObject.style.color = '#000000';
  }  
}

function KH_resetFields() {
  // make sure all fields get erased and filled with dots
  for (i in KH_fields) {
    var fieldObject = document.getElementById(KH_fields[i]);
    fieldObject.value = KH_generateString('.', KH_getFieldMaxLength(i));
    fieldObject.style.color = '#CCCCCC';
    fieldObject.style.textAlign = 'center';
  }

  var fieldObject = document.getElementById(KH_fields[0]);
  // position the carret in the beginning of the first field
  KH_setCaretPosition(fieldObject, 0);
  // make sure that field gets focus
  fieldObject.focus();
}

function KH_getFieldsString() {
  var string = '';
  for (i in KH_fields) {
    var fieldObject = document.getElementById(KH_fields[i]);
    string = string + fieldObject.value;    
  }

  // make sure no dots appear in the text
  string.replace(/./, "");

  // and trim spaces on the front and back
  string = KH_trim(string);

  return string;
}

function KH_getSpacedFieldsString() {
  var string = '';
  for (i in KH_fields) {
    var fieldObject = document.getElementById(KH_fields[i]);
    string = string + fieldObject.value + ((i == KH_fields.length - 1) ? "" : " ");
  }
  
  // make sure no dots appear in the text
  string.replace(/./, "");

  // and trim spaces form the front and back
  string = KH_trim(string);

  return string;
}

function KH_getFieldMaxLength(fieldNumber) {
  var fieldObject = document.getElementById(KH_fields[fieldNumber]);

  return fieldObject.getAttribute('maxlength');
}

function KH_trim(string) {
  return string.replace(/^\s+|\s+$/g,"");
}

/*
 ** Generates a string filled with char and length length
 */
function KH_generateString(char, length) {
  var string ='';
  for (i = 1; i <= length; i++) {
    string = string + char;
  }  

  return string;
}

function KH_isValid(parm, val) {
  if (parm == "") {
    return true;
  }

  for (i = 0; i < parm.length; i++) {
    if (val.indexOf(parm.charAt(i),0) == -1) {
       return false;
    }
  }

  return true;
}

function KH_isAlphaNum(parm) {
  return KH_isValid(parm, lower + upper + number);
}

function KH_isNum(parm) {
  return isValid(parm, number);
}

function KH_isAlpha(parm) {
  return KH_isValid(parm, lower + upper);
}

/*
 *  This method was posted by m2pc on 08-24-2005, 02:48 PM at http://www.webdeveloper.com/forum/archive/index.php/t-74982.html 
 *
 *  Sets the caret (cursor) position of the specified text field.
 *  Valid positions are 0-oField.length.
 */
function KH_setCaretPosition(oField, iCaretPos) {
  // IE Support
  if(document.selection) {
    // Set focus on the element
    oField.focus();

    // Create empty selection range
    var oSel = document.selection.createRange();

    // Move selection start and end to 0 position
    oSel.moveStart('character', -oField.value.length);

    // Move selection start and end to desired position
    oSel.moveStart('character', iCaretPos);
    oSel.moveEnd('character', 0);
    oSel.select();
  }

  // Firefox support
  else if(oField.selectionStart || oField.selectionStart == '0') {
    oField.selectionStart = iCaretPos;
    oField.selectionEnd = iCaretPos;
    oField.focus();
  }
}

/*
 * This method comes from: http://javascript.nwbox.com/cursor_position/
 */
function KH_getCaretPosition(o) {
  if (o.createTextRange) {
    var r = document.selection.createRange().duplicate()
    r.moveEnd('character', o.value.length)
    if (r.text == '') return o.value.length
      return o.value.lastIndexOf(r.text)
   } else return o.selectionStart
}

function KH_handleInput(e, entermethod, fieldNumber) {
  var characterCode;
  var currentField = document.getElementById(KH_fields[fieldNumber]);
  var previousField = document.getElementById(KH_fields[fieldNumber == 0 ? 0 : fieldNumber - 1]); 
  var nextField = document.getElementById(KH_fields[fieldNumber == KH_fields.length - 1 ? KH_fields.length - 1 : fieldNumber + 1]);

   if(e) {                    // if the event object is present (NN only)
    e = e                     // var e = event
  } else {
    e = window.event          // else e = winddow.event for IE
  }

  if(e.which){                // if there is syntax support for the property 'which' (NN only)
    characterCode = e.which   // e.which is stored in variable "keycode"
  } else {
    characterCode = e.keyCode // otherwise for IE, var keycode stores e.keyCode syntax
  }

  if (DEBUG_ENABLED)
    document.form_debug.keycode_debug.value = fieldNumber;

  var pos =  KH_getCaretPosition(currentField);

  if (DEBUG_ENABLED)
    document.form_debug.position_debug.value = pos;

  if(characterCode == 8 || characterCode == 37) { // backspace character or left cursor
    if(pos == 0) {
      if(previousField != currentField) {
        KH_setCaretPosition(previousField, previousField.value.length);
      }
    }
  }

  if(characterCode == 39) { // right cursor
    if(pos == currentField.value.length) {
      if(currentField != nextField) {
        KH_setCaretPosition(nextField, 0);
      }
    }
  }

  if(characterCode == 13) { // enter is pressed
    if (e.type == "keydown" && lastCharacterCode != characterCode) {
      /*entermethod();*/
      /*KH_resetFields()*/;
    }
    /*KH_resetFields()/*/;
  }

  if(KH_isAlphaNum(String.fromCharCode(characterCode)) || characterCode == 96) {
    if(currentField != nextField && pos == currentField.getAttribute("maxlength")) {
      KH_setCaretPosition(nextField, 0);
    }
    
    // make sure that lowercase characters are converted to uppercase to avoid mistakes
    currentField.value = currentField.value.toUpperCase()
  }

  lastCharacterCode = characterCode;
}

