Browse Source

export, include, code formatting

221V 3 years ago
parent
commit
7ae553ebaa
114 changed files with 7152 additions and 2968 deletions
  1. 5 4
      include/calendar.hrl
  2. 8 7
      include/comboLookup.hrl
  3. 2 1
      include/comboLookupEdit.hrl
  4. 1 0
      include/comboLookupText.hrl
  5. 1 0
      include/comboLookupVec.hrl
  6. 2 1
      include/cx.hrl
  7. 2 1
      include/event.hrl
  8. 1 0
      include/koatuuControl.hrl
  9. 16 8
      include/n2z.hrl
  10. 140 139
      include/nitro.hrl
  11. 9 8
      include/proto.hrl
  12. 1 0
      include/sortable_item.hrl
  13. 1 0
      include/sortable_list.hrl
  14. 8 3
      src/actions/action_alert.erl
  15. 8 7
      src/actions/action_api.erl
  16. 18 12
      src/actions/action_bind.erl
  17. 8 5
      src/actions/action_confirm.erl
  18. 35 21
      src/actions/action_event.erl
  19. 43 21
      src/actions/action_jq.erl
  20. 21 14
      src/actions/action_manage.erl
  21. 21 8
      src/actions/action_transfer.erl
  22. 7 4
      src/actions/action_ui.erl
  23. 16 5
      src/actions/action_wire.erl
  24. 172 78
      src/elements/combo/element_calendar.erl
  25. 8 4
      src/elements/combo/element_comboLookup.erl
  26. 15 7
      src/elements/combo/element_comboLookupEdit.erl
  27. 21 17
      src/elements/combo/element_comboLookupText.erl
  28. 12 4
      src/elements/combo/element_comboLookupVec.erl
  29. 9 6
      src/elements/combo/element_koatuu.erl
  30. 19 7
      src/elements/combo/element_sortable_item.erl
  31. 17 9
      src/elements/combo/element_sortable_list.erl
  32. 75 25
      src/elements/edit/element_del.erl
  33. 75 25
      src/elements/edit/element_ins.erl
  34. 89 32
      src/elements/embed/element_area.erl
  35. 111 31
      src/elements/embed/element_audio.erl
  36. 77 25
      src/elements/embed/element_canvas.erl
  37. 75 27
      src/elements/embed/element_embed.erl
  38. 84 30
      src/elements/embed/element_iframe.erl
  39. 10 4
      src/elements/embed/element_image.erl
  40. 76 24
      src/elements/embed/element_map.erl
  41. 82 30
      src/elements/embed/element_object.erl
  42. 73 25
      src/elements/embed/element_param.erl
  43. 74 26
      src/elements/embed/element_source.erl
  44. 90 28
      src/elements/embed/element_track.erl
  45. 115 33
      src/elements/embed/element_video.erl
  46. 37 21
      src/elements/form/element_button.erl
  47. 90 34
      src/elements/form/element_fieldset.erl
  48. 115 39
      src/elements/form/element_form.erl
  49. 99 38
      src/elements/form/element_keygen.erl
  50. 16 10
      src/elements/form/element_label.erl
  51. 14 8
      src/elements/form/element_legend.erl
  52. 81 29
      src/elements/form/element_meter.erl
  53. 78 26
      src/elements/form/element_output.erl
  54. 77 25
      src/elements/form/element_progress.erl
  55. 61 24
      src/elements/form/element_select.erl
  56. 117 37
      src/elements/form/element_textarea.erl
  57. 16 10
      src/elements/group/element_blockquote.erl
  58. 30 15
      src/elements/group/element_dtl.erl
  59. 77 24
      src/elements/group/element_html.erl
  60. 14 8
      src/elements/group/element_li.erl
  61. 96 31
      src/elements/group/element_script.erl
  62. 122 41
      src/elements/input/element_checkbox.erl
  63. 107 40
      src/elements/input/element_color.erl
  64. 123 45
      src/elements/input/element_date.erl
  65. 123 45
      src/elements/input/element_datetime.erl
  66. 123 45
      src/elements/input/element_datetime_local.erl
  67. 43 22
      src/elements/input/element_dropdown.erl
  68. 130 46
      src/elements/input/element_email.erl
  69. 114 40
      src/elements/input/element_file.erl
  70. 81 28
      src/elements/input/element_hidden.erl
  71. 128 53
      src/elements/input/element_input.erl
  72. 94 37
      src/elements/input/element_input_button.erl
  73. 108 46
      src/elements/input/element_input_image.erl
  74. 123 45
      src/elements/input/element_input_time.erl
  75. 93 39
      src/elements/input/element_link.erl
  76. 18 10
      src/elements/input/element_list.erl
  77. 15 7
      src/elements/input/element_literal.erl
  78. 116 43
      src/elements/input/element_month.erl
  79. 123 45
      src/elements/input/element_number.erl
  80. 123 45
      src/elements/input/element_password.erl
  81. 45 32
      src/elements/input/element_radio.erl
  82. 24 14
      src/elements/input/element_radiogroup.erl
  83. 110 43
      src/elements/input/element_range.erl
  84. 99 38
      src/elements/input/element_reset.erl
  85. 125 46
      src/elements/input/element_search.erl
  86. 28 18
      src/elements/input/element_submit.erl
  87. 124 46
      src/elements/input/element_tel.erl
  88. 38 17
      src/elements/input/element_textbox.erl
  89. 124 46
      src/elements/input/element_url.erl
  90. 123 45
      src/elements/input/element_week.erl
  91. 88 28
      src/elements/interactive/element_command.erl
  92. 80 24
      src/elements/interactive/element_details.erl
  93. 83 25
      src/elements/interactive/element_menu.erl
  94. 73 22
      src/elements/interactive/element_summary.erl
  95. 34 19
      src/elements/interactive/element_upload.erl
  96. 76 28
      src/elements/meta/element_meta.erl
  97. 73 25
      src/elements/meta/element_meta_base.erl
  98. 77 29
      src/elements/meta/element_meta_link.erl
  99. 84 26
      src/elements/meta/element_style.erl
  100. 76 24
      src/elements/table/element_col.erl
  101. 76 24
      src/elements/table/element_colgroup.erl
  102. 34 14
      src/elements/table/element_table.erl
  103. 9 3
      src/elements/table/element_td.erl
  104. 9 3
      src/elements/table/element_th.erl
  105. 20 6
      src/elements/table/element_tr.erl
  106. 209 132
      src/nitro.erl
  107. 153 98
      src/nitro_conv.erl
  108. 81 44
      src/nitro_n2z.erl
  109. 50 37
      src/nitro_static.erl
  110. 48 28
      src/render/wf_event.erl
  111. 27 13
      src/render/wf_render.erl
  112. 17 9
      src/render/wf_render_actions.erl
  113. 103 69
      src/render/wf_render_elements.erl
  114. 54 26
      src/render/wf_tags.erl

+ 5 - 4
include/calendar.hrl

@@ -4,9 +4,10 @@
 -include_lib("nitro/include/nitro.hrl").
 
 -record(calendar, {?ELEMENT_BASE(element_calendar),
-  autocomplete=true, autofocus=false, disabled=false, form=[], list=[], maxDate={2019,2,2},
-    minDate, format="DD.MM.YYYY", pattern=[], name=[], step=[], readonly=[], required=[],
-    value={2020,2,2}, placeholder=[], onSelect=[], disableDayFn=[], firstDay=0, position=[],
-    reposition=[], yearRange=100}).
+  autocomplete=true, autofocus=false, disabled=false, form=[], list=[], maxDate={2019, 2, 2},
+  minDate, format="DD.MM.YYYY", pattern=[], name=[], step=[], readonly=[], required=[],
+  value={2020, 2, 2}, placeholder=[], onSelect=[], disableDayFn=[], firstDay=0, position=[],
+  reposition=[], yearRange=100}).
 
 -endif.
+

+ 8 - 7
include/comboLookup.hrl

@@ -3,17 +3,18 @@
 
 -include_lib("nitro/include/nitro.hrl").
 
--record(comboKey,  { value=[], dom=[], feed=[], delegate=[]}).
+-record(comboKey,    { value=[], dom=[], feed=[], delegate=[]}).
 -record(comboKeyup,  { value=[], dom=[], feed=[], delegate=[]}).
--record(comboSelect,  { value=[], dom=[], feed=[], delegate=[] }).
+-record(comboSelect, { value=[], dom=[], feed=[], delegate=[]}).
 -record(comboNext,   { pos=[],  count=[], feed=[]}).
 -record(comboLookup, { ?ELEMENT_BASE(element_comboLookup),
-    value=[],
-    disabled=false,
-    feed=[],
-    reader=[],
-    chunk=20 }).
+  value=[],
+  disabled=false,
+  feed=[],
+  reader=[],
+  chunk=20}).
 
 -record(process, {name=[]}).
 
 -endif.
+

+ 2 - 1
include/comboLookupEdit.hrl

@@ -4,4 +4,5 @@
 -include_lib("nitro/include/nitro.hrl").
 -record(comboLookupEdit, {?ELEMENT_BASE(element_comboLookupEdit), input, disabled, form, values, multiple}).
 
--endif.
+-endif.
+

+ 1 - 0
include/comboLookupText.hrl

@@ -5,3 +5,4 @@
 -record(comboLookupText, {?ELEMENT_BASE(element_comboLookupText), input, disabled, textarea, values}).
 
 -endif.
+

+ 1 - 0
include/comboLookupVec.hrl

@@ -5,3 +5,4 @@
 -record(comboLookupVec, {?ELEMENT_BASE(element_comboLookupVec), input, disabled, values}).
 
 -endif.
+

+ 2 - 1
include/cx.hrl

@@ -2,7 +2,8 @@
 -define(NITRO_CX, true).
 
 -record(cx, { handlers=[], actions=[], req=[], module=[], lang=[], path=[],
-              session=[], token=[], formatter=bert, params=[], node=[],
+              session=[], token=[], formatter=bert, params=[], 'node'=[],
               client_pid=[], state=[], from=[], vsn = [] }).
 
 -endif.
+

+ 2 - 1
include/event.hrl

@@ -3,6 +3,7 @@
 
 -include_lib("nitro/include/nitro.hrl").
 
--record(event,   {?ACTION_BASE(action_event), type=default, postback, delegate, validation=[]}).
+-record(event, {?ACTION_BASE(action_event), type=default, postback, delegate, validation=[]}).
 
 -endif.
+

+ 1 - 0
include/koatuuControl.hrl

@@ -5,3 +5,4 @@
 -record(koatuu, {?ELEMENT_BASE(element_koatuu)}).
 
 -endif.
+

+ 16 - 8
include/n2z.hrl

@@ -1,20 +1,27 @@
 -ifndef(N2Z_HRL).
 -define(N2Z_HRL, true).
 
--define(FORMAT(F), case F of F when is_binary(F) -> binary_to_list(F);
-                             F when is_atom(F) -> atom_to_list(F);
-                             F when is_list(F) -> F end).
+-define(FORMAT(F),
+  case F of
+    F when erlang:is_binary(F) ->
+      erlang:binary_to_list(F);
+    F when erlang:is_atom(F) ->
+      erlang:atom_to_list(F);
+    F when erlang:is_list(F) ->
+      F
+  end).
+
 
 -ifdef(OTP_RELEASE).
 -include_lib("kernel/include/logger.hrl").
 -else.
 -define(LOG_INFO(F), io:format(?FORMAT(F)) end).
--define(LOG_INFO(F,X), io:format(?FORMAT(F),X)).
--define(LOG_ERROR(F), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,F])).
--define(LOG_ERROR(F,X), io:format(?FORMAT(F),X)).
+-define(LOG_INFO(F, X), io:format(?FORMAT(F),X)).
+-define(LOG_ERROR(F), io:format("{~p,~p}: ~p~n", [?MODULE, ?LINE, F])).
+-define(LOG_ERROR(F, X), io:format(?FORMAT(F), X)).
 -endif.
 
--define(LOG_EXCEPTION(E,R,S), ?LOG_ERROR(#{exception => E, reason => R, stack => S})).
+-define(LOG_EXCEPTION(E, R, S), ?LOG_ERROR(#{exception => E, reason => R, stack => S})).
 
 -record(pi, { name     :: term(),
               table    :: atom(),
@@ -32,7 +39,7 @@
               token     = [] :: [] | binary(),
               formatter = bert :: bert | json | atom(),
               params    = [] :: [] | list(tuple()) | binary() | list(),
-              node      = [] :: [] | atom() | list(),
+              'node'    = [] :: [] | atom() | list(),
               client_pid= [] :: [] | term(),
               state     = [] :: [] | term(),
               from      = [] :: [] | binary(),
@@ -46,3 +53,4 @@
 -include_lib("nitro/include/proto.hrl").
 
 -endif.
+

+ 140 - 139
include/nitro.hrl

@@ -2,188 +2,189 @@
 -define(NITRO_HRL, true).
 
 -ifndef(CTX).
--define(CTX, (get(context))).
+-define(CTX, (erlang:get(context))).
 -endif.
 
 -define(DEFAULT_BASE, {?ELEMENT_BASE([])}).
--define(DEFAULT_BASE_TAG(Tag), {?ELEMENT_BASE([],Tag,[])}).
--define(ELEMENT_BASE(Module), ?ELEMENT_BASE(Module,[],[])).
--define(ELEMENT_BASE(Module,Tag,Delegate),
-        ancestor=element, id=[], module=Module, delegate=Delegate, validation=[],
-        validate=[], actions=[], class=[], style=[], source=[], onmouseover=[], onmouseout=[], onmousemove=[],
-        onkeypress=[], onchange=[], onkeyup=[], onkeydown=[], onclick=[],
-        data_fields=[], aria_states=[], body=[], role=[], tabindex=[], show_if=true,
-        html_tag=Tag, title=[], postback=[], accesskey=[], contenteditable=[],
-        contextmenu=[], dir=[], draggable=[], dropzone=[], hidden=[], lang=[],
-        spellcheck=[], translate=[], onblur=[], onerror=[], onfocus=[],
-        onmessage=[], onresize=[], bind=[]).
+-define(DEFAULT_BASE_TAG(Tag), {?ELEMENT_BASE([], Tag, [])}).
+-define(ELEMENT_BASE(Module), ?ELEMENT_BASE(Module, [], [])).
+-define(ELEMENT_BASE(Module, Tag, Delegate),
+  ancestor='element', id=[], module=Module, delegate=Delegate, validation=[],
+  validate=[], actions=[], class=[], style=[], source=[], onmouseover=[], onmouseout=[], onmousemove=[],
+  onkeypress=[], onchange=[], onkeyup=[], onkeydown=[], onclick=[],
+  data_fields=[], aria_states=[], body=[], role=[], tabindex=[], show_if=true,
+  html_tag=Tag, title=[], postback=[], accesskey=[], contenteditable=[],
+  contextmenu=[], dir=[], draggable=[], dropzone=[], hidden=[], lang=[],
+  spellcheck=[], translate=[], onblur=[], onerror=[], onfocus=[],
+  onmessage=[], onresize=[], bind=[]).
 
 -define(ACTION_BASE(Module), ancestor=action, trigger=[], target=[], module=Module, actions=[], source=[]).
 -define(CTRL_BASE(Module), ?ELEMENT_BASE(Module,[],Module)).
 
--record(element, {?ELEMENT_BASE([])}).
--record(literal, {?ELEMENT_BASE(element_literal), html_encode=true }).
--record(dtl, {?ELEMENT_BASE(element_dtl), file="index", bindings=[], app=web, folder="priv/templates", ext="html", bind_script=true, js_escape=false }).
--record(list, {?ELEMENT_BASE(element_list), numbered=false }).
--record(dropdown, {?ELEMENT_BASE(element_dropdown), options, value, multiple=false, disabled=false, name}).
+-record('element',  {?ELEMENT_BASE([])}).
+-record(literal,    {?ELEMENT_BASE(element_literal), html_encode=true }).
+-record(dtl,        {?ELEMENT_BASE(element_dtl), file="index", bindings=[], app=web, folder="priv/templates", ext="html", bind_script=true, js_escape=false }).
+-record(list,       {?ELEMENT_BASE(element_list), numbered=false }).
+-record(dropdown,   {?ELEMENT_BASE(element_dropdown), options, value, multiple=false, disabled=false, name}).
 -record(radiogroup, {?ELEMENT_BASE(element_radiogroup)}).
--record(spinner, {?ELEMENT_BASE(element_spinner), image="/priv/static/spinner.gif"}).
+-record(spinner,    {?ELEMENT_BASE(element_spinner), image="/priv/static/spinner.gif"}).
 
 % HTML Document meta
--record(base,       {?ELEMENT_BASE(element_meta_base), href=[], target=[]}).
--record(head,       ?DEFAULT_BASE).
--record(meta_link,       {?ELEMENT_BASE(element_meta_link), href=[], hreflang=[], media=[], rel=[], sizes=[], type=[]}).
--record(meta,       {?ELEMENT_BASE(element_meta), charset=[], content=[], http_equiv=[], name=[], type=[]}).
--record(style,       {?ELEMENT_BASE(element_style), media=[], scoped=[], type=[]}).
--record(title,       ?DEFAULT_BASE).
+-record(base,      {?ELEMENT_BASE(element_meta_base), href=[], target=[]}).
+-record(head,      ?DEFAULT_BASE).
+-record(meta_link, {?ELEMENT_BASE(element_meta_link), href=[], hreflang=[], media=[], rel=[], sizes=[], type=[]}).
+-record(meta,      {?ELEMENT_BASE(element_meta), charset=[], content=[], http_equiv=[], name=[], type=[]}).
+-record(style,     {?ELEMENT_BASE(element_style), media=[], scoped=[], type=[]}).
+-record(title,     ?DEFAULT_BASE).
 
 % HTML Edits
--record('del',       {?ELEMENT_BASE(element_del), cite=[], datetime}).
--record(ins,       {?ELEMENT_BASE(element_ins), cite=[], datetime}).
+-record('del', {?ELEMENT_BASE(element_del), cite=[], datetime}).
+-record(ins,   {?ELEMENT_BASE(element_ins), cite=[], datetime}).
 
 % HTML Embedded
--record(area,       {?ELEMENT_BASE(element_area), alt, coords, href, hreflang, media, target, rel, shape, type}).
--record(audio,       {?ELEMENT_BASE(element_audio), autoplay, controls, loop, mediagroup, muted, preload, src, width}).
--record(canvas,       {?ELEMENT_BASE(element_canvas), height, width}).
--record(embed,       {?ELEMENT_BASE(element_embed), height, src, type, width}).
--record(iframe,       {?ELEMENT_BASE(element_iframe), height, name, sandbox, seamless, src, srcdoc, width}).
--record(image,       {?ELEMENT_BASE(element_image), alt, height, ismap, src, usemap, width, image}).
--record(map,       {?ELEMENT_BASE(element_map), name}).
--record(object,       {?ELEMENT_BASE(element_object), data, form, height, name, type, usemap, width}).
--record(param,       {?ELEMENT_BASE(element_param), name, value}).
--record(source,       {?ELEMENT_BASE(element_source), media, src, type}).
--record(track,       {?ELEMENT_BASE(element_track), default, kind, label, src, srclang}).
--record(video,       {?ELEMENT_BASE(element_video), autoplay, controls, height, loop, mediagroup, muted, poster, preload, src, width}).
+-record(area,   {?ELEMENT_BASE(element_area), alt, coords, href, hreflang, media, target, rel, shape, type}).
+-record(audio,  {?ELEMENT_BASE(element_audio), autoplay, controls, loop, mediagroup, muted, preload, src, width}).
+-record(canvas, {?ELEMENT_BASE(element_canvas), height, width}).
+-record(embed,  {?ELEMENT_BASE(element_embed), height, src, type, width}).
+-record(iframe, {?ELEMENT_BASE(element_iframe), height, name, sandbox, seamless, src, srcdoc, width}).
+-record(image,  {?ELEMENT_BASE(element_image), alt, height, ismap, src, usemap, width, image}).
+-record(map,    {?ELEMENT_BASE(element_map), name}).
+-record(object, {?ELEMENT_BASE(element_object), data, form, height, name, type, usemap, width}).
+-record(param,  {?ELEMENT_BASE(element_param), name, value}).
+-record(source, {?ELEMENT_BASE(element_source), media, src, type}).
+-record(track,  {?ELEMENT_BASE(element_track), default, kind, label, src, srclang}).
+-record(video,  {?ELEMENT_BASE(element_video), autoplay, controls, height, loop, mediagroup, muted, poster, preload, src, width}).
 
 % HTML Form
--record(button,       {?ELEMENT_BASE(element_button), autofocus=[], disabled=[], form=[], formaction=[], formenctype=[], formmethod=[], formtarget=[], formnovalidate=[], name=[], type= <<"button">>, value=[]}).
--record(datalist,       ?DEFAULT_BASE).
--record(fieldset,       {?ELEMENT_BASE(element_fieldset), disabled=[], form=[], name=[], legend=[]}).
--record(form,       {?ELEMENT_BASE(element_form), accept_charset=[], action=[], autocomplete=[], enctype=[], method=[], name=[], novalidate=[], target=[]}).
--record(keygen,       {?ELEMENT_BASE(element_keygen), autofocus=[], challenge=[], disabled=[], form=[], keytype=[], name=[]}).
--record(legend,       ?DEFAULT_BASE).
--record(label,       {?ELEMENT_BASE(element_label), for=[], form=[]}).
--record(meter,       {?ELEMENT_BASE(element_meter), high=[], low=[], max=[], min=[], optimum=[], value=[]}).
--record(optgroup,       {?ELEMENT_BASE(element_select), disabled=[], label=[]}).
--record(option,       {?ELEMENT_BASE(element_select), disabled=[], label=[], selected=false, value=[]}).
--record(output,       {?ELEMENT_BASE(element_output), for, form, name}).
--record(progress,       {?ELEMENT_BASE(element_progress), max=[], value=[]}).
--record(select,       {?ELEMENT_BASE(element_select), autofocus=[], disabled=[], form=[], multiple=[], name=[], required=[], size=[]}).
--record(textarea,       {?ELEMENT_BASE(element_textarea), autofocus=[], cols=[], dirname=[], disabled=[], form=[], maxlength, name, placeholder, readonly=[], required=[], rows=[], wrap=[], value=[]}).
+-record(button,   {?ELEMENT_BASE(element_button), autofocus=[], disabled=[], form=[], formaction=[], formenctype=[], formmethod=[], formtarget=[], formnovalidate=[], name=[], type= <<"button">>, value=[]}).
+-record(datalist, ?DEFAULT_BASE).
+-record(fieldset, {?ELEMENT_BASE(element_fieldset), disabled=[], form=[], name=[], legend=[]}).
+-record(form,     {?ELEMENT_BASE(element_form), accept_charset=[], action=[], autocomplete=[], enctype=[], method=[], name=[], novalidate=[], target=[]}).
+-record(keygen,   {?ELEMENT_BASE(element_keygen), autofocus=[], challenge=[], disabled=[], form=[], keytype=[], name=[]}).
+-record(legend,   ?DEFAULT_BASE).
+-record(label,    {?ELEMENT_BASE(element_label), for=[], form=[]}).
+-record(meter,    {?ELEMENT_BASE(element_meter), high=[], low=[], max=[], min=[], optimum=[], value=[]}).
+-record(optgroup, {?ELEMENT_BASE(element_select), disabled=[], label=[]}).
+-record(option,   {?ELEMENT_BASE(element_select), disabled=[], label=[], selected=false, value=[]}).
+-record(output,   {?ELEMENT_BASE(element_output), for, form, name}).
+-record(progress, {?ELEMENT_BASE(element_progress), max=[], value=[]}).
+-record(select,   {?ELEMENT_BASE(element_select), autofocus=[], disabled=[], form=[], multiple=[], name=[], required=[], 'size'=[]}).
+-record(textarea, {?ELEMENT_BASE(element_textarea), autofocus=[], cols=[], dirname=[], disabled=[], form=[], maxlength, name, placeholder, readonly=[], required=[], rows=[], wrap=[], value=[]}).
 
 % HTML Form inputs
--record(input,       {?ELEMENT_BASE(element_input), required, autocomplete, autofocus, disabled, form, name, value, type=[], checked=false, placeholder, multiple, min, max, pattern, accept}).
--record(input_button,       {?ELEMENT_BASE(element_input_button),  autofocus, disabled, form, name, value}).
--record(checkbox,           {?ELEMENT_BASE(element_checkbox),  autofocus, checked=false, disabled, form, name, required, value}).
--record(color,           {?ELEMENT_BASE(element_color),  autocomplete, autofocus, disabled, form, list, name, value}).
--record(date,           {?ELEMENT_BASE(element_date),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
--record(datetime,           {?ELEMENT_BASE(element_datetime),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
--record(datetime_local,           {?ELEMENT_BASE(element_datetime_local),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
--record(email,           {?ELEMENT_BASE(element_email),  autocomplete, autofocus, disabled, form, list, maxlength, multiple, name, pattern, placeholder, readonly, required, size, value}).
+-record(input,          {?ELEMENT_BASE(element_input), required, autocomplete, autofocus, disabled, form, name, value, type=[], checked=false, placeholder, multiple, min, max, pattern, accept}).
+-record(input_button,   {?ELEMENT_BASE(element_input_button),  autofocus, disabled, form, name, value}).
+-record(checkbox,       {?ELEMENT_BASE(element_checkbox),  autofocus, checked=false, disabled, form, name, required, value}).
+-record(color,          {?ELEMENT_BASE(element_color),  autocomplete, autofocus, disabled, form, list, name, value}).
+-record('date',         {?ELEMENT_BASE(element_date),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
+-record(datetime,       {?ELEMENT_BASE(element_datetime),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
+-record(datetime_local, {?ELEMENT_BASE(element_datetime_local),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
+-record(email,          {?ELEMENT_BASE(element_email),  autocomplete, autofocus, disabled, form, list, maxlength, multiple, name, pattern, placeholder, readonly, required, 'size', value}).
 -record(file,           {?ELEMENT_BASE(element_file),  accept, autofocus, disabled, form, multiple, name, required}).
--record(hidden,           {?ELEMENT_BASE(element_hidden),  disabled, form, name, value, html_name}).
--record(input_image,           {?ELEMENT_BASE(element_input_image),  alt, autofocus, disabled, form, formaction, formenctype, formmethod, formnovalue, formtarget, height, name, src, width}).
--record(month,              {?ELEMENT_BASE(element_month),  alt, autocomplete, autofocus, disabled, form, list, min, max, name, readonly, required, step, value}).
--record(number,              {?ELEMENT_BASE(element_number),  autocomplete, autofocus, disabled, form, list, max, min, name, placeholder, readonly, required, step, value}).
--record(password,              {?ELEMENT_BASE(element_password),  autocomplete, autofocus, disabled, form, maxlength, name, pattern, placeholder, readonly, required, size, value}).
--record(radio,              {?ELEMENT_BASE(element_radio),  autofocus, checked, disabled, form, name, required, value, html_name}).
--record(range,              {?ELEMENT_BASE(element_range),  autocomplete, autofocus, disabled, form, list, max=100, min=0, name, step=1, value}).
--record(reset,              {?ELEMENT_BASE(element_reset),  autofocus, disabled, form, name, value}).
--record(search,              {?ELEMENT_BASE(element_search),  autocomplete, autofocus, dirname, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, size, value}).
--record(submit,              {?ELEMENT_BASE(element_submit),  autofocus, disabled, form, formaction, formenctype, formmethod, formnovalidate, formtarget, name, value, click}).
--record(tel,              {?ELEMENT_BASE(element_tel),  autocomplete, autofocus, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, size, value}).
--record(textbox,              {?ELEMENT_BASE(element_textbox),  autocomplete, autofocus, dirname, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, size, value}).
--record(input_time,              {?ELEMENT_BASE(element_input_time),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
--record(url,              {?ELEMENT_BASE(element_url),  autocomplete, autofocus, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, size, value}).
--record(week,              {?ELEMENT_BASE(element_week),  autocomplete, autofocus, disabled, form, list, max, min, name, readonly, required, step, value}).
+-record(hidden,         {?ELEMENT_BASE(element_hidden),  disabled, form, name, value, html_name}).
+-record(input_image,    {?ELEMENT_BASE(element_input_image),  alt, autofocus, disabled, form, formaction, formenctype, formmethod, formnovalue, formtarget, height, name, src, width}).
+-record(month,          {?ELEMENT_BASE(element_month),  alt, autocomplete, autofocus, disabled, form, list, min, max, name, readonly, required, step, value}).
+-record(number,         {?ELEMENT_BASE(element_number),  autocomplete, autofocus, disabled, form, list, max, min, name, placeholder, readonly, required, step, value}).
+-record(password,       {?ELEMENT_BASE(element_password),  autocomplete, autofocus, disabled, form, maxlength, name, pattern, placeholder, readonly, required, 'size', value}).
+-record(radio,          {?ELEMENT_BASE(element_radio),  autofocus, checked, disabled, form, name, required, value, html_name}).
+-record(range,          {?ELEMENT_BASE(element_range),  autocomplete, autofocus, disabled, form, list, max=100, min=0, name, step=1, value}).
+-record(reset,          {?ELEMENT_BASE(element_reset),  autofocus, disabled, form, name, value}).
+-record(search,         {?ELEMENT_BASE(element_search),  autocomplete, autofocus, dirname, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, 'size', value}).
+-record(submit,         {?ELEMENT_BASE(element_submit),  autofocus, disabled, form, formaction, formenctype, formmethod, formnovalidate, formtarget, name, value, click}).
+-record(tel,            {?ELEMENT_BASE(element_tel),  autocomplete, autofocus, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, 'size', value}).
+-record(textbox,        {?ELEMENT_BASE(element_textbox),  autocomplete, autofocus, dirname, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, 'size', value}).
+-record(input_time,     {?ELEMENT_BASE(element_input_time),  autocomplete, autofocus, disabled, form, list, max, min, name, step, readonly, required, value}).
+-record(url,            {?ELEMENT_BASE(element_url),  autocomplete, autofocus, disabled, form, list, maxlength, name, pattern, placeholder, readonly, required, 'size', value}).
+-record(week,           {?ELEMENT_BASE(element_week),  autocomplete, autofocus, disabled, form, list, max, min, name, readonly, required, step, value}).
 
 % HTML Interactive
--record(command,       {?ELEMENT_BASE(element_command),  checked, disabled, icon, label, radiogroup, type= <<"command">>}).
--record(details,       {?ELEMENT_BASE(element_details),  open}).
--record(menu,       {?ELEMENT_BASE(element_menu),  label, type}).
--record(summary,       ?DEFAULT_BASE).
+-record(command, {?ELEMENT_BASE(element_command),  checked, disabled, icon, label, radiogroup, type= <<"command">>}).
+-record(details, {?ELEMENT_BASE(element_details),  open}).
+-record(menu,    {?ELEMENT_BASE(element_menu),  label, type}).
+-record(summary, ?DEFAULT_BASE).
 
 % HTML Grouping content
--record(blockquote,		{?ELEMENT_BASE(element_blockquote),  cite}).
--record(br,       		?DEFAULT_BASE).
--record(dd,       		?DEFAULT_BASE).
--record('div',      	?DEFAULT_BASE_TAG(<<"div">>)).
--record(dl,       		?DEFAULT_BASE).
--record(dt,       		?DEFAULT_BASE).
--record(figcaption,		?DEFAULT_BASE).
--record(figure,       	?DEFAULT_BASE).
--record(hr,       		?DEFAULT_BASE).
--record(li,             {?ELEMENT_BASE(element_li),  value}).
--record(ol,             ?DEFAULT_BASE).
--record(p,       		?DEFAULT_BASE).
--record(panel,          ?DEFAULT_BASE_TAG(<<"div">>)).
--record(pre,       		?DEFAULT_BASE).
--record(ul,       		?DEFAULT_BASE).
+-record(blockquote, {?ELEMENT_BASE(element_blockquote), cite}).
+-record(br,         ?DEFAULT_BASE).
+-record(dd,         ?DEFAULT_BASE).
+-record('div',      ?DEFAULT_BASE_TAG(<<"div">>)).
+-record(dl,         ?DEFAULT_BASE).
+-record(dt,         ?DEFAULT_BASE).
+-record(figcaption, ?DEFAULT_BASE).
+-record(figure,     ?DEFAULT_BASE).
+-record(hr,         ?DEFAULT_BASE).
+-record(li,         {?ELEMENT_BASE(element_li), value}).
+-record(ol,         ?DEFAULT_BASE).
+-record(p,          ?DEFAULT_BASE).
+-record(panel,      ?DEFAULT_BASE_TAG(<<"div">>)).
+-record(pre,        ?DEFAULT_BASE).
+-record(ul,         ?DEFAULT_BASE).
 
 % HTML Root
--record(html,			{?ELEMENT_BASE(element_html), manifest}).
+-record(html, {?ELEMENT_BASE(element_html), manifest}).
 
 % HTML Scripting
--record(script,			{?ELEMENT_BASE(element_script),  async=[], charset=[], defer=[], src=[], type=[]}).
--record(noscript,      	?DEFAULT_BASE).
+-record(script,   {?ELEMENT_BASE(element_script), async=[], charset=[], defer=[], src=[], type=[]}).
+-record(noscript, ?DEFAULT_BASE).
 
 % HTML Sections
--record(body,       	?DEFAULT_BASE).
--record(section,    	?DEFAULT_BASE).
--record(nav,        	?DEFAULT_BASE).
--record(article,    	?DEFAULT_BASE).
--record(aside,      	?DEFAULT_BASE).
--record(h1,         	?DEFAULT_BASE).
--record(h2,         	?DEFAULT_BASE).
--record(h3,         	?DEFAULT_BASE).
--record(h4,         	?DEFAULT_BASE).
--record(h5,         	?DEFAULT_BASE).
--record(h6,         	?DEFAULT_BASE).
--record(header,     	?DEFAULT_BASE).
--record(hgroup,     	?DEFAULT_BASE).
--record(footer,     	?DEFAULT_BASE).
--record(address,    	?DEFAULT_BASE).
--record(main,       	?DEFAULT_BASE).
+-record(body,    ?DEFAULT_BASE).
+-record(section, ?DEFAULT_BASE).
+-record(nav,     ?DEFAULT_BASE).
+-record(article, ?DEFAULT_BASE).
+-record(aside,   ?DEFAULT_BASE).
+-record(h1,      ?DEFAULT_BASE).
+-record(h2,      ?DEFAULT_BASE).
+-record(h3,      ?DEFAULT_BASE).
+-record(h4,      ?DEFAULT_BASE).
+-record(h5,      ?DEFAULT_BASE).
+-record(h6,      ?DEFAULT_BASE).
+-record(header,  ?DEFAULT_BASE).
+-record(hgroup,  ?DEFAULT_BASE).
+-record(footer,  ?DEFAULT_BASE).
+-record(address, ?DEFAULT_BASE).
+-record(main,    ?DEFAULT_BASE).
 
 % HTML Table
--record(caption,       	?DEFAULT_BASE).
--record(col,            {?ELEMENT_BASE(element_col),  span}).
--record(colgroup,       {?ELEMENT_BASE(element_colgroup), col, span}).
--record(table,          {?ELEMENT_BASE(element_table),  caption, colgroup, border, footer, header}).
--record(tbody,          ?DEFAULT_BASE).
--record(td, 			{?ELEMENT_BASE(element_td), colspan=1, headers, rowspan=1, scope, bgcolor}).
--record(tfoot,       	?DEFAULT_BASE).
--record(th, 			{?ELEMENT_BASE(element_th), colspan=1, headers, rowspan=1, scope}).
--record(thead,       	?DEFAULT_BASE).
--record(tr, 			{?ELEMENT_BASE(element_tr), cells}).
+-record(caption,  ?DEFAULT_BASE).
+-record(col,      {?ELEMENT_BASE(element_col), span}).
+-record(colgroup, {?ELEMENT_BASE(element_colgroup), col, span}).
+-record(table,    {?ELEMENT_BASE(element_table),  caption, colgroup, border, footer, header}).
+-record(tbody,    ?DEFAULT_BASE).
+-record(td,       {?ELEMENT_BASE(element_td), colspan=1, headers, rowspan=1, scope, bgcolor}).
+-record(tfoot,    ?DEFAULT_BASE).
+-record(th,       {?ELEMENT_BASE(element_th), colspan=1, headers, rowspan=1, scope}).
+-record(thead,    ?DEFAULT_BASE).
+-record(tr,       {?ELEMENT_BASE(element_tr), cells}).
 
 % Text
--record(link,           {?ELEMENT_BASE(element_link),  href, hreflang, media, rel, target, type, url="javascript:void(0);", download, name}).
--record(mark,           ?DEFAULT_BASE).
--record(code,           ?DEFAULT_BASE).
--record(span,           ?DEFAULT_BASE).
+-record('link', {?ELEMENT_BASE(element_link),  href, hreflang, media, rel, target, type, url="javascript:void(0);", download, name}).
+-record(mark, ?DEFAULT_BASE).
+-record(code, ?DEFAULT_BASE).
+-record(span, ?DEFAULT_BASE).
 
 % Extras
--record(upload,         {?CTRL_BASE(element_upload), name, value}).
+-record(upload, {?CTRL_BASE(element_upload), name, value}).
 
 % HTML5 template
--record(template,		?DEFAULT_BASE).
--record(message,		?DEFAULT_BASE).
--record(author,		    ?DEFAULT_BASE).
+-record(template, ?DEFAULT_BASE).
+-record(message,  ?DEFAULT_BASE).
+-record(author,   ?DEFAULT_BASE).
 
--record(action,  {?ACTION_BASE(undefined)}).
--record(wire,    {?ACTION_BASE(action_wire)}).
+-record(action, {?ACTION_BASE(undefined)}).
+-record(wire,   {?ACTION_BASE(action_wire)}).
 
 -record(replace, {?ACTION_BASE(action_manage), elements}).
 -record(insert,  {?ACTION_BASE(action_manage), elements, position = beforeend}).
 -record(multi,   {?ACTION_BASE(action_manage)}).
 -record(focus,   {?ACTION_BASE(action_ui)}).
 
--record(api,     {?ACTION_BASE(action_api), name, tag, delegate }).
--record(bind,    {?ACTION_BASE(action_bind), type=click, postback}).
--record(alert,   {?ACTION_BASE(action_alert), text}).
--record(confirm, {?ACTION_BASE(action_confirm), text, postback, delegate}).
--record(jq,      {?ACTION_BASE(action_jq), property, method, args=[], right, format="~s"}).
--record(transfer,{?ACTION_BASE(action_transfer), state, events=[] }).
+-record(api,      {?ACTION_BASE(action_api), name, tag, delegate }).
+-record(bind,     {?ACTION_BASE(action_bind), type=click, postback}).
+-record(alert,    {?ACTION_BASE(action_alert), text}).
+-record(confirm,  {?ACTION_BASE(action_confirm), text, postback, delegate}).
+-record(jq,       {?ACTION_BASE(action_jq), property, method, args=[], right, format="~s"}).
+-record(transfer, {?ACTION_BASE(action_transfer), state, events=[] }).
 
 -endif.
+

+ 9 - 8
include/proto.hrl

@@ -1,12 +1,13 @@
 -ifndef(NITRO_PROTO_HRL).
 -define(NITRO_PROTO_HRL, true).
 
--record(client,  { data=[] }).
--record(server,  { data=[] }).
--record(init,    { token=[] }).
--record(pickle,  { source=[], pickled=[], args=[] }).
--record(flush,   { data=[] }).
--record(direct,  { data=[] }).
--record(ev,      { module=[], msg=[], trigger=[], name=[] }).
+-record(client, { data=[] }).
+-record(server, { data=[] }).
+-record(init,   { token=[] }).
+-record(pickle, { source=[], pickled=[], args=[] }).
+-record(flush,  { data=[] }).
+-record(direct, { data=[] }).
+-record(ev,     { module=[], msg=[], trigger=[], name=[] }).
+
+-endif.
 
--endif.

+ 1 - 0
include/sortable_item.hrl

@@ -5,3 +5,4 @@
 -record(sortable_item, {?ELEMENT_BASE(element_sortable_item), list_id, value, closeable, disabled}).
 
 -endif.
+

+ 1 - 0
include/sortable_list.hrl

@@ -5,3 +5,4 @@
 -record(sortable_list, {?ELEMENT_BASE(element_sortable_list), values, closeable, disabled}).
 
 -endif.
+

+ 8 - 3
src/actions/action_alert.erl

@@ -1,7 +1,12 @@
 -module(action_alert).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_action(#alert{text=T}) -> ["alert(\"",nitro:js_escape(T),"\");"].
+-export([render_action/1]).
+
+
+render_action(#alert{text=T}) ->
+  ["alert(\"", nitro:js_escape(T), "\");"].
+

+ 8 - 7
src/actions/action_api.erl

@@ -1,12 +1,13 @@
 -module(action_api).
--author('Maxim Sokhatsky').
+% author Maxim Sokhatsky
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
--define(B(E), nitro:to_binary(E)).
+-export([render_action/1]).
+
+
+render_action(#api{name=Name, delegate=Delegate}) ->
+  PostbackScript = wf_event:new(Name, "document", Delegate, api_event, "string(JSON.stringify(data))", []),
+  erlang:iolist_to_binary(["document.", nitro:to_binary(Name), "=function(data){", PostbackScript, "};"]).
 
-render_action(#api{name=Name,delegate=Delegate}) ->
-    Data = "string(JSON.stringify(data))",
-    PostbackScript = wf_event:new(Name, "document", Delegate, api_event, Data, []),
-    iolist_to_binary(["document.",?B(Name),"=function(data){",PostbackScript,"};"]).

+ 18 - 12
src/actions/action_bind.erl

@@ -1,18 +1,24 @@
 -module(action_bind).
--author('Maxim Sokhatsky').
+% author Maxim Sokhatsky
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
--define(B(E), nitro:to_binary(E)).
--define(T(T), wf_event:target(T)).
+-export([render_action/1]).
+
+
+render_action(#bind{postback=Code, target={g, _}=Control, type=Type, source=Src}) ->
+  % rebind same control to same handler on same target
+  [" {if('", nitro:to_binary(Src), "' in ", wf_event:target(Control), "){",
+    wf_event:target(Control), ".removeEventListener('", nitro:to_binary(Type), "',", nitro:to_binary(Src), ");"
+    "delete ", wf_event:target(Control), "[", nitro:to_binary(Src), "]};",
+    nitro:to_binary(Src), "={handleEvent:(event) => { "
+    "if(event.type === '", nitro:to_binary(Type), "'){", nitro:to_binary(Code), "}}};",
+    wf_event:target(Control), ".addEventListener('", nitro:to_binary(Type), "',", nitro:to_binary(Src), ");",
+    wf_event:target(Control), ".", nitro:to_binary(Src), "=", nitro:to_binary(Src), ";} "];
 
-render_action(#bind{postback=Code,target={g,_}=Control,type=Type,source=Src}) ->
-    % rebind same control to same handler on same target
-    G = ?T(Control), V = ?B(Src), E = ?B(Type),
+render_action(#bind{postback=Code, target=Control, type=Type}) ->
+  ["{var x=", wf_event:target(Control), ";"
+     "x && x.addEventListener('", nitro:to_binary(Type), "',"
+     "function(event){", nitro:to_binary(Code),"});}"].
 
-    ["{ if('",V,"' in ",G,"){",G,".removeEventListener('",E,"',",V,");delete ",G,"[",V,"]};",
-        V,"={handleEvent:(event) => { if(event.type === '",E,"'){",?B(Code),"}}};",
-        G,".addEventListener('",E,"',", V,");", G,".",V,"=",V,";}"];
-render_action(#bind{postback=Code,target=Control,type=Type}) ->
-    ["{var x=",?T(Control),"; x && x.addEventListener('",?B(Type),"',function(event){",?B(Code),"});}"].

+ 8 - 5
src/actions/action_confirm.erl

@@ -1,10 +1,13 @@
 -module(action_confirm).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_action(#confirm{target=Control,text=Text,postback=Postback,delegate=Delegate}) -> 
-    PostbackScript = wf_event:new(Postback, Control, Delegate, event, "[]", []),
-    ["if (confirm(\"",nitro:js_escape(Text),"\")) {",PostbackScript,"}"].
+-export([render_action/1]).
+
+
+render_action(#confirm{target=Control, text=Text, postback=Postback, delegate=Delegate}) -> 
+  PostbackScript = wf_event:new(Postback, Control, Delegate, event, "[]", []),
+  ["if(confirm(\"", nitro:js_escape(Text), "\")){", PostbackScript, "}"].
 

+ 35 - 21
src/actions/action_event.erl

@@ -1,24 +1,38 @@
 -module(action_event).
--author('Maxim Sokhatsky').
--author('Andrey Martemyanov').
+% author Maxim Sokhatsky
+% author Andrey Martemyanov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
--define(B(E), nitro:to_binary(E)).
-
-render_action(#event{source=undefined}) -> [];
-render_action(#event{postback=Postback,actions=_A,source=Source,target=Control,type=Type,delegate=D,validation=V}) ->
-    E = ?B(Control),
-    ValidationSource = [ S || S <- Source, not is_tuple(S) ],
-    PostbackBin = wf_event:new(Postback, E, D, event, data(E,Source), ValidationSource, V),
-    ["{var x=qi('",E,"'); x && x.addEventListener('",?B(Type),
-     "',function (event){ event.preventDefault(); ",PostbackBin,"});};"].
-
-data(E,SourceList) ->
-    Type=fun(A) when is_atom(A)   -> [ "atom('",atom_to_list(A),"')" ];
-            (A) when is_binary(A) -> [ "bin('",binary_to_list(A),"')" ];
-                              (A) -> [ "string('",A,"')" ] end,
-    list_to_binary(["[tuple(tuple(string('",E,"'),bin('detail')),[])",
-        [ case S of {Id,Code} -> [ ",tuple(",Type(Id),",",Code,")" ];
-                            _ -> [ ",tuple(",Type(S),",querySource('",?B(S),"'))" ]
-          end || S <- SourceList ],"]"]).
+
+-export([render_action/1]).
+
+
+render_action(#event{source=undefined}) ->
+  [];
+
+render_action(#event{postback=Postback, actions=_A, source=Source, target=Control, type=Type, delegate=D, validation=V}) ->
+  E = nitro:to_binary(Control),
+  ValidationSource = [ S || S <- Source, not erlang:is_tuple(S) ],
+  PostbackBin = wf_event:new(Postback, E, D, event, data(E, Source), ValidationSource, V),
+  ["{var x=qi('", E, "'); x && x.addEventListener('", nitro:to_binary(Type), "',"
+   "function(event){ event.preventDefault(); ", PostbackBin, "});};"].
+
+
+data(E, SourceList) ->
+  Type = fun(A) when erlang:is_atom(A) ->
+      ["atom('", erlang:atom_to_list(A), "')"];
+    (A) when erlang:is_binary(A) ->
+      ["bin('", erlang:binary_to_list(A), "')" ];
+    (A) ->
+      ["string('", A, "')"]
+  end,
+  
+  erlang:list_to_binary(["[tuple(tuple(string('", E, "'),bin('detail')),[])",
+    [case S of
+      {Id, Code} ->
+        [",tuple(", Type(Id), ",", Code, ")"];
+      _ ->
+        [",tuple(", Type(S), ",querySource('", nitro:to_binary(S), "'))"]
+     end || S <- SourceList ], "]"]).
+

+ 43 - 21
src/actions/action_jq.erl

@@ -1,23 +1,45 @@
 -module(action_jq).
--author('Rusty Klophaus').
--author('Andrey Martemyanov').
+% author Rusty Klophaus
+% author Andrey Martemyanov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
-
--define(B(E), nitro:to_binary(E)).
--define(R(E), nitro:render(E)).
--define(T(T), wf_event:target(T)).
--define(U, undefined).
--define(M, {".map(i=>i.", ");"}).
--define(P, {".", ";"}).
-
-render_action(#jq{property=?U,target=T,method=Methods,args=Args0,format=F}) ->
-    Args = case F of "'~s'" -> [ ?R(Args0) ]; _ -> Args0 end,
-    Format = fun(A) when is_tuple(A) orelse is_integer(A) -> ?R(A); (A) -> nitro:to_list(A) end,
-    RenderedArgs = string:join([ Format(A) || A <- Args], ","),
-    {Op,Op2} = case T of {qa,_} ->  ?M;{_,{qa,_},_} -> ?M; _ -> ?P end,
-    [[?T(T),Op,?B(M),"(",nitro:f(F,[RenderedArgs]),")", Op2] || M <- Methods];
-render_action(#jq{target=T,method=?U,property=P,right=R,args=simple}) -> [?B(T),".",?B(P),"='",?R(R),"';"];
-render_action(#jq{target=T,method=?U,property=P,right=?U})            -> [?T(T),".",?B(P),";"];
-render_action(#jq{target=T,method=?U,property=P,right=#jq{}=R})       -> [?T(T),".",?B(P),"=", ?R(R), ";"];
-render_action(#jq{target=T,method=?U,property=P,right=R})             -> [?T(T),".",?B(P),"='",?R(R),"';"].
+
+-export([render_action/1]).
+
+
+render_action(#jq{property=undefined, target=T, method=Methods, args=Args0, format=F}) ->
+  Args = case F of
+    "'~s'" ->
+      [ nitro:render(Args0) ];
+    _ -> Args0
+  end,
+  
+  Format = fun(A) when erlang:is_tuple(A) orelse erlang:is_integer(A) ->
+      nitro:render(A);
+    (A) -> nitro:to_list(A)
+  end,
+  
+  RenderedArgs = string:join([ Format(A) || A <- Args], ","),
+  
+  {Op, Op2} = case T of
+    {qa, _} ->
+      {".map(i=>i.", ");"};
+    {_, {qa, _}, _} ->
+      {".map(i=>i.", ");"};
+    _ -> {".", ";"}
+  end,
+  
+  [[ wf_event:target(T), Op, nitro:to_binary(M), "(", nitro:f(F, [RenderedArgs]),")", Op2] || M <- Methods];
+
+render_action(#jq{target=T, method=undefined, property=P, right=R, args=simple}) ->
+  [nitro:to_binary(T), ".", nitro:to_binary(P), "='", nitro:render(R), "';"];
+
+render_action(#jq{target=T, method=undefined, property=P, right=undefined}) ->
+  [wf_event:target(T), ".", nitro:to_binary(P), ";"];
+
+render_action(#jq{target=T, method=undefined, property=P, right=#jq{}=R}) ->
+  [wf_event:target(T), ".", nitro:to_binary(P), "=", nitro:render(R), ";"];
+
+render_action(#jq{target=T, method=undefined, property=P, right=R}) ->
+  [wf_event:target(T), ".", nitro:to_binary(P), "='", nitro:render(R), "';"].
+

+ 21 - 14
src/actions/action_manage.erl

@@ -1,20 +1,27 @@
 -module(action_manage).
--author('Andrey Martemyanov').
+% author Andrey Martemyanov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
--define(B(E), nitro:to_binary(E)).
--define(R(E), nitro:render(E)).
--define(T(T), wf_event:target(T)).
+-export([render_action/1]).
+
+
+render_action(#replace{target=T, elements=E}) ->
+  nitro:render(#jq{target=T, property=outerHTML, right=E});
+render_action(#insert{target=T, elements=E, position=P}) ->
+  {Rendered, Actions} = render_element(E),
+  [wf_event:target(T), ".insertAdjacentHTML('", nitro:to_binary(P), "','", Rendered, "');", nitro:render(Actions)];
+render_action(#multi{actions=A}) ->
+  ["window.requestAnimationFrame(function(timestamp){", nitro:render(A), "});"].
 
-render_action(#replace{target=T,elements=E}) -> ?R(#jq{target=T,property=outerHTML,right=E});
-render_action(#insert{target=T,elements=E,position=P}) ->
-    {Rendered,Actions}=render_element(E),
-    [?T(T),".insertAdjacentHTML('",?B(P),"','",Rendered,"');",?R(Actions)];
-render_action(#multi{actions=A}) -> ["window.requestAnimationFrame(function(timestamp){",?R(A),"});"].
 
 render_element(E) ->
-    Pid = self(),
-    Ref = make_ref(),
-    spawn(fun() -> Pid ! {?R(E),Ref,wf:actions()} end),
-    receive {Rendered, Ref, Actions} -> {Rendered,Actions} end.
+  Pid = erlang:self(),
+  Ref = erlang:make_ref(),
+  erlang:spawn(fun() ->
+    Pid ! {nitro:render(E), Ref, wf:actions()}
+    end),
+  receive {Rendered, Ref, Actions} ->
+    {Rendered, Actions}
+  end.
+

+ 21 - 8
src/actions/action_transfer.erl

@@ -1,12 +1,25 @@
 -module(action_transfer).
--author('Andrey Martemyanov').
+% author Andrey Martemyanov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
+
+-export([render_action/1]).
+
 
 render_action(Record) ->
-    case Record#transfer.state of
-        undefined -> ok;
-        List when is_list(List) -> [ erlang:put(K,V) || {K,V} <- List ];
-        Single -> erlang:put(state,Single) end,
-    Events = case Record#transfer.events of E when is_list(E) -> E; E -> [E] end,
-    [ self() ! M || M <- Events ], ok.
+  case Record#transfer.state of
+    undefined -> ok;
+    List when erlang:is_list(List) ->
+      [ erlang:put(K, V) || {K, V} <- List ];
+    Single ->
+      erlang:put(state, Single)
+  end,
+  
+  Events = case Record#transfer.events of
+    E when erlang:is_list(E) -> E;
+    E -> [E]
+  end,
+  
+  [ erlang:self() ! M || M <- Events ],
+  ok.
+

+ 7 - 4
src/actions/action_ui.erl

@@ -1,9 +1,12 @@
 -module(action_ui).
--author('Andrey Martemyanov').
+% author Andrey Martemyanov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
--define(T(T), wf_event:target(T)).
+-export([render_action/1]).
+
+
+render_action(#focus{target=T}) ->
+  ["window.setTimeout(function(){var x=", wf_event:target(T), "; x && x.focus();},4);"].
 
-render_action(#focus{target=T}) -> ["window.setTimeout(function(){var x=",?T(T),"; x && x.focus();},4);"].

+ 16 - 5
src/actions/action_wire.erl

@@ -1,12 +1,23 @@
 -module(action_wire).
--author('Maxim Sokhatsky').
+% author Maxim Sokhatsky
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
+
+-export([render_action/1, wire/1]).
+
 
 render_action(#wire{actions=Actions}) -> nitro:render(Actions);
-render_action(S) when is_list(S) -> S;
+render_action(S) when erlang:is_list(S) -> S;
 render_action(_) -> [].
 
-wire(A) -> Actions = case get(actions) of undefined -> []; E -> E end,
-           put(actions,Actions++[#wire{actions=A}]), [].
+
+wire(A) ->
+  Actions = case erlang:get(actions) of
+    undefined -> [];
+    E -> E
+  end,
+  
+  erlang:put(actions, Actions ++ [#wire{actions=A}]),
+  [].
+

+ 172 - 78
src/elements/combo/element_calendar.erl

@@ -1,88 +1,182 @@
 -module(element_calendar).
+
 -include_lib("nitro/include/calendar.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
-render_element(Record) when Record#calendar.show_if==false -> [<<>>];
-render_element(Record) ->
-    Id = case Record#calendar.postback of
-        [] -> Record#calendar.id;
-        Postback ->
-          ID = case Record#calendar.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#calendar.source, delegate=Record#calendar.delegate }),
-          ID end,
 
-    init(Id,Record),
+render_element(Record) when Record#calendar.show_if == false ->
+  [<<>>];
+
+render_element(Record) ->
+  Id = case Record#calendar.postback of
+    [] ->
+      Record#calendar.id;
+    Postback ->
+      ID = case Record#calendar.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+                 source=Record#calendar.source, delegate=Record#calendar.delegate }),
+      ID
+  end,
+  
+  init(Id, Record),
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#calendar.accesskey},
+    {<<"class">>, Record#calendar.class},
+    
+    {<<"contenteditable">>,
+      case Record#calendar.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#calendar.contextmenu},
+    
+    {<<"dir">>,
+      case Record#calendar.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#calendar.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#calendar.dropzone},
+    
+    {<<"hidden">>,
+      case Record#calendar.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    
+    {<<"spellcheck">>,
+      case Record#calendar.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#calendar.style},
+    {<<"tabindex">>, Record#calendar.tabindex},
+    {<<"title">>, Record#calendar.title},
+    
+    {<<"translate">>,
+      case Record#calendar.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#calendar.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#calendar.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#calendar.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#calendar.form},
+    {<<"list">>, Record#calendar.list},
+    {<<"name">>, Record#calendar.name},
+    
+    {<<"readonly">>,
+      case Record#calendar.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#calendar.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#calendar.step},
+    {<<"type">>, <<"calendar">>},
+    {<<"pattern">>, Record#calendar.pattern},
+    {<<"placeholder">>, Record#calendar.placeholder},
+    {<<"onkeypress">>, Record#calendar.onkeypress} | Record#calendar.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#calendar.body), List).
 
-    List = [
-      %global
-      {<<"accesskey">>, Record#calendar.accesskey},
-      {<<"class">>, Record#calendar.class},
-      {<<"contenteditable">>, case Record#calendar.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#calendar.contextmenu},
-      {<<"dir">>, case Record#calendar.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#calendar.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#calendar.dropzone},
-      {<<"hidden">>, case Record#calendar.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"spellcheck">>, case Record#calendar.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#calendar.style},
-      {<<"tabindex">>, Record#calendar.tabindex},
-      {<<"title">>, Record#calendar.title},
-      {<<"translate">>, case Record#calendar.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},
-      % spec
-      {<<"autocomplete">>, case Record#calendar.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#calendar.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#calendar.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#calendar.form},
-      {<<"list">>,Record#calendar.list},
-      {<<"name">>,Record#calendar.name},
-      {<<"readonly">>,if Record#calendar.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#calendar.required == true -> "required"; true -> [] end},
-      {<<"step">>,Record#calendar.step},
-      {<<"type">>, <<"calendar">>},
-      {<<"pattern">>,Record#calendar.pattern},
-      {<<"placeholder">>,Record#calendar.placeholder},
-      {<<"onkeypress">>, Record#calendar.onkeypress} | Record#calendar.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#calendar.body), List).
 
-init(Id,#calendar{minDate=Min,maxDate=Max,lang=Lang,format=Form,
-        value=Value,onSelect=SelectFn,disableDayFn=DisDayFn,firstDay=FirstDay,
-        position=Pos,reposition=Repos,yearRange=YearRange} = Calendar) ->
-    ID = nitro:to_list(Id),
-    I18n =        "clLangs.ua",
-    DefaultDate = case Value of
-       {Yv,Mv,Dv} -> nitro:f("new Date(~s,~s,~s)",[nitro:to_list(Yv),nitro:to_list(Mv-1),nitro:to_list(Dv)]);
-        _ -> "''" end,
-    MinDate =     case Min   of {Y,M,D}    -> nitro:f("new Date(~s,~s,~s)",[nitro:to_list(Y), nitro:to_list(M-1), nitro:to_list(D)]);   _ -> "new Date(2009, 3, 4)" end,
-    MaxDate =     case Max   of {Y1,M1,D1} -> nitro:f("new Date(~s,~s,~s)",[nitro:to_list(Y1),nitro:to_list(M1-1),nitro:to_list(D1)]);  _ -> "new Date(2189, 4, 1)" end,
-    OnSelect =    "null",
-    DisDay =      "null",
-    Position =    "bottom left",
-    Reposition =  "true",
-    WeekFirstDay = nitro:to_list(FirstDay),
-    nitro:wire(nitro:f(
-        "pickers['~s'] = new Pikaday({
-            field: document.getElementById('~s'),
-            i18n: ~s,
-            defaultDate: ~s,
-            setDefaultDate: true,
-            firstDay: ~s,
-            minDate: ~s,
-            maxDate: ~s,
-            format: '~s',
-            onSelect: ~s,
-            disableDayFn: ~s,
-            position: '~s',
-            reposition: ~s,
-            yearRange: ~s
-        });",
-        [ID,ID,I18n,DefaultDate,WeekFirstDay,MinDate,MaxDate,Form,OnSelect,DisDay,
-         Position,Reposition,nitro:to_list(YearRange)]
-    )).
+init(Id, #calendar{minDate=Min, maxDate=Max, lang=Lang, format=Form,
+        value=Value, onSelect=SelectFn, disableDayFn=DisDayFn, firstDay=FirstDay,
+        position=Pos, reposition=Repos, yearRange=YearRange} = Calendar) ->
+  ID = nitro:to_list(Id),
+  I18n = "clLangs.ua",
+  
+  DefaultDate = case Value of
+    {Yv, Mv, Dv} ->
+      nitro:f("new Date(~s,~s,~s)", [nitro:to_list(Yv), nitro:to_list(Mv - 1), nitro:to_list(Dv)]);
+      _ ->
+        "''"
+  end,
+  
+  MinDate = case Min of
+    {Y, M, D} ->
+      nitro:f("new Date(~s,~s,~s)", [nitro:to_list(Y), nitro:to_list(M - 1), nitro:to_list(D)]);
+    _ ->
+      "new Date(2009, 3, 4)"
+  end,
+  
+  MaxDate = case Max of
+    {Y1, M1, D1} ->
+      nitro:f("new Date(~s,~s,~s)", [nitro:to_list(Y1), nitro:to_list(M1 - 1), nitro:to_list(D1)]);
+    _ ->
+      "new Date(2189, 4, 1)"
+  end,
+  
+  OnSelect = "null",
+  DisDay = "null",
+  Position = "bottom left",
+  Reposition = "true",
+  WeekFirstDay = nitro:to_list(FirstDay),
+  
+  nitro:wire(nitro:f(
+    "pickers['~s'] = new Pikaday({"
+    "field: document.getElementById('~s'),"
+    "i18n: ~s,"
+    "defaultDate: ~s,"
+    "setDefaultDate: true,"
+    "firstDay: ~s,"
+    "minDate: ~s,"
+    "maxDate: ~s,"
+    "format: '~s',"
+    "onSelect: ~s,"
+    "disableDayFn: ~s,"
+    "position: '~s',"
+    "reposition: ~s,"
+    "yearRange: ~s});",
+    [ID, ID, I18n, DefaultDate, WeekFirstDay, MinDate, MaxDate,
+     Form, OnSelect, DisDay, Position, Reposition, nitro:to_list(YearRange)] )).
 

+ 8 - 4
src/elements/combo/element_comboLookup.erl

@@ -1,14 +1,17 @@
 -module(element_comboLookup).
+
 -include_lib("nitro/include/comboLookup.hrl").
 -include_lib("nitro/include/nitro.hrl").
--export([render_element/1,proto/1]).
+
+-export([render_element/1, proto/1]).
+
 
 proto(#comboKey{delegate=Module}=Msg)    -> Module:proto(Msg);
 proto(#comboKeyup{delegate=Module}=Msg)  -> Module:proto(Msg);
 proto(#comboSelect{delegate=Module}=Msg) -> Module:proto(Msg).
 
-render_element(#comboLookup{id=Id, style=Style, value = Val, bind = Object,
-  feed = Feed, disabled = Disabled, delegate = Module} = Data) ->
+
+render_element(#comboLookup{id=Id, style=Style, value = Val, bind = Object, feed = Feed, disabled = Disabled, delegate = Module} = Data) ->
   nitro:render(
     #panel{id=form:atom([lookup, Id]), class=[dropdown],
            body=[#input{id=Id, disabled = Disabled, type="comboLookup",
@@ -36,5 +39,6 @@ render_element(#comboLookup{id=Id, style=Style, value = Val, bind = Object,
                               ++ nitro:to_list(Module) ++ "')")
                           end},
                  #panel{id=form:atom([comboContainer, Id]),
-                        class = ['dropdown-content']}]}).
+                        class = ['dropdown-content']}
+           ]}).
 

+ 15 - 7
src/elements/combo/element_comboLookupEdit.erl

@@ -1,19 +1,22 @@
 -module(element_comboLookupEdit).
+
 -include_lib("nitro/include/comboLookupEdit.hrl").
 -include_lib("nitro/include/comboLookup.hrl").
 -include_lib("nitro/include/sortable_list.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
+
 render_element(#comboLookupEdit{id=Id, input=Input, disabled=Disabled, validation=Validation, form=Form, values=Values, multiple=Multiple}) ->
   ListId = form:atom([Id, "list"]),
-  InputId = element(#element.id, Input),
+  InputId = erlang:element(#element.id, Input),
   nitro:render(
     #panel{
       id = Id,
       validation = Validation,
-      data_fields = [{<<"data-edit-input">>,<<"data-edit-input">>}],
+      data_fields = [{<<"data-edit-input">>, <<"data-edit-input">>}],
       body = [
         #panel{
           style = "display: flex; position: relative; width: 100%; justify-content: center;",
@@ -35,8 +38,13 @@ render_element(#comboLookupEdit{id=Id, input=Input, disabled=Disabled, validatio
                     id = form:atom([InputId, "form"]),
                     class = ['dropdown-content'],
                     body = #panel{class = ['dropdown-item'], body = Form}
-                  } end ]},
-            case Multiple of
-              true -> #sortable_list{id = ListId, values = Values, closeable = true, disabled = Disabled};
-              false -> []
-            end ]}).
+                  }
+              end
+            ]},
+        case Multiple of
+          true ->
+            #sortable_list{id = ListId, values = Values, closeable = true, disabled = Disabled};
+          false -> []
+        end
+      ]}).
+

+ 21 - 17
src/elements/combo/element_comboLookupText.erl

@@ -1,28 +1,32 @@
 -module(element_comboLookupText).
+
 -include_lib("nitro/include/comboLookupText.hrl").
 -include_lib("nitro/include/nitro.hrl").
+
 -export([render_element/1]).
 
+
 render_element(#comboLookupText{id=Id, input=Input, disabled=Disabled, validation=Validation, textarea=Textarea, values=Values}) ->
-  InputId = element(#element.id, Input),
+  InputId = erlang:element(#element.id, Input),
   LookupId = "wrap_" ++ Id ++ "_lookup",
   TextareaId = "wrap_" ++ Id ++ "_textarea",
   WrapId = "wrap_" ++ Id ++ "_comboLookupText",
   nitro:render(
+    #panel{
+      id = WrapId,
+      validation = Validation,
+      data_fields = [{<<"data-text-input">>, <<"data-text-input">>}],
+      body = [
         #panel{
-          id = WrapId,
-          validation = Validation,
-          data_fields = [{<<"data-text-input">>,<<"data-text-input">>}],
-          body = [
-            #panel{
-              id = LookupId,
-              style = "display: flex; width: 100%; justify-content: center;",
-              body =
-                case Disabled of
-                  true -> [];
-                  _ -> [Input]
-                end},
-            #panel{
-              id = TextareaId,
-              style = "display: flex; width: 100%; justify-content: center;",
-              body = [Textarea]}]}).
+          id = LookupId,
+          style = "display: flex; width: 100%; justify-content: center;",
+          body = case Disabled of
+            true -> [];
+            _ -> [Input]
+          end},
+        #panel{
+          id = TextareaId,
+          style = "display: flex; width: 100%; justify-content: center;",
+          body = [Textarea]}
+      ]}).
+

+ 12 - 4
src/elements/combo/element_comboLookupVec.erl

@@ -1,18 +1,21 @@
 -module(element_comboLookupVec).
+
 -include_lib("nitro/include/comboLookupVec.hrl").
 -include_lib("nitro/include/sortable_list.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
+
 render_element(#comboLookupVec{id=Id, input=Input, disabled=Disabled, validation=Validation, values=Values}) ->
   ListId = form:atom([Id, "list"]),
-  InputId = element(#element.id, Input),
+  InputId = erlang:element(#element.id, Input),
   nitro:render(
     #panel{
       id = Id,
       validation = Validation,
-      data_fields = [{<<"data-vector-input">>,<<"data-vector-input">>}],
+      data_fields = [{<<"data-vector-input">>, <<"data-vector-input">>}],
       body = [
         #panel{
           style = "display: flex; width: 100%; justify-content: center;",
@@ -25,7 +28,12 @@ render_element(#comboLookupVec{id=Id, input=Input, disabled=Disabled, validation
                     class = [button, sgreen],
                     style = "min-width: 40px; text-align: center; height: fit-content; margin-left: 5px;",
                     onclick = nitro:jse("addSortableItemFrom('#" ++ ListId ++ "', '" ++ InputId ++ "')"),
-                    body = <<"+">>} ] end },
+                    body = <<"+">>} ]
+            end
+        },
         % TODO: Add validation for each list_item and/or "+" button
         % TODO?: Maybe show message "Empty list" when Values == []
-        #sortable_list{id = ListId, values = Values, closeable = true, disabled = Disabled}]}).
+        #sortable_list{id = ListId, values = Values, closeable = true, disabled = Disabled}
+      ]
+    }).
+

+ 9 - 6
src/elements/combo/element_koatuu.erl

@@ -1,18 +1,21 @@
 -module(element_koatuu).
+
 -include_lib("nitro/include/comboLookup.hrl").
 -include_lib("nitro/include/koatuuControl.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
-render_element(#koatuu{id=Id, style=Style, postback = Postback,delegate = Module} = Data) ->
-  Options = [ #option{ value = <<"Хмельницька"/utf8>>,
-                       body = <<"Хмельницька"/utf8>>,
+
+render_element(#koatuu{id=Id, style=Style, postback = Postback, delegate = Module} = Data) ->
+  Options = [ #option{value = <<"Хмельницька"/utf8>>,
+                      body = <<"Хмельницька"/utf8>>,
                       selected = true}], % 25 regions from const feed
   nitro:render(
     #panel{id=form:atom([koatuu, Id]),
-           body=[ #select{ id=form:atom([koatuu_select, Id]), postback=Postback,
+           body=[ #select{ id=form:atom([koatuu_select, Id]),
+                           postback=Postback,
                            body=Options},
-
-                  #comboLookup{ } ]}).
+                  #comboLookup{} ]}).
 

+ 19 - 7
src/elements/combo/element_sortable_item.erl

@@ -1,37 +1,49 @@
 -module(element_sortable_item).
+
 -include_lib("nitro/include/sortable_item.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
+
 render_element(#sortable_item{list_id=ListId, value=Value, bind=Bind, closeable=Close, disabled=Disabled}) ->
   Item = case Disabled of
     true ->
       #panel{
         class = <<"list__item">>,
         body = #panel{
-            class = <<"list__item-content">>,
-            style = <<"width:100%">>,
-            body = #panel{ class = <<"list__item-title">>, body = Value}}};
+          class = <<"list__item-content">>,
+          style = <<"width:100%">>,
+          body = #panel{ class = <<"list__item-title">>, body = Value}}};
+    
     _ ->
       #panel{
         class = <<"list__item">>,
         data_fields = [ {<<"data-sortable-item">>,<<"data-sortable-item">>} |
           case Bind of
             [] -> [];
-            _ -> [{<<"data-bind">>, base64:encode(term_to_binary(Bind))}] end ],
+            _ -> [{<<"data-bind">>, base64:encode(erlang:term_to_binary(Bind))}]
+          end ],
         body = [
           case Close of
             true -> 
               #panel{
                 class = <<"list__item-close">>,
                 onclick = nitro:jse("removeSortableItem('#" ++ ListId ++ "', this.parentNode);")};
-            _ -> [] end,
+            _ -> []
+          end,
           #panel{
             class = <<"list__item-content">>,
-            style = case Close of true -> []; _ -> <<"width:100% - 40px">> end,
+            style = case Close of
+              true -> [];
+              _ -> <<"width:100% - 40px">>
+            end,
             body = #panel{ class = <<"list__item-title">>, body = Value}},
           #panel{
             class = <<"list__item-handle">>,
-            data_fields = [{<<"data-sortable-handle">>,<<"data-sortable-handle">>}]}]} end,
+            data_fields = [{<<"data-sortable-handle">>, <<"data-sortable-handle">>}]}
+        ]}
+  end,
   nitro:render(Item).
+

+ 17 - 9
src/elements/combo/element_sortable_list.erl

@@ -1,24 +1,32 @@
 -module(element_sortable_list).
+
 -include_lib("nitro/include/sortable_list.hrl").
 -include_lib("nitro/include/sortable_item.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
+
 -export([render_element/1]).
 
+
 render_element(#sortable_list{id = Id, values = Values, closeable = Close, disabled = Disabled}) ->
-  case Disabled of
-    true ->
-      Closeable = false;
+  Closeable = case Disabled of
+    true -> false;
     _ ->
       nitro:wire("createSortable('#" ++ Id ++ "');"),
-      Closeable = Close end,
+      Close
+  end,
+  
   ProtoItem = #sortable_item{ list_id = Id, closeable = Closeable, disabled = Disabled},
+  
   Body = case Values of
-          {view_value_pairs, List} ->
-            [ ProtoItem#sortable_item{value = Val, bind = Bind} || {Val, Bind} <- List ];
-          _ ->
-            [ ProtoItem#sortable_item{value = Val} || Val <- Values ] end,
+    {view_value_pairs, List} ->
+      [ ProtoItem#sortable_item{value = Val, bind = Bind} || {Val, Bind} <- List ];
+    _ ->
+      [ ProtoItem#sortable_item{value = Val} || Val <- Values ]
+  end,
+  
   nitro:render(
     #panel{ id = Id,
             data_fields = [{<<"data-sortable-list">>, <<"data-sortable-list">>}],
-            body = Body}).
+            body = Body}).
+

+ 75 - 25
src/elements/edit/element_del.erl

@@ -1,29 +1,79 @@
 -module(element_del).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#del.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#del.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#del.accesskey},
-      {<<"class">>, Record#del.class},
-      {<<"contenteditable">>, case Record#del.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#del.contextmenu},
-      {<<"dir">>, case Record#del.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#del.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#del.dropzone},
-      {<<"hidden">>, case Record#del.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#del.id},
-      {<<"lang">>, Record#del.lang},
-      {<<"spellcheck">>, case Record#del.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#del.style},
-      {<<"tabindex">>, Record#del.tabindex},
-      {<<"title">>, Record#del.title},
-      {<<"translate">>, case Record#del.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"cite">>, Record#del.cite},
-      {<<"datetime">>, Record#del.datetime} | Record#del.data_fields
-    ],
-    wf_tags:emit_tag(<<"del">>, nitro:render(case Record#del.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#del.accesskey},
+    {<<"class">>, Record#del.class},
+    {<<"contenteditable">>,
+      case Record#del.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#del.contextmenu},
+    {<<"dir">>,
+      case Record#del.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#del.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#del.dropzone},
+    
+    {<<"hidden">>,
+      case Record#del.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#del.id},
+    {<<"lang">>, Record#del.lang},
+    
+    {<<"spellcheck">>,
+      case Record#del.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#del.style},
+    {<<"tabindex">>, Record#del.tabindex},
+    {<<"title">>, Record#del.title},
+    
+    {<<"translate">>,
+      case Record#del.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"cite">>, Record#del.cite},
+    {<<"datetime">>, Record#del.datetime} | Record#del.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"del">>, nitro:render(
+    case Record#del.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 75 - 25
src/elements/edit/element_ins.erl

@@ -1,29 +1,79 @@
 -module(element_ins).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#ins.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#ins.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#ins.accesskey},
-      {<<"class">>, Record#ins.class},
-      {<<"contenteditable">>, case Record#ins.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#ins.contextmenu},
-      {<<"dir">>, case Record#ins.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#ins.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#ins.dropzone},
-      {<<"hidden">>, case Record#ins.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#ins.id},
-      {<<"lang">>, Record#ins.lang},
-      {<<"spellcheck">>, case Record#ins.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#ins.style},
-      {<<"tabindex">>, Record#ins.tabindex},
-      {<<"title">>, Record#ins.title},
-      {<<"translate">>, case Record#ins.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"cite">>, Record#ins.cite},
-      {<<"datetime">>, Record#ins.datetime} | Record#ins.data_fields
-    ],
-    wf_tags:emit_tag(<<"ins">>, nitro:render(case Record#ins.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#ins.accesskey},
+    {<<"class">>, Record#ins.class},
+    {<<"contenteditable">>,
+      case Record#ins.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#ins.contextmenu},
+    
+    {<<"dir">>,
+      case Record#ins.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#ins.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#ins.dropzone},
+    {<<"hidden">>,
+      case Record#ins.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#ins.id},
+    {<<"lang">>, Record#ins.lang},
+    
+    {<<"spellcheck">>,
+      case Record#ins.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#ins.style},
+    {<<"tabindex">>, Record#ins.tabindex},
+    {<<"title">>, Record#ins.title},
+    
+    {<<"translate">>,
+      case Record#ins.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"cite">>, Record#ins.cite},
+    {<<"datetime">>, Record#ins.datetime} | Record#ins.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"ins">>, nitro:render(
+    case Record#ins.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 89 - 32
src/elements/embed/element_area.erl

@@ -1,36 +1,93 @@
 -module(element_area).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#area.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#area.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#area.accesskey},
-      {<<"class">>, Record#area.class},
-      {<<"contenteditable">>, case Record#area.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#area.contextmenu},
-      {<<"dir">>, case Record#area.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#area.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#area.dropzone},
-      {<<"hidden">>, case Record#area.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#area.id},
-      {<<"lang">>, Record#area.lang},
-      {<<"spellcheck">>, case Record#area.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#area.style},
-      {<<"tabindex">>, Record#area.tabindex},
-      {<<"title">>, Record#area.title},
-      {<<"translate">>, case Record#area.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"alt">>,Record#area.alt},
-      {<<"coords">>,Record#area.coords},
-      {<<"href">>,Record#area.href},
-      {<<"hreflang">>,Record#area.hreflang},
-      {<<"media">>,Record#area.media},
-      {<<"rel">>,Record#area.rel},
-      {<<"shape">>, case Record#area.shape of "rect" -> "rect"; "circle" -> "circle"; "poly" -> "poly"; "default" -> "default"; _ -> [] end},
-      {<<"target">>,Record#area.target},
-      {<<"type">>,Record#area.type} | Record#area.data_fields
-    ],
-    wf_tags:emit_tag(<<"area">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#area.accesskey},
+    {<<"class">>, Record#area.class},
+    
+    {<<"contenteditable">>,
+      case Record#area.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#area.contextmenu},
+    
+    {<<"dir">>,
+      case Record#area.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#area.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#area.dropzone},
+    
+    {<<"hidden">>,
+      case Record#area.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#area.id},
+    {<<"lang">>, Record#area.lang},
+    
+    {<<"spellcheck">>,
+      case Record#area.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#area.style},
+    {<<"tabindex">>, Record#area.tabindex},
+    {<<"title">>, Record#area.title},
+    
+    {<<"translate">>,
+      case Record#area.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"alt">>, Record#area.alt},
+    {<<"coords">>, Record#area.coords},
+    {<<"href">>, Record#area.href},
+    {<<"hreflang">>, Record#area.hreflang},
+    {<<"media">>, Record#area.media},
+    {<<"rel">>, Record#area.rel},
+    
+    {<<"shape">>,
+      case Record#area.shape of
+        "rect" -> "rect";
+        "circle" -> "circle";
+        "poly" -> "poly";
+        "default" -> "default";
+        _ -> []
+      end},
+    
+    {<<"target">>, Record#area.target},
+    {<<"type">>, Record#area.type} | Record#area.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"area">>, List).
+

+ 111 - 31
src/elements/embed/element_audio.erl

@@ -1,35 +1,115 @@
 -module(element_audio).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#audio.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#audio.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#audio.accesskey},
-      {<<"class">>, Record#audio.class},
-      {<<"contenteditable">>, case Record#audio.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#audio.contextmenu},
-      {<<"dir">>, case Record#audio.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#audio.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#audio.dropzone},
-      {<<"hidden">>, case Record#audio.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#audio.id},
-      {<<"lang">>, Record#audio.lang},
-      {<<"spellcheck">>, case Record#audio.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#audio.style},
-      {<<"tabindex">>, Record#audio.tabindex},
-      {<<"title">>, Record#audio.title},
-      {<<"translate">>, case Record#audio.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autoplay">>, case Record#audio.autoplay of true -> "autoplay"; _ -> [] end},      
-      {<<"controls">>, case Record#audio.controls of true -> "controls"; _ -> [] end},      
-      {<<"loop">>, case Record#audio.loop of true -> "loop"; _ -> [] end},            
-      {<<"mediagroup">>, Record#audio.mediagroup},      
-      {<<"muted">>, case Record#audio.muted of true -> "muted"; _ -> [] end},
-      {<<"preload">>, case Record#audio.preload of "auto" -> "auto"; "none" -> "none"; "metadata" -> "metadata"; _ -> [] end},
-      {<<"src">>, Record#audio.src},
-      {<<"width">>, Record#audio.width} | Record#audio.data_fields
-    ],
-    wf_tags:emit_tag(<<"audio">>, nitro:render(case Record#audio.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#audio.accesskey},
+    {<<"class">>, Record#audio.class},
+    
+    {<<"contenteditable">>,
+      case Record#audio.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#audio.contextmenu},
+    
+    {<<"dir">>,
+      case Record#audio.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#audio.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#audio.dropzone},
+    
+    {<<"hidden">>,
+      case Record#audio.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#audio.id},
+    {<<"lang">>, Record#audio.lang},
+    
+    {<<"spellcheck">>,
+      case Record#audio.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#audio.style},
+    {<<"tabindex">>, Record#audio.tabindex},
+    {<<"title">>, Record#audio.title},
+    
+    {<<"translate">>,
+      case Record#audio.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autoplay">>,
+      case Record#audio.autoplay of
+        true -> "autoplay";
+        _ -> []
+      end},
+    
+    {<<"controls">>,
+      case Record#audio.controls of
+        true -> "controls";
+        _ -> []
+      end},
+    
+    {<<"loop">>,
+      case Record#audio.loop of
+        true -> "loop";
+        _ -> []
+      end},
+    
+    {<<"mediagroup">>, Record#audio.mediagroup},
+    
+    {<<"muted">>,
+      case Record#audio.muted of
+        true -> "muted";
+        _ -> []
+      end},
+    
+    {<<"preload">>,
+      case Record#audio.preload of
+        "auto" -> "auto";
+        "none" -> "none";
+        "metadata" -> "metadata";
+        _ -> []
+      end},
+    
+    {<<"src">>, Record#audio.src},
+    {<<"width">>, Record#audio.width} | Record#audio.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"audio">>, nitro:render(
+    case Record#audio.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 77 - 25
src/elements/embed/element_canvas.erl

@@ -1,29 +1,81 @@
 -module(element_canvas).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#canvas.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#canvas.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#canvas.accesskey},
-      {<<"class">>, Record#canvas.class},
-      {<<"contenteditable">>, case Record#canvas.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#canvas.contextmenu},
-      {<<"dir">>, case Record#canvas.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#canvas.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#canvas.dropzone},
-      {<<"hidden">>, case Record#canvas.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#canvas.id},
-      {<<"lang">>, Record#canvas.lang},
-      {<<"spellcheck">>, case Record#canvas.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#canvas.style},
-      {<<"tabindex">>, Record#canvas.tabindex},
-      {<<"title">>, Record#canvas.title},
-      {<<"translate">>, case Record#canvas.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"height">>,Record#canvas.height},
-      {<<"width">>,Record#canvas.width} | Record#canvas.data_fields
-    ],
-    wf_tags:emit_tag(<<"canvas">>, nitro:render(case Record#canvas.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#canvas.accesskey},
+    {<<"class">>, Record#canvas.class},
+    
+    {<<"contenteditable">>,
+      case Record#canvas.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#canvas.contextmenu},
+    
+    {<<"dir">>,
+      case Record#canvas.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#canvas.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#canvas.dropzone},
+    
+    {<<"hidden">>,
+      case Record#canvas.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#canvas.id},
+    {<<"lang">>, Record#canvas.lang},
+    
+    {<<"spellcheck">>,
+      case Record#canvas.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#canvas.style},
+    {<<"tabindex">>, Record#canvas.tabindex},
+    {<<"title">>, Record#canvas.title},
+    
+    {<<"translate">>,
+      case Record#canvas.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"height">>, Record#canvas.height},
+    {<<"width">>, Record#canvas.width} | Record#canvas.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"canvas">>, nitro:render(
+    case Record#canvas.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 75 - 27
src/elements/embed/element_embed.erl

@@ -1,31 +1,79 @@
 -module(element_embed).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#embed.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#embed.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#embed.accesskey},
-      {<<"class">>, Record#embed.class},
-      {<<"contenteditable">>, case Record#embed.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#embed.contextmenu},
-      {<<"dir">>, case Record#embed.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#embed.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#embed.dropzone},
-      {<<"hidden">>, case Record#embed.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#embed.id},
-      {<<"lang">>, Record#embed.lang},
-      {<<"spellcheck">>, case Record#embed.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#embed.style},
-      {<<"tabindex">>, Record#embed.tabindex},
-      {<<"title">>, Record#embed.title},
-      {<<"translate">>, case Record#embed.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"height">>,Record#embed.height},      
-      {<<"src">>,Record#embed.src},
-      {<<"type">>,Record#embed.type},
-      {<<"width">>,Record#embed.width} | Record#embed.data_fields
-    ],
-    wf_tags:emit_tag(<<"embed">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#embed.accesskey},
+    {<<"class">>, Record#embed.class},
+    
+    {<<"contenteditable">>,
+      case Record#embed.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#embed.contextmenu},
+    
+    {<<"dir">>,
+      case Record#embed.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#embed.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#embed.dropzone},
+    
+    {<<"hidden">>,
+      case Record#embed.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#embed.id},
+    {<<"lang">>, Record#embed.lang},
+    
+    {<<"spellcheck">>,
+      case Record#embed.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#embed.style},
+    {<<"tabindex">>, Record#embed.tabindex},
+    {<<"title">>, Record#embed.title},
+    
+    {<<"translate">>,
+      case Record#embed.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"height">>, Record#embed.height},
+    {<<"src">>, Record#embed.src},
+    {<<"type">>, Record#embed.type},
+    {<<"width">>, Record#embed.width} | Record#embed.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"embed">>, List).
+

+ 84 - 30
src/elements/embed/element_iframe.erl

@@ -1,34 +1,88 @@
 -module(element_iframe).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#iframe.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#iframe.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#iframe.accesskey},
-      {<<"class">>, Record#iframe.class},
-      {<<"contenteditable">>, case Record#iframe.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#iframe.contextmenu},
-      {<<"dir">>, case Record#iframe.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#iframe.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#iframe.dropzone},
-      {<<"hidden">>, case Record#iframe.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#iframe.id},
-      {<<"lang">>, Record#iframe.lang},
-      {<<"spellcheck">>, case Record#iframe.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#iframe.style},
-      {<<"tabindex">>, Record#iframe.tabindex},
-      {<<"title">>, Record#iframe.title},
-      {<<"translate">>, case Record#iframe.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"height">>,Record#iframe.height},      
-      {<<"sandbox">>,Record#iframe.sandbox},      
-      {<<"seamless">>, if Record#iframe.seamless == true -> "seamless"; true -> [] end},
-      {<<"src">>,Record#iframe.src},
-      {<<"srcdoc">>,Record#iframe.srcdoc},            
-      {<<"name">>,Record#iframe.name},
-      {<<"width">>,Record#iframe.width} | Record#iframe.data_fields
-    ],
-    wf_tags:emit_tag(<<"iframe">>, [], List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#iframe.accesskey},
+    {<<"class">>, Record#iframe.class},
+    
+    {<<"contenteditable">>,
+      case Record#iframe.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#iframe.contextmenu},
+    
+    {<<"dir">>,
+      case Record#iframe.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#iframe.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#iframe.dropzone},
+    
+    {<<"hidden">>,
+      case Record#iframe.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#iframe.id},
+    {<<"lang">>, Record#iframe.lang},
+    
+    {<<"spellcheck">>,
+      case Record#iframe.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#iframe.style},
+    {<<"tabindex">>, Record#iframe.tabindex},
+    {<<"title">>, Record#iframe.title},
+    
+    {<<"translate">>,
+      case Record#iframe.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"height">>, Record#iframe.height},
+    {<<"sandbox">>, Record#iframe.sandbox},
+    
+    {<<"seamless">>,
+      case Record#iframe.seamless of
+        true -> "seamless";
+        _ -> []
+      end},
+    
+    {<<"src">>, Record#iframe.src},
+    {<<"srcdoc">>, Record#iframe.srcdoc},
+    {<<"name">>, Record#iframe.name},
+    {<<"width">>, Record#iframe.width} | Record#iframe.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"iframe">>, [], List).
+

+ 10 - 4
src/elements/embed/element_image.erl

@@ -1,9 +1,14 @@
 -module(element_image).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#image.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#image.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
   Attributes = [
     {<<"id">>, Record#image.id},
@@ -15,5 +20,6 @@ render_element(Record) ->
     {<<"height">>, Record#image.height},
     {<<"src">>, nitro:coalesce([Record#image.src, Record#image.image])} | Record#image.data_fields
   ],
-
+  
   wf_tags:emit_tag(<<"img">>, Attributes).
+

+ 76 - 24
src/elements/embed/element_map.erl

@@ -1,28 +1,80 @@
 -module(element_map).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#map.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#map.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#map.accesskey},
-      {<<"class">>, Record#map.class},
-      {<<"contenteditable">>, case Record#map.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#map.contextmenu},
-      {<<"dir">>, case Record#map.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#map.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#map.dropzone},
-      {<<"hidden">>, case Record#map.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#map.id},
-      {<<"lang">>, Record#map.lang},
-      {<<"spellcheck">>, case Record#map.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#map.style},
-      {<<"tabindex">>, Record#map.tabindex},
-      {<<"title">>, Record#map.title},
-      {<<"translate">>, case Record#map.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"name">>,Record#map.name} | Record#map.data_fields
-    ],
-    wf_tags:emit_tag(<<"map">>, nitro:render(case Record#map.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#map.accesskey},
+    {<<"class">>, Record#map.class},
+    
+    {<<"contenteditable">>,
+      case Record#map.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#map.contextmenu},
+    
+    {<<"dir">>,
+      case Record#map.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#map.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#map.dropzone},
+    
+    {<<"hidden">>,
+      case Record#map.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#map.id},
+    {<<"lang">>, Record#map.lang},
+    
+    {<<"spellcheck">>,
+      case Record#map.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#map.style},
+    {<<"tabindex">>, Record#map.tabindex},
+    {<<"title">>, Record#map.title},
+    
+    {<<"translate">>,
+      case Record#map.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"name">>, Record#map.name} | Record#map.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"map">>, nitro:render(
+    case Record#map.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 82 - 30
src/elements/embed/element_object.erl

@@ -1,34 +1,86 @@
 -module(element_object).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#object.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#object.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#object.accesskey},
-      {<<"class">>, Record#object.class},
-      {<<"contenteditable">>, case Record#object.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#object.contextmenu},
-      {<<"dir">>, case Record#object.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#object.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#object.dropzone},
-      {<<"hidden">>, case Record#object.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#object.id},
-      {<<"lang">>, Record#object.lang},
-      {<<"spellcheck">>, case Record#object.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#object.style},
-      {<<"tabindex">>, Record#object.tabindex},
-      {<<"title">>, Record#object.title},
-      {<<"translate">>, case Record#object.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"data">>,Record#object.data},      
-      {<<"form">>,Record#object.form},      
-      {<<"height">>,Record#object.height},      
-      {<<"name">>,Record#object.name},            
-      {<<"type">>,Record#object.type},
-      {<<"usemap">>,Record#object.usemap},            
-      {<<"width">>,Record#object.width} | Record#object.data_fields
-    ],
-    wf_tags:emit_tag(<<"object">>, nitro:render(case Record#object.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#object.accesskey},
+    {<<"class">>, Record#object.class},
+    
+    {<<"contenteditable">>,
+      case Record#object.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#object.contextmenu},
+    
+    {<<"dir">>,
+      case Record#object.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#object.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#object.dropzone},
+    
+    {<<"hidden">>,
+      case Record#object.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#object.id},
+    {<<"lang">>, Record#object.lang},
+    
+    {<<"spellcheck">>,
+      case Record#object.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#object.style},
+    {<<"tabindex">>, Record#object.tabindex},
+    {<<"title">>, Record#object.title},
+    
+    {<<"translate">>,
+      case Record#object.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"data">>, Record#object.data},
+    {<<"form">>, Record#object.form},
+    {<<"height">>, Record#object.height},
+    {<<"name">>, Record#object.name},
+    {<<"type">>, Record#object.type},
+    {<<"usemap">>, Record#object.usemap},
+    {<<"width">>, Record#object.width} | Record#object.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"object">>, nitro:render(
+    case Record#object.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 73 - 25
src/elements/embed/element_param.erl

@@ -1,29 +1,77 @@
 -module(element_param).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#param.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#param.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#param.accesskey},
-      {<<"class">>, Record#param.class},
-      {<<"contenteditable">>, case Record#param.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#param.contextmenu},
-      {<<"dir">>, case Record#param.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#param.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#param.dropzone},
-      {<<"hidden">>, case Record#param.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#param.id},
-      {<<"lang">>, Record#param.lang},
-      {<<"spellcheck">>, case Record#param.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#param.style},
-      {<<"tabindex">>, Record#param.tabindex},
-      {<<"title">>, Record#param.title},
-      {<<"translate">>, case Record#param.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"name">>,Record#param.name},
-      {<<"value">>,Record#param.value} | Record#param.data_fields
-    ],
-    wf_tags:emit_tag(<<"param">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#param.accesskey},
+    {<<"class">>, Record#param.class},
+    
+    {<<"contenteditable">>,
+      case Record#param.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#param.contextmenu},
+    
+    {<<"dir">>,
+      case Record#param.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#param.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#param.dropzone},
+    
+    {<<"hidden">>,
+      case Record#param.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#param.id},
+    {<<"lang">>, Record#param.lang},
+    
+    {<<"spellcheck">>,
+      case Record#param.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#param.style},
+    {<<"tabindex">>, Record#param.tabindex},
+    {<<"title">>, Record#param.title},
+    
+    {<<"translate">>,
+      case Record#param.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"name">>, Record#param.name},
+    {<<"value">>, Record#param.value} | Record#param.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"param">>, List).
+

+ 74 - 26
src/elements/embed/element_source.erl

@@ -1,30 +1,78 @@
 -module(element_source).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#source.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#source.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#source.accesskey},
-      {<<"class">>, Record#source.class},
-      {<<"contenteditable">>, case Record#source.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#source.contextmenu},
-      {<<"dir">>, case Record#source.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#source.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#source.dropzone},
-      {<<"hidden">>, case Record#source.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#source.id},
-      {<<"lang">>, Record#source.lang},
-      {<<"spellcheck">>, case Record#source.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#source.style},
-      {<<"tabindex">>, Record#source.tabindex},
-      {<<"title">>, Record#source.title},
-      {<<"translate">>, case Record#source.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"media">>,Record#source.media},
-      {<<"type">>,Record#source.type},
-      {<<"src">>,Record#source.src} | Record#source.data_fields
-    ],
-    wf_tags:emit_tag(<<"source">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#source.accesskey},
+    {<<"class">>, Record#source.class},
+    
+    {<<"contenteditable">>,
+      case Record#source.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#source.contextmenu},
+    
+    {<<"dir">>,
+      case Record#source.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#source.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#source.dropzone},
+    
+    {<<"hidden">>,
+      case Record#source.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#source.id},
+    {<<"lang">>, Record#source.lang},
+    
+    {<<"spellcheck">>,
+      case Record#source.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#source.style},
+    {<<"tabindex">>, Record#source.tabindex},
+    {<<"title">>, Record#source.title},
+    
+    {<<"translate">>,
+      case Record#source.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"media">>, Record#source.media},
+    {<<"type">>, Record#source.type},
+    {<<"src">>, Record#source.src} | Record#source.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"source">>, List).
+

+ 90 - 28
src/elements/embed/element_track.erl

@@ -1,32 +1,94 @@
 -module(element_track).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#track.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#track.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#track.accesskey},
-      {<<"class">>, Record#track.class},
-      {<<"contenteditable">>, case Record#track.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#track.contextmenu},
-      {<<"dir">>, case Record#track.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#track.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#track.dropzone},
-      {<<"hidden">>, case Record#track.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#track.id},
-      {<<"lang">>, Record#track.lang},
-      {<<"spellcheck">>, case Record#track.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#track.style},
-      {<<"tabindex">>, Record#track.tabindex},
-      {<<"title">>, Record#track.title},
-      {<<"translate">>, case Record#track.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"default">>, case Record#track.default of true -> "default"; _ -> [] end},
-      {<<"kind">>, case Record#track.kind of "subtitles" -> "subtitles"; "captions" -> "captions"; "descriptions" -> "descriptions"; "chapters" -> "chapters"; "metadata" -> "metadata"; _ -> [] end},
-      {<<"label">>, Record#track.label},
-      {<<"src">>, Record#track.src},
-      {<<"srclang">>, Record#track.srclang} | Record#track.data_fields
-    ],
-    wf_tags:emit_tag(<<"track">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#track.accesskey},
+    {<<"class">>, Record#track.class},
+    
+    {<<"contenteditable">>,
+      case Record#track.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#track.contextmenu},
+    
+    {<<"dir">>,
+      case Record#track.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#track.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#track.dropzone},
+    
+    {<<"hidden">>,
+      case Record#track.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#track.id},
+    {<<"lang">>, Record#track.lang},
+    
+    {<<"spellcheck">>,
+      case Record#track.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#track.style},
+    {<<"tabindex">>, Record#track.tabindex},
+    {<<"title">>, Record#track.title},
+    
+    {<<"translate">>,
+      case Record#track.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"default">>,
+      case Record#track.default of
+        true -> "default";
+        _ -> []
+      end},
+    
+    {<<"kind">>,
+      case Record#track.kind of
+        "subtitles" -> "subtitles";
+        "captions" -> "captions";
+        "descriptions" -> "descriptions";
+        "chapters" -> "chapters";
+        "metadata" -> "metadata";
+        _ -> []
+      end},
+    
+    {<<"label">>, Record#track.label},
+    {<<"src">>, Record#track.src},
+    {<<"srclang">>, Record#track.srclang} | Record#track.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"track">>, List).
+

+ 115 - 33
src/elements/embed/element_video.erl

@@ -1,37 +1,119 @@
 -module(element_video).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#video.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#video.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#video.accesskey},
-      {<<"class">>, Record#video.class},
-      {<<"contenteditable">>, case Record#video.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#video.contextmenu},
-      {<<"dir">>, case Record#video.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#video.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#video.dropzone},
-      {<<"hidden">>, case Record#video.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#video.id},
-      {<<"lang">>, Record#video.lang},
-      {<<"spellcheck">>, case Record#video.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#video.style},
-      {<<"tabindex">>, Record#video.tabindex},
-      {<<"title">>, Record#video.title},
-      {<<"translate">>, case Record#video.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autoplay">>, case Record#video.autoplay of true -> "autoplay"; _ -> [] end},      
-      {<<"controls">>, case Record#video.controls of true -> "controls"; _ -> [] end},      
-      {<<"height">>, Record#video.height},      
-      {<<"loop">>, case Record#video.loop of true -> "loop"; _ -> [] end},            
-      {<<"mediagroup">>, Record#video.mediagroup},      
-      {<<"muted">>, case Record#video.muted of true -> "muted"; _ -> [] end},
-      {<<"poster">>, Record#video.poster},      
-      {<<"preload">>, case Record#video.preload of "auto" -> "auto"; "none" -> "none"; "metadata" -> "metadata"; _ -> [] end},
-      {<<"src">>, Record#video.src},     
-      {<<"width">>, Record#video.width} | Record#video.data_fields
-    ],
-    wf_tags:emit_tag(<<"video">>, nitro:render(case Record#video.body of [] -> []; B -> B end), List).
+  List = [
+    %global
+    {<<"accesskey">>, Record#video.accesskey},
+    {<<"class">>, Record#video.class},
+    
+    {<<"contenteditable">>,
+      case Record#video.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#video.contextmenu},
+    
+    {<<"dir">>,
+      case Record#video.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#video.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#video.dropzone},
+    
+    {<<"hidden">>,
+      case Record#video.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#video.id},
+    {<<"lang">>, Record#video.lang},
+    
+    {<<"spellcheck">>,
+      case Record#video.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#video.style},
+    {<<"tabindex">>, Record#video.tabindex},
+    {<<"title">>, Record#video.title},
+    
+    {<<"translate">>,
+      case Record#video.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autoplay">>,
+      case Record#video.autoplay of
+        true -> "autoplay";
+        _ -> []
+      end},
+    
+    {<<"controls">>,
+      case Record#video.controls of
+        true -> "controls";
+        _ -> []
+      end},
+    
+    {<<"height">>, Record#video.height},
+    
+    {<<"loop">>,
+      case Record#video.loop of
+        true -> "loop";
+        _ -> []
+      end},
+    
+    {<<"mediagroup">>, Record#video.mediagroup},
+    
+    {<<"muted">>,
+      case Record#video.muted of
+        true -> "muted";
+        _ -> []
+      end},
+    
+    {<<"poster">>, Record#video.poster},
+    
+    {<<"preload">>,
+      case Record#video.preload of
+        "auto" -> "auto";
+        "none" -> "none";
+        "metadata" -> "metadata";
+        _ -> []
+      end},
+    
+    {<<"src">>, Record#video.src},
+    {<<"width">>, Record#video.width} | Record#video.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"video">>, nitro:render(
+    case Record#video.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 37 - 21
src/elements/form/element_button.erl

@@ -1,26 +1,42 @@
 -module(element_button).
--author('Andrew Zadorozhny').
+% author Andrew Zadorozhny
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#button.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#button.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#button.postback of
-        [] -> Record#button.id;
-        undefined -> Record#button.id;
-        Postback ->
-          ID = case Record#button.id of [] -> nitro:temp_id(); I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#button.source, delegate=Record#button.delegate }),
-          ID end,
-    wf_tags:emit_tag(<<"button">>, nitro:render(Record#button.body), [
-        {<<"id">>, Id},
-        {<<"type">>, Record#button.type},
-        {<<"name">>, Record#button.name},
-        {<<"class">>, Record#button.class},
-        {<<"style">>, Record#button.style},
-        {<<"onchange">>, Record#button.onchange},
-        {<<"onclick">>, Record#button.onclick},
-        {<<"disabled">>, if Record#button.disabled == true -> "disabled"; true -> [] end},
-        {<<"value">>, Record#button.value}  | Record#button.data_fields ]).
+  Id = case Record#button.postback of
+    [] -> Record#button.id;
+    undefined -> Record#button.id;
+    Postback ->
+      ID = case Record#button.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#button.source, delegate=Record#button.delegate }),
+      ID
+  end,
+  
+  wf_tags:emit_tag(<<"button">>, nitro:render(Record#button.body),
+    [{<<"id">>, Id},
+     {<<"type">>, Record#button.type},
+     {<<"name">>, Record#button.name},
+     {<<"class">>, Record#button.class},
+     {<<"style">>, Record#button.style},
+     {<<"onchange">>, Record#button.onchange},
+     {<<"onclick">>, Record#button.onclick},
+     {<<"disabled">>,
+       case Record#button.disabled of
+         true -> "disabled";
+         _ -> []
+       end},
+     {<<"value">>, Record#button.value} | Record#button.data_fields ]).
+

+ 90 - 34
src/elements/form/element_fieldset.erl

@@ -1,39 +1,95 @@
 -module(element_fieldset).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#fieldset.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#fieldset.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#fieldset.accesskey},
-      {<<"class">>, Record#fieldset.class},
-      {<<"contenteditable">>, case Record#fieldset.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#fieldset.contextmenu},
-      {<<"dir">>, case Record#fieldset.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#fieldset.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#fieldset.dropzone},
-      {<<"hidden">>, case Record#fieldset.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#fieldset.id},
-      {<<"lang">>, Record#fieldset.lang},
-      {<<"spellcheck">>, case Record#fieldset.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#fieldset.style},
-      {<<"tabindex">>, Record#fieldset.tabindex},
-      {<<"title">>, Record#fieldset.title},
-      {<<"translate">>, case Record#fieldset.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"disabled">>, if Record#fieldset.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#fieldset.form},
-      {<<"name">>,Record#fieldset.name} | Record#fieldset.data_fields
+  List = [
+    % global
+    {<<"accesskey">>, Record#fieldset.accesskey},
+    {<<"class">>, Record#fieldset.class},
+    
+    {<<"contenteditable">>,
+      case Record#fieldset.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#fieldset.contextmenu},
+    
+    {<<"dir">>,
+      case Record#fieldset.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#fieldset.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#fieldset.dropzone},
+    
+    {<<"hidden">>,
+      case Record#fieldset.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#fieldset.id},
+    {<<"lang">>, Record#fieldset.lang},
+    
+    {<<"spellcheck">>,
+      case Record#fieldset.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#fieldset.style},
+    {<<"tabindex">>, Record#fieldset.tabindex},
+    {<<"title">>, Record#fieldset.title},
+    
+    {<<"translate">>,
+      case Record#fieldset.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"disabled">>,
+      case Record#fieldset.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#fieldset.form},
+    {<<"name">>, Record#fieldset.name} | Record#fieldset.data_fields
+  ],
+  
+  wf_tags:emit_tag(
+    <<"fieldset">>,
+    [case Record#fieldset.legend of 
+      [] -> [];
+      B -> wf_tags:emit_tag(<<"legend">>, nitro:render(B), [])
+    end, 
+    nitro:render(
+      case Record#fieldset.body of
+        [] -> [];
+        B -> B
+      end)
     ],
-    wf_tags:emit_tag(
-      <<"fieldset">>,
-      [
-        case Record#fieldset.legend of 
-          [] -> [];
-          B -> wf_tags:emit_tag(<<"legend">>, nitro:render(B), [])
-        end, 
-        nitro:render(case Record#fieldset.body of [] -> []; B -> B end)
-      ], 
-      List).
+    List).
+

+ 115 - 39
src/elements/form/element_form.erl

@@ -1,44 +1,120 @@
 -module(element_form).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#form.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#form.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    ID = case Record#form.id of [] -> nitro:temp_id(); I->I end,
-    case Record#form.postback of
-         [] -> skip;
-         Postback -> nitro:wire(#event { type=submit,
-                                         target=ID,
-                                         postback=Postback,
-                                         delegate=Record#form.delegate,
-                                         source=Record#form.source }) end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#form.accesskey},
-      {<<"class">>, Record#form.class},
-      {<<"contenteditable">>, case Record#form.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#form.contextmenu},
-      {<<"dir">>, case Record#form.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#form.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#form.dropzone},
-      {<<"hidden">>, case Record#form.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, ID},
-      {<<"lang">>, Record#form.lang},
-      {<<"spellcheck">>, case Record#form.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#form.style},
-      {<<"tabindex">>, Record#form.tabindex},
-      {<<"title">>, Record#form.title},
-      {<<"translate">>, case Record#form.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},
-      % spec
-      {<<"accept-charset">>, Record#form.accept_charset},
-      {<<"action">>, Record#form.action},
-      {<<"autocomplete">>, case Record#form.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"enctype">>, case Record#form.enctype of "application/x-www-form-urlencoded" -> "application/x-www-form-urlencoded"; "multipart/form-data" -> "multipart/form-data"; "text/plain" -> "text/plain"; _ -> [] end},
-      {<<"method">>, case Record#form.method of "post" -> "post"; _ -> "get" end},
-      {<<"name">>,Record#form.name},
-      {<<"novalidate">>, case Record#form.novalidate of true -> "novalidate"; _ -> [] end},
-      {<<"target">>, Record#form.target} | Record#form.data_fields
-    ],
-    wf_tags:emit_tag(<<"form">>, nitro:render(Record#form.body), List).
+  ID = case Record#form.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  case Record#form.postback of
+    [] -> skip;
+    Postback ->
+      nitro:wire(#event{ type=submit, target=ID, postback=Postback,
+                         delegate=Record#form.delegate, source=Record#form.source })
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#form.accesskey},
+    {<<"class">>, Record#form.class},
+    
+    {<<"contenteditable">>,
+      case Record#form.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#form.contextmenu},
+    
+    {<<"dir">>,
+      case Record#form.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#form.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#form.dropzone},
+    
+    {<<"hidden">>,
+      case Record#form.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, ID},
+    {<<"lang">>, Record#form.lang},
+    
+    {<<"spellcheck">>,
+      case Record#form.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#form.style},
+    {<<"tabindex">>, Record#form.tabindex},
+    {<<"title">>, Record#form.title},
+    
+    {<<"translate">>,
+      case Record#form.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"accept-charset">>, Record#form.accept_charset},
+    {<<"action">>, Record#form.action},
+    
+    {<<"autocomplete">>,
+    case Record#form.autocomplete of
+      true -> "on";
+      false -> "off";
+      _ -> []
+    end},
+    
+    {<<"enctype">>,
+      case Record#form.enctype of
+        "application/x-www-form-urlencoded" -> "application/x-www-form-urlencoded";
+        "multipart/form-data" -> "multipart/form-data";
+        "text/plain" -> "text/plain";
+        _ -> []
+      end},
+    
+    {<<"method">>,
+      case Record#form.method of
+        "post" -> "post";
+        _ -> "get"
+      end},
+    
+    {<<"name">>, Record#form.name},
+    
+    {<<"novalidate">>,
+      case Record#form.novalidate of
+        true -> "novalidate";
+        _ -> []
+      end},
+    
+    {<<"target">>, Record#form.target} | Record#form.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"form">>, nitro:render(Record#form.body), List).
+

+ 99 - 38
src/elements/form/element_keygen.erl

@@ -1,43 +1,104 @@
 -module(element_keygen).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#keygen.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#keygen.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#keygen.postback of
-        [] -> Record#keygen.id;
-        Postback ->
-          ID = case Record#keygen.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#keygen.source, delegate=Record#keygen.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#keygen.accesskey},
-      {<<"class">>, Record#keygen.class},
-      {<<"contenteditable">>, case Record#keygen.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#keygen.contextmenu},
-      {<<"dir">>, case Record#keygen.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#keygen.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#keygen.dropzone},
-      {<<"hidden">>, case Record#keygen.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#keygen.lang},
-      {<<"spellcheck">>, case Record#keygen.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#keygen.style},
-      {<<"tabindex">>, Record#keygen.tabindex},
-      {<<"title">>, Record#keygen.title},
-      {<<"translate">>, case Record#keygen.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autofocus">>,if Record#keygen.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"challenge">>,Record#keygen.challenge},      
-      {<<"disabled">>, if Record#keygen.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#keygen.form},
-      {<<"keytype">>,<<"rsa">>},
-      {<<"name">>,Record#keygen.name} | Record#keygen.data_fields
-    ],
-    wf_tags:emit_tag(<<"keygen">>, nitro:render(Record#keygen.body), List).
+  Id = case Record#keygen.postback of
+    [] -> Record#keygen.id;
+    Postback ->
+      ID = case Record#keygen.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+        source=Record#keygen.source, delegate=Record#keygen.delegate }),
+      ID
+  end,
+  List = [
+    % global
+    {<<"accesskey">>, Record#keygen.accesskey},
+    {<<"class">>, Record#keygen.class},
+    
+    {<<"contenteditable">>,
+      case Record#keygen.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#keygen.contextmenu},
+    
+    {<<"dir">>,
+      case Record#keygen.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#keygen.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#keygen.dropzone},
+    
+    {<<"hidden">>,
+      case Record#keygen.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#keygen.lang},
+    
+    {<<"spellcheck">>,
+      case Record#keygen.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#keygen.style},
+    {<<"tabindex">>, Record#keygen.tabindex},
+    {<<"title">>, Record#keygen.title},
+    
+    {<<"translate">>,
+      case Record#keygen.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autofocus">>,
+      case Record#keygen.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"challenge">>, Record#keygen.challenge},
+    
+    {<<"disabled">>,
+      case Record#keygen.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#keygen.form},
+    {<<"keytype">>, <<"rsa">>},
+    {<<"name">>, Record#keygen.name} | Record#keygen.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"keygen">>, nitro:render(Record#keygen.body), List).
+

+ 16 - 10
src/elements/form/element_label.erl

@@ -1,14 +1,20 @@
 -module(element_label).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#label.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#label.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-  wf_tags:emit_tag(<<"label">>, nitro:render(Record#label.body), [
-    {<<"id">>, Record#label.id},
-    {<<"class">>, Record#label.class},
-    {<<"style">>, Record#label.style},
-    {<<"for">>, Record#label.for},
-    {<<"onclick">>, Record#label.onclick} | Record#label.data_fields
-  ]).
+  wf_tags:emit_tag(<<"label">>, nitro:render(Record#label.body),
+    [{<<"id">>, Record#label.id},
+     {<<"class">>, Record#label.class},
+     {<<"style">>, Record#label.style},
+     {<<"for">>, Record#label.for},
+     {<<"onclick">>, Record#label.onclick} | Record#label.data_fields
+    ]).
+

+ 14 - 8
src/elements/form/element_legend.erl

@@ -1,12 +1,18 @@
 -module(element_legend).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#legend.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#legend.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-  wf_tags:emit_tag(<<"legend">>, nitro:render(Record#legend.body), [
-    {<<"id">>, Record#legend.id},
-    {<<"class">>, Record#legend.class},
-    {<<"style">>, Record#legend.style} | Record#legend.data_fields
-  ]).
+  wf_tags:emit_tag(<<"legend">>, nitro:render(Record#legend.body),
+    [{<<"id">>, Record#legend.id},
+     {<<"class">>, Record#legend.class},
+     {<<"style">>, Record#legend.style} | Record#legend.data_fields
+    ]).
+

+ 81 - 29
src/elements/form/element_meter.erl

@@ -1,33 +1,85 @@
 -module(element_meter).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#meter.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#meter.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#meter.accesskey},
-      {<<"class">>, Record#meter.class},
-      {<<"contenteditable">>, case Record#meter.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#meter.contextmenu},
-      {<<"dir">>, case Record#meter.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#meter.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#meter.dropzone},
-      {<<"hidden">>, case Record#meter.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#meter.id},
-      {<<"lang">>, Record#meter.lang},
-      {<<"spellcheck">>, case Record#meter.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#meter.style},
-      {<<"tabindex">>, Record#meter.tabindex},
-      {<<"title">>, Record#meter.title},
-      {<<"translate">>, case Record#meter.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"high">>,Record#meter.high},
-      {<<"low">>,Record#meter.low},
-      {<<"max">>,Record#meter.max},
-      {<<"min">>,Record#meter.min},
-      {<<"optimum">>,Record#meter.optimum},
-      {<<"value">>, Record#meter.value} | Record#meter.data_fields
-    ],
-    wf_tags:emit_tag(<<"meter">>, nitro:render(case Record#meter.body of [] -> []; B -> B end), List).
+  List = [
+  % global
+  {<<"accesskey">>, Record#meter.accesskey},
+  {<<"class">>, Record#meter.class},
+  
+  {<<"contenteditable">>,
+    case Record#meter.contenteditable of
+      true -> "true";
+      false -> "false";
+      _ -> []
+    end},
+  
+  {<<"contextmenu">>, Record#meter.contextmenu},
+  
+  {<<"dir">>,
+    case Record#meter.dir of
+      "ltr" -> "ltr";
+      "rtl" -> "rtl";
+      "auto" -> "auto";
+      _ -> []
+    end},
+  
+  {<<"draggable">>,
+    case Record#meter.draggable of
+      true -> "true";
+      false -> "false";
+      _ -> []
+    end},
+  
+  {<<"dropzone">>, Record#meter.dropzone},
+  
+  {<<"hidden">>,
+    case Record#meter.hidden of
+      "hidden" -> "hidden";
+      _ -> []
+    end},
+  
+  {<<"id">>, Record#meter.id},
+  {<<"lang">>, Record#meter.lang},
+  
+  {<<"spellcheck">>,
+    case Record#meter.spellcheck of
+      true -> "true";
+      false -> "false";
+      _ -> []
+    end},
+  
+  {<<"style">>, Record#meter.style},
+  {<<"tabindex">>, Record#meter.tabindex},
+  {<<"title">>, Record#meter.title},
+  
+  {<<"translate">>,
+    case Record#meter.contenteditable of
+      "yes" -> "yes";
+      "no" -> "no";
+      _ -> []
+    end},
+  
+  % spec
+  {<<"high">>, Record#meter.high},
+  {<<"low">>, Record#meter.low},
+  {<<"max">>, Record#meter.max},
+  {<<"min">>, Record#meter.min},
+  {<<"optimum">>, Record#meter.optimum},
+  {<<"value">>, Record#meter.value} | Record#meter.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"meter">>, nitro:render(
+    case Record#meter.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 78 - 26
src/elements/form/element_output.erl

@@ -1,30 +1,82 @@
 -module(element_output).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#output.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#output.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#output.accesskey},
-      {<<"class">>, Record#output.class},
-      {<<"contenteditable">>, case Record#output.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#output.contextmenu},
-      {<<"dir">>, case Record#output.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#output.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#output.dropzone},
-      {<<"hidden">>, case Record#output.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#output.id},
-      {<<"lang">>, Record#output.lang},
-      {<<"spellcheck">>, case Record#output.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#output.style},
-      {<<"tabindex">>, Record#output.tabindex},
-      {<<"title">>, Record#output.title},
-      {<<"translate">>, case Record#output.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"for">>,Record#output.for},
-      {<<"form">>,Record#output.form},
-      {<<"name">>,Record#output.name} | Record#output.data_fields
-    ],
-    wf_tags:emit_tag(<<"output">>, nitro:render(case Record#output.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#output.accesskey},
+    {<<"class">>, Record#output.class},
+    
+    {<<"contenteditable">>,
+      case Record#output.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#output.contextmenu},
+    
+    {<<"dir">>,
+      case Record#output.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#output.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#output.dropzone},
+    
+    {<<"hidden">>,
+      case Record#output.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#output.id},
+    {<<"lang">>, Record#output.lang},
+    
+    {<<"spellcheck">>,
+      case Record#output.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#output.style},
+    {<<"tabindex">>, Record#output.tabindex},
+    {<<"title">>, Record#output.title},
+    
+    {<<"translate">>,
+      case Record#output.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"for">>,Record#output.for},
+    {<<"form">>,Record#output.form},
+    {<<"name">>,Record#output.name} | Record#output.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"output">>, nitro:render(
+    case Record#output.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 77 - 25
src/elements/form/element_progress.erl

@@ -1,29 +1,81 @@
 -module(element_progress).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#progress.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#progress.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#progress.accesskey},
-      {<<"class">>, Record#progress.class},
-      {<<"contenteditable">>, case Record#progress.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#progress.contextmenu},
-      {<<"dir">>, case Record#progress.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#progress.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#progress.dropzone},
-      {<<"hidden">>, case Record#progress.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#progress.id},
-      {<<"lang">>, Record#progress.lang},
-      {<<"spellcheck">>, case Record#progress.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#progress.style},
-      {<<"tabindex">>, Record#progress.tabindex},
-      {<<"title">>, Record#progress.title},
-      {<<"translate">>, case Record#progress.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"max">>,Record#progress.max},
-      {<<"value">>,Record#progress.value} | Record#progress.data_fields
-    ],
-    wf_tags:emit_tag(<<"progress">>, nitro:render(case Record#progress.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#progress.accesskey},
+    {<<"class">>, Record#progress.class},
+    
+    {<<"contenteditable">>,
+      case Record#progress.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#progress.contextmenu},
+    
+    {<<"dir">>,
+      case Record#progress.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#progress.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#progress.dropzone},
+    
+    {<<"hidden">>,
+      case Record#progress.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#progress.id},
+    {<<"lang">>, Record#progress.lang},
+    
+    {<<"spellcheck">>,
+      case Record#progress.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#progress.style},
+    {<<"tabindex">>, Record#progress.tabindex},
+    {<<"title">>, Record#progress.title},
+    
+    {<<"translate">>,
+      case Record#progress.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"max">>,Record#progress.max},
+    {<<"value">>,Record#progress.value} | Record#progress.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"progress">>, nitro:render(
+    case Record#progress.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 61 - 24
src/elements/form/element_select.erl

@@ -1,18 +1,29 @@
 -module(element_select).
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#select.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#select.show_if == false ->
+  [<<>>];
+
+
 render_element(Record = #select{}) ->
-  ID = case Record#select.id of [] -> nitro:temp_id(); I->I end,
+  ID = case Record#select.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  
   case Record#select.postback of
     [] -> skip;
-    Postback -> nitro:wire(#event{ type=change,
-                                target=ID,
-                                postback=Postback,
-                                source=[nitro:to_atom(ID)|Record#select.source],
-                                delegate=Record#select.delegate }) end,
+    Postback ->
+      nitro:wire(#event{ type=change, target=ID, postback=Postback,
+                         source=[nitro:to_atom(ID)|Record#select.source],
+                         delegate=Record#select.delegate })
+  end,
+  
   Props = [
     {<<"id">>, ID},
     {<<"class">>, Record#select.class},
@@ -20,29 +31,55 @@ render_element(Record = #select{}) ->
     {<<"name">>, Record#select.name},
     {<<"onchange">>, Record#select.onchange},
     {<<"title">>, Record#select.title},
-    {<<"required">>, case Record#select.required of true -> <<"required">>; _-> [] end},
-    {<<"disabled">>, case Record#select.disabled of true -> <<"disabled">>; _-> [] end},
-    {<<"multiple">>, case Record#select.multiple of true -> <<"multiple">>; _-> [] end} | Record#select.data_fields
+    
+    {<<"required">>,
+      case Record#select.required of
+        true -> <<"required">>;
+        _-> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#select.disabled of
+        true -> <<"disabled">>;
+        _-> []
+      end},
+    
+    {<<"multiple">>,
+      case Record#select.multiple of
+        true -> <<"multiple">>;
+        _-> []
+      end} | Record#select.data_fields
   ],
-  wf_tags:emit_tag(<<"select">>, nitro:render(Record#select.body),
-                                  Props);
+  
+  wf_tags:emit_tag(<<"select">>, nitro:render(Record#select.body), Props);
+
 render_element(Group = #optgroup{}) ->
-  wf_tags:emit_tag(<<"optgroup">>, nitro:render(Group#optgroup.body), [
-    {<<"disabled">>, case Group#optgroup.disabled of true-> <<"disabled">>; _-> [] end},
-    {<<"label">>, Group#optgroup.label}
-  ]);
+  wf_tags:emit_tag(<<"optgroup">>, nitro:render(Group#optgroup.body),
+    [{<<"disabled">>,
+       case Group#optgroup.disabled of
+         true-> <<"disabled">>;
+         _-> []
+       end},
+     
+     {<<"label">>, Group#optgroup.label}
+    ]);
+
 render_element(O = #option{}) ->
-  wf_tags:emit_tag(<<"option">>, nitro:render(O#option.body), lists:flatten([get_attrs(O) | O#option.data_fields])).
+  wf_tags:emit_tag(<<"option">>, nitro:render(O#option.body),
+    lists:flatten([get_attrs(O) | O#option.data_fields])).
+
 
 get_attrs(O) ->
   ValueAttr = case {O#option.selected, O#option.disabled} of
-                {true, _} -> <<"selected value">>;
-                {true, true} -> <<"selected disabled value">>;
-                {_, true} -> <<"disabled value">>;
-                _ -> <<"value">>
-              end,
-  [{<<"id">>, O#option.id},
+    {true, _} -> <<"selected value">>;
+    {true, true} -> <<"selected disabled value">>;
+    {_, true} -> <<"disabled value">>;
+    _ -> <<"value">>
+  end,
+  
+  [ {<<"id">>, O#option.id},
     {<<"label">>, O#option.label},
     {<<"title">>, O#option.title},
     {ValueAttr, O#option.value}
   ].
+

+ 117 - 37
src/elements/form/element_textarea.erl

@@ -1,41 +1,121 @@
 -module(element_textarea).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#textarea.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#textarea.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#textarea.accesskey},
-      {<<"class">>, Record#textarea.class},
-      {<<"contenteditable">>, case Record#textarea.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#textarea.contextmenu},
-      {<<"dir">>, case Record#textarea.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#textarea.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#textarea.dropzone},
-      {<<"hidden">>, case Record#textarea.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#textarea.id},
-      {<<"lang">>, Record#textarea.lang},
-      {<<"spellcheck">>, case Record#textarea.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#textarea.style},
-      {<<"tabindex">>, Record#textarea.tabindex},
-      {<<"title">>, Record#textarea.title},
-      {<<"translate">>, case Record#textarea.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autofocus">>,if Record#textarea.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"cols">>,Record#textarea.cols},
-      {<<"dirname">>,Record#textarea.dirname},      
-      {<<"disabled">>, if Record#textarea.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#textarea.form},
-      {<<"maxlength">>,Record#textarea.maxlength},      
-      {<<"name">>,Record#textarea.name},
-      {<<"placeholder">>,Record#textarea.placeholder},
-      {<<"readonly">>,if Record#textarea.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#textarea.required == true -> "required"; true -> [] end},
-      {<<"rows">>,Record#textarea.rows},      
-      {<<"form">>,Record#textarea.wrap},
-      {<<"value">>,Record#textarea.value},
-      {<<"wrap">>, case Record#textarea.wrap of "hard" -> "hard"; "soft" -> "soft"; _ -> [] end} | Record#textarea.data_fields
-    ],
-    wf_tags:emit_tag(<<"textarea">>, nitro:render(case Record#textarea.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#textarea.accesskey},
+    {<<"class">>, Record#textarea.class},
+    
+    {<<"contenteditable">>,
+      case Record#textarea.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#textarea.contextmenu},
+    
+    {<<"dir">>,
+      case Record#textarea.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#textarea.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#textarea.dropzone},
+    
+    {<<"hidden">>,
+      case Record#textarea.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#textarea.id},
+    {<<"lang">>, Record#textarea.lang},
+    
+    {<<"spellcheck">>,
+      case Record#textarea.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#textarea.style},
+    {<<"tabindex">>, Record#textarea.tabindex},
+    {<<"title">>, Record#textarea.title},
+    
+    {<<"translate">>,
+      case Record#textarea.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},    
+    
+    % spec
+    {<<"autofocus">>,
+      case Record#textarea.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"cols">>, Record#textarea.cols},
+    {<<"dirname">>, Record#textarea.dirname},
+    
+    {<<"disabled">>,
+      case Record#textarea.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#textarea.form},
+    {<<"maxlength">>, Record#textarea.maxlength},
+    {<<"name">>, Record#textarea.name},
+    {<<"placeholder">>, Record#textarea.placeholder},
+    
+    {<<"readonly">>,
+      case Record#textarea.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#textarea.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"rows">>, Record#textarea.rows},
+    {<<"form">>, Record#textarea.wrap},
+    {<<"value">>, Record#textarea.value},
+    
+    {<<"wrap">>,
+      case Record#textarea.wrap of
+        "hard" -> "hard";
+        "soft" -> "soft";
+        _ -> []
+      end} | Record#textarea.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"textarea">>, nitro:render(
+    case Record#textarea.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 16 - 10
src/elements/group/element_blockquote.erl

@@ -1,13 +1,19 @@
 -module (element_blockquote).
--author('Andrew Zadorozhny').
--include("nitro.hrl").
--compile(export_all).
+% author Andrew Zadorozhny
+
+-include_lib("nitro/include/nitro.hrl").
+
+-export([render_element/1]).
+
+
+render_element(Record) when Record#blockquote.show_if == false ->
+  [<<>>];
 
-render_element(Record) when Record#blockquote.show_if==false -> [<<>>];
 render_element(Record) ->
-  wf_tags:emit_tag(<<"blockquote">>, nitro:render(Record#blockquote.body), [
-      {<<"id">>, Record#blockquote.id},
-      {<<"class">>, Record#blockquote.class},
-      {<<"style">>, Record#blockquote.style},
-      {<<"cite">>, Record#blockquote.cite}  | Record#blockquote.data_fields
-  ]).
+  wf_tags:emit_tag(<<"blockquote">>, nitro:render(Record#blockquote.body),
+    [{<<"id">>, Record#blockquote.id},
+     {<<"class">>, Record#blockquote.class},
+     {<<"style">>, Record#blockquote.style},
+     {<<"cite">>, Record#blockquote.cite} | Record#blockquote.data_fields
+    ]).
+

+ 30 - 15
src/elements/group/element_dtl.erl

@@ -1,20 +1,35 @@
 -module(element_dtl).
--author('Maxim Sokhatsky').
--include("nitro.hrl").
--compile(export_all).
+% author Maxim Sokhatsky
+
+-include_lib("nitro/include/nitro.hrl").
+
+-export([render_element/1]).
+
+
+render_element(Record) when Record#dtl.show_if == false ->
+  [<<>>];
 
-render_element(Record) when Record#dtl.show_if==false -> [<<>>];
 render_element(Record=#dtl{}) ->
-    M = list_to_atom(nitro:to_list(Record#dtl.file) ++ "_view"),
-    %File = case code:lib_dir(nitro:to_atom(Record#dtl.app)) of
-                %{error,bad_name} -> nitro:to_list(Record#dtl.app);
-                %A -> A end ++ "/" ++ nitro:to_list(Record#dtl.folder)
-         %++ "/" ++ nitro:to_list(Record#dtl.file) ++ "." ++ nitro:to_list(Record#dtl.ext),
-    {ok,R} = render(M, Record#dtl.js_escape, [{K,nitro:render(V)} || {K,V} <- Record#dtl.bindings] ++
-        if Record#dtl.bind_script==true -> [{script,nitro:script()}]; true-> [] end),
-    R.
+  M = erlang:list_to_atom(nitro:to_list(Record#dtl.file) ++ "_view"),
+  
+  %File = case code:lib_dir(nitro:to_atom(Record#dtl.app)) of
+  %  {error, bad_name} -> nitro:to_list(Record#dtl.app);
+  %  A -> A
+  %end ++ "/" ++ nitro:to_list(Record#dtl.folder)
+  %  ++ "/" ++ nitro:to_list(Record#dtl.file) ++ "." ++ nitro:to_list(Record#dtl.ext),
+  
+  {ok, R} = render(M, Record#dtl.js_escape,
+    [{K, nitro:render(V)} || {K, V} <- Record#dtl.bindings] ++
+      case Record#dtl.bind_script of
+        true -> [{script, nitro:script()}];
+        _-> []
+      end),
+  R.
+
 
 render(M, true, Args) ->
-    {ok, R} = M:render(Args),
-    {ok, nitro:js_escape(R)};
-render(M, _, Args) -> M:render(Args).
+  {ok, R} = M:render(Args),
+  {ok, nitro:js_escape(R)};
+render(M, _, Args) ->
+  M:render(Args).
+

+ 77 - 24
src/elements/group/element_html.erl

@@ -1,28 +1,81 @@
 -module(element_html).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#html.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#html.show_if == false ->
+  [<<>>];
+
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#html.accesskey},
-      {<<"class">>, Record#html.class},
-      {<<"contenteditable">>, case Record#html.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#html.contextmenu},
-      {<<"dir">>, case Record#html.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#html.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#html.dropzone},
-      {<<"hidden">>, case Record#html.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#html.id},
-      {<<"lang">>, Record#html.lang},
-      {<<"spellcheck">>, case Record#html.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#html.style},
-      {<<"tabindex">>, Record#html.tabindex},
-      {<<"title">>, Record#html.title},
-      {<<"translate">>, case Record#html.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"manifest">>, Record#html.manifest} | Record#html.data_fields
-    ],
-    wf_tags:emit_tag(<<"html">>, nitro:render(case Record#html.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#html.accesskey},
+    {<<"class">>, Record#html.class},
+    
+    {<<"contenteditable">>,
+      case Record#html.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#html.contextmenu},
+    
+    {<<"dir">>,
+      case Record#html.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#html.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#html.dropzone},
+    
+    {<<"hidden">>,
+      case Record#html.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#html.id},
+    {<<"lang">>, Record#html.lang},
+    
+    {<<"spellcheck">>,
+      case Record#html.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#html.style},
+    {<<"tabindex">>, Record#html.tabindex},
+    {<<"title">>, Record#html.title},
+    
+    {<<"translate">>,
+      case Record#html.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"manifest">>, Record#html.manifest} | Record#html.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"html">>, nitro:render(
+    case Record#html.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 14 - 8
src/elements/group/element_li.erl

@@ -1,12 +1,18 @@
 -module(element_li).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#li.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#li.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-  wf_tags:emit_tag(<<"li">>, nitro:render(Record#li.body), [
-    {<<"class">>, Record#li.class},
-    {<<"id">>, Record#li.id},
-    {<<"style">>, Record#li.style} | Record#li.data_fields
-  ]).
+  wf_tags:emit_tag(<<"li">>, nitro:render(Record#li.body),
+    [{<<"class">>, Record#li.class},
+     {<<"id">>, Record#li.id},
+     {<<"style">>, Record#li.style} | Record#li.data_fields
+    ]).
+

+ 96 - 31
src/elements/group/element_script.erl

@@ -1,35 +1,100 @@
 -module(element_script).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#script.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#script.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#script.accesskey},
-      {<<"class">>, Record#script.class},
-      {<<"contenteditable">>, case Record#script.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#script.contextmenu},
-      {<<"dir">>, case Record#script.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#script.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#script.dropzone},
-      {<<"hidden">>, case Record#script.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#script.id},
-      {<<"lang">>, Record#script.lang},
-      {<<"spellcheck">>, case Record#script.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#script.style},
-      {<<"tabindex">>, Record#script.tabindex},
-      {<<"title">>, Record#script.title},
-      {<<"translate">>, case Record#script.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"async">>, if Record#script.async == true -> "async"; true -> [] end},
-      {<<"charset">>,Record#script.charset},
-      {<<"defer">>, if Record#script.defer == true -> "defer"; true -> [] end},
-      {<<"src">>,Record#script.src},
-      {<<"type">>,Record#script.type} | Record#script.data_fields
-    ],
-    wf_tags:emit_tag(<<"script">>,
-      case Record#script.src of
-           [] -> nitro:render(case Record#script.body of [] -> []; B -> B end);
-           _ -> [] end, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#script.accesskey},
+    {<<"class">>, Record#script.class},
+    
+    {<<"contenteditable">>,
+      case Record#script.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#script.contextmenu},
+    
+    {<<"dir">>,
+      case Record#script.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#script.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#script.dropzone},
+    
+    {<<"hidden">>,
+      case Record#script.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#script.id},
+    {<<"lang">>, Record#script.lang},
+    
+    {<<"spellcheck">>,
+      case Record#script.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#script.style},
+    {<<"tabindex">>, Record#script.tabindex},
+    {<<"title">>, Record#script.title},
+    
+    {<<"translate">>,
+      case Record#script.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"async">>,
+      case Record#script.async of
+        true -> "async";
+        _ -> []
+      end},
+    
+    {<<"charset">>, Record#script.charset},
+    
+    {<<"defer">>,
+      case Record#script.defer of
+        true -> "defer";
+        _ -> []
+      end},
+    
+    {<<"src">>, Record#script.src},
+    {<<"type">>, Record#script.type} | Record#script.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"script">>,
+    case Record#script.src of
+      [] ->
+        nitro:render(
+          case Record#script.body of
+            [] -> [];
+            B -> B
+          end);
+      _ -> []
+    end, List).
+

+ 122 - 41
src/elements/input/element_checkbox.erl

@@ -1,46 +1,127 @@
 -module(element_checkbox).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#checkbox.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#checkbox.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-    Id = case Record#checkbox.id of [] -> nitro:temp_id(); I->I end,
-    case Record#checkbox.postback of
-        [] -> ignore;
-        Postback -> nitro:wire(#event { type=change, postback=Postback, target=Id, source=[Id|Record#checkbox.source], delegate=Record#checkbox.delegate })
-    end,
-   Label = [ wf_tags:emit_tag(<<"input">>, [], [
-      % global
-      {<<"accesskey">>, Record#checkbox.accesskey},
-      {<<"class">>, Record#checkbox.class},
-      {<<"contenteditable">>, case Record#checkbox.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#checkbox.contextmenu},
-      {<<"dir">>, case Record#checkbox.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#checkbox.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#checkbox.dropzone},
-      {<<"hidden">>, case Record#checkbox.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#checkbox.lang},
-      {<<"spellcheck">>, case Record#checkbox.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#checkbox.style},
-      {<<"tabindex">>, Record#checkbox.tabindex},
-      {<<"title">>, Record#checkbox.title},
-      {<<"translate">>, case Record#checkbox.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autofocus">>,Record#checkbox.autofocus},
-      {<<"checked">>, if Record#checkbox.checked==true -> <<"checked">>; true -> [] end},
-      {<<"data-toggle">>, <<"checkbox">>},
-      {<<"disabled">>, if Record#checkbox.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>, Record#checkbox.form},
-      {<<"name">>, Record#checkbox.name},            
-      {<<"required">>, if Record#checkbox.required == true -> "required"; true -> [] end},
-      {<<"type">>, <<"checkbox">>},
-      {<<"value">>, Record#checkbox.value} | Record#checkbox.data_fields
-      ]),
-      case Record#checkbox.body of [] -> []; B -> B end ],
-    wf_tags:emit_tag(<<"label">>, nitro:render(Label), [
-        {<<"class">>, Record#checkbox.class},
-        {<<"style">>, Record#checkbox.style},
-        {<<"for">>, Id} ]).
+  Id = case Record#checkbox.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  
+  case Record#checkbox.postback of
+    [] -> ignore;
+    Postback ->
+      nitro:wire(#event{ type=change,
+                         postback=Postback,
+                         target=Id,
+                         source=[Id|Record#checkbox.source],
+                   delegate=Record#checkbox.delegate })
+  end,
+  
+  Label = [ wf_tags:emit_tag(<<"input">>, [], [
+    % global
+    {<<"accesskey">>, Record#checkbox.accesskey},
+    {<<"class">>, Record#checkbox.class},
+    
+    {<<"contenteditable">>,
+      case Record#checkbox.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#checkbox.contextmenu},
+    
+    {<<"dir">>,
+      case Record#checkbox.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#checkbox.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#checkbox.dropzone},
+    
+    {<<"hidden">>,
+      case Record#checkbox.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#checkbox.lang},
+    
+    {<<"spellcheck">>,
+      case Record#checkbox.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#checkbox.style},
+    {<<"tabindex">>, Record#checkbox.tabindex},
+    {<<"title">>, Record#checkbox.title},
+    
+    {<<"translate">>,
+      case Record#checkbox.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autofocus">>, Record#checkbox.autofocus},
+    
+    {<<"checked">>,
+      case Record#checkbox.checked of
+        true -> <<"checked">>;
+        _ -> []
+      end},
+    
+    {<<"data-toggle">>, <<"checkbox">>},
+    
+    {<<"disabled">>,
+      case Record#checkbox.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#checkbox.form},
+    {<<"name">>, Record#checkbox.name},      
+    
+    {<<"required">>, 
+      case Record#checkbox.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"type">>, <<"checkbox">>},
+    {<<"value">>, Record#checkbox.value} | Record#checkbox.data_fields ]),
+    
+    case Record#checkbox.body of
+      [] -> [];
+      B -> B
+    end
+  ],
+  
+  wf_tags:emit_tag(<<"label">>, nitro:render(Label),
+    [{<<"class">>, Record#checkbox.class},
+     {<<"style">>, Record#checkbox.style},
+     {<<"for">>, Id}
+    ]).
+

+ 107 - 40
src/elements/input/element_color.erl

@@ -1,45 +1,112 @@
 -module(element_color).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#color.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#color.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#color.postback of
-        [] -> Record#color.id;
-        Postback ->
-          ID = case Record#color.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#color.source, delegate=Record#color.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#color.accesskey},
-      {<<"class">>, Record#color.class},
-      {<<"contenteditable">>, case Record#color.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#color.contextmenu},
-      {<<"dir">>, case Record#color.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#color.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#color.dropzone},
-      {<<"hidden">>, case Record#color.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#color.lang},
-      {<<"spellcheck">>, case Record#color.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#color.style},
-      {<<"tabindex">>, Record#color.tabindex},
-      {<<"title">>, Record#color.title},
-      {<<"translate">>, case Record#color.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>,case Record#color.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#color.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#color.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#color.form},
-      {<<"list">>,Record#color.list},      
-      {<<"name">>,Record#color.name},
-      {<<"type">>, <<"color">>},
-      {<<"value">>, Record#color.value} | Record#color.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#color.body), List).
+  Id = case Record#color.postback of
+    [] -> Record#color.id;
+    Postback ->
+      ID = case Record#color.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#color.source, delegate=Record#color.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#color.accesskey},
+    {<<"class">>, Record#color.class},
+    
+    {<<"contenteditable">>,
+      case Record#color.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#color.contextmenu},
+    
+    {<<"dir">>,
+      case Record#color.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#color.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#color.dropzone},
+    
+    {<<"hidden">>,
+      case Record#color.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#color.lang},
+    
+    {<<"spellcheck">>,
+      case Record#color.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#color.style},
+    {<<"tabindex">>, Record#color.tabindex},
+    {<<"title">>, Record#color.title},
+    
+    {<<"translate">>,
+      case Record#color.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#color.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#color.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#color.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#color.form},
+    {<<"list">>, Record#color.list},
+    {<<"name">>, Record#color.name},
+    {<<"type">>, <<"color">>},
+    {<<"value">>, Record#color.value} | Record#color.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#color.body), List).
+

+ 123 - 45
src/elements/input/element_date.erl

@@ -1,50 +1,128 @@
 -module(element_date).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#date.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#date.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#date.postback of
-        [] -> Record#date.id;
-        Postback ->
-          ID = case Record#date.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#date.source, delegate=Record#date.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#date.accesskey},
-      {<<"class">>, Record#date.class},
-      {<<"contenteditable">>, case Record#date.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#date.contextmenu},
-      {<<"dir">>, case Record#date.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#date.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#date.dropzone},
-      {<<"hidden">>, case Record#date.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#date.lang},
-      {<<"spellcheck">>, case Record#date.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#date.style},
-      {<<"tabindex">>, Record#date.tabindex},
-      {<<"title">>, Record#date.title},
-      {<<"translate">>, case Record#date.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#date.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#date.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#date.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#date.form},
-      {<<"list">>,Record#date.list},
-      {<<"max">>,Record#date.max},
-      {<<"min">>,Record#date.min},
-      {<<"name">>,Record#date.name},
-      {<<"readonly">>,if Record#date.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#date.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#date.step},
-      {<<"type">>, <<"date">>},
-      {<<"value">>, Record#date.value} | Record#date.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#date.body), List).
+  Id = case Record#date.postback of
+    [] -> Record#date.id;
+    Postback ->
+      ID = case Record#date.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#date.source, delegate=Record#date.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#date.accesskey},
+    {<<"class">>, Record#date.class},
+    
+    {<<"contenteditable">>,
+      case Record#date.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#date.contextmenu},
+    
+    {<<"dir">>,
+      case Record#date.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#date.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#date.dropzone},
+    
+    {<<"hidden">>,
+      case Record#date.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#date.lang},
+    
+    {<<"spellcheck">>,
+      case Record#date.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#date.style},
+    {<<"tabindex">>, Record#date.tabindex},
+    {<<"title">>, Record#date.title},
+    
+    {<<"translate">>,
+      case Record#date.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#date.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#date.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#date.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#date.form},
+    {<<"list">>, Record#date.list},
+    {<<"max">>, Record#date.max},
+    {<<"min">>, Record#date.min},
+    {<<"name">>, Record#date.name},
+    
+    {<<"readonly">>,
+      case Record#date.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#date.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#date.step},
+    {<<"type">>, <<"date">>},
+    {<<"value">>, Record#date.value} | Record#date.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#date.body), List).
+

+ 123 - 45
src/elements/input/element_datetime.erl

@@ -1,50 +1,128 @@
 -module(element_datetime).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#datetime.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#datetime.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#datetime.postback of
-        [] -> Record#datetime.id;
-        Postback ->
-          ID = case Record#datetime.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#datetime.source, delegate=Record#datetime.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#datetime.accesskey},
-      {<<"class">>, Record#datetime.class},
-      {<<"contenteditable">>, case Record#datetime.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#datetime.contextmenu},
-      {<<"dir">>, case Record#datetime.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#datetime.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#datetime.dropzone},
-      {<<"hidden">>, case Record#datetime.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#datetime.lang},
-      {<<"spellcheck">>, case Record#datetime.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#datetime.style},
-      {<<"tabindex">>, Record#datetime.tabindex},
-      {<<"title">>, Record#datetime.title},
-      {<<"translate">>, case Record#datetime.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#datetime.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#datetime.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#datetime.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#datetime.form},
-      {<<"list">>,Record#datetime.list},
-      {<<"max">>,Record#datetime.max},
-      {<<"min">>,Record#datetime.min},
-      {<<"name">>,Record#datetime.name},
-      {<<"readonly">>,if Record#datetime.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#datetime.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#datetime.step},
-      {<<"type">>, <<"datetime">>},
-      {<<"value">>, Record#datetime.value} | Record#datetime.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#datetime.body), List).
+  Id = case Record#datetime.postback of
+    [] -> Record#datetime.id;
+    Postback ->
+      ID = case Record#datetime.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#datetime.source, delegate=Record#datetime.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#datetime.accesskey},
+    {<<"class">>, Record#datetime.class},
+    
+    {<<"contenteditable">>,
+      case Record#datetime.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#datetime.contextmenu},
+    
+    {<<"dir">>,
+      case Record#datetime.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#datetime.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#datetime.dropzone},
+    
+    {<<"hidden">>,
+      case Record#datetime.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#datetime.lang},
+    
+    {<<"spellcheck">>,
+      case Record#datetime.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#datetime.style},
+    {<<"tabindex">>, Record#datetime.tabindex},
+    {<<"title">>, Record#datetime.title},
+    
+    {<<"translate">>,
+      case Record#datetime.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#datetime.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#datetime.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#datetime.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#datetime.form},
+    {<<"list">>, Record#datetime.list},
+    {<<"max">>, Record#datetime.max},
+    {<<"min">>, Record#datetime.min},
+    {<<"name">>, Record#datetime.name},
+    
+    {<<"readonly">>,
+      case Record#datetime.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#datetime.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#datetime.step},
+    {<<"type">>, <<"datetime">>},
+    {<<"value">>, Record#datetime.value} | Record#datetime.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#datetime.body), List).
+

+ 123 - 45
src/elements/input/element_datetime_local.erl

@@ -1,50 +1,128 @@
 -module(element_datetime_local).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#datetime_local.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#datetime_local.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#datetime_local.postback of
-        [] -> Record#datetime_local.id;
-        Postback ->
-          ID = case Record#datetime_local.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#datetime_local.source, delegate=Record#datetime_local.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#datetime_local.accesskey},
-      {<<"class">>, Record#datetime_local.class},
-      {<<"contenteditable">>, case Record#datetime_local.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#datetime_local.contextmenu},
-      {<<"dir">>, case Record#datetime_local.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#datetime_local.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#datetime_local.dropzone},
-      {<<"hidden">>, case Record#datetime_local.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#datetime_local.lang},
-      {<<"spellcheck">>, case Record#datetime_local.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#datetime_local.style},
-      {<<"tabindex">>, Record#datetime_local.tabindex},
-      {<<"title">>, Record#datetime_local.title},
-      {<<"translate">>, case Record#datetime_local.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#datetime_local.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#datetime_local.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#datetime_local.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#datetime_local.form},
-      {<<"list">>,Record#datetime_local.list},
-      {<<"max">>,Record#datetime_local.max},
-      {<<"min">>,Record#datetime_local.min},
-      {<<"name">>,Record#datetime_local.name},
-      {<<"readonly">>,if Record#datetime_local.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#datetime_local.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#datetime_local.step},
-      {<<"type">>, <<"datetime-local">>},
-      {<<"value">>, Record#datetime_local.value} | Record#datetime_local.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#datetime_local.body), List).
+  Id = case Record#datetime_local.postback of
+    [] -> Record#datetime_local.id;
+    Postback ->
+      ID = case Record#datetime_local.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#datetime_local.source, delegate=Record#datetime_local.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#datetime_local.accesskey},
+    {<<"class">>, Record#datetime_local.class},
+    
+    {<<"contenteditable">>,
+      case Record#datetime_local.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#datetime_local.contextmenu},
+    
+    {<<"dir">>,
+      case Record#datetime_local.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#datetime_local.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#datetime_local.dropzone},
+    
+    {<<"hidden">>,
+      case Record#datetime_local.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#datetime_local.lang},
+    
+    {<<"spellcheck">>,
+      case Record#datetime_local.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#datetime_local.style},
+    {<<"tabindex">>, Record#datetime_local.tabindex},
+    {<<"title">>, Record#datetime_local.title},
+    
+    {<<"translate">>,
+      case Record#datetime_local.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#datetime_local.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#datetime_local.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#datetime_local.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#datetime_local.form},
+    {<<"list">>, Record#datetime_local.list},
+    {<<"max">>, Record#datetime_local.max},
+    {<<"min">>, Record#datetime_local.min},
+    {<<"name">>, Record#datetime_local.name},
+    
+    {<<"readonly">>,
+      case Record#datetime_local.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#datetime_local.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#datetime_local.step},
+    {<<"type">>, <<"datetime-local">>},
+    {<<"value">>, Record#datetime_local.value} | Record#datetime_local.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#datetime_local.body), List).
+

+ 43 - 22
src/elements/input/element_dropdown.erl

@@ -1,29 +1,50 @@
 -module(element_dropdown).
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#dropdown.show_if==false -> [<<>>];
-render_element(Record = #dropdown{}) -> 
-    ID = case Record#dropdown.id of [] -> nitro:temp_id(); I->I end,
-    case Record#dropdown.postback of
-         [] -> skip;
-         Postback -> nitro:wire(#event { type=change, postback=Postback, target=ID,
-                        source=Record#dropdown.source, delegate=Record#dropdown.delegate } ) end,
+-export([render_element/1]).
+
 
-    Opts = [wf_tags:emit_tag(<<"option">>, [O#option.label], [
-      {<<"disabled">>, O#option.disabled},
-      {<<"label">>, O#option.label},
-      {<<"selected">>, case O#option.selected of true -> <<"selected">>; _-> [] end},
-      {<<"value">>, O#option.value}
-    ])|| O = #option{show_if=Visible} <- Record#dropdown.options, Visible == true],
+render_element(Record) when Record#dropdown.show_if == false ->
+  [<<>>];
 
-    wf_tags:emit_tag(<<"select">>, Opts, [
-        {<<"id">>, Record#dropdown.id},
-        {<<"class">>, Record#dropdown.class},
-        {<<"style">>, Record#dropdown.style},
-        {<<"name">>, Record#dropdown.name},
-        {<<"disabled">>, case Record#dropdown.disabled of true -> <<"disabled">>; _-> [] end},
-        {<<"multiple">>, case Record#dropdown.multiple of true -> <<"multiple">>; _-> [] end}|
-        Record#dropdown.data_fields
+render_element(Record = #dropdown{}) -> 
+  ID = case Record#dropdown.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  case Record#dropdown.postback of
+    [] -> skip;
+    Postback -> nitro:wire(#event{ type=change, postback=Postback, target=ID,
+                  source=Record#dropdown.source, delegate=Record#dropdown.delegate })
+  end,
+  
+  Opts = [wf_tags:emit_tag(<<"option">>, [O#option.label],
+    [{<<"disabled">>, O#option.disabled},
+     {<<"label">>, O#option.label},
+     {<<"selected">>,
+       case O#option.selected of
+         true -> <<"selected">>;
+         _-> []
+       end},
+     {<<"value">>, O#option.value}
+    ]) || O = #option{show_if=Visible} <- Record#dropdown.options, Visible == true],
+  
+  wf_tags:emit_tag(<<"select">>, Opts,
+    [{<<"id">>, Record#dropdown.id},
+     {<<"class">>, Record#dropdown.class},
+     {<<"style">>, Record#dropdown.style},
+     {<<"name">>, Record#dropdown.name},
+     {<<"disabled">>,
+       case Record#dropdown.disabled of
+         true -> <<"disabled">>;
+         _-> []
+       end},
+     {<<"multiple">>,
+       case Record#dropdown.multiple of
+         true -> <<"multiple">>;
+         _-> []
+       end} | Record#dropdown.data_fields
     ]).
+

+ 130 - 46
src/elements/input/element_email.erl

@@ -1,52 +1,136 @@
 -module(element_email).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#email.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#email.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#email.postback of
-        [] -> Record#email.id;
-        Postback ->
-          ID = case Record#email.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
+  Id = case Record#email.postback of
+    [] -> Record#email.id;
+    Postback ->
+      ID = case Record#email.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
                   source=Record#email.source, delegate=Record#email.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#email.accesskey},
-      {<<"class">>, Record#email.class},
-      {<<"contenteditable">>, case Record#email.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#email.contextmenu},
-      {<<"dir">>, case Record#email.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#email.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#email.dropzone},
-      {<<"hidden">>, case Record#email.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#email.lang},
-      {<<"spellcheck">>, case Record#email.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#email.style},
-      {<<"tabindex">>, Record#email.tabindex},
-      {<<"title">>, Record#email.title},
-      {<<"translate">>, case Record#email.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#email.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#email.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#email.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#email.form},
-      {<<"list">>,Record#email.list},
-      {<<"maxlength">>,Record#email.maxlength},
-      {<<"multiple">>,if Record#email.multiple == true -> "multiple"; true -> [] end},
-      {<<"name">>,Record#email.name},
-      {<<"pattern">>,Record#email.pattern},
-      {<<"placeholder">>,Record#email.placeholder},
-      {<<"readonly">>,if Record#email.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#email.required == true -> "required"; true -> [] end}, 
-      {<<"size">>,Record#email.size},
-      {<<"type">>, <<"email">>},
-      {<<"value">>, Record#email.value} | Record#email.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#email.body), List).
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#email.accesskey},
+    {<<"class">>, Record#email.class},
+    
+    {<<"contenteditable">>,
+      case Record#email.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#email.contextmenu},
+    
+    {<<"dir">>,
+      case Record#email.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#email.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#email.dropzone},
+    
+    {<<"hidden">>,
+      case Record#email.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#email.lang},
+    
+    {<<"spellcheck">>,
+      case Record#email.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#email.style},
+    {<<"tabindex">>, Record#email.tabindex},
+    {<<"title">>, Record#email.title},
+    
+    {<<"translate">>,
+      case Record#email.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#email.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#email.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#email.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#email.form},
+    {<<"list">>, Record#email.list},
+    {<<"maxlength">>, Record#email.maxlength},
+    
+    {<<"multiple">>,
+      case Record#email.multiple of
+        true -> "multiple";
+        _ -> []
+      end},
+    
+    {<<"name">>, Record#email.name},
+    {<<"pattern">>, Record#email.pattern},
+    {<<"placeholder">>, Record#email.placeholder},
+    
+    {<<"readonly">>,
+      case Record#email.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#email.required of
+        true -> "required";
+        _ -> []
+      end}, 
+    
+    {<<"size">>, Record#email.size},
+    {<<"type">>, <<"email">>},
+    {<<"value">>, Record#email.value} | Record#email.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#email.body), List).
+

+ 114 - 40
src/elements/input/element_file.erl

@@ -1,45 +1,119 @@
 -module(element_file).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#file.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#file.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#file.postback of
-        [] -> Record#file.id;
-        Postback ->
-          ID = case Record#file.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#file.source, delegate=Record#file.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#file.accesskey},
-      {<<"class">>, Record#file.class},
-      {<<"contenteditable">>, case Record#file.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#file.contextmenu},
-      {<<"dir">>, case Record#file.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#file.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#file.dropzone},
-      {<<"hidden">>, case Record#file.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#file.lang},
-      {<<"spellcheck">>, case Record#file.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#file.style},
-      {<<"tabindex">>, Record#file.tabindex},
-      {<<"title">>, Record#file.title},
-      {<<"translate">>, case Record#file.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"accept">>,Record#file.accept},
-      {<<"autofocus">>,if Record#file.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#file.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#file.form},
-      {<<"multiple">>,if Record#file.multiple == true -> "multiple"; true -> [] end},
-      {<<"name">>,Record#file.name},
-      {<<"required">>,if Record#file.required == true -> "required"; true -> [] end}, 
-      {<<"type">>, <<"file">>} | Record#file.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#file.body), List).
+  Id = case Record#file.postback of
+    [] -> Record#file.id;
+    Postback ->
+      ID = case Record#file.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+                 source=Record#file.source, delegate=Record#file.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#file.accesskey},
+    {<<"class">>, Record#file.class},
+    
+    {<<"contenteditable">>,
+      case Record#file.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#file.contextmenu},
+    
+    {<<"dir">>,
+      case Record#file.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#file.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#file.dropzone},
+    
+    {<<"hidden">>,
+      case Record#file.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#file.lang},
+    
+    {<<"spellcheck">>,
+      case Record#file.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#file.style},
+    {<<"tabindex">>, Record#file.tabindex},
+    {<<"title">>, Record#file.title},
+    
+    {<<"translate">>,
+      case Record#file.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"accept">>, Record#file.accept},
+    
+    {<<"autofocus">>,
+      case Record#file.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#file.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#file.form},
+    
+    {<<"multiple">>,
+      case Record#file.multiple of
+        true -> "multiple";
+        _ -> []
+      end},
+    
+    {<<"name">>, Record#file.name},
+    
+    {<<"required">>,
+      case Record#file.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"type">>, <<"file">>} | Record#file.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#file.body), List).
+

+ 81 - 28
src/elements/input/element_hidden.erl

@@ -1,32 +1,85 @@
 -module(element_hidden).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#hidden.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#hidden.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#hidden.accesskey},
-      {<<"class">>, Record#hidden.class},
-      {<<"contenteditable">>, case Record#hidden.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#hidden.contextmenu},
-      {<<"dir">>, case Record#hidden.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#hidden.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#hidden.dropzone},
-      {<<"hidden">>, case Record#hidden.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#hidden.id},
-      {<<"lang">>, Record#hidden.lang},
-      {<<"spellcheck">>, case Record#hidden.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#hidden.style},
-      {<<"tabindex">>, Record#hidden.tabindex},
-      {<<"title">>, Record#hidden.title},
-      {<<"translate">>, case Record#hidden.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"disabled">>, if Record#hidden.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#hidden.form},
-      {<<"name">>,Record#hidden.name},
-      {<<"type">>, <<"hidden">>},
-      {<<"value">>, Record#hidden.value} | Record#hidden.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#hidden.body), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#hidden.accesskey},
+    {<<"class">>, Record#hidden.class},
+    
+    {<<"contenteditable">>,
+      case Record#hidden.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#hidden.contextmenu},
+    
+    {<<"dir">>,
+      case Record#hidden.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#hidden.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#hidden.dropzone},
+    
+    {<<"hidden">>,
+      case Record#hidden.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#hidden.id},
+    {<<"lang">>, Record#hidden.lang},
+    
+    {<<"spellcheck">>,
+      case Record#hidden.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#hidden.style},
+    {<<"tabindex">>, Record#hidden.tabindex},
+    {<<"title">>, Record#hidden.title},
+    
+    {<<"translate">>,
+      case Record#hidden.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"disabled">>,
+      case Record#hidden.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#hidden.form},
+    {<<"name">>, Record#hidden.name},
+    {<<"type">>, <<"hidden">>},
+    {<<"value">>, Record#hidden.value} | Record#hidden.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#hidden.body), List).
+

+ 128 - 53
src/elements/input/element_input.erl

@@ -1,58 +1,133 @@
 -module(element_input).
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#input.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#input.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#input.postback of
-        [] -> Record#input.id;
-        undefined -> Record#input.id;
-        Postback ->
-          ID = case Record#input.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#input.source, delegate=Record#input.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#input.accesskey},
-      {<<"class">>, Record#input.class},
-      {<<"contenteditable">>, case Record#input.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#input.contextmenu},
-      {<<"dir">>, case Record#input.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#input.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#input.dropzone},
-      {<<"hidden">>, case Record#input.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#input.lang},
-      {<<"spellcheck">>, case Record#input.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#input.style},
-      {<<"tabindex">>, Record#input.tabindex},
-      {<<"title">>, Record#input.title},
-      {<<"translate">>, case Record#input.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},
-      % spec
-      {<<"autocomplete">>,Record#input.autocomplete},
-      {<<"autofocus">>,Record#input.autofocus},
-      {<<"disabled">>, if Record#input.disabled == true -> "disabled"; true -> [] end},
-      {<<"name">>,Record#input.name},
-      {<<"type">>, Record#input.type},
-      {<<"accept">>, Record#input.accept},
-      {<<"max">>, Record#input.max},
-      {<<"checked">>, if Record#input.checked == true -> true; true -> [] end},
-      {<<"aria-states">>, Record#input.aria_states},
-      {<<"placeholder">>,Record#input.placeholder},
-      {<<"min">>, Record#input.min},
-      {<<"multiple">>, Record#input.multiple},
-      {<<"pattern">>, Record#input.pattern},
-      {<<"value">>, Record#input.value},
-      {<<"data-bind">>, case Record#input.bind of [] -> []; X -> base64:encode(term_to_binary(X)) end},
-      {<<"onkeypress">>, Record#input.onkeypress},
-      {<<"onkeyup">>, Record#input.onkeyup},
-      {<<"onkeydown">>, Record#input.onkeydown},
-      {<<"onclick">>, Record#input.onclick},
-      {<<"required">>, if Record#input.required == true -> "required"; true -> [] end},
-      {<<"onchange">>, Record#input.onchange} | Record#input.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#input.body), List).
+  Id = case Record#input.postback of
+    [] -> Record#input.id;
+    undefined -> Record#input.id;
+    Postback ->
+      ID = case Record#input.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#input.source, delegate=Record#input.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#input.accesskey},
+    {<<"class">>, Record#input.class},
+    
+    {<<"contenteditable">>,
+      case Record#input.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#input.contextmenu},
+    
+    {<<"dir">>,
+      case Record#input.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#input.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#input.dropzone},
+    
+    {<<"hidden">>,
+      case Record#input.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#input.lang},
+    
+    {<<"spellcheck">>,
+      case Record#input.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#input.style},
+    {<<"tabindex">>, Record#input.tabindex},
+    {<<"title">>, Record#input.title},
+    
+    {<<"translate">>,
+      case Record#input.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>, Record#input.autocomplete},
+    {<<"autofocus">>, Record#input.autofocus},
+    
+    {<<"disabled">>,
+      case Record#input.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"name">>, Record#input.name},
+    {<<"type">>, Record#input.type},
+    {<<"accept">>, Record#input.accept},
+    {<<"max">>, Record#input.max},
+    
+    {<<"checked">>,
+      case Record#input.checked of
+        true -> true;
+        _ -> []
+      end},
+    
+    {<<"aria-states">>, Record#input.aria_states},
+    {<<"placeholder">>, Record#input.placeholder},
+    {<<"min">>, Record#input.min},
+    {<<"multiple">>, Record#input.multiple},
+    {<<"pattern">>, Record#input.pattern},
+    {<<"value">>, Record#input.value},
+    
+    {<<"data-bind">>,
+      case Record#input.bind of
+        [] -> [];
+        X -> base64:encode(erlang:term_to_binary(X))
+      end},
+    
+    {<<"onkeypress">>, Record#input.onkeypress},
+    {<<"onkeyup">>, Record#input.onkeyup},
+    {<<"onkeydown">>, Record#input.onkeydown},
+    {<<"onclick">>, Record#input.onclick},
+    
+    {<<"required">>,
+      case Record#input.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"onchange">>, Record#input.onchange} | Record#input.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#input.body), List).
+

+ 94 - 37
src/elements/input/element_input_button.erl

@@ -1,42 +1,99 @@
 -module(element_input_button).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#input_button.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#input_button.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#input_button.postback of
-        [] -> Record#input_button.id;
-        Postback ->
-          ID = case Record#input_button.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#input_button.source, delegate=Record#input_button.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#input_button.accesskey},
-      {<<"class">>, Record#input_button.class},
-      {<<"contenteditable">>, case Record#input_button.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#input_button.contextmenu},
-      {<<"dir">>, case Record#input_button.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#input_button.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#input_button.dropzone},
-      {<<"hidden">>, case Record#input_button.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#input_button.lang},
-      {<<"spellcheck">>, case Record#input_button.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#input_button.style},
-      {<<"tabindex">>, Record#input_button.tabindex},
-      {<<"title">>, Record#input_button.title},
-      {<<"translate">>, case Record#input_button.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autofocus">>,Record#input_button.autofocus},
-      {<<"disabled">>, if Record#input_button.disabled == true -> "disabled"; true -> [] end},
-      {<<"name">>,Record#input_button.name},
-      {<<"type">>, <<"button">>},
-      {<<"value">>, Record#input_button.value} | Record#input_button.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_button.body), List).
+  Id = case Record#input_button.postback of
+    [] -> Record#input_button.id;
+    Postback ->
+      ID = case Record#input_button.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#input_button.source, delegate=Record#input_button.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#input_button.accesskey},
+    {<<"class">>, Record#input_button.class},
+    
+    {<<"contenteditable">>,
+      case Record#input_button.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#input_button.contextmenu},
+    
+    {<<"dir">>,
+      case Record#input_button.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#input_button.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#input_button.dropzone},
+    
+    {<<"hidden">>,
+      case Record#input_button.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#input_button.lang},
+    
+    {<<"spellcheck">>,
+      case Record#input_button.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#input_button.style},
+    {<<"tabindex">>, Record#input_button.tabindex},
+    {<<"title">>, Record#input_button.title},
+    
+    {<<"translate">>,
+      case Record#input_button.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},    
+    
+    % spec
+    {<<"autofocus">>, Record#input_button.autofocus},
+    
+    {<<"disabled">>,
+      case Record#input_button.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"name">>, Record#input_button.name},
+    {<<"type">>, <<"button">>},
+    {<<"value">>, Record#input_button.value} | Record#input_button.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_button.body), List).
+

+ 108 - 46
src/elements/input/element_input_image.erl

@@ -1,51 +1,113 @@
 -module(element_input_image).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#input_image.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#input_image.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#input_image.postback of
-        [] -> Record#input_image.id;
-        Postback ->
-          ID = case Record#input_image.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#input_image.source, delegate=Record#input_image.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#input_image.accesskey},
-      {<<"class">>, Record#input_image.class},
-      {<<"contenteditable">>, case Record#input_image.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#input_image.contextmenu},
-      {<<"dir">>, case Record#input_image.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#input_image.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#input_image.dropzone},
-      {<<"hidden">>, case Record#input_image.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#input_image.lang},
-      {<<"spellcheck">>, case Record#input_image.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#input_image.style},
-      {<<"tabindex">>, Record#input_image.tabindex},
-      {<<"title">>, Record#input_image.title},
-      {<<"translate">>, case Record#input_image.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"alt">>,Record#input_image.alt},
-      {<<"autofocus">>,if Record#input_image.autofocus == true -> "autofocus"; true -> [] end},      
-      {<<"disabled">>, if Record#input_image.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#input_image.form},
-      {<<"formaction">>,Record#input_image.formaction},
-      {<<"formenctype">>,Record#input_image.formenctype},
-      {<<"formmethod">>,Record#input_image.formmethod},
-      {<<"formnovalue">>,Record#input_image.formnovalue},
-      {<<"formtarget">>,Record#input_image.formtarget},
-      {<<"height">>,Record#input_image.height},
-      {<<"name">>,Record#input_image.name},
-      {<<"src">>,Record#input_image.src},
-      {<<"type">>, <<"image">>},
-      {<<"width">>,Record#input_image.width} | Record#input_image.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_image.body), List).
+  Id = case Record#input_image.postback of
+    [] -> Record#input_image.id;
+    Postback ->
+      ID = case Record#input_image.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#input_image.source, delegate=Record#input_image.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#input_image.accesskey},
+    {<<"class">>, Record#input_image.class},
+    
+    {<<"contenteditable">>,
+      case Record#input_image.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#input_image.contextmenu},
+    
+    {<<"dir">>,
+      case Record#input_image.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#input_image.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#input_image.dropzone},
+    
+    {<<"hidden">>,
+      case Record#input_image.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#input_image.lang},
+    
+    {<<"spellcheck">>,
+      case Record#input_image.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#input_image.style},
+    {<<"tabindex">>, Record#input_image.tabindex},
+    {<<"title">>, Record#input_image.title},
+    
+    {<<"translate">>,
+      case Record#input_image.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},    
+    
+    % spec
+    {<<"alt">>, Record#input_image.alt},
+    
+    {<<"autofocus">>,
+      case Record#input_image.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#input_image.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#input_image.form},
+    {<<"formaction">>, Record#input_image.formaction},
+    {<<"formenctype">>, Record#input_image.formenctype},
+    {<<"formmethod">>, Record#input_image.formmethod},
+    {<<"formnovalue">>, Record#input_image.formnovalue},
+    {<<"formtarget">>, Record#input_image.formtarget},
+    {<<"height">>, Record#input_image.height},
+    {<<"name">>, Record#input_image.name},
+    {<<"src">>, Record#input_image.src},
+    {<<"type">>, <<"image">>},
+    {<<"width">>, Record#input_image.width} | Record#input_image.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_image.body), List).
+

+ 123 - 45
src/elements/input/element_input_time.erl

@@ -1,50 +1,128 @@
 -module(element_input_time).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#input_time.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#input_time.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#input_time.postback of
-        [] -> Record#input_time.id;
-        Postback ->
-          ID = case Record#input_time.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#input_time.source, delegate=Record#input_time.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#input_time.accesskey},
-      {<<"class">>, Record#input_time.class},
-      {<<"contenteditable">>, case Record#input_time.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#input_time.contextmenu},
-      {<<"dir">>, case Record#input_time.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#input_time.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#input_time.dropzone},
-      {<<"hidden">>, case Record#input_time.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#input_time.lang},
-      {<<"spellcheck">>, case Record#input_time.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#input_time.style},
-      {<<"tabindex">>, Record#input_time.tabindex},
-      {<<"title">>, Record#input_time.title},
-      {<<"translate">>, case Record#input_time.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#input_time.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#input_time.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#input_time.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#input_time.form},
-      {<<"list">>,Record#input_time.list},
-      {<<"max">>,Record#input_time.max},
-      {<<"min">>,Record#input_time.min},
-      {<<"name">>,Record#input_time.name},
-      {<<"readonly">>,if Record#input_time.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#input_time.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#input_time.step},
-      {<<"type">>, <<"time">>},
-      {<<"value">>, Record#input_time.value} | Record#input_time.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_time.body), List).
+  Id = case Record#input_time.postback of
+    [] -> Record#input_time.id;
+    Postback ->
+      ID = case Record#input_time.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#input_time.source, delegate=Record#input_time.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#input_time.accesskey},
+    {<<"class">>, Record#input_time.class},
+    
+    {<<"contenteditable">>,
+      case Record#input_time.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#input_time.contextmenu},
+    
+    {<<"dir">>,
+      case Record#input_time.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#input_time.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#input_time.dropzone},
+    
+    {<<"hidden">>,
+      case Record#input_time.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#input_time.lang},
+    
+    {<<"spellcheck">>,
+      case Record#input_time.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#input_time.style},
+    {<<"tabindex">>, Record#input_time.tabindex},
+    {<<"title">>, Record#input_time.title},
+    
+    {<<"translate">>,
+      case Record#input_time.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},    
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#input_time.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#input_time.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#input_time.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#input_time.form},
+    {<<"list">>, Record#input_time.list},
+    {<<"max">>, Record#input_time.max},
+    {<<"min">>, Record#input_time.min},
+    {<<"name">>, Record#input_time.name},
+    
+    {<<"readonly">>,
+      case Record#input_time.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#input_time.required of
+        true -> "required";
+        _ -> []
+      end},    
+    
+    {<<"step">>, Record#input_time.step},
+    {<<"type">>, <<"time">>},
+    {<<"value">>, Record#input_time.value} | Record#input_time.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#input_time.body), List).
+

+ 93 - 39
src/elements/input/element_link.erl

@@ -1,44 +1,98 @@
 -module(element_link).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#link.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#link.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-    Id = case Record#link.postback of
-        [] -> Record#link.id;
-        Postback ->
-            ID = case Record#link.id of [] -> nitro:temp_id(); I -> I end,
-            nitro:wire(#event{ type=click,postback=Postback,target=ID,
-                            source=Record#link.source,delegate=Record#link.delegate,validation=Record#link.validate}),
-            ID end,
-    List = [
-      % global
-      {<<"accesskey">>, Record#link.accesskey},
-      {<<"class">>, Record#link.class},
-      {<<"contenteditable">>, case Record#link.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#link.contextmenu},
-      {<<"dir">>, case Record#link.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#link.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#link.dropzone},
-      {<<"hidden">>, case Record#link.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#link.lang},
-      {<<"spellcheck">>, case Record#link.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#link.style},
-      {<<"tabindex">>, Record#link.tabindex},
-      {<<"title">>, Record#link.title},
-      {<<"translate">>, case Record#link.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"href">>, nitro:coalesce([Record#link.href,Record#link.url])},
-      {<<"hreflang">>, Record#link.hreflang},
-      {<<"target">>, Record#link.target},
-      {<<"media">>, Record#link.media},
-      {<<"rel">>, Record#link.rel},
-      {<<"type">>, Record#link.type},
-      {<<"download">>, Record#link.download},
-      {<<"name">>, Record#link.name},
-      {<<"onclick">>, Record#link.onclick},
-      {<<"onmouseover">>, Record#link.onmouseover} | Record#link.data_fields ],
-    wf_tags:emit_tag(<<"a">>, nitro:render(Record#link.body), List).
+  Id = case Record#link.postback of
+    [] -> Record#link.id;
+    Postback ->
+      ID = case Record#link.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{ type=click,postback=Postback,target=ID,
+              source=Record#link.source,delegate=Record#link.delegate,validation=Record#link.validate}),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#link.accesskey},
+    {<<"class">>, Record#link.class},
+    
+    {<<"contenteditable">>,
+      case Record#link.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#link.contextmenu},
+    
+    {<<"dir">>,
+      case Record#link.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#link.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#link.dropzone},
+    
+    {<<"hidden">>,
+      case Record#link.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#link.lang},
+    
+    {<<"spellcheck">>,
+      case Record#link.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#link.style},
+    {<<"tabindex">>, Record#link.tabindex},
+    {<<"title">>, Record#link.title},
+    
+    {<<"translate">>,
+      case Record#link.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"href">>, nitro:coalesce([Record#link.href, Record#link.url])},
+    {<<"hreflang">>, Record#link.hreflang},
+    {<<"target">>, Record#link.target},
+    {<<"media">>, Record#link.media},
+    {<<"rel">>, Record#link.rel},
+    {<<"type">>, Record#link.type},
+    {<<"download">>, Record#link.download},
+    {<<"name">>, Record#link.name},
+    {<<"onclick">>, Record#link.onclick},
+    {<<"onmouseover">>, Record#link.onmouseover} | Record#link.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"a">>, nitro:render(Record#link.body), List).
+

+ 18 - 10
src/elements/input/element_list.erl

@@ -1,15 +1,23 @@
 -module(element_list).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#list.show_if==false -> [<<>>];
-render_element(Record = #list{}) -> 
-  Tag = case Record#list.numbered of true -> <<"ol">>; _ -> <<"ul">> end,
+-export([render_element/1]).
+
+
+render_element(Record) when Record#list.show_if == false ->
+  [<<>>];
 
-  wf_tags:emit_tag(Tag, nitro:render(Record#list.body), [
-    {<<"id">>, Record#list.id},
-    {<<"class">>, Record#list.class},
-    {<<"style">>, Record#list.style} | Record#list.data_fields
-  ]).
+render_element(Record = #list{}) ->
+  Tag = case Record#list.numbered of
+    true -> <<"ol">>;
+    _ -> <<"ul">>
+  end,
+  
+  wf_tags:emit_tag(Tag, nitro:render(Record#list.body),
+    [{<<"id">>, Record#list.id},
+     {<<"class">>, Record#list.class},
+     {<<"style">>, Record#list.style} | Record#list.data_fields
+    ]).
 

+ 15 - 7
src/elements/input/element_literal.erl

@@ -1,11 +1,19 @@
 -module(element_literal).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#literal.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#literal.show_if == false ->
+  [<<>>];
+
 render_element(Record = #literal{}) ->
-	case Record#literal.html_encode of
-		true -> nitro:html_encode(Record#literal.body);
-		_    -> Record#literal.body
-	end.
+  case Record#literal.html_encode of
+    true ->
+      nitro:html_encode(Record#literal.body);
+    _ ->
+      Record#literal.body
+  end.
+

+ 116 - 43
src/elements/input/element_month.erl

@@ -1,49 +1,122 @@
 -module(element_month).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#month.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#month.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#month.postback of
-        [] -> Record#month.id;
-        Postback ->
-          ID = case Record#month.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
+  Id = case Record#month.postback of
+    [] -> Record#month.id;
+    Postback ->
+      ID = case Record#month.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
                   source=Record#month.source, delegate=Record#month.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#month.accesskey},
-      {<<"class">>, Record#month.class},
-      {<<"contenteditable">>, case Record#month.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#month.contextmenu},
-      {<<"dir">>, case Record#month.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#month.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#month.dropzone},
-      {<<"hidden">>, case Record#month.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#month.lang},
-      {<<"spellcheck">>, case Record#month.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#month.style},
-      {<<"tabindex">>, Record#month.tabindex},
-      {<<"title">>, Record#month.title},
-      {<<"translate">>, case Record#month.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"alt">>,Record#month.alt},
-      {<<"autofocus">>,if Record#month.autofocus == true -> "autofocus"; true -> [] end},            
-      {<<"disabled">>, if Record#month.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#month.form},
-      {<<"max">>,Record#month.max},
-      {<<"min">>,Record#month.min},      
-      {<<"name">>,Record#month.name},
-      {<<"readonly">>,if Record#month.readonly == true -> "readonly"; true -> [] end},      
-      {<<"required">>,if Record#month.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#month.step},
-      {<<"type">>, <<"month">>},
-      {<<"value">>, Record#month.value} | Record#month.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#month.body), List).
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#month.accesskey},
+    {<<"class">>, Record#month.class},
+    
+    {<<"contenteditable">>,
+      case Record#month.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#month.contextmenu},
+    
+    {<<"dir">>,
+      case Record#month.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#month.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#month.dropzone},
+    
+    {<<"hidden">>,
+      case Record#month.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#month.lang},
+    
+    {<<"spellcheck">>,
+      case Record#month.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#month.style},
+    {<<"tabindex">>, Record#month.tabindex},
+    {<<"title">>, Record#month.title},
+    
+    {<<"translate">>,
+      case Record#month.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"alt">>, Record#month.alt},
+    
+    {<<"autofocus">>,
+      case Record#month.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#month.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#month.form},
+    {<<"max">>, Record#month.max},
+    {<<"min">>, Record#month.min},
+    {<<"name">>, Record#month.name},
+    
+    {<<"readonly">>,
+      case Record#month.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#month.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#month.step},
+    {<<"type">>, <<"month">>},
+    {<<"value">>, Record#month.value} | Record#month.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#month.body), List).
+

+ 123 - 45
src/elements/input/element_number.erl

@@ -1,51 +1,129 @@
 -module(element_number).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#number.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#number.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#number.postback of
-        [] -> Record#number.id;
-        Postback ->
-          ID = case Record#number.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
+  Id = case Record#number.postback of
+    [] -> Record#number.id;
+    Postback ->
+      ID = case Record#number.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
                   source=Record#number.source, delegate=Record#number.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#number.accesskey},
-      {<<"class">>, Record#number.class},
-      {<<"contenteditable">>, case Record#number.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#number.contextmenu},
-      {<<"dir">>, case Record#number.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#number.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#number.dropzone},
-      {<<"hidden">>, case Record#number.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#number.lang},
-      {<<"spellcheck">>, case Record#number.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#number.style},
-      {<<"tabindex">>, Record#number.tabindex},
-      {<<"title">>, Record#number.title},
-      {<<"translate">>, case Record#number.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec      
-      {<<"autocomplete">>, case Record#number.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#number.autofocus == true -> "autofocus"; true -> [] end},            
-      {<<"disabled">>, if Record#number.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#number.form},
-      {<<"list">>,Record#number.list},
-      {<<"max">>,Record#number.max},
-      {<<"min">>,Record#number.min},      
-      {<<"name">>,Record#number.name},
-      {<<"placeholder">>,Record#number.placeholder},
-      {<<"readonly">>,if Record#number.readonly == true -> "readonly"; true -> [] end},      
-      {<<"required">>,if Record#number.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#number.step},
-      {<<"type">>, <<"number">>},
-      {<<"value">>, Record#number.value} | Record#number.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#number.body), List).
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#number.accesskey},
+    {<<"class">>, Record#number.class},
+    
+    {<<"contenteditable">>,
+      case Record#number.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#number.contextmenu},
+    
+    {<<"dir">>,
+      case Record#number.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#number.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#number.dropzone},
+    
+    {<<"hidden">>,
+      case Record#number.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#number.lang},
+    
+    {<<"spellcheck">>,
+      case Record#number.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#number.style},
+    {<<"tabindex">>, Record#number.tabindex},
+    {<<"title">>, Record#number.title},
+    
+    {<<"translate">>,
+      case Record#number.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#number.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#number.autofocus of
+        true -> "autofocus";
+        true -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#number.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#number.form},
+    {<<"list">>, Record#number.list},
+    {<<"max">>, Record#number.max},
+    {<<"min">>, Record#number.min},
+    {<<"name">>, Record#number.name},
+    {<<"placeholder">>, Record#number.placeholder},
+    
+    {<<"readonly">>,
+      case Record#number.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#number.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#number.step},
+    {<<"type">>, <<"number">>},
+    {<<"value">>, Record#number.value} | Record#number.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#number.body), List).
+

+ 123 - 45
src/elements/input/element_password.erl

@@ -1,50 +1,128 @@
 -module(element_password).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#password.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#password.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#password.postback of
-        [] -> Record#password.id;
-        Postback ->
-          ID = case Record#password.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#password.source, delegate=Record#password.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#password.accesskey},
-      {<<"class">>, Record#password.class},
-      {<<"contenteditable">>, case Record#password.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#password.contextmenu},
-      {<<"dir">>, case Record#password.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#password.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#password.dropzone},
-      {<<"hidden">>, case Record#password.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#password.lang},
-      {<<"spellcheck">>, case Record#password.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#password.style},
-      {<<"tabindex">>, Record#password.tabindex},
-      {<<"title">>, Record#password.title},
-      {<<"translate">>, case Record#password.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec 
-      {<<"autocomplete">>, case Record#password.autocomplete of true -> "on"; false -> "off"; _ -> [] end},      
-      {<<"autofocus">>,if Record#password.autofocus == true -> "autofocus"; true -> [] end},            
-      {<<"disabled">>, if Record#password.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#password.form},
-      {<<"maxlength">>,Record#password.maxlength},
-      {<<"name">>,Record#password.name},
-      {<<"pattern">>,Record#password.pattern},
-      {<<"placeholder">>, Record#password.placeholder},
-      {<<"readonly">>,if Record#password.readonly == true -> "readonly"; true -> [] end},      
-      {<<"required">>,if Record#password.required == true -> "required"; true -> [] end},      
-      {<<"size">>,Record#password.size},
-      {<<"type">>, <<"password">>},
-      {<<"value">>, Record#password.value} | Record#password.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#password.body), List).
+  Id = case Record#password.postback of
+    [] -> Record#password.id;
+    Postback ->
+      ID = case Record#password.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#password.source, delegate=Record#password.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#password.accesskey},
+    {<<"class">>, Record#password.class},
+    
+    {<<"contenteditable">>,
+      case Record#password.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#password.contextmenu},
+    
+    {<<"dir">>,
+      case Record#password.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#password.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#password.dropzone},
+    
+    {<<"hidden">>,
+      case Record#password.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#password.lang},
+    
+    {<<"spellcheck">>,
+      case Record#password.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#password.style},
+    {<<"tabindex">>, Record#password.tabindex},
+    {<<"title">>, Record#password.title},
+    
+    {<<"translate">>,
+      case Record#password.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec 
+    {<<"autocomplete">>,
+      case Record#password.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#password.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#password.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#password.form},
+    {<<"maxlength">>, Record#password.maxlength},
+    {<<"name">>, Record#password.name},
+    {<<"pattern">>, Record#password.pattern},
+    {<<"placeholder">>, Record#password.placeholder},
+    
+    {<<"readonly">>,
+      case Record#password.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#password.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"size">>, Record#password.size},
+    {<<"type">>, <<"password">>},
+    {<<"value">>, Record#password.value} | Record#password.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#password.body), List).
+

+ 45 - 32
src/elements/input/element_radio.erl

@@ -1,37 +1,50 @@
 -module(element_radio).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#radio.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#radio.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    ID = case Record#radio.id of
-        [] -> nitro:temp_id();
-        RadioID -> RadioID
-    end,
-
-    case Record#radio.postback of
-        [] -> ignore;
-        Postback -> nitro:wire(#event{type=change, postback=Postback, target=ID, delegate=Record#radio.delegate })
-    end,
-
-    Content = nitro:render(Record#radio.body),
-    TypeChecked = case Record#radio.checked of
-         true -> [{<<"checked">>, <<"">>},{<<"type">>, <<"radio">>}];
-            _ -> [{<<"type">>, <<"radio">>}] end ++ case Record#radio.disabled of
-         true -> [{<<"disabled">>, <<"disabled">>}];
-            _ -> [] end,
-
-    [
-        wf_tags:emit_tag(<<"input">>, Content, TypeChecked ++ [
-            {<<"id">>, ID},
-            {<<"value">>, Record#radio.value},
-            {<<"name">>, nitro:coalesce([Record#radio.html_name,Record#radio.name])},
-            {<<"class">>, Record#radio.class},
-            {<<"style">>, Record#radio.style},
-            {<<"onclick">>, Record#radio.onclick},
-            {<<"required">>,if Record#radio.required == true -> "required"; true -> [] end}
-        ])
-
-    ].
+  ID = case Record#radio.id of
+    [] -> nitro:temp_id();
+    RadioID -> RadioID
+  end,
+
+  case Record#radio.postback of
+    [] -> ignore;
+    Postback ->
+      nitro:wire(#event{type=change, postback=Postback, target=ID, delegate=Record#radio.delegate })
+  end,
+
+  Content = nitro:render(Record#radio.body),
+  TypeChecked = case Record#radio.checked of
+     true ->
+       [{<<"checked">>, <<"">>}, {<<"type">>, <<"radio">>}];
+     _ ->
+       [{<<"type">>, <<"radio">>}]
+  end ++ case Record#radio.disabled of
+    true -> [{<<"disabled">>, <<"disabled">>}];
+    _ -> []
+  end,
+
+  [ wf_tags:emit_tag(<<"input">>, Content, TypeChecked ++
+    [{<<"id">>, ID},
+     {<<"value">>, Record#radio.value},
+     {<<"name">>, nitro:coalesce([Record#radio.html_name, Record#radio.name])},
+     {<<"class">>, Record#radio.class},
+     {<<"style">>, Record#radio.style},
+     {<<"onclick">>, Record#radio.onclick},
+     {<<"required">>,
+       case Record#radio.required of
+         true -> "required";
+         _ -> []
+       end}
+    ])
+  ].
+

+ 24 - 14
src/elements/input/element_radiogroup.erl

@@ -1,24 +1,34 @@
 -module(element_radiogroup).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#radiogroup.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#radiogroup.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-    ID = Record#radiogroup.id,
-    Body = apply_name(ID, Record#radiogroup.body),
-    wf_render_elements:render_element(#panel {
-        id=ID,
-        class=[radiogroup, Record#radiogroup.class],
-        style=Record#radiogroup.style,
-        body=Body
-    }).
+  ID = Record#radiogroup.id,
+  Body = apply_name(ID, Record#radiogroup.body),
+  wf_render_elements:render_element(#panel{
+    id=ID,
+    class=[radiogroup, Record#radiogroup.class],
+    style=Record#radiogroup.style,
+    body=Body
+  }).
 
 %% TODO: This whole thing needs to be replaced with a smarter recursive search.
 %% As it is, it won't dive into the bodies of subelements. A recursive map (ie: nitro:map_body) would be
 %% ideal
 
-apply_name(Name, Terms) -> [do_apply(Name, X) || X <- Terms].
-do_apply(Name, X) when is_record(X, radio) -> X#radio {name = Name};
-do_apply(Name, List) when is_list(List) -> apply_name(Name,List);
+apply_name(Name, Terms) ->
+  [do_apply(Name, X) || X <- Terms].
+
+do_apply(Name, X) when erlang:is_record(X, radio) ->
+  X#radio{name = Name};
+do_apply(Name, List) when erlang:is_list(List) ->
+  apply_name(Name, List);
 do_apply(_Name, X) -> X.
+

+ 110 - 43
src/elements/input/element_range.erl

@@ -1,48 +1,115 @@
 -module(element_range).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#range.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#range.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#range.postback of
-        [] -> Record#range.id;
-        Postback ->
-          ID = case Record#range.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#range.source, delegate=Record#range.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#range.accesskey},
-      {<<"class">>, Record#range.class},
-      {<<"contenteditable">>, case Record#range.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#range.contextmenu},
-      {<<"dir">>, case Record#range.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#range.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#range.dropzone},
-      {<<"hidden">>, case Record#range.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#range.lang},
-      {<<"spellcheck">>, case Record#range.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#range.style},
-      {<<"tabindex">>, Record#range.tabindex},
-      {<<"title">>, Record#range.title},
-      {<<"translate">>, case Record#range.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#range.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#range.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#range.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#range.form},
-      {<<"list">>,Record#range.list},
-      {<<"max">>,Record#range.max},
-      {<<"min">>,Record#range.min},
-      {<<"name">>,Record#range.name},
-      {<<"step">>,Record#range.step},
-      {<<"type">>, <<"range">>},
-      {<<"value">>, Record#range.value} | Record#range.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#range.body), List).
+  Id = case Record#range.postback of
+    [] -> Record#range.id;
+    Postback ->
+      ID = case Record#range.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#range.source, delegate=Record#range.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#range.accesskey},
+    {<<"class">>, Record#range.class},
+    
+    {<<"contenteditable">>,
+      case Record#range.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#range.contextmenu},
+    
+    {<<"dir">>,
+      case Record#range.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#range.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#range.dropzone},
+    
+    {<<"hidden">>,
+      case Record#range.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#range.lang},
+    
+    {<<"spellcheck">>,
+      case Record#range.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#range.style},
+    {<<"tabindex">>, Record#range.tabindex},
+    {<<"title">>, Record#range.title},
+    
+    {<<"translate">>,
+      case Record#range.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#range.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#range.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#range.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#range.form},
+    {<<"list">>, Record#range.list},
+    {<<"max">>, Record#range.max},
+    {<<"min">>, Record#range.min},
+    {<<"name">>, Record#range.name},
+    {<<"step">>, Record#range.step},
+    {<<"type">>, <<"range">>},
+    {<<"value">>, Record#range.value} | Record#range.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#range.body), List).
+

+ 99 - 38
src/elements/input/element_reset.erl

@@ -1,43 +1,104 @@
 -module(element_reset).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#reset.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#reset.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#reset.postback of
-        [] -> Record#reset.id;
-        Postback ->
-          ID = case Record#reset.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#reset.source, delegate=Record#reset.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#reset.accesskey},
-      {<<"class">>, Record#reset.class},
-      {<<"contenteditable">>, case Record#reset.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#reset.contextmenu},
-      {<<"dir">>, case Record#reset.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#reset.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#reset.dropzone},
-      {<<"hidden">>, case Record#reset.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#reset.lang},
-      {<<"spellcheck">>, case Record#reset.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#reset.style},
-      {<<"tabindex">>, Record#reset.tabindex},
-      {<<"title">>, Record#reset.title},
-      {<<"translate">>, case Record#reset.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autofocus">>,if Record#reset.autofocus == true -> "autofocus"; true -> [] end},            
-      {<<"disabled">>, if Record#reset.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#reset.form},
-      {<<"name">>,Record#reset.name},
-      {<<"type">>, <<"reset">>},
-      {<<"value">>, Record#reset.value} | Record#reset.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#reset.body), List).
+  Id = case Record#reset.postback of
+    [] -> Record#reset.id;
+    Postback ->
+      ID = case Record#reset.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#reset.source, delegate=Record#reset.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#reset.accesskey},
+    {<<"class">>, Record#reset.class},
+    
+    {<<"contenteditable">>,
+      case Record#reset.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#reset.contextmenu},
+    
+    {<<"dir">>,
+      case Record#reset.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#reset.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#reset.dropzone},
+    
+    {<<"hidden">>,
+      case Record#reset.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#reset.lang},
+    
+    {<<"spellcheck">>,
+      case Record#reset.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#reset.style},
+    {<<"tabindex">>, Record#reset.tabindex},
+    {<<"title">>, Record#reset.title},
+    
+    {<<"translate">>,
+      case Record#reset.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autofocus">>,
+      case Record#reset.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#reset.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#reset.form},
+    {<<"name">>, Record#reset.name},
+    {<<"type">>, <<"reset">>},
+    {<<"value">>, Record#reset.value} | Record#reset.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#reset.body), List).
+

+ 125 - 46
src/elements/input/element_search.erl

@@ -1,52 +1,131 @@
 -module(element_search).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#search.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#search.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#search.postback of
-        [] -> Record#search.id;
-        Postback ->
-          ID = case Record#search.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
+  Id = case Record#search.postback of
+    [] -> Record#search.id;
+    Postback ->
+      ID = case Record#search.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
                   source=Record#search.source, delegate=Record#search.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#search.accesskey},
-      {<<"class">>, Record#search.class},
-      {<<"contenteditable">>, case Record#search.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#search.contextmenu},
-      {<<"dir">>, case Record#search.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#search.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#search.dropzone},
-      {<<"hidden">>, case Record#search.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#search.lang},
-      {<<"spellcheck">>, case Record#search.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#search.style},
-      {<<"tabindex">>, Record#search.tabindex},
-      {<<"title">>, Record#search.title},
-      {<<"translate">>, case Record#search.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#search.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#search.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"dirname">>,Record#search.dirname},
-      {<<"disabled">>, if Record#search.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#search.form},
-      {<<"list">>,Record#search.list},
-      {<<"maxlength">>,Record#search.maxlength},
-      {<<"name">>,Record#search.name},
-      {<<"pattern">>,Record#search.pattern},
-      {<<"placeholder">>,Record#search.placeholder},
-      {<<"readonly">>,if Record#search.readonly == true -> "readonly"; true -> [] end},      
-      {<<"required">>,if Record#search.required == true -> "required"; true -> [] end},      
-      {<<"size">>,Record#search.size},
-      {<<"type">>, <<"search">>},
-      {<<"value">>, Record#search.value} | Record#search.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#search.body), List).
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#search.accesskey},
+    {<<"class">>, Record#search.class},
+    
+    {<<"contenteditable">>,
+      case Record#search.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#search.contextmenu},
+    
+    {<<"dir">>,
+      case Record#search.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#search.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#search.dropzone},
+    
+    {<<"hidden">>,
+      case Record#search.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#search.lang},
+    
+    {<<"spellcheck">>,
+      case Record#search.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#search.style},
+    {<<"tabindex">>, Record#search.tabindex},
+    {<<"title">>, Record#search.title},
+    
+    {<<"translate">>,
+      case Record#search.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#search.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#search.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"dirname">>,Record#search.dirname},
+    
+    {<<"disabled">>,
+      case Record#search.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#search.form},
+    {<<"list">>, Record#search.list},
+    {<<"maxlength">>, Record#search.maxlength},
+    {<<"name">>, Record#search.name},
+    {<<"pattern">>, Record#search.pattern},
+    {<<"placeholder">>, Record#search.placeholder},
+    
+    {<<"readonly">>,
+      case Record#search.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#search.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"size">>, Record#search.size},
+    {<<"type">>, <<"search">>},
+    {<<"value">>, Record#search.value} | Record#search.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#search.body), List).
+

+ 28 - 18
src/elements/input/element_submit.erl

@@ -1,25 +1,35 @@
 -module (element_submit).
--author('Andrew Zadorozhny').
+% author Andrew Zadorozhny
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#submit.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#submit.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    ID = case Record#submit.id of [] -> nitro:temp_id(); I->I end,
-    case Record#submit.postback of
-         [] -> skip;
-         Postback -> nitro:wire(#event { type=click, 
-                                      target=ID,
-                                      postback=Postback,
-                                      source=Record#submit.source }) end,
-    case Record#submit.click of
-         [] -> ignore;
-         ClickActions -> nitro:wire(#event { target=ID, type=click, actions=ClickActions }) end,
+  ID = case Record#submit.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  case Record#submit.postback of
+     [] -> skip;
+     Postback -> nitro:wire(#event{ type=click, target=ID, postback=Postback,
+                                    source=Record#submit.source })
+  end,
+  case Record#submit.click of
+    [] -> ignore;
+    ClickActions ->
+      nitro:wire(#event{ target=ID, type=click, actions=ClickActions })
+  end,
   wf_tags:emit_tag(<<"input">>, [
-      {<<"id">>, ID},
-      {<<"type">>, <<"submit">>},
-      {<<"class">>, Record#submit.class},
-      {<<"style">>, Record#submit.style},
-      {<<"value">>, Record#submit.body}  | Record#submit.data_fields
+    {<<"id">>, ID},
+    {<<"type">>, <<"submit">>},
+    {<<"class">>, Record#submit.class},
+    {<<"style">>, Record#submit.style},
+    {<<"value">>, Record#submit.body}  | Record#submit.data_fields
   ]).
+

+ 124 - 46
src/elements/input/element_tel.erl

@@ -1,51 +1,129 @@
 -module(element_tel).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#tel.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#tel.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#tel.postback of
-        [] -> Record#tel.id;
-        Postback ->
-          ID = case Record#tel.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#tel.source, delegate=Record#tel.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#tel.accesskey},
-      {<<"class">>, Record#tel.class},
-      {<<"contenteditable">>, case Record#tel.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#tel.contextmenu},
-      {<<"dir">>, case Record#tel.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#tel.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#tel.dropzone},
-      {<<"hidden">>, case Record#tel.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#tel.lang},
-      {<<"spellcheck">>, case Record#tel.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#tel.style},
-      {<<"tabindex">>, Record#tel.tabindex},
-      {<<"title">>, Record#tel.title},
-      {<<"translate">>, case Record#tel.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#tel.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#tel.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#tel.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#tel.form},
-      {<<"list">>,Record#tel.list},
-      {<<"maxlength">>,Record#tel.maxlength},
-      {<<"name">>,Record#tel.name},
-      {<<"pattern">>,Record#tel.pattern},
-      {<<"placeholder">>,Record#tel.placeholder},
-      {<<"readonly">>,if Record#tel.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#tel.required == true -> "required"; true -> [] end},      
-      {<<"size">>,Record#tel.size},
-      {<<"type">>, <<"tel">>},
-      {<<"value">>, Record#tel.value} | Record#tel.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#tel.body), List).
+  Id = case Record#tel.postback of
+    [] -> Record#tel.id;
+    Postback ->
+      ID = case Record#tel.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+                   source=Record#tel.source, delegate=Record#tel.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#tel.accesskey},
+    {<<"class">>, Record#tel.class},
+    
+    {<<"contenteditable">>,
+      case Record#tel.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#tel.contextmenu},
+    
+    {<<"dir">>,
+      case Record#tel.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#tel.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#tel.dropzone},
+    
+    {<<"hidden">>,
+      case Record#tel.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#tel.lang},
+    
+    {<<"spellcheck">>,
+      case Record#tel.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#tel.style},
+    {<<"tabindex">>, Record#tel.tabindex},
+    {<<"title">>, Record#tel.title},
+    
+    {<<"translate">>,
+      case Record#tel.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#tel.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#tel.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#tel.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#tel.form},
+    {<<"list">>, Record#tel.list},
+    {<<"maxlength">>, Record#tel.maxlength},
+    {<<"name">>, Record#tel.name},
+    {<<"pattern">>, Record#tel.pattern},
+    {<<"placeholder">>, Record#tel.placeholder},
+    
+    {<<"readonly">>,
+      case Record#tel.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#tel.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"size">>, Record#tel.size},
+    {<<"type">>, <<"tel">>},
+    {<<"value">>, Record#tel.value} | Record#tel.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#tel.body), List).
+

+ 38 - 17
src/elements/input/element_textbox.erl

@@ -1,23 +1,44 @@
 -module(element_textbox).
--author('Rusty Klophaus').
+% author Rusty Klophaus
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#textbox.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#textbox.show_if == false ->
+  [<<>>];
+
 render_element(Record) -> 
-    List = [
-      {<<"id">>, Record#textbox.id},
-      {<<"type">>, <<"text">>},
-      {<<"maxlength">>,Record#textbox.maxlength},
-      {<<"style">>,Record#textbox.style},
-      {<<"name">>,Record#textbox.name},
-      {<<"placeholder">>,Record#textbox.placeholder},
-      {<<"value">>, Record#textbox.value},
-      {<<"disabled">>,Record#textbox.disabled},
-      {<<"autofocus">>,Record#textbox.autofocus},
-      {<<"readonly">>,if Record#textbox.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#textbox.required == true -> "required"; true -> [] end}, 
-      {<<"class">>,Record#textbox.class} | Record#textbox.data_fields
-  ] ++ case Record#textbox.disabled of [] -> []; _ -> [{<<"disabled">>,<<"disabled">>}] end,
+  List = [
+    {<<"id">>, Record#textbox.id},
+    {<<"type">>, <<"text">>},
+    {<<"maxlength">>, Record#textbox.maxlength},
+    {<<"style">>, Record#textbox.style},
+    {<<"name">>, Record#textbox.name},
+    {<<"placeholder">>, Record#textbox.placeholder},
+    {<<"value">>, Record#textbox.value},
+    {<<"disabled">>, Record#textbox.disabled},
+    {<<"autofocus">>, Record#textbox.autofocus},
+    
+    {<<"readonly">>,
+      case Record#textbox.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#textbox.required of
+        true -> "required";
+        _ -> []
+      end}, 
+    
+    {<<"class">>, Record#textbox.class} | Record#textbox.data_fields
+  ] ++
+    case Record#textbox.disabled of
+      [] -> [];
+      _ -> [{<<"disabled">>, <<"disabled">>}]
+    end,
+  
   wf_tags:emit_tag(<<"input">>, nitro:render(Record#textbox.body), List).
 

+ 124 - 46
src/elements/input/element_url.erl

@@ -1,51 +1,129 @@
 -module(element_url).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#url.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#url.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#url.postback of
-        [] -> Record#url.id;
-        Postback ->
-          ID = case Record#url.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#url.source, delegate=Record#url.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#url.accesskey},
-      {<<"class">>, Record#url.class},
-      {<<"contenteditable">>, case Record#url.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#url.contextmenu},
-      {<<"dir">>, case Record#url.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#url.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#url.dropzone},
-      {<<"hidden">>, case Record#url.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#url.lang},
-      {<<"spellcheck">>, case Record#url.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#url.style},
-      {<<"tabindex">>, Record#url.tabindex},
-      {<<"title">>, Record#url.title},
-      {<<"translate">>, case Record#url.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#url.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#url.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#url.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#url.form},
-      {<<"list">>,Record#url.list},
-      {<<"maxlength">>,Record#url.maxlength},
-      {<<"name">>,Record#url.name},
-      {<<"pattern">>,Record#url.pattern},      
-      {<<"placeholder">>,Record#url.placeholder},      
-      {<<"readonly">>,if Record#url.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#url.required == true -> "required"; true -> [] end},      
-      {<<"size">>,Record#url.size},
-      {<<"type">>, <<"url">>},
-      {<<"value">>, Record#url.value} | Record#url.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#url.body), List).
+  Id = case Record#url.postback of
+    [] -> Record#url.id;
+    Postback ->
+      ID = case Record#url.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#url.source, delegate=Record#url.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#url.accesskey},
+    {<<"class">>, Record#url.class},
+    
+    {<<"contenteditable">>,
+      case Record#url.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#url.contextmenu},
+    
+    {<<"dir">>,
+      case Record#url.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#url.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#url.dropzone},
+    
+    {<<"hidden">>,
+      case Record#url.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#url.lang},
+    
+    {<<"spellcheck">>,
+      case Record#url.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#url.style},
+    {<<"tabindex">>, Record#url.tabindex},
+    {<<"title">>, Record#url.title},
+    
+    {<<"translate">>,
+      case Record#url.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#url.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#url.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#url.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#url.form},
+    {<<"list">>, Record#url.list},
+    {<<"maxlength">>, Record#url.maxlength},
+    {<<"name">>, Record#url.name},
+    {<<"pattern">>, Record#url.pattern},
+    {<<"placeholder">>, Record#url.placeholder},
+    
+    {<<"readonly">>,
+      case Record#url.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#url.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"size">>, Record#url.size},
+    {<<"type">>, <<"url">>},
+    {<<"value">>, Record#url.value} | Record#url.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#url.body), List).
+

+ 123 - 45
src/elements/input/element_week.erl

@@ -1,50 +1,128 @@
 -module(element_week).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#week.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#week.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    Id = case Record#week.postback of
-        [] -> Record#week.id;
-        Postback ->
-          ID = case Record#week.id of
-            [] -> nitro:temp_id();
-            I -> I end,
-          nitro:wire(#event{type=click, postback=Postback, target=ID,
-                  source=Record#week.source, delegate=Record#week.delegate }),
-          ID end,
-    List = [
-      %global
-      {<<"accesskey">>, Record#week.accesskey},
-      {<<"class">>, Record#week.class},
-      {<<"contenteditable">>, case Record#week.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#week.contextmenu},
-      {<<"dir">>, case Record#week.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#week.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#week.dropzone},
-      {<<"hidden">>, case Record#week.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Id},
-      {<<"lang">>, Record#week.lang},
-      {<<"spellcheck">>, case Record#week.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#week.style},
-      {<<"tabindex">>, Record#week.tabindex},
-      {<<"title">>, Record#week.title},
-      {<<"translate">>, case Record#week.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"autocomplete">>, case Record#week.autocomplete of true -> "on"; false -> "off"; _ -> [] end},
-      {<<"autofocus">>,if Record#week.autofocus == true -> "autofocus"; true -> [] end},
-      {<<"disabled">>, if Record#week.disabled == true -> "disabled"; true -> [] end},
-      {<<"form">>,Record#week.form},
-      {<<"list">>,Record#week.list},
-      {<<"max">>,Record#week.max},
-      {<<"min">>,Record#week.min},
-      {<<"name">>,Record#week.name},
-      {<<"readonly">>,if Record#week.readonly == true -> "readonly"; true -> [] end},
-      {<<"required">>,if Record#week.required == true -> "required"; true -> [] end},      
-      {<<"step">>,Record#week.step},
-      {<<"type">>, <<"week">>},
-      {<<"value">>, Record#week.value} | Record#week.data_fields
-    ],
-    wf_tags:emit_tag(<<"input">>, nitro:render(Record#week.body), List).
+  Id = case Record#week.postback of
+    [] -> Record#week.id;
+    Postback ->
+      ID = case Record#week.id of
+        [] -> nitro:temp_id();
+        I -> I
+      end,
+      nitro:wire(#event{type=click, postback=Postback, target=ID,
+          source=Record#week.source, delegate=Record#week.delegate }),
+      ID
+  end,
+  
+  List = [
+    % global
+    {<<"accesskey">>, Record#week.accesskey},
+    {<<"class">>, Record#week.class},
+    
+    {<<"contenteditable">>,
+      case Record#week.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#week.contextmenu},
+    
+    {<<"dir">>,
+      case Record#week.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#week.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#week.dropzone},
+    
+    {<<"hidden">>,
+      case Record#week.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Id},
+    {<<"lang">>, Record#week.lang},
+    
+    {<<"spellcheck">>,
+      case Record#week.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#week.style},
+    {<<"tabindex">>, Record#week.tabindex},
+    {<<"title">>, Record#week.title},
+    
+    {<<"translate">>,
+      case Record#week.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"autocomplete">>,
+      case Record#week.autocomplete of
+        true -> "on";
+        false -> "off";
+        _ -> []
+      end},
+    
+    {<<"autofocus">>,
+      case Record#week.autofocus of
+        true -> "autofocus";
+        _ -> []
+      end},
+    
+    {<<"disabled">>,
+      case Record#week.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"form">>, Record#week.form},
+    {<<"list">>, Record#week.list},
+    {<<"max">>, Record#week.max},
+    {<<"min">>, Record#week.min},
+    {<<"name">>, Record#week.name},
+    
+    {<<"readonly">>,
+      case Record#week.readonly of
+        true -> "readonly";
+        _ -> []
+      end},
+    
+    {<<"required">>,
+      case Record#week.required of
+        true -> "required";
+        _ -> []
+      end},
+    
+    {<<"step">>, Record#week.step},
+    {<<"type">>, <<"week">>},
+    {<<"value">>, Record#week.value} | Record#week.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"input">>, nitro:render(Record#week.body), List).
+

+ 88 - 28
src/elements/interactive/element_command.erl

@@ -1,32 +1,92 @@
 -module(element_command).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#command.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#command.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#command.accesskey},
-      {<<"class">>, Record#command.class},
-      {<<"contenteditable">>, case Record#command.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#command.contextmenu},
-      {<<"dir">>, case Record#command.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#command.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#command.dropzone},
-      {<<"hidden">>, case Record#command.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#command.id},
-      {<<"lang">>, Record#command.lang},
-      {<<"spellcheck">>, case Record#command.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#command.style},
-      {<<"tabindex">>, Record#command.tabindex},
-      {<<"title">>, Record#command.title},
-      {<<"translate">>, case Record#command.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},
-      % spec
-      {<<"disabled">>, if Record#command.disabled == true -> "disabled"; true -> [] end},
-      {<<"icon">>, Record#command.icon},
-      {<<"label">>, Record#command.label},
-      {<<"radiogroup">>, Record#command.radiogroup},
-      {<<"type">>, case Record#command.type of "command" -> "command"; "radio" -> "radio"; "checkbox" -> "checkbox"; _ -> [] end} | Record#command.data_fields
-    ],
-    wf_tags:emit_tag(<<"command">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#command.accesskey},
+    {<<"class">>, Record#command.class},
+    
+    {<<"contenteditable">>,
+      case Record#command.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#command.contextmenu},
+    
+    {<<"dir">>,
+      case Record#command.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#command.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#command.dropzone},
+    
+    {<<"hidden">>,
+      case Record#command.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#command.id},
+    {<<"lang">>, Record#command.lang},
+    
+    {<<"spellcheck">>,
+      case Record#command.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#command.style},
+    {<<"tabindex">>, Record#command.tabindex},
+    {<<"title">>, Record#command.title},
+    
+    {<<"translate">>,
+      case Record#command.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"disabled">>,
+      case Record#command.disabled of
+        true -> "disabled";
+        _ -> []
+      end},
+    
+    {<<"icon">>, Record#command.icon},
+    {<<"label">>, Record#command.label},
+    {<<"radiogroup">>, Record#command.radiogroup},
+    
+    {<<"type">>,
+      case Record#command.type of
+        "command" -> "command";
+        "radio" -> "radio";
+        "checkbox" -> "checkbox";
+        _ -> []
+      end} | Record#command.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"command">>, List).
+

+ 80 - 24
src/elements/interactive/element_details.erl

@@ -1,28 +1,84 @@
 -module(element_details).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#details.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#details.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#details.accesskey},
-      {<<"class">>, Record#details.class},
-      {<<"contenteditable">>, case Record#details.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#details.contextmenu},
-      {<<"dir">>, case Record#details.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#details.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#details.dropzone},
-      {<<"hidden">>, case Record#details.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#details.id},
-      {<<"lang">>, Record#details.lang},
-      {<<"spellcheck">>, case Record#details.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#details.style},
-      {<<"tabindex">>, Record#details.tabindex},
-      {<<"title">>, Record#details.title},
-      {<<"translate">>, case Record#details.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"open">>, case Record#details.open of true -> "open"; _ -> [] end} | Record#details.data_fields
-    ],
-    wf_tags:emit_tag(<<"details">>, nitro:render(case Record#details.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#details.accesskey},
+    {<<"class">>, Record#details.class},
+    
+    {<<"contenteditable">>,
+      case Record#details.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#details.contextmenu},
+    
+    {<<"dir">>,
+      case Record#details.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#details.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#details.dropzone},
+    
+    {<<"hidden">>,
+      case Record#details.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#details.id},
+    {<<"lang">>, Record#details.lang},
+    
+    {<<"spellcheck">>,
+      case Record#details.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#details.style},
+    {<<"tabindex">>, Record#details.tabindex},
+    {<<"title">>, Record#details.title},
+    
+    {<<"translate">>,
+      case Record#details.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"open">>,
+      case Record#details.open of
+        true -> "open";
+        _ -> []
+      end} | Record#details.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"details">>, nitro:render(
+    case Record#details.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 83 - 25
src/elements/interactive/element_menu.erl

@@ -1,29 +1,87 @@
 -module(element_menu).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#menu.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#menu.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#menu.accesskey},
-      {<<"class">>, Record#menu.class},
-      {<<"contenteditable">>, case Record#menu.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#menu.contextmenu},
-      {<<"dir">>, case Record#menu.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#menu.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#menu.dropzone},
-      {<<"hidden">>, case Record#menu.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#menu.id},
-      {<<"lang">>, Record#menu.lang},
-      {<<"spellcheck">>, case Record#menu.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#menu.style},
-      {<<"tabindex">>, Record#menu.tabindex},
-      {<<"title">>, Record#menu.title},
-      {<<"translate">>, case Record#menu.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"label">>, Record#menu.label},
-      {<<"type">>, case Record#menu.type of "toolbar" -> "toolbar"; "context" -> "context"; _ -> [] end} | Record#menu.data_fields
-    ],
-    wf_tags:emit_tag(<<"menu">>, nitro:render(case Record#menu.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#menu.accesskey},
+    {<<"class">>, Record#menu.class},
+    
+    {<<"contenteditable">>,
+      case Record#menu.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#menu.contextmenu},
+    
+    {<<"dir">>,
+      case Record#menu.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#menu.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#menu.dropzone},
+    
+    {<<"hidden">>,
+      case Record#menu.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#menu.id},
+    {<<"lang">>, Record#menu.lang},
+    
+    {<<"spellcheck">>,
+      case Record#menu.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#menu.style},
+    {<<"tabindex">>, Record#menu.tabindex},
+    {<<"title">>, Record#menu.title},
+    
+    {<<"translate">>,
+      case Record#menu.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},    
+    
+    % spec
+    {<<"label">>, Record#menu.label},
+    
+    {<<"type">>,
+      case Record#menu.type of
+        "toolbar" -> "toolbar";
+        "context" -> "context";
+        _ -> []
+      end} | Record#menu.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"menu">>, nitro:render(
+    case Record#menu.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 73 - 22
src/elements/interactive/element_summary.erl

@@ -1,26 +1,77 @@
 -module(element_summary).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#summary.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#summary.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#summary.accesskey},
-      {<<"class">>, Record#summary.class},
-      {<<"contenteditable">>, case Record#summary.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#summary.contextmenu},
-      {<<"dir">>, case Record#summary.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#summary.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#summary.dropzone},
-      {<<"hidden">>, case Record#summary.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#summary.id},
-      {<<"lang">>, Record#summary.lang},
-      {<<"spellcheck">>, case Record#summary.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#summary.style},
-      {<<"tabindex">>, Record#summary.tabindex},
-      {<<"title">>, Record#summary.title},
-      {<<"translate">>, case Record#summary.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end} | Record#summary.data_fields
-    ],
-    wf_tags:emit_tag(<<"summary">>, nitro:render(case Record#summary.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#summary.accesskey},
+    {<<"class">>, Record#summary.class},
+    
+    {<<"contenteditable">>,
+      case Record#summary.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#summary.contextmenu},
+    
+    {<<"dir">>,
+      case Record#summary.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#summary.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#summary.dropzone},
+    
+    {<<"hidden">>,
+      case Record#summary.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#summary.id},
+    {<<"lang">>, Record#summary.lang},
+    
+    {<<"spellcheck">>,
+      case Record#summary.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#summary.style},
+    {<<"tabindex">>, Record#summary.tabindex},
+    {<<"title">>, Record#summary.title},
+    
+    {<<"translate">>,
+      case Record#summary.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end} | Record#summary.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"summary">>, nitro:render(
+    case Record#summary.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 34 - 19
src/elements/interactive/element_upload.erl

@@ -1,24 +1,39 @@
 -module(element_upload).
--compile(export_all).
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
 
-render_element(Record) when Record#upload.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#upload.show_if == false ->
+  [<<>>];
+
 render_element(#upload{id=Id}) ->
-    Uid = case Id of [] -> nitro:temp_id(); I -> I end,
-    nitro:wire("ftp_file=undefined;"),
-    bind(ftp_open,  click,  nitro:f("qi('~s').click(); event.preventDefault();", [nitro:to_list(Uid)])),
-    bind(ftp_start, click,  "ftp.start(ftp_file);"),
-    bind(ftp_stop,  click,  "ftp.stop(ftp_file);"),
-    bind(nitro:to_atom(Uid), change, "ftp_file=ftp.init(this.files[0]);"),
-    Upload = #span  { id=upload, body = [
-             #input  { id   = Uid,         type    = <<"file">>, style = "display:none" },
-             #span   { id   = ftp_status,  body    = [] },
-             #span   { body = [
-             #button { id   = ftp_open,    body = "Browse" },
-             #button { id   = ftp_start,   body = "Upload" },
-             #button { id   = ftp_stop,    body = "Stop" }
-    ] } ] }, nitro:render(Upload).
-
-bind(Control,Event,Code) ->
-    nitro:wire(#bind{target=Control,type=Event,postback=Code}).
+  Uid = case Id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  
+  nitro:wire("ftp_file=undefined;"),
+  
+  bind(ftp_open,  click,  nitro:f("qi('~s').click(); event.preventDefault();", [nitro:to_list(Uid)])),
+  bind(ftp_start, click,  "ftp.start(ftp_file);"),
+  bind(ftp_stop,  click,  "ftp.stop(ftp_file);"),
+  bind(nitro:to_atom(Uid), change, "ftp_file=ftp.init(this.files[0]);"),
+  
+  Upload = #span{ id=upload, body = [
+    #input{ id = Uid, type = <<"file">>, style = "display:none" },
+    #span{ id = ftp_status, body = [] },
+    #span{ body = [
+      #button{ id = ftp_open, body = "Browse" },
+      #button{ id = ftp_start, body = "Upload" },
+      #button{ id = ftp_stop, body = "Stop" }
+    ]}
+  ]},
+  nitro:render(Upload).
+
+
+bind(Control, Event, Code) ->
+  nitro:wire(#bind{target=Control, type=Event, postback=Code}).
+

+ 76 - 28
src/elements/meta/element_meta.erl

@@ -1,32 +1,80 @@
 -module(element_meta).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#meta.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#meta.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#meta.accesskey},
-      {<<"class">>, Record#meta.class},
-      {<<"contenteditable">>, case Record#meta.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#meta.contextmenu},
-      {<<"dir">>, case Record#meta.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#meta.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#meta.dropzone},
-      {<<"hidden">>, case Record#meta.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#meta.id},
-      {<<"lang">>, Record#meta.lang},
-      {<<"spellcheck">>, case Record#meta.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#meta.style},
-      {<<"tabindex">>, Record#meta.tabindex},
-      {<<"title">>, Record#meta.title},
-      {<<"translate">>, case Record#meta.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"charset">>, Record#meta.charset},
-      {<<"content">>, Record#meta.content},
-      {<<"http_equiv">>, Record#meta.http_equiv},
-      {<<"name">>, Record#meta.name},
-      {<<"type">>, Record#meta.type} | Record#meta.data_fields
-    ],
-    wf_tags:emit_tag(<<"meta">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#meta.accesskey},
+    {<<"class">>, Record#meta.class},
+    
+    {<<"contenteditable">>,
+      case Record#meta.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#meta.contextmenu},
+    
+    {<<"dir">>,
+      case Record#meta.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#meta.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#meta.dropzone},
+    
+    {<<"hidden">>,
+      case Record#meta.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#meta.id},
+    {<<"lang">>, Record#meta.lang},
+    
+    {<<"spellcheck">>,
+      case Record#meta.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#meta.style},
+    {<<"tabindex">>, Record#meta.tabindex},
+    {<<"title">>, Record#meta.title},
+    
+    {<<"translate">>,
+      case Record#meta.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"charset">>, Record#meta.charset},
+    {<<"content">>, Record#meta.content},
+    {<<"http_equiv">>, Record#meta.http_equiv},
+    {<<"name">>, Record#meta.name},
+    {<<"type">>, Record#meta.type} | Record#meta.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"meta">>, List).
+

+ 73 - 25
src/elements/meta/element_meta_base.erl

@@ -1,29 +1,77 @@
 -module(element_meta_base).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#base.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#base.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#base.accesskey},
-      {<<"class">>, Record#base.class},
-      {<<"contenteditable">>, case Record#base.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#base.contextmenu},
-      {<<"dir">>, case Record#base.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#base.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#base.dropzone},
-      {<<"hidden">>, case Record#base.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#base.id},
-      {<<"lang">>, Record#base.lang},
-      {<<"spellcheck">>, case Record#base.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#base.style},
-      {<<"tabindex">>, Record#base.tabindex},
-      {<<"title">>, Record#base.title},
-      {<<"translate">>, case Record#base.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"href">>,Record#base.href},
-      {<<"target">>,Record#base.target} | Record#base.data_fields
-    ],
-    wf_tags:emit_tag(<<"base">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#base.accesskey},
+    {<<"class">>, Record#base.class},
+    
+    {<<"contenteditable">>,
+      case Record#base.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#base.contextmenu},
+    
+    {<<"dir">>,
+      case Record#base.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#base.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#base.dropzone},
+    
+    {<<"hidden">>,
+      case Record#base.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#base.id},
+    {<<"lang">>, Record#base.lang},
+    
+    {<<"spellcheck">>,
+      case Record#base.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#base.style},
+    {<<"tabindex">>, Record#base.tabindex},
+    {<<"title">>, Record#base.title},
+    
+    {<<"translate">>,
+      case Record#base.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"href">>, Record#base.href},
+    {<<"target">>, Record#base.target} | Record#base.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"base">>, List).
+

+ 77 - 29
src/elements/meta/element_meta_link.erl

@@ -1,33 +1,81 @@
 -module(element_meta_link).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#meta_link.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#meta_link.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#meta_link.accesskey},
-      {<<"class">>, Record#meta_link.class},
-      {<<"contenteditable">>, case Record#meta_link.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#meta_link.contextmenu},
-      {<<"dir">>, case Record#meta_link.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#meta_link.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#meta_link.dropzone},
-      {<<"hidden">>, case Record#meta_link.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#meta_link.id},
-      {<<"lang">>, Record#meta_link.lang},
-      {<<"spellcheck">>, case Record#meta_link.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#meta_link.style},
-      {<<"tabindex">>, Record#meta_link.tabindex},
-      {<<"title">>, Record#meta_link.title},
-      {<<"translate">>, case Record#meta_link.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"href">>,Record#meta_link.href},
-      {<<"hreflang">>,Record#meta_link.hreflang},
-      {<<"media">>,Record#meta_link.media},
-      {<<"rel">>,Record#meta_link.rel},
-      {<<"sizes">>,Record#meta_link.sizes},
-      {<<"type">>,Record#meta_link.type} | Record#meta_link.data_fields
-    ],
-    wf_tags:emit_tag(<<"link">>, List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#meta_link.accesskey},
+    {<<"class">>, Record#meta_link.class},
+    
+    {<<"contenteditable">>,
+      case Record#meta_link.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#meta_link.contextmenu},
+    
+    {<<"dir">>,
+      case Record#meta_link.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#meta_link.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#meta_link.dropzone},
+    
+    {<<"hidden">>,
+      case Record#meta_link.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#meta_link.id},
+    {<<"lang">>, Record#meta_link.lang},
+    
+    {<<"spellcheck">>,
+      case Record#meta_link.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#meta_link.style},
+    {<<"tabindex">>, Record#meta_link.tabindex},
+    {<<"title">>, Record#meta_link.title},
+    
+    {<<"translate">>,
+      case Record#meta_link.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"href">>, Record#meta_link.href},
+    {<<"hreflang">>, Record#meta_link.hreflang},
+    {<<"media">>, Record#meta_link.media},
+    {<<"rel">>, Record#meta_link.rel},
+    {<<"sizes">>, Record#meta_link.sizes},
+    {<<"type">>, Record#meta_link.type} | Record#meta_link.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"link">>, List).
+

+ 84 - 26
src/elements/meta/element_style.erl

@@ -1,30 +1,88 @@
 -module(element_style).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#style.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#style.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#style.accesskey},
-      {<<"class">>, Record#style.class},
-      {<<"contenteditable">>, case Record#style.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#style.contextmenu},
-      {<<"dir">>, case Record#style.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#style.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#style.dropzone},
-      {<<"hidden">>, case Record#style.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#style.id},
-      {<<"lang">>, Record#style.lang},
-      {<<"spellcheck">>, case Record#style.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#style.style},
-      {<<"tabindex">>, Record#style.tabindex},
-      {<<"title">>, Record#style.title},
-      {<<"translate">>, case Record#style.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"media">>, Record#style.media},
-      {<<"scoped">>, case Record#style.scoped of true -> "scoped"; _ -> [] end},      
-      {<<"type">>, Record#style.type} | Record#style.data_fields
-    ],
-    wf_tags:emit_tag(<<"style">>, nitro:render(case Record#style.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#style.accesskey},
+    {<<"class">>, Record#style.class},
+    
+    {<<"contenteditable">>,
+      case Record#style.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#style.contextmenu},
+    
+    {<<"dir">>,
+      case Record#style.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#style.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#style.dropzone},
+    
+    {<<"hidden">>,
+      case Record#style.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#style.id},
+    {<<"lang">>, Record#style.lang},
+    
+    {<<"spellcheck">>,
+      case Record#style.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#style.style},
+    {<<"tabindex">>, Record#style.tabindex},
+    {<<"title">>, Record#style.title},
+    
+    {<<"translate">>,
+      case Record#style.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"media">>, Record#style.media},
+    
+    {<<"scoped">>,
+      case Record#style.scoped of
+        true -> "scoped";
+        _ -> []
+      end},
+    
+    {<<"type">>, Record#style.type} | Record#style.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"style">>, nitro:render(
+    case Record#style.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 76 - 24
src/elements/table/element_col.erl

@@ -1,28 +1,80 @@
 -module(element_col).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#col.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#col.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#col.accesskey},
-      {<<"class">>, Record#col.class},
-      {<<"contenteditable">>, case Record#col.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#col.contextmenu},
-      {<<"dir">>, case Record#col.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#col.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#col.dropzone},
-      {<<"hidden">>, case Record#col.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#col.id},
-      {<<"lang">>, Record#col.lang},
-      {<<"spellcheck">>, case Record#col.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#col.style},
-      {<<"tabindex">>, Record#col.tabindex},
-      {<<"title">>, Record#col.title},
-      {<<"translate">>, case Record#col.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"span">>,Record#col.span} | Record#col.data_fields
-    ],
-    wf_tags:emit_tag(<<"col">>, nitro:render(case Record#col.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#col.accesskey},
+    {<<"class">>, Record#col.class},
+    
+    {<<"contenteditable">>,
+      case Record#col.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#col.contextmenu},
+    
+    {<<"dir">>,
+      case Record#col.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#col.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#col.dropzone},
+    
+    {<<"hidden">>,
+      case Record#col.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#col.id},
+    {<<"lang">>, Record#col.lang},
+    
+    {<<"spellcheck">>,
+      case Record#col.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#col.style},
+    {<<"tabindex">>, Record#col.tabindex},
+    {<<"title">>, Record#col.title},
+    
+    {<<"translate">>,
+      case Record#col.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"span">>,Record#col.span} | Record#col.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"col">>, nitro:render(
+    case Record#col.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 76 - 24
src/elements/table/element_colgroup.erl

@@ -1,28 +1,80 @@
 -module(element_colgroup).
--author('Vladimir Galunshchikov').
+% author Vladimir Galunshchikov
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#colgroup.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#colgroup.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
-    List = [
-      %global
-      {<<"accesskey">>, Record#colgroup.accesskey},
-      {<<"class">>, Record#colgroup.class},
-      {<<"contenteditable">>, case Record#colgroup.contenteditable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"contextmenu">>, Record#colgroup.contextmenu},
-      {<<"dir">>, case Record#colgroup.dir of "ltr" -> "ltr"; "rtl" -> "rtl"; "auto" -> "auto"; _ -> [] end},
-      {<<"draggable">>, case Record#colgroup.draggable of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"dropzone">>, Record#colgroup.dropzone},
-      {<<"hidden">>, case Record#colgroup.hidden of "hidden" -> "hidden"; _ -> [] end},
-      {<<"id">>, Record#colgroup.id},
-      {<<"lang">>, Record#colgroup.lang},
-      {<<"spellcheck">>, case Record#colgroup.spellcheck of true -> "true"; false -> "false"; _ -> [] end},
-      {<<"style">>, Record#colgroup.style},
-      {<<"tabindex">>, Record#colgroup.tabindex},
-      {<<"title">>, Record#colgroup.title},
-      {<<"translate">>, case Record#colgroup.contenteditable of "yes" -> "yes"; "no" -> "no"; _ -> [] end},      
-      % spec
-      {<<"span">>,Record#colgroup.span} | Record#colgroup.data_fields
-    ],
-    wf_tags:emit_tag(<<"colgroup">>, nitro:render(case Record#colgroup.body of [] -> []; B -> B end), List).
+  List = [
+    % global
+    {<<"accesskey">>, Record#colgroup.accesskey},
+    {<<"class">>, Record#colgroup.class},
+    
+    {<<"contenteditable">>,
+      case Record#colgroup.contenteditable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"contextmenu">>, Record#colgroup.contextmenu},
+    
+    {<<"dir">>,
+      case Record#colgroup.dir of
+        "ltr" -> "ltr";
+        "rtl" -> "rtl";
+        "auto" -> "auto";
+        _ -> []
+      end},
+    
+    {<<"draggable">>,
+      case Record#colgroup.draggable of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"dropzone">>, Record#colgroup.dropzone},
+    
+    {<<"hidden">>,
+      case Record#colgroup.hidden of
+        "hidden" -> "hidden";
+        _ -> []
+      end},
+    
+    {<<"id">>, Record#colgroup.id},
+    {<<"lang">>, Record#colgroup.lang},
+    
+    {<<"spellcheck">>,
+      case Record#colgroup.spellcheck of
+        true -> "true";
+        false -> "false";
+        _ -> []
+      end},
+    
+    {<<"style">>, Record#colgroup.style},
+    {<<"tabindex">>, Record#colgroup.tabindex},
+    {<<"title">>, Record#colgroup.title},
+    
+    {<<"translate">>,
+      case Record#colgroup.contenteditable of
+        "yes" -> "yes";
+        "no" -> "no";
+        _ -> []
+      end},
+    
+    % spec
+    {<<"span">>, Record#colgroup.span} | Record#colgroup.data_fields
+  ],
+  
+  wf_tags:emit_tag(<<"colgroup">>, nitro:render(
+    case Record#colgroup.body of
+      [] -> [];
+      B -> B
+    end), List).
+

+ 34 - 14
src/elements/table/element_table.erl

@@ -1,34 +1,54 @@
 -module(element_table).
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#table.show_if==false -> [<<>>];
-render_element(Record = #table{}) -> 
+-export([render_element/1]).
+
+
+render_element(Record) when Record#table.show_if == false ->
+  [<<>>];
+
+render_element(Record = #table{}) ->
   Header = case Record#table.header of
     [] -> "";
-    H when is_tuple(H) -> H;
-    _ -> wf_tags:emit_tag(<<"thead">>, nitro:render(Record#table.header), [])
+    H when erlang:is_tuple(H) -> H;
+    _ ->
+      wf_tags:emit_tag(<<"thead">>, nitro:render(Record#table.header), [])
   end,
+  
   Footer = case Record#table.footer of
     [] -> "";
-    _ -> wf_tags:emit_tag(<<"tfoot">>, nitro:render(Record#table.footer), [])
+    _ ->
+      wf_tags:emit_tag(<<"tfoot">>, nitro:render(Record#table.footer), [])
   end,
+  
   Bodies = case Record#table.body of
     #tbody{} = B -> B;
     [] -> #tbody{};
     unndefined -> #tbody{};
-    Rows -> [case B of #tbody{}=B1 -> B1; _-> #tbody{body=B} end  || B <- Rows]
+    Rows ->
+      [case B of
+         #tbody{}=B1 -> B1;
+         _-> #tbody{body=B}
+       end || B <- Rows]
   end,
+  
   Caption = case Record#table.caption of
     [] -> "";
-    _ -> wf_tags:emit_tag(<<"caption">>, nitro:render(Record#table.caption), [])
+    _ ->
+      wf_tags:emit_tag(<<"caption">>, nitro:render(Record#table.caption), [])
   end,
+  
   Colgroup = case Record#table.colgroup of
     [] -> "";
-    _ -> wf_tags:emit_tag(<<"colgroup">>, nitro:render(Record#table.colgroup), [])
+    _ ->
+      wf_tags:emit_tag(<<"colgroup">>, nitro:render(Record#table.colgroup), [])
   end,
-  wf_tags:emit_tag( <<"table">>, nitro:render([Caption, Colgroup, Header, Footer, Bodies]), [
-      {<<"id">>, Record#table.id},
-      {<<"class">>, Record#table.class},
-      {<<"style">>, Record#table.style} | Record#table.data_fields
-  ]).
+  
+  wf_tags:emit_tag(<<"table">>,
+    nitro:render([Caption, Colgroup, Header, Footer, Bodies]),
+    [{<<"id">>, Record#table.id},
+     {<<"class">>, Record#table.class},
+     {<<"style">>, Record#table.style} | Record#table.data_fields
+    ]).
+

+ 9 - 3
src/elements/table/element_td.erl

@@ -1,8 +1,13 @@
 -module(element_td).
--include("nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#td.show_if==false -> [<<>>];
+-include_lib("nitro/include/nitro.hrl").
+
+-export([render_element/1]).
+
+
+render_element(Record) when Record#td.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
   wf_tags:emit_tag(<<"td">>, nitro:render(Record#td.body), [
     {<<"id">>, Record#td.id},
@@ -14,3 +19,4 @@ render_element(Record) ->
     {<<"colspan">>, Record#td.colspan},
     {<<"scope">>, Record#td.scope} | Record#td.data_fields
   ]).
+

+ 9 - 3
src/elements/table/element_th.erl

@@ -1,8 +1,13 @@
 -module(element_th).
--include("nitro.hrl").
--compile(export_all).
 
-render_element(Record) when Record#th.show_if==false -> [<<>>];
+-include_lib("nitro/include/nitro.hrl").
+
+-export([render_element/1]).
+
+
+render_element(Record) when Record#th.show_if == false ->
+  [<<>>];
+
 render_element(Record) ->
   wf_tags:emit_tag(<<"th">>, nitro:render(Record#th.body), [
     {<<"id">>, Record#th.id},
@@ -12,3 +17,4 @@ render_element(Record) ->
     {<<"colspan">>, Record#th.colspan},
     {<<"scope">>, Record#th.scope} | Record#th.data_fields
   ]).
+

+ 20 - 6
src/elements/table/element_tr.erl

@@ -1,14 +1,27 @@
 -module(element_tr).
--include("nitro.hrl").
+
+-include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
 
-render_element(Record) when Record#tr.show_if==false -> [<<>>];
+-export([render_element/1]).
+
+
+render_element(Record) when Record#tr.show_if == false ->
+  [<<>>];
+
 render_element(Record = #tr{postback= Postback}) ->
-  Id = case Record#tr.id of [] -> nitro:temp_id(); I->I end,
-  Cursor = case Postback of [] -> "";
-    P -> nitro:wire(#event {type=click, postback=P, target=Id, delegate=Record#tr.delegate}), "cursor:pointer;"
+  Id = case Record#tr.id of
+    [] -> nitro:temp_id();
+    I -> I
+  end,
+  
+  Cursor = case Postback of
+    [] -> "";
+    P ->
+      nitro:wire(#event{type=click, postback=P, target=Id, delegate=Record#tr.delegate}),
+      "cursor:pointer;"
   end,
+  
   wf_tags:emit_tag(<<"tr">>, nitro:render(Record#tr.cells), [
     {<<"id">>, Id},
     {<<"onclick">>, Record#tr.onclick},
@@ -17,3 +30,4 @@ render_element(Record = #tr{postback= Postback}) ->
     {<<"onmouseout">>, Record#tr.onmouseout},
     {<<"style">>, [Record#tr.style, Cursor]} | Record#tr.data_fields
   ]).
+

+ 209 - 132
src/nitro.erl

@@ -1,25 +1,45 @@
 -module(nitro).
+
+-behaviour(application).
+
 -include_lib("nitro/include/cx.hrl").
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
--behaviour(application).
+
 -export([start/2, stop/1, init/1]).
+-compile([export_all, nowarn_export_all]). % todo export
+
 
-atom(List) when is_list(List) -> string:join([ nitro:to_list(L) || L <- List], "_");
+atom(List) when erlang:is_list(List) ->
+  string:join([ nitro:to_list(L) || L <- List], "_");
 atom(Scalar) -> nitro:to_list(Scalar).
 
 q(Key) -> q(Key, []).
-q(Key, Def) -> case get(Key) of undefined -> Def; Val -> Val end.
 
-qc(Key) -> CX = get(context), qc(Key,CX#cx.req).
-qc(Key,Req) -> proplists:get_value(nitro:to_binary(Key),cowboy_req:parse_qs(Req)).
+q(Key, Def) ->
+  case erlang:get(Key) of
+    undefined -> Def;
+    Val -> Val
+  end.
+
+qc(Key) ->
+  CX = erlang:get(context),
+  qc(Key,CX#cx.req).
+
+qc(Key, Req) ->
+  proplists:get_value(nitro:to_binary(Key), cowboy_req:parse_qs(Req)).
+
+
+start(_StartType, _StartArgs) ->
+  supervisor:start_link({local, ?MODULE}, ?MODULE, []).
 
-start(_StartType, _StartArgs) -> supervisor:start_link({local, ?MODULE}, ?MODULE, []).
 stop(_State) -> ok.
+
 init([]) -> {ok, {{one_for_one, 5, 10}, []}}.
 
+
 f(S) -> f(S, []).
+
 f(S, Args) -> lists:flatten(io_lib:format(S, Args)).
 
 coalesce([]) -> undefined;
@@ -29,35 +49,44 @@ coalesce([[]|T]) -> coalesce(T);
 coalesce([H|_]) -> H.
 
 jse(X) -> js_escape(X).
-hte(X) when is_binary(X) -> nitro:to_binary(nitro_conv:html_encode(X));
+hte(X) when erlang:is_binary(X) ->
+  nitro:to_binary(nitro_conv:html_encode(X));
 hte(X) -> nitro_conv:html_encode(X).
 
-js_escape(Value) -> nitro_conv:js_escape(Value).
+js_escape(Value) ->
+  nitro_conv:js_escape(Value).
+
+
+-define(IS_STRING(Term),
+  (erlang:is_list(Term) andalso Term /= [] andalso erlang:is_integer(erlang:hd(Term)))).
 
--define(IS_STRING(Term), (is_list(Term) andalso Term /= [] andalso is_integer(hd(Term)))).
 
 to_list(L) when ?IS_STRING(L) -> L;
-to_list(L) when is_list(L) -> SubLists = [inner_to_list(X) || X <- L], lists:flatten(SubLists);
+to_list(L) when erlang:is_list(L) ->
+  SubLists = [inner_to_list(X) || X <- L],
+  lists:flatten(SubLists);
 to_list(A) -> inner_to_list(A).
-inner_to_list(A) when is_atom(A) -> atom_to_list(A);
-inner_to_list(B) when is_binary(B) -> binary_to_list(B);
-inner_to_list(I) when is_integer(I) -> integer_to_list(I);
-inner_to_list(L) when is_tuple(L) -> lists:flatten(io_lib:format("~p", [L]));
-inner_to_list(L) when is_list(L) -> L;
-inner_to_list(F) when is_float(F) -> float_to_list(F,[{decimals,9},compact]).
-
-to_atom(A) when is_atom(A) -> A;
-to_atom(B) when is_binary(B) -> to_atom(binary_to_list(B));
-to_atom(I) when is_integer(I) -> to_atom(integer_to_list(I));
-to_atom(F) when is_float(F) -> to_atom(float_to_list(F,[{decimals,9},compact]));
-to_atom(L) when is_list(L) -> list_to_atom(binary_to_list(list_to_binary(L))).
-
-to_binary(A) when is_atom(A) -> atom_to_binary(A,latin1);
-to_binary(B) when is_binary(B) -> B;
-to_binary(I) when is_integer(I) -> to_binary(integer_to_list(I));
-to_binary(F) when is_float(F) -> float_to_binary(F,[{decimals,9},compact]);
-to_binary(L) when is_list(L) ->  iolist_to_binary(L);
-to_binary(X) when is_tuple(X) ->  term_to_binary(X).
+
+inner_to_list(A) when erlang:is_atom(A) -> erlang:atom_to_list(A);
+inner_to_list(B) when erlang:is_binary(B) -> erlang:binary_to_list(B);
+inner_to_list(I) when erlang:is_integer(I) -> erlang:integer_to_list(I);
+inner_to_list(L) when erlang:is_tuple(L) -> lists:flatten(io_lib:format("~p", [L]));
+inner_to_list(L) when erlang:is_list(L) -> L;
+inner_to_list(F) when erlang:is_float(F) -> erlang:float_to_list(F, [{decimals, 9}, compact]).
+
+to_atom(A) when erlang:is_atom(A) -> A;
+to_atom(B) when erlang:is_binary(B) -> to_atom(erlang:binary_to_list(B));
+to_atom(I) when erlang:is_integer(I) -> to_atom(erlang:integer_to_list(I));
+to_atom(F) when erlang:is_float(F) -> to_atom(erlang:float_to_list(F, [{decimals, 9}, compact]));
+to_atom(L) when erlang:is_list(L) -> erlang:list_to_atom(erlang:binary_to_list(erlang:list_to_binary(L))).
+
+to_binary(A) when erlang:is_atom(A) -> erlang:atom_to_binary(A, latin1);
+to_binary(B) when erlang:is_binary(B) -> B;
+to_binary(I) when erlang:is_integer(I) -> to_binary(erlang:integer_to_list(I));
+to_binary(F) when erlang:is_float(F) -> erlang:float_to_binary(F, [{decimals, 9}, compact]);
+to_binary(L) when erlang:is_list(L) ->  erlang:iolist_to_binary(L);
+to_binary(X) when erlang:is_tuple(X) ->  erlang:term_to_binary(X).
+
 
 -ifndef(PICKLER).
 -define(PICKLER, (application:get_env(n2z, pickler, nitro_conv))).
@@ -66,160 +95,208 @@ to_binary(X) when is_tuple(X) ->  term_to_binary(X).
 pickle(Data) -> ?PICKLER:pickle(Data).
 depickle(SerializedData) -> ?PICKLER:depickle(SerializedData).
 
-prolongate() -> case application:get_env(n2z, session) of {ok, M} -> M:prolongate(); undefined -> false end.
-authenticate(I, Auth) -> (application:get_env(n2z, session, n2z_session)):authenticate(I, Auth).
+prolongate() ->
+  case application:get_env(n2z, session) of
+    {ok, M} -> M:prolongate();
+    undefined -> false
+  end.
+
+authenticate(I, Auth) ->
+  (application:get_env(n2z, session, n2z_session)):authenticate(I, Auth).
 
 render(X) -> wf_render:render(X).
 wire(Actions) -> action_wire:wire(Actions).
 
 unique_integer() -> erlang:unique_integer().
-temp_id() -> "auto" ++ integer_to_list(unique_integer() rem 1000000).
-
-html_encode(L,Fun) when is_function(Fun) -> Fun(L);
-html_encode(L,EncType) when is_atom(L) -> html_encode(nitro:to_list(L),EncType);
-html_encode(L,EncType) when is_integer(L) -> html_encode(integer_to_list(L),EncType);
-html_encode(L,EncType) when is_float(L) -> html_encode(float_to_list(L,[{decimals,9},compact]),EncType);
-html_encode(L, false) -> L;
-html_encode(L, true) -> L;
-html_encode(L, whites) -> html_encode_whites(nitro:to_list(lists:flatten([L]))).
-html_encode(<<>>) -> [];
-html_encode([]) -> [];
+
+temp_id() ->
+  "auto" ++ integer_to_list(unique_integer() rem 1000000).
+
+html_encode(L, Fun) when erlang:is_function(Fun) ->
+  Fun(L);
+html_encode(L, EncType) when erlang:is_atom(L) ->
+  html_encode(nitro:to_list(L), EncType);
+html_encode(L, EncType) when erlang:is_integer(L) ->
+  html_encode(erlang:integer_to_list(L),EncType);
+html_encode(L, EncType) when erlang:is_float(L) ->
+  html_encode(erlang:float_to_list(L, [{decimals, 9}, compact]), EncType);
+html_encode(L, false) ->
+  L;
+html_encode(L, true) ->
+  L;
+html_encode(L, whites) ->
+  html_encode_whites(nitro:to_list(lists:flatten([L]))).
+html_encode(<<>>) ->
+  [];
+html_encode([]) ->
+  [];
 html_encode([H|T]) ->
-    case H of
-        $< -> "&lt;" ++ html_encode(T);
-        $> -> "&gt;" ++ html_encode(T);
-        $" -> "&quot;" ++ html_encode(T);
-        $' -> "&#39;" ++ html_encode(T);
-        $& -> "&amp;" ++ html_encode(T);
-        BigNum when is_integer(BigNum) andalso BigNum > 255 ->
-        [$&,$# | nitro:to_list(BigNum)] ++ ";" ++ html_encode(T);
-        Tup when is_tuple(Tup) -> throw({html_encode,encountered_tuple,Tup});
-        _ -> [H|html_encode(T)]
-    end.
+  case H of
+    $< -> "&lt;" ++ html_encode(T);
+    $> -> "&gt;" ++ html_encode(T);
+    $" -> "&quot;" ++ html_encode(T);
+    $' -> "&#39;" ++ html_encode(T);
+    $& -> "&amp;" ++ html_encode(T);
+    BigNum when erlang:is_integer(BigNum) andalso BigNum > 255 ->
+      [$&,$# | nitro:to_list(BigNum)] ++ ";" ++ html_encode(T);
+    Tup when erlang:is_tuple(Tup) ->
+      erlang:throw({html_encode, encountered_tuple, Tup});
+    _ ->
+      [H|html_encode(T)]
+  end.
 
 html_encode_whites([]) -> [];
 html_encode_whites([H|T]) ->
-    case H of
-        $\s -> "&nbsp;" ++ html_encode_whites(T);
-        $\t -> "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" ++ html_encode_whites(T);
-        $< -> "&lt;" ++ html_encode_whites(T);
-        $> -> "&gt;" ++ html_encode_whites(T);
-        $" -> "&quot;" ++ html_encode_whites(T);
-        $' -> "&#39;" ++ html_encode_whites(T);
-        $& -> "&amp;" ++ html_encode_whites(T);
-        $\n -> "<br>" ++ html_encode_whites(T);
-        _ -> [H|html_encode_whites(T)]
-    end.
-
-script() -> get(script).
-script(Script) -> put(script,Script).
+  case H of
+    $\s -> "&nbsp;" ++ html_encode_whites(T);
+    $\t -> "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" ++ html_encode_whites(T);
+    $< -> "&lt;" ++ html_encode_whites(T);
+    $> -> "&gt;" ++ html_encode_whites(T);
+    $" -> "&quot;" ++ html_encode_whites(T);
+    $' -> "&#39;" ++ html_encode_whites(T);
+    $& -> "&amp;" ++ html_encode_whites(T);
+    $\n -> "<br>" ++ html_encode_whites(T);
+    _ -> [H|html_encode_whites(T)]
+  end.
+
+script() -> erlang:get(script).
+script(Script) -> erlang:put(script, Script).
+
 
 % Update DOM nitro:update
 
 update(Target, Elements) ->
-    nitro:wire(#jq{target=Target,property=outerHTML,right=Elements,format="`~s`"}).
+  nitro:wire(#jq{target=Target, property=outerHTML, right=Elements, format="`~s`"}).
 
-insert_top(Tag,Target, Elements) ->
-    {Render, _Ref, Actions} = render_html(Elements),
-    nitro:wire(nitro:f(
-        "qi('~s').insertBefore("
-        "(function(){var div = qn('~s'); div.innerHTML = `~s`; return div.firstChild; })(),"
-        "qi('~s').firstChild);",
-        [Target,Tag,Render,Target])),
-    nitro:wire(nitro:render(Actions)).
+insert_top(Tag, Target, Elements) ->
+  {Render, _Ref, Actions} = render_html(Elements),
+  nitro:wire(nitro:f(
+    "qi('~s').insertBefore("
+    "(function(){var div = qn('~s'); div.innerHTML = `~s`; return div.firstChild; })(),"
+    "qi('~s').firstChild);",
+    [Target, Tag, Render, Target])),
+  nitro:wire(nitro:render(Actions)).
 
 insert_bottom(Tag, Target, Elements) ->
-    {Render, _Ref, Actions} = render_html(Elements),
-    nitro:wire(nitro:f(
-        "(function(){ var div = qn('~s'); div.innerHTML = `~s`;"
-                     "qi('~s').appendChild(div.firstChild); })();",
-        [Tag,Render,Target])),
-    nitro:wire(nitro:render(Actions)).
+  {Render, _Ref, Actions} = render_html(Elements),
+  nitro:wire(nitro:f(
+    "(function(){ var div = qn('~s'); div.innerHTML = `~s`;"
+    "qi('~s').appendChild(div.firstChild); })();",
+    [Tag, Render, Target])),
+  nitro:wire(nitro:render(Actions)).
 
 insert_before(Target, Elements) -> insert_adjacent(beforebegin, Target, Elements).
 insert_after(Target, Elements) -> insert_adjacent(afterend, Target, Elements).
 
-insert_adjacent(Command, Target, Elements) -> insert_adjacent(Command, Target, Elements, "qi").
+insert_adjacent(Command, Target, Elements) ->
+  insert_adjacent(Command, Target, Elements, "qi").
 insert_adjacent(Command, Target, Elements, Q) ->
-    {Render, _Ref, Actions} = render_html(Elements),
-    nitro:wire(nitro:f("~s('~s').insertAdjacentHTML('~s', `~s`);",[Q,Target,Command,Render])),
-    nitro:wire(nitro:render(Actions)).
+  {Render, _Ref, Actions} = render_html(Elements),
+  nitro:wire(nitro:f("~s('~s').insertAdjacentHTML('~s', `~s`);", [Q, Target, Command, Render])),
+  nitro:wire(nitro:render(Actions)).
 
 
 render_html(Elements) ->
-    Pid = self(),
-    Ref = make_ref(),
-    spawn(fun() -> R = nitro:render(Elements), Pid ! {R, Ref, nitro:actions()} end),
-    {Render, Ref, Actions} = receive {_, Ref, _} = A -> A end, 
-    {Render, Ref, Actions}.
-    
+  Pid = erlang:self(),
+  Ref = erlang:make_ref(),
+  erlang:spawn(fun() ->
+    R = nitro:render(Elements),
+    Pid ! {R, Ref, nitro:actions()}
+    end),
+  {Render, Ref, Actions} = receive {_, Ref, _} = A -> A end, 
+  {Render, Ref, Actions}.
+
 
-actions() -> get(actions).
-actions(Ac) -> put(actions,Ac).
+actions() -> erlang:get(actions).
+actions(Ac) -> erlang:put(actions,Ac).
 
-insert_top(Target, Elements) when element(1,Elements) == tr -> insert_top(tbody,Target, Elements);
-insert_top(Target, Elements) -> insert_top('div',Target, Elements).
-insert_bottom(Target, Elements) when element(1,Elements) == tr -> insert_bottom(tbody, Target, Elements);
-insert_bottom(Target, Elements) -> insert_bottom('div', Target, Elements).
+insert_top(Target, Elements) when erlang:element(1, Elements) == tr ->
+  insert_top(tbody, Target, Elements);
+insert_top(Target, Elements) ->
+  insert_top('div', Target, Elements).
+
+insert_bottom(Target, Elements) when erlang:element(1, Elements) == tr ->
+  insert_bottom(tbody, Target, Elements);
+insert_bottom(Target, Elements) ->
+  insert_bottom('div', Target, Elements).
 
 
 clear(Target) ->
-    nitro:wire("var x = qi('"++nitro:to_list(Target)++"'); while (x && x.firstChild) x.removeChild(x.firstChild);").
+  nitro:wire("var x = qi('" ++ nitro:to_list(Target) ++ "');"
+    "while(x && x.firstChild) x.removeChild(x.firstChild);").
 
 remove(Target) ->
-    nitro:wire("var x=qi('"++nitro:to_list(Target)++"'); x && x.parentNode.removeChild(x);").
+  nitro:wire("var x = qi('" ++ nitro:to_list(Target) ++ "');"
+    "x && x.parentNode.removeChild(x);").
+
 
 % Wire JavaScript nitro:wire
 
 state(Key) -> erlang:get(Key).
-state(Key,Value) -> erlang:put(Key,Value).
+state(Key, Value) -> erlang:put(Key, Value).
+
 
 % Redirect and purge connection nitro:redirect
 
-redirect(Url) -> nitro:wire(#jq{target='window',property=location,args=simple,right=Url}).
-%header(K,V) -> nitro:context((?CTX)#cx{req=cowboy_req:set_resp_header(K,V,?CTX#cx.req)}).
+redirect(Url) -> nitro:wire(#jq{target='window', property=location, args=simple, right=Url}).
+%header(K, V) -> nitro:context((?CTX)#cx{req=cowboy_req:set_resp_header(K, V, ?CTX#cx.req)}).
+
 
 setAttr(Element, Attr, Value) -> 
-    nitro:wire("{ var x = qi('"++ 
-    nitro:to_list(Element)++"'); if (x) x.setAttribute('"++nitro:to_list(Attr)++"', '"++nitro:to_list(Value)++"'); }").
+  nitro:wire("{ var x = qi('" ++ nitro:to_list(Element) ++ "');"
+    "if(x) x.setAttribute('" ++ nitro:to_list(Attr) ++ "', '" ++ nitro:to_list(Value) ++ "'); }").
 
-style(Element, Style) -> setAttr(Element, "style", Style).
+style(Element, Style) ->
+  setAttr(Element, "style", Style).
 style(Element, Style, Value) -> 
-            nitro:wire("{ var x = qi('"++ 
-                nitro:to_list(Element)++"'); if (x) x.style."++nitro:to_list(Style)++" = '"++nitro:to_list(Value)++"'; }").
+  nitro:wire("{ var x = qi('" ++ nitro:to_list(Element) ++ "');"
+    "if(x) x.style." ++ nitro:to_list(Style) ++ " = '" ++ nitro:to_list(Value) ++ "'; }").
 
-display(Element,Status) -> style(Element, "display", Status).
+display(Element, Status) -> style(Element, "display", Status).
 
-show(Element) -> display(Element,block).
-hide(Element) -> display(Element,none).
+show(Element) -> display(Element, block).
+hide(Element) -> display(Element, none).
 
 compact([]) -> "[]";
 compact("\n") -> "[]";
-compact([X|_]=Y) when is_tuple(X) -> [ compact(F) || F <- Y ];
-compact(Tuple) when is_binary(Tuple) -> unicode:characters_to_binary(Tuple);
-compact(Tuple) when is_tuple(Tuple) ->
-     Min = erlang:min(9,size(Tuple)),
-     Fields = lists:zip(lists:seq(1,Min),lists:sublist(tuple_to_list(Tuple),1,Min)),
-     "{" ++ string:join([ io_lib:format("~s",[compact(F)]) || {_,F}<- Fields ],",") ++ "}";
-compact(Tuple) -> nitro:jse(nitro:to_list(Tuple)).
-
-meg(X) -> integer_to_list(X div 1000000) ++ "M".
+compact([X|_]=Y) when erlang:is_tuple(X) ->
+  [ compact(F) || F <- Y ];
+compact(Bin) when erlang:is_binary(Bin) ->
+  unicode:characters_to_binary(Bin);
+compact(Tuple) when erlang:is_tuple(Tuple) ->
+  Min = erlang:min(9, erlang:size(Tuple)),
+  Fields = lists:zip(lists:seq(1, Min),
+    lists:sublist(erlang:tuple_to_list(Tuple), 1, Min)),
+  "{" ++ string:join([ io_lib:format("~s", [compact(F)]) || {_, F} <- Fields ], ",") ++ "}";
+compact(T) ->
+  nitro:jse(nitro:to_list(T)).
+
+meg(X) -> erlang:integer_to_list(X div 1000000) ++ "M".
+
 rev(X) -> lists:reverse(X).
+
 num(S) -> case rev(S) of
-               [$K|K] -> list_to_integer(rev(K)) * 1000;
-               [$M|M] -> list_to_integer(rev(M)) * 1000 * 1000;
-               [$G|G] -> list_to_integer(rev(G)) * 1000 * 1000 * 1000;
-               [$T|T] -> list_to_integer(rev(T)) * 1000 * 1000 * 1000 * 1000 end.
+    [$K|K] -> erlang:list_to_integer(rev(K)) * 1000;
+    [$M|M] -> erlang:list_to_integer(rev(M)) * 1000 * 1000;
+    [$G|G] -> erlang:list_to_integer(rev(G)) * 1000 * 1000 * 1000;
+    [$T|T] -> erlang:list_to_integer(rev(T)) * 1000 * 1000 * 1000 * 1000
+  end.
 
 cookie_expire(SecondsToLive) ->
-    Seconds = calendar:datetime_to_gregorian_seconds(calendar:local_time()),
-    DateTime = calendar:gregorian_seconds_to_datetime(Seconds + SecondsToLive),
-    cow_date:rfc2109(DateTime).
+  Seconds = calendar:datetime_to_gregorian_seconds(calendar:local_time()),
+  DateTime = calendar:gregorian_seconds_to_datetime(Seconds + SecondsToLive),
+  cow_date:rfc2109(DateTime).
 
 cookie(Id, Value) -> cookie(Id, Value, 2147483647). % expire never
 cookie(Id, Value, Expire) ->
-    Format = "document.cookie='~s=~s; path=/; expires=~s';",
-    nitro:wire(nitro:f(Format,[nitro:to_list(Id),nitro:to_list(Value), cookie_expire(Expire)])).
+  Format = "document.cookie='~s=~s; path=/; expires=~s';",
+  nitro:wire(nitro:f(Format, [nitro:to_list(Id), nitro:to_list(Value), cookie_expire(Expire)])).
+
+cookies() ->
+  cowboy_req:parse_cookies((erlang:get(context))#cx.req).
+cookie(Key) ->
+  case lists:keyfind(Key, 1, cowboy_req:parse_cookies((erlang:get(context))#cx.req)) of
+    false -> undefined;
+    {_, Value} -> Value
+  end.
 
-cookies() -> cowboy_req:parse_cookies((get(context))#cx.req).
-cookie(Key) -> case lists:keyfind(Key, 1, cowboy_req:parse_cookies((get(context))#cx.req)) of false -> undefined; {_, Value} -> Value end.

+ 153 - 98
src/nitro_conv.erl

@@ -1,12 +1,15 @@
 -module(nitro_conv).
 % N2Z Formatter: JSON, BERT
 % author Maxim Sokhatsky
--compile(export_all).
+
 -include_lib("nitro/include/nitro.hrl").
 
+-compile([export_all, nowarn_export_all]). % todo export
+
+
 % WF to_atom to_list to_binary
 
--define(IS_STRING(Term), (is_list(Term) andalso Term /= [] andalso is_integer(hd(Term)))).
+-define(IS_STRING(Term), (erlang:is_list(Term) andalso Term /= [] andalso erlang:is_integer(erlang:hd(Term)))).
 
 -ifndef(N2Z_JSON).
 -define(N2Z_JSON, (application:get_env(n2z, json, jsone))).
@@ -14,79 +17,90 @@
 
 
 to_list(L) when ?IS_STRING(L) -> L;
-to_list(L) when is_list(L) -> SubLists = [inner_to_list(X) || X <- L], lists:flatten(SubLists);
+to_list(L) when erlang:is_list(L) ->
+  SubLists = [inner_to_list(X) || X <- L],
+  lists:flatten(SubLists);
 to_list(A) -> inner_to_list(A).
-inner_to_list(A) when is_atom(A) -> atom_to_list(A);
-inner_to_list(B) when is_binary(B) -> binary_to_list(B);
-inner_to_list(I) when is_integer(I) -> integer_to_list(I);
-inner_to_list(L) when is_tuple(L) -> lists:flatten(io_lib:format("~p", [L]));
-inner_to_list(L) when is_list(L) -> L;
-inner_to_list(F) when is_float(F) -> float_to_list(F,[{decimals,9},compact]).
-
-to_atom(A) when is_atom(A) -> A;
-to_atom(B) when is_binary(B) -> to_atom(binary_to_list(B));
-to_atom(I) when is_integer(I) -> to_atom(integer_to_list(I));
-to_atom(F) when is_float(F) -> to_atom(float_to_list(F,[{decimals,9},compact]));
-to_atom(L) when is_list(L) -> list_to_atom(binary_to_list(list_to_binary(L))).
-
-to_binary(A) when is_atom(A) -> atom_to_binary(A,latin1);
-to_binary(B) when is_binary(B) -> B;
-to_binary(T) when is_tuple(T) -> term_to_binary(T);
-to_binary(I) when is_integer(I) -> to_binary(integer_to_list(I));
-to_binary(F) when is_float(F) -> float_to_binary(F,[{decimals,9},compact]);
-to_binary(L) when is_list(L) ->  iolist_to_binary(L).
-
-to_integer(A) when is_atom(A) -> to_integer(atom_to_list(A));
-to_integer(B) when is_binary(B) -> to_integer(binary_to_list(B));
-to_integer(I) when is_integer(I) -> I;
+
+inner_to_list(A) when erlang:is_atom(A) -> erlang:atom_to_list(A);
+inner_to_list(B) when erlang:is_binary(B) -> erlang:binary_to_list(B);
+inner_to_list(I) when erlang:is_integer(I) -> erlang:integer_to_list(I);
+inner_to_list(L) when erlang:is_tuple(L) -> lists:flatten(io_lib:format("~p", [L]));
+inner_to_list(L) when erlang:is_list(L) -> L;
+inner_to_list(F) when erlang:is_float(F) -> erlang:float_to_list(F, [{decimals, 9}, compact]).
+
+to_atom(A) when erlang:is_atom(A) -> A;
+to_atom(B) when erlang:is_binary(B) -> to_atom(erlang:binary_to_list(B));
+to_atom(I) when erlang:is_integer(I) -> to_atom(erlang:integer_to_list(I));
+to_atom(F) when erlang:is_float(F) -> to_atom(erlang:float_to_list(F, [{decimals, 9}, compact]));
+to_atom(L) when erlang:is_list(L) -> erlang:list_to_atom(erlang:binary_to_list(erlang:list_to_binary(L))).
+
+to_binary(A) when erlang:is_atom(A) -> erlang:atom_to_binary(A,latin1);
+to_binary(B) when erlang:is_binary(B) -> B;
+to_binary(T) when erlang:is_tuple(T) -> erlang:term_to_binary(T);
+to_binary(I) when erlang:is_integer(I) -> to_binary(erlang:integer_to_list(I));
+to_binary(F) when erlang:is_float(F) -> float_to_binary(F, [{decimals, 9}, compact]);
+to_binary(L) when erlang:is_list(L) ->  erlang:iolist_to_binary(L).
+
+to_integer(A) when erlang:is_atom(A) -> to_integer(erlang:atom_to_list(A));
+to_integer(B) when erlang:is_binary(B) -> to_integer(erlang:binary_to_list(B));
+to_integer(I) when erlang:is_integer(I) -> I;
 to_integer([]) -> 0;
-to_integer(L) when is_list(L) -> list_to_integer(L);
-to_integer(F) when is_float(F) -> round(F).
+to_integer(L) when erlang:is_list(L) -> erlang:list_to_integer(L);
+to_integer(F) when erlang:is_float(F) -> erlang:round(F).
+
 
 % HTML encode/decode
 
-html_encode(L,Fun) when is_function(Fun) -> Fun(L);
-html_encode(L,EncType) when is_atom(L) -> html_encode(nitro:to_list(L),EncType);
-html_encode(L,EncType) when is_integer(L) -> html_encode(integer_to_list(L),EncType);
-html_encode(L,EncType) when is_float(L) -> html_encode(float_to_list(L,[{decimals,9},compact]),EncType);
+html_encode(L, Fun) when erlang:is_function(Fun) ->
+  Fun(L);
+html_encode(L, EncType) when erlang:is_atom(L) ->
+  html_encode(nitro:to_list(L), EncType);
+html_encode(L, EncType) when erlang:is_integer(L) ->
+  html_encode(erlang:integer_to_list(L), EncType);
+html_encode(L, EncType) when erlang:is_float(L) ->
+  html_encode(erlang:float_to_list(L, [{decimals, 9}, compact]), EncType);
 html_encode(L, false) -> L;
 html_encode(L, true) -> L;
-html_encode(L, whites) -> html_encode_whites(nitro:to_list(lists:flatten([L]))).
+html_encode(L, whites) ->
+  html_encode_whites(nitro:to_list(lists:flatten([L]))).
 html_encode(<<>>) -> <<>>;
 html_encode([]) -> [];
-html_encode(B) when is_binary(B) -> html_encode(binary_to_list(B));
+html_encode(B) when is_binary(B) ->
+  html_encode(erlang:binary_to_list(B));
 html_encode([$\n|T]) -> "<br>" ++ html_encode(T);
 html_encode([H|T]) ->
-	case H of
-		$< -> "&lt;" ++ html_encode(T);
-		$> -> "&gt;" ++ html_encode(T);
-		$" -> "&quot;" ++ html_encode(T);
-		$` -> "&#39;" ++ html_encode(T);
-		$' -> "&#39;" ++ html_encode(T);
-		$& -> "&amp;" ++ html_encode(T);
-		BigNum when is_integer(BigNum) andalso BigNum > 255 ->
-			%% Any integers above 255 are converted to their HTML encode equivilant,
-			%% Example: 7534 gets turned into &#7534;
-			[$&,$# | nitro:to_list(BigNum)] ++ ";" ++ html_encode(T);
-		Tup when is_tuple(Tup) -> 
-			throw({html_encode,encountered_tuple,Tup});
-		_ -> [H|html_encode(T)]
-	end.
+  case H of
+    $< -> "&lt;" ++ html_encode(T);
+    $> -> "&gt;" ++ html_encode(T);
+    $" -> "&quot;" ++ html_encode(T);
+    $` -> "&#39;" ++ html_encode(T);
+    $' -> "&#39;" ++ html_encode(T);
+    $& -> "&amp;" ++ html_encode(T);
+    BigNum when erlang:is_integer(BigNum) andalso BigNum > 255 ->
+      %% Any integers above 255 are converted to their HTML encode equivalent,
+      %% Example: 7534 gets turned into &#7534;
+      [$&, $# | nitro:to_list(BigNum)] ++ ";" ++ html_encode(T);
+    Tup when erlang:is_tuple(Tup) -> 
+      erlang:throw({html_encode, encountered_tuple, Tup});
+    _ -> [H|html_encode(T)]
+  end.
 
 html_encode_whites([]) -> [];
 html_encode_whites([H|T]) ->
-	case H of
-		$\s -> "&nbsp;" ++ html_encode_whites(T);
-		$\t -> "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" ++ html_encode_whites(T);
-		$< -> "&lt;" ++ html_encode_whites(T);
-		$> -> "&gt;" ++ html_encode_whites(T);
-		$" -> "&quot;" ++ html_encode_whites(T);
-		$' -> "&#39;" ++ html_encode_whites(T);
-		$` -> "&#39;" ++ html_encode_whites(T);
-		$& -> "&amp;" ++ html_encode_whites(T);
-		$\n -> "<br>" ++ html_encode_whites(T);
-		_ -> [H|html_encode_whites(T)]
-	end.
+  case H of
+    $\s -> "&nbsp;" ++ html_encode_whites(T);
+    $\t -> "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" ++ html_encode_whites(T);
+    $< -> "&lt;" ++ html_encode_whites(T);
+    $> -> "&gt;" ++ html_encode_whites(T);
+    $" -> "&quot;" ++ html_encode_whites(T);
+    $' -> "&#39;" ++ html_encode_whites(T);
+    $` -> "&#39;" ++ html_encode_whites(T);
+    $& -> "&amp;" ++ html_encode_whites(T);
+    $\n -> "<br>" ++ html_encode_whites(T);
+    _ -> [H|html_encode_whites(T)]
+  end.
+
 
 %% URL encode/decode
 
@@ -104,50 +118,73 @@ url_decode(S) -> unquote(S).
     (C =:= ?FULLSTOP orelse C =:= $- orelse C =:= $~ orelse
         C =:= $_))).
 
-quote_plus(Atom) when is_atom(Atom) -> quote_plus(atom_to_list(Atom));
-quote_plus(Int) when is_integer(Int) -> quote_plus(integer_to_list(Int));
-quote_plus(Bin) when is_binary(Bin) -> quote_plus(binary_to_list(Bin));
+quote_plus(Atom) when erlang:is_atom(Atom) ->
+  quote_plus(erlang:atom_to_list(Atom));
+quote_plus(Int) when erlang:is_integer(Int) ->
+  quote_plus(erlang:integer_to_list(Int));
+quote_plus(Bin) when erlang:is_binary(Bin) ->
+  quote_plus(erlang:binary_to_list(Bin));
 quote_plus(String) -> quote_plus(String, []).
 
 quote_plus([], Acc) -> lists:reverse(Acc);
 quote_plus([C | Rest], Acc) when ?QS_SAFE(C) -> quote_plus(Rest, [C | Acc]);
 quote_plus([$\s | Rest], Acc) -> quote_plus(Rest, [$+ | Acc]);
-quote_plus([C | Rest], Acc) -> <<Hi:4, Lo:4>> = <<C>>, quote_plus(Rest, [digit(Lo), digit(Hi), ?PERCENT | Acc]).
+quote_plus([C | Rest], Acc) ->
+  <<Hi:4, Lo:4>> = <<C>>,
+  quote_plus(Rest, [digit(Lo), digit(Hi), ?PERCENT | Acc]).
 
-unquote(Binary) when is_binary(Binary) -> unquote(binary_to_list(Binary));
+unquote(Binary) when erlang:is_binary(Binary) ->
+  unquote(erlang:binary_to_list(Binary));
 unquote(String) -> qs_revdecode(lists:reverse(String)).
 
-unhexdigit(C) when C >= $0, C =< $9 -> C - $0;
-unhexdigit(C) when C >= $a, C =< $f -> C - $a + 10;
-unhexdigit(C) when C >= $A, C =< $F -> C - $A + 10.
+unhexdigit(C) when C >= $0, C =< $9 ->
+  C - $0;
+unhexdigit(C) when C >= $a, C =< $f ->
+  C - $a + 10;
+unhexdigit(C) when C >= $A, C =< $F ->
+  C - $A + 10.
 
 qs_revdecode(S) -> qs_revdecode(S, []).
 qs_revdecode([], Acc) -> Acc;
-qs_revdecode([$+ | Rest], Acc) -> qs_revdecode(Rest, [$\s | Acc]);
-qs_revdecode([Lo, Hi, ?PERCENT | Rest], Acc) when ?IS_HEX(Lo), ?IS_HEX(Hi) -> qs_revdecode(Rest, [(unhexdigit(Lo) bor (unhexdigit(Hi) bsl 4)) | Acc]);
+qs_revdecode([$+ | Rest], Acc) ->
+  qs_revdecode(Rest, [$\s | Acc]);
+qs_revdecode([Lo, Hi, ?PERCENT | Rest], Acc) when ?IS_HEX(Lo), ?IS_HEX(Hi) ->
+  qs_revdecode(Rest, [(unhexdigit(Lo) bor (unhexdigit(Hi) bsl 4)) | Acc]);
 qs_revdecode([C | Rest], Acc) -> qs_revdecode(Rest, [C | Acc]).
 
+
 %% JavaScript encode/decode
 
 js_escape(undefined) -> [];
-js_escape(Value) when is_list(Value) -> binary_to_list(js_escape(iolist_to_binary(Value)));
+js_escape(Value) when erlang:is_list(Value) ->
+  erlang:binary_to_list(js_escape(erlang:iolist_to_binary(Value)));
 js_escape(Value) -> js_escape(Value, <<>>).
-js_escape(<<"\\", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "\\\\">>);
-js_escape(<<"\r", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "\\r">>);
-js_escape(<<"\n", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "\\n">>);
-js_escape(<<"\"", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "\\\"">>);
-js_escape(<<"'",Rest/binary>>,Acc) -> js_escape(Rest, <<Acc/binary, "\\'">>);
-js_escape(<<"`",Rest/binary>>,Acc) -> js_escape(Rest, <<Acc/binary, "\\`">>);
-js_escape(<<"<script", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "<script">>);
-js_escape(<<"script>", Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, "script>">>);
-js_escape(<<C, Rest/binary>>, Acc) -> js_escape(Rest, <<Acc/binary, C>>);
+js_escape(<<"\\", Rest/binary>>, Acc) -> %"
+  js_escape(Rest, <<Acc/binary, "\\\\">>); %"
+js_escape(<<"\r", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "\\r">>);
+js_escape(<<"\n", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "\\n">>);
+js_escape(<<"\"", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "\\\"">>);
+js_escape(<<"'", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "\\'">>);
+js_escape(<<"`", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "\\`">>);
+js_escape(<<"<script", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "<script">>);
+js_escape(<<"script>", Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, "script>">>);
+js_escape(<<C, Rest/binary>>, Acc) ->
+  js_escape(Rest, <<Acc/binary, C>>);
 js_escape(<<>>, Acc) -> Acc.
 
+
 % JOIN
 
 join([],_) -> [];
-join([Item],_Delim) -> [Item];
-join([Item|Items],Delim) -> [Item,Delim | join(Items,Delim)].
+join([Item], _Delim) -> [Item];
+join([Item|Items], Delim) -> [Item, Delim | join(Items,Delim)].
 
 % Fast HEX
 
@@ -168,21 +205,25 @@ digit(13) -> $d;
 digit(14) -> $e;
 digit(15) -> $f.
 
-hex(Bin) -> << << (digit(A1)),(digit(A2)) >> || <<A1:4,A2:4>> <= Bin >>.
-unhex(Hex) -> << << (erlang:list_to_integer([H1,H2], 16)) >> || <<H1,H2>> <= Hex >>.
+hex(Bin) ->
+  << << (digit(A1)), (digit(A2)) >> || <<A1:4, A2:4>> <= Bin >>.
+unhex(Hex) ->
+  << << (erlang:list_to_integer([H1, H2], 16)) >> || <<H1, H2>> <= Hex >>.
 
 f(S) -> f(S, []).
 f(S, Args) -> lists:flatten(io_lib:format(S, Args)).
 
 replace([], _, _) -> [];
-replace(String, S1, S2) when is_list(String), is_list(S1), is_list(S2) ->
-    Length = length(S1),
-    case string:substr(String, 1, Length) of
-        S1 -> S2 ++ replace(string:substr(String, Length + 1), S1, S2);
-        _ -> [hd(String)|replace(tl(String), S1, S2)]
-    end.
-
-coalesce({_,Y}) -> Y;
+replace(String, S1, S2) when erlang:is_list(String), erlang:is_list(S1), erlang:is_list(S2) ->
+  Length = erlang:length(S1),
+  case string:substr(String, 1, Length) of
+    S1 ->
+      S2 ++ replace(string:substr(String, Length + 1), S1, S2);
+    _ ->
+      [erlang:hd(String)|replace(erlang:tl(String), S1, S2)]
+  end.
+
+coalesce({_, Y}) -> Y;
 coalesce(false) -> undefined;
 coalesce([]) -> undefined;
 coalesce([H]) -> H;
@@ -195,13 +236,27 @@ indexof(_Key, [], _N) -> undefined;
 indexof(Key, [Key|_T], N) -> N;
 indexof(Key, [_|T], N) -> indexof(Key, T, N + 1).
 
-config(App, Key, Default) -> application:get_env(App,Key,Default).
+config(App, Key, Default) ->
+  application:get_env(App,Key,Default).
 
 os_env(Key) -> os_env(Key, "").
-os_env(Key, Default) -> case os:getenv(Key) of false -> Default; V -> V end.
+os_env(Key, Default) ->
+  case os:getenv(Key) of
+    false -> Default;
+    V -> V
+  end.
+
 
 % base64 encode/decode
-pickle(Data) -> base64:encode(term_to_binary({Data, os:timestamp()}, [compressed])).
+pickle(Data) ->
+  base64:encode(erlang:term_to_binary({Data, os:timestamp()}, [compressed])).
+
 depickle(PickledData) ->
-    try {Data, _PickleTime} = binary_to_term(base64:decode(nitro:to_binary(PickledData))), Data
-    catch _:_ -> undefined end.
+  try
+  {Data, _PickleTime} = erlang:binary_to_term(base64:decode(nitro:to_binary(PickledData))),
+  Data
+  
+  catch _:_ ->
+    undefined
+  end.
+

+ 81 - 44
src/nitro_n2z.erl

@@ -1,83 +1,119 @@
 -module(nitro_n2z).
 % N2Z Nitrogen Web Framework Protocol
+
 -include_lib("nitro/include/n2z.hrl").
+
 -export([info/3, render_actions/1, io/1, io/2, event/1]).
 
+
 % Nitrogen pickle handler
 
-info({text,<<"N2Z,", Auth/binary>>}, Req, State) ->
-    info(#init{token=Auth},Req,State);
+info({text, <<"N2Z,", Auth/binary>>}, Req, State) ->
+  info(#init{token=Auth}, Req, State);
 
 info(#init{token=Auth}, Req, State) ->
-    {'Token', Token} = nitro:authenticate([], Auth),
-    Sid = case nitro:depickle(Token) of {{S,_},_} -> S; X -> X end,
-    New = State#cx{session = Sid, token = Auth},
-    put(context,New),
-    {reply,{bert,case io(init, State) of
-                      {io,_,{stack,_}} = Io -> Io;
-                      {io,Code,_} -> {io,Code,{'Token',Token}} end},
+  {'Token', Token} = nitro:authenticate([], Auth),
+  Sid = case nitro:depickle(Token) of
+    {{S, _}, _} -> S;
+    X -> X
+  end,
+  New = State#cx{session = Sid, token = Auth},
+  erlang:put(context,New),
+  {reply, {bert, case io(init, State) of
+                   {io, _, {stack, _}} = Io -> Io;
+                   {io, Code, _} -> {io, Code, {'Token', Token}} end},
             Req,New};
 
 info(#client{data=Message}, Req, State) ->
-    nitro:actions([]),
-    {reply,{bert,io(#client{data=Message},State)},Req,State};
+  nitro:actions([]),
+  {reply, {bert, io(#client{data=Message}, State)}, Req, State};
 
 info(#pickle{}=Event, Req, State) ->
-    nitro:actions([]),
-    {reply,{bert,html_events(Event,State)},Req,State};
+  nitro:actions([]),
+  {reply, {bert, html_events(Event, State)}, Req, State};
 
 info(#flush{data=Actions}, Req, State) ->
-    nitro:actions(Actions),
-    {reply,{bert,io(<<>>)},Req,State};
+  nitro:actions(Actions),
+  {reply, {bert, io(<<>>)}, Req, State};
 
 info(#direct{data=Message}, Req, State) ->
-    nitro:actions([]),
-    {reply,{bert,case io(Message, State) of
-                      {io,_,{stack,_}} = Io -> Io;
-                      {io,Code,Res} -> {io,Code,{direct,Res}} end},
+  nitro:actions([]),
+  {reply, {bert, case io(Message, State) of
+                      {io, _, {stack, _}} = Io -> Io;
+                      {io, Code, Res} -> {io, Code, {direct, Res}} end},
             Req,State};
 
-info(Message,Req,State) -> {unknown,Message,Req,State}.
+info(Message, Req, State) -> {unknown, Message, Req, State}.
+
 
 % double render: actions could generate actions
 
 render_actions(Actions) ->
-    nitro:actions([]),
-    First  = nitro:render(Actions),
-    Second = nitro:render(nitro:actions()),
-    nitro:actions([]),
-    nitro:to_binary([First,Second]).
+  nitro:actions([]),
+  First  = nitro:render(Actions),
+  Second = nitro:render(nitro:actions()),
+  nitro:actions([]),
+  nitro:to_binary([First, Second]).
+
 
 % n2z events
 
-html_events(#pickle{source=Source,pickled=Pickled,args=Linked}, State=#cx{token = Token}) ->
-    Ev  = nitro:depickle(Pickled),
-    L   = nitro:prolongate(),
-    Res = case Ev of
-          #ev{} when L =:= false -> render_ev(Ev,Source,Linked,State), <<>>;
-          #ev{} -> render_ev(Ev,Source,Linked,State), nitro:authenticate([], Token);
-          _CustomEnvelop -> %?LOG_ERROR("EV expected: ~p~n",[CustomEnvelop]),
-                           {error,"EV expected"} end,
-    io(Res).
+html_events(#pickle{source=Source, pickled=Pickled, args=Linked}, State=#cx{token = Token}) ->
+  Ev  = nitro:depickle(Pickled),
+  L   = nitro:prolongate(),
+  Res = case Ev of
+    #ev{} when L =:= false ->
+      render_ev(Ev, Source, Linked, State),
+      <<>>;
+    #ev{} ->
+      render_ev(Ev, Source, Linked, State),
+      nitro:authenticate([], Token);
+    _CustomEnvelop ->
+      %?LOG_ERROR("EV expected: ~p~n",[CustomEnvelop]),
+      {error, "EV expected"}
+  end,
+  io(Res).
+
 
 % calling user code in exception-safe manner
 
 -ifdef(OTP_RELEASE).
 
-render_ev(#ev{module=M,name=F,msg=P,trigger=T},_Source,Linked,State) ->
-    try case F of
-         api_event -> M:F(P,Linked,State);
-             event -> [erlang:put(K,V) || {K,V} <- Linked], M:F(P);
-                 _ -> M:F(P,T,State) end
-    catch E:R:S -> ?LOG_EXCEPTION(E,R,S), {stack,S} end.
+render_ev(#ev{module=M, name=F, msg=P, trigger=T}, _Source, Linked, State) ->
+  try
+  case F of
+    api_event ->
+      M:F(P, Linked, State);
+    event ->
+      [erlang:put(K,V) || {K,V} <- Linked],
+      M:F(P);
+    _ ->
+      M:F(P, T, State)
+  end
+  
+  catch E:R:S ->
+    ?LOG_EXCEPTION(E, R, S),
+    {stack, S}
+  end.
 
 io(Event, #cx{module=Module}) ->
-    try X = Module:event(Event), {io,render_actions(nitro:actions()),X}
-    catch E:R:S -> ?LOG_EXCEPTION(E,R,S), {io,[],{stack,S}} end.
+  try
+  X = Module:event(Event),
+  {io, render_actions(nitro:actions()), X}
+  
+  catch E:R:S ->
+    ?LOG_EXCEPTION(E, R, S),
+    {io, [], {stack, S}}
+  end.
 
 io(Data) ->
-    try {io,render_actions(nitro:actions()),Data}
-    catch E:R:S -> ?LOG_EXCEPTION(E,R,S), {io,[],{stack,S}} end.
+  try
+  {io, render_actions(nitro:actions()), Data}
+  
+  catch E:R:S ->
+    ?LOG_EXCEPTION(E, R, S),
+    {io, [], {stack, S}}
+  end.
 
 -else.
 
@@ -98,6 +134,7 @@ io(Data) ->
 
 -endif.
 
+
 % event Nitrogen Web Framework protocol
 
 event(_) -> [].

+ 50 - 37
src/nitro_static.erl

@@ -1,17 +1,21 @@
 -module(nitro_static).
 % NITRO Static bridge
 % author Maxim Sokhatsky
--compile([export_all, nowarn_export_all]).
+
 -include_lib("kernel/include/file.hrl").
 
+-compile([export_all, nowarn_export_all]). % todo export
+
+
 init(_, _, _) -> {upgrade, protocol, cowboy_rest}.
 
-rest_init(Req, {dir, Path, Extra}) when is_binary(Path) -> rest_init(Req, {dir, binary_to_list(Path), Extra});
+rest_init(Req, {dir, Path, Extra}) when erlang:is_binary(Path) ->
+  rest_init(Req, {dir, erlang:binary_to_list(Path), Extra});
 rest_init(Req, {dir, Path, Extra}) ->
-    {PathInfo, Req2} = cowboy_req:path_info(Req),
-    Info = {ok, #file_info{type=regular,size=0}},
-    FileName = filename:join([Path|PathInfo]),
-    {ok, Req2, {FileName, Info, Extra}}.
+  {PathInfo, Req2} = cowboy_req:path_info(Req),
+  Info = {ok, #file_info{type=regular, 'size'=0}},
+  FileName = filename:join([Path|PathInfo]),
+  {ok, Req2, {FileName, Info, Extra}}.
 
 malformed_request(Req, State) -> {State =:= error, Req, State}.
 
@@ -22,47 +26,56 @@ forbidden(Req, State) -> {false, Req, State}.
 
 
 
-fixpath(Path) -> {Module,Fun} = application:get_env(n2z, fixpath, {nitro_static,fix}),
-                 Module:Fun(Path).
+fixpath(Path) ->
+  {Module, Fun} = application:get_env(n2z, fixpath, {nitro_static, fix}),
+  Module:Fun(Path).
 
 fix(A) -> A.
 
 content_types_provided(Req, State={Path, _, Extra}) ->
-    case lists:keyfind(mimetypes, 1, Extra) of
-         false -> {[{cow_mimetypes:web(Path), get_file}], Req, State};
-         {mimetypes, Module, Function} ->
-            {[{Module:Function(fixpath(Path)), get_file}], Req, State};
-         {mimetypes, Type} -> {[{Type, get_file}], Req, State}
-    end.
+  case lists:keyfind(mimetypes, 1, Extra) of
+    false ->
+      {[{cow_mimetypes:web(Path), get_file}], Req, State};
+    {mimetypes, Module, Function} ->
+      {[{Module:Function(fixpath(Path)), get_file}], Req, State};
+    {mimetypes, Type} ->
+      {[{Type, get_file}], Req, State}
+  end.
 
 resource_exists(Req, State={_, {ok, #file_info{type=regular}}, _}) -> {true, Req, State};
 resource_exists(Req, State) -> {false, Req, State}.
 
-generate_etag(Req, State={Path, {ok, #file_info{size=Size, mtime=Mtime}}, Extra}) ->
-    case lists:keyfind(etag, 1, Extra) of
-         false -> {generate_default_etag(Size, Mtime), Req, State};
-         {etag, Module, Function} -> {Module:Function(Path, Size, Mtime), Req, State};
-         {etag, false} -> {undefined, Req, State}
-    end.
+generate_etag(Req, State={Path, {ok, #file_info{'size'=Size, mtime=Mtime}}, Extra}) ->
+  case lists:keyfind(etag, 1, Extra) of
+    false -> {generate_default_etag(Size, Mtime), Req, State};
+    {etag, Module, Function} -> {Module:Function(Path, Size, Mtime), Req, State};
+    {etag, false} -> {undefined, Req, State}
+  end.
 
 generate_default_etag(Size, Mtime) ->
-    {strong, list_to_binary(integer_to_list(erlang:phash2({Size, Mtime}, 16#ffffffff)))}.
+  {strong, erlang:list_to_binary(erlang:integer_to_list(erlang:phash2({Size, Mtime}, 16#ffffffff)))}.
 
 last_modified(Req, State={_, {ok, #file_info{mtime=Modified}}, _}) -> {Modified, Req, State}.
 
-get_file(Req, State={P, {ok, #file_info{size=_Size}}, _}) ->
-    Path = fixpath(P),
-    StringPath = nitro:to_list(unicode:characters_to_binary(Path,utf8,utf8)),
-    [_Type,Name|RestPath] = filename:split(StringPath),
-    FileName = filename:absname(StringPath),
-    Raw = case file:read_file(FileName) of
-          {ok,Bin} -> Bin;
-          {error,_} ->
-              case mad_repl:load_file(StringPath) of
-                   {ok,ETSFile} -> ETSFile;
-                   {error,_} ->
-                        case file:read_file(filename:join([ code:lib_dir(list_to_atom(Name))|RestPath])) of
-                             {ok,ReleaseFile} -> ReleaseFile;
-                             {error,_} -> <<>> end end end,
-    Sendfile = fun (Socket, Transport) -> Transport:send(Socket, Raw) end,
-    {{stream, size(Raw), Sendfile}, Req, State}.
+get_file(Req, State={P, {ok, #file_info{'size'=_Size}}, _}) ->
+  Path = fixpath(P),
+  StringPath = nitro:to_list(unicode:characters_to_binary(Path, utf8, utf8)),
+  [_Type,Name|RestPath] = filename:split(StringPath),
+  FileName = filename:absname(StringPath),
+  Raw = case file:read_file(FileName) of
+    {ok, Bin} -> Bin;
+    {error, _} ->
+      case mad_repl:load_file(StringPath) of
+        {ok, ETSFile} -> ETSFile;
+        {error, _} ->
+          case file:read_file(filename:join([ code:lib_dir(erlang:list_to_atom(Name))|RestPath])) of
+            {ok, ReleaseFile} -> ReleaseFile;
+            {error, _} -> <<>>
+          end
+      end
+  end,
+  Sendfile = fun(Socket, Transport) ->
+    Transport:send(Socket, Raw)
+  end,
+  {{stream, erlang:size(Raw), Sendfile}, Req, State}.
+

+ 48 - 28
src/render/wf_event.erl

@@ -1,36 +1,56 @@
 -module(wf_event).
 % author Maxim Sokhatsky
 % author Andrey Martemyanov
+
 -include_lib("nitro/include/cx.hrl").
 -include_lib("nitro/include/nitro.hrl").
--compile([export_all, nowarn_export_all]).
-
--record(ev,      { module, msg, trigger, name }).
-
--define(B(E), nitro:to_binary(E)).
--define(L(E), nitro:to_list(E)).
-target({ps, {qa, Id}, Ps}) ->
-  T = target({qa,Id}), P = nitro:js_escape(Ps),
-  ["var t=",T,";t.map(ts => '",P,"'.split('.').reduce((a,p)=>(a&&a[p]?a[p]:null),ts)).filter(o=>o)"];
-target({ps,Id,Ps}) ->
-  T = target(Id), P = nitro:js_escape(Ps),
-  ["var ts=",T,",ps = '",P,"'.split('.').reduce((a,p)=>(a&&a[p]?a[p]:null),ts);","ps&&ps"];
-target({qs,S}) -> ["qs('",nitro:js_escape(?L(S)), "')"];
-target({qa,S}) -> ["Array.from(qa('",nitro:js_escape(?L(S)), "'))"];
-target({g,T})  -> nitro:js_escape(?L(T));
-target(Id)     -> ["qi('",nitro:js_escape(?L(Id)),"')"].
-
-new(P,E,D,N,Data,Source) -> new(P,E,D,N,Data,Source,<<>>).
-
-new(bin,Data) -> <<"ws.send(enc(tuple(atom('bin'),bin('",(nitro:pickle(Data))/binary,"'))));">>.
+
+-export([target/1, new/2, new/6, new/7]).
+
+
+-record(ev, { module, msg, trigger, name }).
+
+target({ps, {qa, Id}=T, Ps}) ->
+  ["var t=", target(T), ";t.map(ts => '", nitro:js_escape(Ps), "'.split('.')"
+     ".reduce((a, p)=>(a&&a[p]?a[p]:null), ts)).filter(o=>o)"];
+target({ps, Id, Ps}) ->
+  ["var ts=", target(Id), ",ps = '", nitro:js_escape(Ps), "'.split('.')"
+     ".reduce((a,p)=>(a&&a[p]?a[p]:null),ts); ps&&ps"];
+target({qs, S}) ->
+  ["qs('", nitro:js_escape(nitro:to_list(S)), "')"];
+target({qa, S}) ->
+  ["Array.from(qa('", nitro:js_escape(nitro:to_list(S)), "'))"];
+target({g, T}) ->
+  nitro:js_escape(nitro:to_list(T));
+target(Id) ->
+  ["qi('", nitro:js_escape(nitro:to_list(Id)), "')"].
+
+
+new(bin, Data) ->
+  <<"ws.send(enc(tuple(atom('bin'), bin('", (nitro:pickle(Data))/binary, "'))));">>.
+
+new(P, E, D, N, Data, Source) -> new(P, E, D, N, Data, Source, <<>>).
+
 new([], _, _, _, _, _, _) -> <<>>;
 new(undefined, _, _, _, _, _, _) -> <<>>;
 new(Postback, Element, Delegate, Name, Data, Source, Validation) ->
-    Module = nitro:coalesce([Delegate, ?CTX#cx.module]),
-    Join=fun([]) -> [];
-           ([E]) -> [$'|E]++[$'];
-         ([H|T]) -> [[$'|H]++[$']] ++ [ [$,,$'|E]++[$'] || E <- T ] end,
-    Event = #ev{name=Name, module=Module, msg=Postback, trigger=Element},
-    list_to_binary(["{ if (validateSources([",Join([ nitro:to_list(S) || S <- Source, S =/= []]),
-        "])) { ",?B(Validation)," ws.send(enc(tuple(atom('",?B(application:get_env(n2z, event, pickle)),"'),bin('",
-        Element,"'),bin('",nitro:pickle(Event),"'),",Data,"))); } else console.log('Validation Error'); }"]).
+  Module = nitro:coalesce([Delegate, ?CTX#cx.module]),
+  
+  Event = #ev{name=Name, module=Module, msg=Postback, trigger=Element},
+  erlang:list_to_binary(["{ if(validateSources([",
+    join([nitro:to_list(S) || S <- Source, S =/= []]),
+    "])){", nitro:to_binary(Validation),
+    " ws.send(enc(tuple(atom('",
+    nitro:to_binary(application:get_env(n2z, event, pickle)),
+    "'),bin('", Element, "'),bin('", nitro:pickle(Event), "'),", Data, ")));"
+    "}else console.log('Validation Error'); }"
+  ]).
+
+
+join([]) ->
+  [];
+join([E]) ->
+  [$'|E] ++ [$'];
+join([H|T]) ->
+  [[$'|H] ++ [$']] ++ [ [$,, $'|E] ++ [$'] || E <- T ].
+

+ 27 - 13
src/render/wf_render.erl

@@ -1,15 +1,29 @@
 -module(wf_render).
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
-
-render_item([]) -> <<>>;
-render_item(undefined) -> <<>>;
-render_item(E) when element(2,E) =:= element -> wf_render_elements:render_element(E);
-render_item(E) when element(2,E) =:= action  -> wf_render_actions:render_action(E);
-render_item(E) -> E.
-
-render([]) -> <<>>;
-render(undefined) -> <<>>;
-render(<<E/binary>>) -> E;
-render(Elements) when is_list(Elements) -> [ render_item(E) || E <- Elements, E /= undefined ];
-render(Elements) -> render_item(Elements).
+
+-export([render/1]).
+
+
+render([]) ->
+  <<>>;
+render(undefined) ->
+  <<>>;
+render(<<E/binary>>) ->
+  E;
+render(Elements) when erlang:is_list(Elements) ->
+  [ render_item(E) || E <- Elements, E /= undefined ];
+render(Elements) ->
+  render_item(Elements).
+
+render_item([]) ->
+  <<>>;
+render_item(undefined) ->
+  <<>>;
+render_item(E) when erlang:element(2, E) =:= 'element' ->
+  wf_render_elements:render_element(E);
+render_item(E) when erlang:element(2, E) =:= action ->
+  wf_render_actions:render_action(E);
+render_item(E) ->
+  E.
+

+ 17 - 9
src/render/wf_render_actions.erl

@@ -1,15 +1,23 @@
 -module(wf_render_actions).
--author('Andrew Zadorozhny').
+% author Andrew Zadorozhny
+
 -include_lib("nitro/include/nitro.hrl").
 -include_lib("nitro/include/event.hrl").
--compile(export_all).
+
+-export([render_action/1]).
+
 
 render_action(Action) ->
-    Module = element(#action.module,Action),
-    Res = Module:render_action(Action),
-    case Res of
-         Res when is_tuple(Res) -> render_action(Res);
-         Bin when is_binary(Bin) -> Bin;
-         Str when is_list(Str) -> Str;
-         _ -> [] end.
+  Module = erlang:element(#action.module,Action),
+  Res = Module:render_action(Action),
+  case Res of
+    Res when erlang:is_tuple(Res) ->
+      render_action(Res);
+    Bin when erlang:is_binary(Bin) ->
+      Bin;
+    Str when erlang:is_list(Str) ->
+      Str;
+    _ ->
+      []
+  end.
 

+ 103 - 69
src/render/wf_render_elements.erl

@@ -1,76 +1,110 @@
 -module (wf_render_elements).
--author('Maxim Sokhatsky').
+% author Maxim Sokhatsky
+
 -include_lib ("nitro/include/nitro.hrl").
 -include_lib ("nitro/include/comboLookupEdit.hrl").
--compile(export_all).
 
-render_element(E) when is_list(E) -> E;
-render_element(Element) when is_tuple(Element) ->
-    Id = case element(#element.id,Element) of
-        [] -> [];
-        undefined -> undefined;
-        L when is_list(L) -> L;
-        Other -> nitro:to_list(Other) end,
-    case element(#element.actions,Element) of [] -> skip; Actions -> nitro:wire(Actions) end,
-    Tag = case element(#element.html_tag,Element) of [] -> nitro:to_binary(element(1, Element)); T -> T end,
-    case element(1, Element) of
-      comboLookupEdit ->
-        lists:map(fun (El) ->
-          Input =
-            case element(#element.body, El) of
-              Body when not (Body == []) and is_list(Body) ->
-                case element(#element.body, hd(lists:flatten(tl(Body)))) of
-                  X when is_tuple(X)-> X;
-                  _ -> El
-                end;
+-export([render_element/1]).
+
+
+render_element(E) when erlang:is_list(E) ->
+  E;
+render_element(Element) when erlang:is_tuple(Element) ->
+  Id = case erlang:element(#element.id,Element) of
+    [] -> [];
+    undefined -> undefined;
+    L when erlang:is_list(L) -> L;
+    Other -> nitro:to_list(Other)
+  end,
+  
+  case erlang:element(#element.actions,Element) of
+    [] -> skip;
+    Actions -> nitro:wire(Actions)
+  end,
+  
+  Tag = case erlang:element(#element.html_tag,Element) of
+    [] -> nitro:to_binary(erlang:element(1, Element));
+    T -> T
+  end,
+  
+  case erlang:element(1, Element) of
+    comboLookupEdit ->
+      lists:map(fun(El) ->
+        Input = case erlang:element(#element.body, El) of
+          Body when not (Body == []) and erlang:is_list(Body) ->
+            case erlang:element(#element.body, erlang:hd(lists:flatten(erlang:tl(Body)))) of
+              X when erlang:is_tuple(X)-> X;
               _ -> El
-            end,
-          InputId = element(#element.id, Input),
-          case element(#element.validation, Input) of
-            [] -> skip;
-            InputCode ->
-              nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation',"
-                                "function(e) { if (!(~s)) e.preventDefault(); });"
-                                "if(qi(name)) qi(name).validation = true;}",[InputId,InputCode]))
-          end
-        end, lists:flatten(tl(element(#element.body, element(#comboLookupEdit.form, Element)))));
-      _ ->
-        case element(#element.validation,Element) of
-         [] -> skip;
-         Code ->
-         nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation',"
-                                "function(e) { if (!(~s)) e.preventDefault(); });"
-                                "if(qi(name)) qi(name).validation = true;}",[Id,Code])) end
-    end,
-    case element(#element.module,Element) of
-        [] -> default_render(Tag, Element);
-        undefined -> default_render(Tag, Element);
-        Module -> nitro:to_binary(Module:render_element(setelement(#element.id,Element,Id))) end;
-render_element(Element) -> io:format("Unknown Element: ~p~n\r",[Element]).
+            end;
+          _ -> El
+        end,
+        
+        InputId = erlang:element(#element.id, Input),
+        
+        case erlang:element(#element.validation, Input) of
+          [] -> skip;
+          InputCode ->
+            nitro:wire(nitro:f("{var name='~s';"
+              "qi(name) && qi(name).addEventListener('validation',"
+              "function(e){ if (!(~s)) e.preventDefault(); });"
+              "if(qi(name)) qi(name).validation = true;}", [InputId, InputCode]))
+        end
+      end,
+      
+      lists:flatten(erlang:tl(
+        erlang:element(#element.body, erlang:element(#comboLookupEdit.form, Element))
+        )));
+    
+    _ ->
+    case erlang:element(#element.validation, Element) of
+      [] -> skip;
+      Code ->
+        nitro:wire(nitro:f("{var name='~s';"
+          "qi(name) && qi(name).addEventListener('validation',"
+          "function(e) { if (!(~s)) e.preventDefault(); });"
+          "if(qi(name)) qi(name).validation = true;}", [Id, Code]))
+    end
+  end,
+  
+  case erlang:element(#element.module,Element) of
+    [] -> default_render(Tag, Element);
+    undefined -> default_render(Tag, Element);
+    Module ->
+      nitro:to_binary(Module:render_element(
+        erlang:setelement(#element.id, Element, Id)
+      ))
+  end;
+
+render_element(Element) ->
+  io:format("Unknown Element: ~p~n\r", [Element]).
+
 
 default_render(Tag, Record) ->
-    wf_tags:emit_tag(Tag, nitro:render(lists:flatten([element(#element.body,Record)])),
-        lists:append([
-           [{<<"id">>,              element(#element.id, Record)},
-            {<<"data-bind">>,       element(#element.bind, Record)},
-            {<<"class">>,           element(#element.class, Record)},
-            {<<"style">>,           element(#element.style, Record)},
-            {<<"title">>,           element(#element.title, Record)},
-            {<<"accesskey">>,       element(#element.accesskey, Record)},
-            {<<"contenteditable">>, element(#element.contenteditable, Record)},
-            {<<"contextmenu">>,     element(#element.contextmenu, Record)},
-            {<<"dir">>,             element(#element.dir, Record)},
-            {<<"draggable">>,       element(#element.draggable, Record)},
-            {<<"dropzone">>,        element(#element.dropzone, Record)},
-            {<<"hidden">>,          element(#element.hidden, Record)},
-            {<<"lang">>,            element(#element.lang, Record)},
-            {<<"onclick">>,         element(#element.onclick, Record)},
-            {<<"spellcheck">>,      element(#element.spellcheck, Record)},
-            {<<"translate">>,       element(#element.translate, Record)},
-            {<<"tabindex">>,        element(#element.tabindex, Record)},
-            {<<"onmouseout">>,      element(#element.onmouseout, Record)},
-            {<<"onmouseover">>,     element(#element.onmouseover, Record)},
-            {<<"onmousemove">>,     element(#element.onmousemove, Record)},
-            {<<"role">>,            element(#element.role, Record)}],
-        element(#element.data_fields, Record),
-        element(#element.aria_states, Record)])).
+  wf_tags:emit_tag(Tag,
+    nitro:render(lists:flatten([erlang:element(#element.body,Record)])),
+    lists:append([
+      [{<<"id">>,              erlang:element(#element.id, Record)},
+       {<<"data-bind">>,       erlang:element(#element.bind, Record)},
+       {<<"class">>,           erlang:element(#element.class, Record)},
+       {<<"style">>,           erlang:element(#element.style, Record)},
+       {<<"title">>,           erlang:element(#element.title, Record)},
+       {<<"accesskey">>,       erlang:element(#element.accesskey, Record)},
+       {<<"contenteditable">>, erlang:element(#element.contenteditable, Record)},
+       {<<"contextmenu">>,     erlang:element(#element.contextmenu, Record)},
+       {<<"dir">>,             erlang:element(#element.dir, Record)},
+       {<<"draggable">>,       erlang:element(#element.draggable, Record)},
+       {<<"dropzone">>,        erlang:element(#element.dropzone, Record)},
+       {<<"hidden">>,          erlang:element(#element.hidden, Record)},
+       {<<"lang">>,            erlang:element(#element.lang, Record)},
+       {<<"onclick">>,         erlang:element(#element.onclick, Record)},
+       {<<"spellcheck">>,      erlang:element(#element.spellcheck, Record)},
+       {<<"translate">>,       erlang:element(#element.translate, Record)},
+       {<<"tabindex">>,        erlang:element(#element.tabindex, Record)},
+       {<<"onmouseout">>,      erlang:element(#element.onmouseout, Record)},
+       {<<"onmouseover">>,     erlang:element(#element.onmouseover, Record)},
+       {<<"onmousemove">>,     erlang:element(#element.onmousemove, Record)},
+       {<<"role">>,            erlang:element(#element.role, Record)}],
+      erlang:element(#element.data_fields, Record),
+      erlang:element(#element.aria_states, Record)
+    ])).
+

+ 54 - 26
src/render/wf_tags.erl

@@ -1,29 +1,57 @@
 -module(wf_tags).
--author('Maxim Sokhatsky').
+% author Maxim Sokhatsky
+
 -include_lib("nitro/include/nitro.hrl").
--compile(export_all).
--define(VOID(Tag),  (Tag == <<"br">>     orelse Tag == <<"hr">>
-              orelse Tag == <<"link">>   orelse Tag == <<"img">>
-              orelse Tag == <<"input">>  orelse Tag == <<"link">>
-              orelse Tag == <<"meta">>   orelse Tag == <<"param">>
-              orelse Tag == <<"base">>   orelse Tag == <<"area">>
-              orelse Tag == <<"col">>    orelse Tag == <<"command">> orelse Tag == <<"option">>
-              orelse Tag == <<"keygen">> orelse Tag == <<"source">>)).
-
-emit_tag(TagName, Props) -> [<<"<">>,TagName] ++ write_props(Props) ++ [<<"/>">>].
-emit_tag(TagName, undefined, Props) -> emit_tag(TagName, [], Props);
-emit_tag(TagName, [[]], Props) -> emit_tag(TagName, [], Props);
-emit_tag(TagName, [undefined], Props) -> emit_tag(TagName, [], Props);
-emit_tag(TagName, <<>>, Props) when ?VOID(TagName) -> emit_tag(TagName, Props);
-emit_tag(TagName, [], Props) -> [<<"<">>,TagName,write_props(Props),<<">">>,<<"</">>,TagName,<<">">>];
-emit_tag(TagName, Content, Props) -> [<<"<">>,TagName,write_props(Props),<<">">>, Content,<<"</">>,TagName,<<">">>].
+
+-export([emit_tag/2, emit_tag/3]).
+
+
+-define(VOID(Tag), (Tag == <<"br">>     orelse Tag == <<"hr">>
+             orelse Tag == <<"link">>   orelse Tag == <<"img">>
+             orelse Tag == <<"input">>  orelse Tag == <<"link">>
+             orelse Tag == <<"meta">>   orelse Tag == <<"param">>
+             orelse Tag == <<"base">>   orelse Tag == <<"area">>
+             orelse Tag == <<"col">>    orelse Tag == <<"command">>
+             orelse Tag == <<"option">> orelse Tag == <<"keygen">>
+             orelse Tag == <<"source">>)).
+
+
+emit_tag(TagName, Props) ->
+  [<<"<">>, TagName] ++ write_props(Props) ++ [<<"/>">>].
+
+emit_tag(TagName, undefined, Props) ->
+  emit_tag(TagName, [], Props);
+emit_tag(TagName, [[]], Props) ->
+  emit_tag(TagName, [], Props);
+emit_tag(TagName, [undefined], Props) ->
+  emit_tag(TagName, [], Props);
+emit_tag(TagName, <<>>, Props) when ?VOID(TagName) ->
+  emit_tag(TagName, Props);
+emit_tag(TagName, [], Props) ->
+  [<<"<">>, TagName, write_props(Props), <<">">>, <<"</">>, TagName, <<">">>];
+emit_tag(TagName, Content, Props) ->
+  [<<"<">>, TagName, write_props(Props), <<">">>, Content, <<"</">>, TagName, <<">">>].
+
+
 write_props(Props) -> lists:map(fun display_property/1, Props).
-display_property({_, undefined}) -> [];
-display_property({_, []}) -> [];
-display_property({<<"class">>=Id, Value}) -> prop({Id,Value});
-display_property({<<"data-toggle">>=Id, Value}) -> prop({Id,Value});
-display_property({Prop, Value}) -> [<<" ">>, nitro:to_binary(Prop), <<"=\"">>, nitro:to_binary(Value), <<"\"">>].
-
-prop({Id, Value}) when is_atom(Value) -> [<<" ">>,Id,<<"=\"">>, nitro:to_binary(Value), <<"\"">>];
-prop({Id, Value}) when is_binary(Value) -> [<<" ">>,Id,<<"=\"">>, Value, <<"\"">>];
-prop({Id, Value}) -> [<<" ">>,Id,<<"=\"">>, string:join([nitro:to_list(V) || V <-Value ]," "), <<"\"">>].
+
+
+display_property({_, undefined}) ->
+  [];
+display_property({_, []}) ->
+  [];
+display_property({<<"class">>=Id, Value}) ->
+  prop({Id, Value});
+display_property({<<"data-toggle">>=Id, Value}) ->
+  prop({Id, Value});
+display_property({Prop, Value}) ->
+  [<<" ">>, nitro:to_binary(Prop), <<"=\"">>, nitro:to_binary(Value), <<"\"">>].
+
+
+prop({Id, Value}) when erlang:is_atom(Value) ->
+  [<<" ">>, Id, <<"=\"">>, nitro:to_binary(Value), <<"\"">>];
+prop({Id, Value}) when erlang:is_binary(Value) ->
+  [<<" ">>, Id, <<"=\"">>, Value, <<"\"">>];
+prop({Id, Value}) ->
+  [<<" ">>, Id, <<"=\"">>, string:join([nitro:to_list(V) || V <-Value ], " "), <<"\"">>].
+