OSDN Git Service

1057fc3da3e47d0dda754ca62d82bf0d6581c30f
[pettanr/pettanr.git] / app / assets / javascripts / panels.js.coffee
1 $ ->\r
2   confirm_confirm_confirm = () ->\r
3     confirm(  )\r
4   new_element_index = {}\r
5   new_element_index[pettanr_current_panel_id] = 0\r
6   \r
7   set_tree_value = (keys, last_attr, value) ->\r
8     key = keys.shift()\r
9     if keys.length <= 0\r
10       last_attr[key] = value\r
11     else\r
12       last_attr[key] = last_attr[key] || {}\r
13       set_tree_value(keys, last_attr[key], value)\r
14 \r
15   repeat_texts = ['repeat', 'repeat-x', 'repeat-y', 'no-repeat']\r
16   \r
17   is_editable = (p) ->\r
18     if p.parent().attr('editable')\r
19       return true\r
20     else\r
21       return false\r
22   is_var = (o) ->\r
23     if parseInt(o.attr('no_attr')) > 0\r
24       return false\r
25     else\r
26       if o.attr('column') \r
27         if o.attr('column') == '_destroy' and o.val().length < 1\r
28           return false\r
29         else\r
30           return true\r
31       else\r
32         return false\r
33   is_element = (o) ->\r
34     if o.attr('element_type')\r
35       return true\r
36     else\r
37       return false\r
38   is_element_part = (o) ->\r
39     if o.attr('element_part_type')\r
40       return true\r
41     else\r
42       return false\r
43   element_types  = {'panel_picture': 'panel_pictures', 'speech_balloon': 'speech_balloons', 'ground_picture': 'ground_pictures', 'ground_color': 'ground_colors'}\r
44   element_type_to_table = (element_type) ->\r
45     element_types[element_type]\r
46   text_align_texts = ['left', 'left', 'right', 'center']\r
47 \r
48   make_tree = (attr, o) ->\r
49     if is_var(o)\r
50       tree = 'panels-' + o.attr('panel_id') + '-'\r
51       if is_element(o)\r
52         tree = tree + element_type_to_table(o.attr('element_type')) + '_attributes-' + o.attr('element_id') + '-'\r
53         if is_element_part(o)\r
54           tree = tree + o.attr('element_part_type') + '_attributes-'\r
55       tree = tree + o.attr('column')\r
56       keys = tree.split('-')\r
57       set_tree_value(keys, attr, o.val())\r
58   \r
59   panel_tag_id = (element) ->\r
60     '#panel' + element.attr('panel_id')\r
61   \r
62   element_tag_id = (element) ->\r
63     '#panel' + element.attr('panel_id') + element.attr('element_type') + element.attr('element_id')\r
64   \r
65   element_part_tag_id = (element_part) ->\r
66     '#panel' + element_part.attr('panel_id') + element_part.attr('element_type') + element_part.attr('element_id') + element_part.attr('element_part_type') + element_part.attr('element_part_id')\r
67   \r
68   refresh_attribute = () ->\r
69     attr = {}\r
70     $('input').map ->\r
71       make_tree(attr, $(@))\r
72     $('textarea').map  ->\r
73       make_tree(attr, $(@))\r
74     $('select').map ->\r
75       make_tree(attr, $(@))\r
76     $('#pettanr-panel-json').val(JSON.stringify(attr['panels'][pettanr_current_panel_id.toString() ]))\r
77   \r
78   $('#tabs').tabs()\r
79   $('#elements-tabs').tabs()\r
80   $('#new-element-tabs').tabs()\r
81   $('#new-speech_balloon-tabs').tabs()\r
82   $('#elements-tabs').addClass( "ui-tabs-vertical ui-helper-clearfix" )\r
83   $("#elements-tabs li").removeClass("ui-corner-top")\r
84   $("#elements-tabs li").addClass("ui-corner-left")\r
85   $("#elements-tabs li").map ->\r
86     $(@).mouseover -> \r
87       switch $(@).attr('element_type')\r
88         when 'speech_balloon'\r
89           trace = element_tag_id($(@)) \r
90           t = $('img', $(trace))\r
91         when 'panel_picture'\r
92           trace = element_tag_id($(@)) + 'img'\r
93           t = $(trace)\r
94         else\r
95           t = null\r
96       if t\r
97         $('.ui-resizable-handle', t.parent()).map ->\r
98           $(@).css('display', 'block')\r
99     $(@).mouseout -> \r
100       switch $(@).attr('element_type')\r
101         when 'speech_balloon'\r
102           trace = element_tag_id($(@)) \r
103           t = $('img', $(trace))\r
104         when 'panel_picture'\r
105           trace = element_tag_id($(@)) + 'img'\r
106           t = $(trace)\r
107         else\r
108           t = null\r
109       if t\r
110         $('.ui-resizable-handle', t.parent()).map ->\r
111           $(@).css('display', 'none')\r
112   \r
113   #destroy button\r
114   $('.ui-icon-destroy').map ->\r
115     $(@).button {\r
116       icons: {\r
117         primary: 'ui-icon-close', \r
118         secondary: null\r
119       }, \r
120       text: false\r
121     }\r
122     $(@).click -> \r
123       if confirm('destroy ?')\r
124         trace = element_tag_id($(@))\r
125         $(trace + '_destroy').val('true')\r
126         panel_trace = panel_tag_id($(@))\r
127         update_t(panel_trace + 'tsort')\r
128         update_z(panel_trace + 'zsort')\r
129         # sync\r
130         $(trace + 'element_tab').css('display', 'none')\r
131         $(trace + 'tab_panel').css('display', 'none')\r
132         $(trace + 'zsort').css('display', 'none')\r
133         $(trace + 'tsort').css('display', 'none')\r
134         switch $(@).attr('element_type')\r
135           when 'panel_picture'\r
136             trace = trace + 'div'\r
137         $(trace).css('display', 'none')\r
138         \r
139   \r
140   $('#pettanr-panel-submit').focusin ->\r
141     refresh_attribute()\r
142   \r
143   # panel\r
144   $('.pettanr-comic-panel').map ->\r
145     if is_editable($(@))\r
146       $(@).resizable {\r
147         stop: ( event, ui ) ->\r
148           trace = panel_tag_id($(@))\r
149           w = parseInt($(@).width())\r
150           h = parseInt($(@).height())\r
151           $(trace + 'width').val(w)\r
152           $(trace + 'height').val(h)\r
153           $('.pettanr-comic-ground-picture').map ->\r
154             $(@).width(w)\r
155             $(@).height(h)\r
156           $('.pettanr-comic-ground-color').map ->\r
157             $(@).width(w)\r
158             $(@).height(h)\r
159         , autoHide: true\r
160       }\r
161   # sync view \r
162   $('#panel' + pettanr_current_panel_id.toString() +  'width').focusout ->\r
163     trace = '#panel' + $(@).attr('panel_id')\r
164     $(trace).width(parseInt( $(@).val()))\r
165   \r
166   $('#panel' + pettanr_current_panel_id.toString() + 'height').focusout ->\r
167     trace = '#panel' + $(@).attr('panel_id')\r
168     $(trace).height(parseInt( $(@).val()))\r
169   \r
170   $('#panel' + pettanr_current_panel_id.toString() + 'border').focusout ->\r
171     trace = '#panel' + $(@).attr('panel_id')\r
172     $(trace).css('border-width', parseInt($(@).val()).toString() + 'px')\r
173   \r
174   \r
175   # panel picture\r
176   $('.pettanr-panel-picture-wrapper').map ->\r
177     $(@).draggable {\r
178       stop: ( event, ui ) ->\r
179         trace = '#panel' + $(@).attr('panel_id') + 'panel_picture' + $(@).attr('element_id')\r
180         img = '#panel' + $(@).attr('panel_id') + 'panel_picture' + $(@).attr('element_id') + 'img'\r
181         left = $(img).parent().position().left + $(@).position().left\r
182         top = $(img ).parent().position().top + $(@).position().top\r
183         $(trace + 'x').val(parseInt(left))\r
184         $(trace + 'y').val(parseInt(top))\r
185     }\r
186   \r
187   $('.panel-picture').map ->\r
188     $(@).resizable {\r
189       stop: ( event, ui ) ->\r
190         trace = '#panel' + $(@).parent().attr('panel_id') + 'panel_picture' + $(@).parent().attr('element_id')\r
191         $(trace + 'width').val($(@).width())\r
192         $(trace + 'height').val($(@).height())\r
193       handles: 'all',\r
194       autoHide: true\r
195     }\r
196   \r
197   refresh_picture = (e, w, h)  ->\r
198     if w and h\r
199       sd = ''\r
200       if h < 0\r
201         sd += 'v'\r
202       if w < 0\r
203         sd += 'h'\r
204       if sd.length > 0\r
205         sd += '/'\r
206       pid = parseInt(e.attr('picture_id')).toString()\r
207       ext = e.attr('ext')\r
208       src = '/pictures/' + sd + pid + '.' + ext\r
209       e.attr('src', src)\r
210   \r
211   # sync view \r
212   $('input').map  ->\r
213     if $(@).attr('element_type') and $(@).attr('element_type') == 'panel_picture'\r
214       $(@).focusout ->\r
215         switch $(@).attr('column')\r
216           when 'x'\r
217             trace = element_tag_id($(@)) + 'div'\r
218             v = parseInt($(@).val()).toString() + 'px'\r
219             $(trace).css('left', v)\r
220           when 'y'\r
221             trace = element_tag_id($(@)) + 'div'\r
222             v = parseInt($(@).val()).toString() + 'px'\r
223             $(trace).css('top', v)\r
224           when 'width'\r
225             trace = element_tag_id($(@)) + 'img'\r
226             w = parseInt($(@).val())\r
227             $(trace).width(Math.abs(w))\r
228             $(trace).parent().width(Math.abs(w))\r
229             h = parseInt($(element_tag_id($(@)) + 'height').val())\r
230           when 'height'\r
231             trace = element_tag_id($(@)) + 'img'\r
232             h = parseInt($(@).val())\r
233             $(trace).height(Math.abs(h))\r
234             $(trace).parent().height(Math.abs(h))\r
235             w = parseInt($(element_tag_id($(@)) + 'width').val())\r
236           else\r
237         refresh_picture($(trace), w, h)\r
238     else\r
239   \r
240   # speech_balloons\r
241   $('.pettanr-comic-balloon' ).map ->\r
242     $(@).draggable {\r
243       stop: ( event, ui ) ->\r
244         trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'balloon' + $(@).attr('balloon_id')\r
245         left = $(@).position().left\r
246         top = $(@).position().top\r
247         $(trace + 'x').val(parseInt(left))\r
248         $(trace + 'y').val(parseInt(top))\r
249     }\r
250 \r
251   \r
252   $('.pettanr-balloon' ).map ->\r
253     $(@).resizable {\r
254       stop: ( event, ui ) ->\r
255         trace = '#panel' + $(@).parent().attr('panel_id') + 'speech_balloon' + $(@).parent().attr('element_id') + 'balloon' + $(@).parent().attr('balloon_id')\r
256         $(trace + 'width').val($(@).width())\r
257         $(trace + 'height').val($(@).height())\r
258      resize: ( event, ui ) ->\r
259         trace = '#panel' + $(@).parent().attr('panel_id') + 'speech_balloon' + $(@).parent().attr('element_id')\r
260         $(trace).width($(@).width())\r
261         $(trace).height($(@).height())\r
262       handles: 'all',\r
263       autoHide: true\r
264     }\r
265   $('.pettanr-comic-speech-inner' ).map ->\r
266     $(@).mouseover -> \r
267       outer = $(@).parent()\r
268       sb = outer.parent()\r
269       trace = '#panel' + sb.attr('panel_id') + 'speech_balloon' + sb.attr('element_id') + 'balloon' + sb.attr('balloon_id')\r
270       img = $(trace)\r
271       $('.ui-resizable-handle', img.parent()).map ->\r
272         $(@).css('display', 'block')\r
273     $(@).mouseout -> \r
274       outer = $(@).parent()\r
275       sb = outer.parent()\r
276       trace = '#panel' + sb.attr('panel_id') + 'speech_balloon' + sb.attr('element_id') + 'balloon' + sb.attr('balloon_id')\r
277       img = $(trace)\r
278       $('.ui-resizable-handle', img.parent()).map ->\r
279         $(@).css('display', 'none')\r
280         \r
281   \r
282   # sync view \r
283   $('input').map  ->\r
284     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
285       $(@).focusout ->\r
286         switch $(@).attr('column')\r
287           when 'x'\r
288             trace = element_tag_id($(@))\r
289             v = parseInt($(@).val()).toString() + 'px'\r
290             $(trace).css('left', v)\r
291           when 'y'\r
292             trace = element_tag_id($(@))\r
293             v = parseInt($(@).val()).toString() + 'px'\r
294             $(trace).css('top', v)\r
295           when 'width'\r
296             trace = element_tag_id($(@))\r
297             v = parseInt($(@).val())\r
298             $(trace).width(Math.abs(v))\r
299             trace = '#panel' + $(trace).attr('panel_id') + 'speech_balloon' + $(trace).attr('element_id') + 'balloon' + $(trace).attr('balloon_id')\r
300             $(trace).parent().width(v)\r
301             $(trace).width(v)\r
302           when 'height'\r
303             trace = element_tag_id($(@))\r
304             v = parseInt($(@).val())\r
305             $(trace).height(Math.abs(v))\r
306             trace = '#panel' + $(trace).attr('panel_id') + 'speech_balloon' + $(trace).attr('element_id') + 'balloon' + $(trace).attr('balloon_id')\r
307             $(trace).parent().height(v)\r
308             $(trace).height(v)\r
309           else\r
310     else\r
311   $('textarea').map  ->\r
312     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
313       $(@).focusout ->\r
314         switch $(@).attr('column')\r
315           when 'content'\r
316             trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'speech' + $(@).attr('element_part_id')\r
317             wf_sel = $(trace + 'writing_format_id')\r
318             wf_id = parseInt(wf_sel.val())\r
319             v = writing_format_functions[writing_formats[wf_id]]($(@).val())\r
320             $(trace).html(v)\r
321   $('textarea').map  ->\r
322     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
323       switch $(@).attr('column')\r
324         when 'content'\r
325           $(@).bind('textchange', (event, previousText) ->\r
326             trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'speech' + $(@).attr('element_part_id')\r
327             wf_sel = $(trace + 'writing_format_id')\r
328             wf_id = parseInt(wf_sel.val())\r
329             v = writing_format_functions[writing_formats[wf_id]]($(@).val())\r
330             $(trace).html('<p>' + v + '</p>')\r
331           )\r
332   $('select').map  ->\r
333     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
334       $(@).change ->\r
335         switch $(@).attr('column')\r
336           when 'font_size'\r
337             trace = element_part_tag_id($(@))\r
338             $(trace).css('font-size', $(@).val() + 'em')\r
339           when 'text_align'\r
340             trace = element_part_tag_id($(@))\r
341             v = parseInt($(@).val())\r
342             $(trace).css('text-align', text_align_texts[v])\r
343     else\r
344   $('input').map  ->\r
345     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon' and $(@).attr('column') == 'fore_color'\r
346       $(@).hide()\r
347 \r
348   \r
349   # ground-picture\r
350   # sync view \r
351   $('input').map  ->\r
352     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
353       $(@).focusout ->\r
354         switch $(@).attr('column')\r
355           when 'x', 'y'\r
356             trace = element_tag_id($(@))\r
357             x = parseInt($(@).val()).toString() + 'px'\r
358             ytrace = '#panel' + $(@).attr('panel_id') + 'ground_picture' + $(@).attr('element_id') + 'y'\r
359             y = parseInt($(ytrace).val()).toString() + 'px'\r
360             $(trace).css('background-position', y + ' ' + x)\r
361   $('select').map  ->\r
362     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
363       $(@).change ->\r
364         switch $(@).attr('column')\r
365           when 'repeat'\r
366             trace = element_tag_id($(@))\r
367             v = parseInt($(@).val())\r
368             $(trace).css('background-repeat', repeat_texts[v])\r
369     else\r
370   \r
371   \r
372   # ground_color\r
373   # sync view \r
374   $('input').map  ->\r
375     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_color' and $(@).attr('column') == 'code'\r
376       $(@).hide()\r
377 \r
378   color_slider_change = (trace) -> \r
379     red = $(trace + 'code_red').slider('value')\r
380     green = $(trace + 'code_green').slider('value')\r
381     blue = $(trace + 'code_blue').slider('value')\r
382     code = (red << 16) + (green << 8) + (blue)\r
383     phex = "000000" + code.toString(16)\r
384     hex = code.toString(16)\r
385     h = phex.substring(phex.length - 6)\r
386     $(trace + 'code_swatch').css('background-color', '#' + h)\r
387     $(trace + 'code_hex').html('HEX: #' + h)\r
388     $(trace + 'code_rgb').html('RGB: (' + red + ',' + green + ',' +blue + ')')\r
389     v = '#' + h\r
390     if is_element_part($(trace))\r
391       $(trace + 'fore_color').val(code)\r
392       $(trace).css('color', v)\r
393     else\r
394       $(trace + 'code').val(code)\r
395       $(trace).css('background-color', v)\r
396   \r
397   $('.colorpicker').map -> \r
398     if is_element_part($(@))\r
399       code_picker_trace = element_part_tag_id($(@))\r
400       code = parseInt($(code_picker_trace + 'fore_color').val())\r
401     else\r
402       code_picker_trace = element_tag_id($(@))\r
403       code = parseInt($(code_picker_trace + 'code').val())\r
404     red = (code >> 16) & 0xFF\r
405     green = (code >> 8) & 0xFF\r
406     blue = code & 0xFF\r
407     $(code_picker_trace + 'code_red').slider {\r
408       orientation: 'horizontal',\r
409       range: 'min',\r
410       max: 255,\r
411       value: red,\r
412       change: ( event, ui ) ->\r
413         if is_element_part($(@).parent())\r
414           trace = element_part_tag_id($(@).parent())\r
415         else\r
416           trace = element_tag_id($(@).parent())\r
417         color_slider_change(trace)\r
418     }\r
419     $(code_picker_trace + 'code_green').slider {\r
420       orientation: 'horizontal',\r
421       range: 'min',\r
422       max: 255,\r
423       value: green,\r
424       change: ( event, ui ) ->\r
425         if is_element_part($(@).parent())\r
426           trace = element_part_tag_id($(@).parent())\r
427         else\r
428           trace = element_tag_id($(@).parent())\r
429         color_slider_change(trace)\r
430     }\r
431     $(code_picker_trace + 'code_blue').slider {\r
432       orientation: 'horizontal',\r
433       range: 'min',\r
434       max: 255,\r
435       value: blue,\r
436       change: ( event, ui ) ->\r
437         if is_element_part($(@).parent())\r
438           trace = element_part_tag_id($(@).parent())\r
439         else\r
440           trace = element_tag_id($(@).parent())\r
441         color_slider_change(trace)\r
442     }\r
443     color_slider_change(code_picker_trace)\r
444   $('.colorpicker-wrap').map -> \r
445     $(@).css('display', 'block')\r
446   \r
447   update_t = (ultrace) -> \r
448     t = 0\r
449     $(ultrace + ' li').map ->\r
450       trace = element_tag_id($(@))\r
451       if $(trace + '_destroy').val().length < 1\r
452         $(trace + 't').val(t)\r
453         t++\r
454       else\r
455   \r
456   $('.tsort').map -> \r
457     $(@).sortable {\r
458       update: ( event, ui ) ->\r
459         trace = panel_tag_id($(@))\r
460         update_t(trace + 'tsort')\r
461     }\r
462   $('.t-sort li').map -> \r
463     $(@).disableSelection()\r
464   \r
465   update_z = (ultrace) -> \r
466     z = 1\r
467     $(ultrace + ' li').map ->\r
468       trace = element_tag_id($(@))\r
469       # update panel\r
470       if $(trace + '_destroy').val().length < 1\r
471         $(trace + 'z').val(z)\r
472         switch $(@).attr('element_type')\r
473           when 'panel_picture'\r
474             trace = trace + 'div'\r
475         $(trace).css('zIndex', z)\r
476         z++\r
477       else\r
478   \r
479   $('.zsort').map -> \r
480     $(@).sortable {\r
481       update: ( event, ui ) ->\r
482         trace = panel_tag_id($(@))\r
483         update_z(trace + 'zsort')\r
484     }\r
485   $('.z-sort li').map -> \r
486     $(@).disableSelection()\r
487   \r
488   $('.panel_picture_width_tool').map ->\r
489     $(@).html('<button class="wreverse">Rev</button><button class="wdouble">x2</button><button class="whalf">/2</button>')\r
490   \r
491   $('.wreverse').click -> \r
492     d = $(@).parent()\r
493     trace = element_tag_id(d)\r
494     f = $(trace + 'width')\r
495     w = -f.val()\r
496     f.val(w)\r
497     f = $(trace + 'height')\r
498     h = f.val()\r
499     refresh_picture($(trace + 'img'), w, h)\r
500   \r
501   $('.wdouble').click -> \r
502     d = $(@).parent()\r
503     trace = element_tag_id(d)\r
504     f = $(trace + 'width')\r
505     w = f.val() * 2\r
506     f.val(w)\r
507     $(trace + 'img').width(Math.abs(w))\r
508     $(trace + 'img').parent().width(Math.abs(w))\r
509   \r
510   $('.whalf').click -> \r
511     d = $(@).parent()\r
512     trace = element_tag_id(d)\r
513     f = $(trace + 'width')\r
514     w = Math.floor(f.val() / 2)\r
515     f.val(w)\r
516     $(trace + 'img').width(Math.abs(w))\r
517     $(trace + 'img').parent().width(Math.abs(w))\r
518   \r
519   $('.panel_picture_height_tool').map ->\r
520     $(@).html('<button class="hreverse">Rev</button><button class="hdouble">x2</button><button class="hhalf">/2</button>')\r
521   \r
522   $('.hreverse').click -> \r
523     d = $(@).parent()\r
524     trace = element_tag_id(d)\r
525     f = $(trace + 'height')\r
526     h = -f.val()\r
527     f.val(h)\r
528     f = $(trace + 'width')\r
529     w = f.val()\r
530     refresh_picture($(trace + 'img'), w, h)\r
531   \r
532   $('.hdouble').click -> \r
533     d = $(@).parent()\r
534     trace = element_tag_id(d)\r
535     f = $(trace + 'height')\r
536     h = f.val() * 2\r
537     f.val(h)\r
538     $(trace + 'img').height(Math.abs(h))\r
539     $(trace + 'img').parent().height(Math.abs(h))\r
540   \r
541   $('.hhalf').click -> \r
542     d = $(@).parent()\r
543     trace = element_tag_id(d)\r
544     f = $(trace + 'height')\r
545     h = Math.floor(f.val() / 2)\r
546     f.val(h)\r
547     $(trace + 'img').height(Math.abs(h))\r
548     $(trace + 'img').parent().height(Math.abs(h))\r
549   \r
550   # all\r
551   # disable form actions\r
552   # hide submit buttons\r
553   $('.edit_panel_picture' ).map ->\r
554     $(@).submit ->\r
555       false\r
556   $('.edit_speech_balloon' ).map ->\r
557     $(@).submit ->\r
558       false\r
559   $('.edit_ground_picture' ).map ->\r
560     $(@).submit ->\r
561       false\r
562   $('.edit_ground_color' ).map ->\r
563     $(@).submit ->\r
564       false\r
565   \r
566   $('.edit_panel' ).map ->\r
567     if $(@).attr('jqform')\r
568     else\r
569       $(@).submit ->\r
570         false\r
571   \r
572   $('.submit' ).map ->\r
573     $(@).hide()\r
574   \r
575   # disable form z t\r
576   $('input').map  ->\r
577     if $(@).attr('element_type') and $(@).attr('column')\r
578       switch $(@).attr('column')\r
579         when 'z' , 't'\r
580           $(@).hide()\r
581           $(@).parent().hide() #label\r
582   \r
583   # add button on new form\r
584   $('.submit-new-form').map ->\r
585     $(@).html('<button class="new-element">add</button>')\r
586   \r
587   $('.new-element').map ->\r
588     $(@).click -> \r
589       false\r
590   \r