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 ) () ;
input