var FieldChecker = {
  prepare: function() {
    $A(document.getElementsByTagName("input")).each(function(i) {
      if(i._check) throw $continue;
      switch(i.type.toLowerCase()) {
        case "text":
          if(Element.hasClassName(i, "numeric")) {
            i._check = this.numeric;
          } else if(Element.hasClassName(i, "integer")) {
            i._check = this.integer;
          }
          break;
          default:
      }
      if(i._check) {
        Event.observe(i, "keydown", this.check);
        Event.observe(i, "change", this.check);
      } else {
        i._check = this.nop;
      }
    }.bind(this));
  },
  
  toChar: function(k) {
    if(k == 110 || k == 190) return ".";
    if(k == 109) return "-";
    if(k >= 96 && k <= 105)  return String.fromCharCode(k- 48); // numeric keyboard
    if(k >= 48 && k <= 57) return String.fromCharCode(k);
    if(k == 8 || k == 9 || k >= 37 && k <= 40 || k == 46) return ""; // backspace, tab, cursor, delete
    return String.fromCharCode(k);
  },
  
  check: function(ev) {
    var f = Event.element(ev);
    if(ev.type.indexOf("key") > -1) {
     
      var c = FieldChecker.toChar(ev.keyCode);
      
      if(c && !f._check(c)) { 
        Event.stop(ev);
      }
      return;
    }
    var v = $F(f);
    var cv = f._check(v, ev);
    if(cv != v) {
      f.value = cv;
      new Effect.Highlight(f);
    }
  },
  
  nop: function(ev) {
    return true;
  },
  numeric: function(value, ev) {
    return (/^\s*-/.test(value) ? "-" : "") + value.replace(/[^\d\.]/g, "").replace(/(\.\d+)\..*/, "$1");
  },
  integer: function(value) {
    return (/^\s*-/.test(value) ? "-" : "") + value.replace(/[\D]/g, "");
  }
};
