let input format parse value size editable callback =
    let node = create "input"
      ~attrs:["type""text""value", format value;
              "size", string_of_int size ] () in
    let value = ref value in
    let input = {
        get = (fun () -> !value);
        set = (fun x -> value := x ; Node.set_attribute node "value" (format x));
        editable = (fun b -> Node.set_attribute node "disabled" (if b then "false" else  "true"));
        node = node;
        callback = callback;
    } in
      if not editable then Node.set_attribute node "disabled" "disabled" ;
      Node.register_event node "onchange"
        (fun () ->
           (try value := parse (Node.get_attribute node "value"with _ -> input.set !value) ;
           input.callback input (* do not simplify *)) () ;
      input