 
   base: oj.ModelKeyView
 
-  properties:
-    value:
-      get: -> @el.value
-      set: (v) -> @el.value = v; return
-
-  methods:
-    make: (props) ->
+  constructor: (args) ->
+    @el = oj.argumentShift(args, 'el') || oj.toDOM ->
       oj.input type:'text',
         keydown: => if @live then @viewChange(); return
         keyup: => if @live then @viewChange(); return
         change: => @viewChange(); return
 
+    oj.TextBox.base.constructor.apply @, arguments
+
+  properties:
+    value:
+      get: ->
+        v = @el.value
+        v = '' if not v? or v == 'undefined'
+        v
+      set: (v) -> @el.value = v; return
+
 # oj.CheckBox
 # ------------------------------------------------------------------------------
 # CheckBox control
 
 oj.CheckBox = oj.type 'CheckBox',
-
   base: oj.ModelKeyView
+
+  constructor: (args) ->
+    @el = oj.argumentShift(args, 'el') || oj.toDOM ->
+      oj.input type:'checkbox',
+        change: => @viewChange(); return
+
+    oj.CheckBox.base.constructor.apply @, arguments
 
   properties:
     value:

      # Bind events
      if events?
        _attributesBindEventsToDOM events, @el

      return

    removeAttribute: (name) ->
      attr = {}
      attr[name] = 1
      @removeAttribute attr

    removeAttributes: (attributes) ->
      if oj.isObject attributes
        for k of attributes
          @$el.removeAttr k
      return

    toHTML: (options) ->
      @el.outerHTML + (if options.debug then '\n' else '')

    toDOM: ->
      @el

    toString: ->
      @toHTML()

    # Detach element from dom
    detach: -> throw 'detach nyi'

          @$el.removeAttr 'checked'
        return

# oj.TextArea
# ------------------------------------------------------------------------------
# TextArea control

oj.TextArea = oj.type 'TextArea',
  base: oj.ModelKeyView

  constructor: (args) ->
    @el = oj.argumentShift(args, 'el') || oj.toDOM ->
      oj.textarea
        keydown: => if @live then @viewChange(); return
        keyup: => if @live then @viewChange(); return
        change: => @viewChange(); return

    oj.TextArea.base.constructor.apply @, arguments

  properties:
    value:
      get: -> @el.value
      set: (v) -> @el.value = v; return

# oj.ListBox
# ------------------------------------------------------------------------------
# ListBox control

oj.ListBox = oj.type 'ListBox',
  base: oj.ModelKeyView

  constructor: (args) ->
    @el = oj.argumentShift(args, 'el') || oj.toDOM ->
      oj.select change: => @viewChange(); return

    @options = oj.argumentShift args, 'options'

    oj.ListBox.base.constructor.apply @, arguments

  properties:
    value:
