OSDN Git Service

fix anything
[pettanr/pettanr.git] / app / assets / javascripts / panels.js.coffee
1 $ ->\r
2   _.templateSettings = {\r
3     interpolate: /\<\&\=(.+?)\&\>/g,\r
4     evaluate: /\<\&(.+?)\&\>/g\r
5   }\r
6   #filer = new Filer('tt', ['ea','eb','ec'])\r
7   #view = new FilerView( { filer: filer } )\r
8   confirm_confirm_confirm = () ->\r
9     confirm(  )\r
10   editor = window.PettanrEditor\r
11   manifest =  {\r
12     items: window.items,\r
13     controllers: window.controllers,\r
14     models: window.models,\r
15     system_resources: window.system_resources,\r
16     magic_numbers: window.magic_numbers,\r
17   }\r
18   local_manifest =  {\r
19     list_groups: window.list_groups,\r
20     profilers: window.profilers,\r
21     filers: window.filers,\r
22     forms: window.forms,\r
23     buckets: window.buckets,\r
24   }\r
25   j = JSON.stringify(manifest, undefined, 2)\r
26   $('#pettanr-manifest').val(j)\r
27   j = JSON.stringify(local_manifest, undefined, 2)\r
28   $('#pettanr-local_manifest').val(j)\r
29   WritingFormat = window.PettanrWritingFormat\r
30   WritingFormat.load($('#writing_formats'))\r
31   SpeechBalloonTemplate = window.PettanrSpeechBalloonTemplate\r
32   SpeechBalloonTemplate.load($('#speech_balloon_templates'))\r
33   for n, v of SpeechBalloonTemplate.scripts\r
34     v.onLoad()\r
35     v.add_helper( n, '' )\r
36   PictureSizeHelper = window.PettanrPictureSizeHelper\r
37   ColorHelper = window.PettanrColorHelper\r
38   PopupHelper = window.PettanrPopupHelper\r
39   \r
40   #panel = new Panel\r
41   #pp = new PanelPicture\r
42   #pp.set_panel(panel)\r
43   #confirm( PanelPicture.test()  )\r
44   #confirm( pp.test() )\r
45   find_configurations = ( hash, key) ->\r
46     if typeof(hash[key]) == 'string'\r
47       find_configurations(hash, hash[key])\r
48     else\r
49       return hash[key]\r
50   \r
51   set_validates = (form) ->\r
52     rules = {}\r
53     $('input', form).map ->\r
54       model_name = $(@).attr('data-model')\r
55       column_name = $(@).attr('column')\r
56       name = $(@).attr('name')\r
57       if model_name and column_name\r
58         model = find_configurations(configurations['models'], model_name)\r
59         rule = model['attributes'][column_name]['rules']\r
60         trace = editor.element_tag_id($(@)) \r
61         if rule\r
62           rules[name] = rule\r
63           $(@).focusout ->\r
64             if editor.is_panel(form)\r
65               validate_panel(form)\r
66             else\r
67               validate_element(form)\r
68     if Object.keys(rules).length > 0\r
69       v = form.validate({ignore:[],rules: rules})\r
70   \r
71   display_panel = (panel, vis) ->\r
72     v = if vis\r
73       ''\r
74     else\r
75       'none'\r
76     trace = editor.panel_tag_id(panel)\r
77     $(trace).css('display', v)\r
78   \r
79   validate_panel = (form) ->\r
80     valid = form.valid()\r
81     bc = if valid\r
82       ''\r
83     else\r
84       '#ef29ef'\r
85     $('a', $('#tabs-1-tab')).map ->\r
86       $(@).css('background-color', bc)\r
87     display_panel(form, valid)\r
88     valid\r
89   \r
90   display_element = (element, vis) ->\r
91     trace = editor.element_tag_id(element)\r
92     d = $(trace + '_destroy').val()\r
93     v = if vis and d.length < 1\r
94       ''\r
95     else\r
96       'none'\r
97     switch element.attr('element_type')\r
98       when 'panel_picture'\r
99         trace = trace + 'div'\r
100     $(trace).css('display', v)\r
101   \r
102   validate_element = (form) ->\r
103     valid = form.valid()\r
104     bc = if valid\r
105       ''\r
106     else\r
107       '#ef29ef'\r
108     display_element(form, valid)\r
109     trace = editor.element_tag_id(form) \r
110     $('.elements-tab', $(trace + 'element_tab')).map  ->\r
111       $(@).css('background-color', bc)\r
112     valid\r
113   \r
114   validate_forms = () ->\r
115     valid = true\r
116     $('form', $('#tabs-1')).map  ->\r
117       form_name = $(@).attr('data-form-name')\r
118       if form_name\r
119         if validate_panel($(@))\r
120         else\r
121           valid = false\r
122     invalid_elements = []\r
123     $('form', $('#tabs-2')).map  ->\r
124       form_name = $(@).attr('data-form-name')\r
125       if form_name\r
126         if validate_element($(@))\r
127         else\r
128           valid = false\r
129           invalid_elements.push form_name\r
130     if invalid_elements.length > 0\r
131       bc = '#ef29ef'\r
132     else\r
133       bc = ''\r
134     $('a', $('#tabs-2-tab')).map ->\r
135       $(@).css('background-color', bc)\r
136     return valid\r
137   $('form').map  ->\r
138     form_name = $(@).attr('data-form-name')\r
139     if form_name\r
140       form = $(this)\r
141       set_validates(form)\r
142   $('.panel-editor').map ->\r
143     if $(@).attr('current') and parseInt($(@).attr('current')) > 0\r
144       editor.pettanr_current_panel_id = parseInt($(@).attr('panel_id'))\r
145   if editor.is_editting()\r
146     $('#tabs').tabs()\r
147     $('#elements-tabs').tabs()\r
148     $('#new-element-tabs').tabs()\r
149     $('#new-speech_balloon-tabs').tabs()\r
150     $('#elements-tabs').addClass( "ui-tabs-vertical ui-helper-clearfix" )\r
151     $("#elements-tabs li").removeClass("ui-corner-top")\r
152     $("#elements-tabs li").addClass("ui-corner-left")\r
153     $("#elements-tabs li").map ->\r
154       $(@).mouseover -> \r
155         switch $(@).attr('element_type')\r
156           when 'speech_balloon'\r
157             trace = editor.element_tag_id($(@)) \r
158             t = $('img', $(trace))\r
159           when 'panel_picture'\r
160             trace = editor.element_tag_id($(@)) + 'img'\r
161             t = $(trace)\r
162           else\r
163             t = null\r
164         if t\r
165           $('.ui-resizable-handle', t.parent()).map ->\r
166             $(@).css('display', 'block')\r
167       $(@).mouseout -> \r
168         switch $(@).attr('element_type')\r
169           when 'speech_balloon'\r
170             trace = editor.element_tag_id($(@)) \r
171             t = $('img', $(trace))\r
172           when 'panel_picture'\r
173             trace = editor.element_tag_id($(@)) + 'img'\r
174             t = $(trace)\r
175           else\r
176             t = null\r
177         if t\r
178           $('.ui-resizable-handle', t.parent()).map ->\r
179             $(@).css('display', 'none')\r
180     \r
181     #destroy button\r
182     $('.ui-icon-destroy').map ->\r
183       $(@).button {\r
184         icons: {\r
185           primary: 'ui-icon-close', \r
186           secondary: null\r
187         }, \r
188         text: false\r
189       }\r
190       $(@).click -> \r
191         if confirm('destroy ?')\r
192           trace = editor.element_tag_id($(@))\r
193           $(trace + '_destroy').val('true')\r
194           panel_trace = editor.panel_tag_id($(@))\r
195           update_t(panel_trace + 'tsort')\r
196           update_z(panel_trace + 'zsort')\r
197           # sync\r
198           $(trace + 'element_tab').css('display', 'none')\r
199           $(trace + 'tab_panel').css('display', 'none')\r
200           $(trace + 'zsort').css('display', 'none')\r
201           $(trace + 'tsort').css('display', 'none')\r
202           display_element($(@), false)\r
203     \r
204     $('#pettanr-panel-submit').focusin ->\r
205       editor.refresh_attribute($('#pettanr-panel-json'))\r
206     \r
207     # panel\r
208     $('.pettanr-comic-panel').map ->\r
209       if editor.is_editable($(@))\r
210         $(@).resizable {\r
211           stop: ( event, ui ) ->\r
212             trace = editor.panel_tag_id($(@))\r
213             w = parseInt($(@).width())\r
214             h = parseInt($(@).height())\r
215             $(trace + 'width').val(w)\r
216             $(trace + 'height').val(h)\r
217             $('.pettanr-comic-ground-picture').map ->\r
218               $(@).width(w)\r
219               $(@).height(h)\r
220             $('.pettanr-comic-ground-color').map ->\r
221               $(@).width(w)\r
222               $(@).height(h)\r
223           , autoHide: true\r
224         }\r
225     \r
226     # sync view \r
227     $('input').map  ->\r
228       if $(@).attr('element_type')\r
229       else\r
230         if $(@).attr('panel_id')\r
231           $(@).focusout ->\r
232             switch $(@).attr('column')\r
233               when 'width'\r
234                 trace = editor.panel_tag_id($(@))\r
235                 $(trace).width(parseInt( $(@).val()))\r
236               when 'height'\r
237                 trace = editor.panel_tag_id($(@))\r
238                 $(trace).height(parseInt( $(@).val()))\r
239               when 'border'\r
240                 trace = editor.panel_tag_id($(@))\r
241                 $(trace).css('border-width', parseInt($(@).val()).toString() + 'px')\r
242     \r
243     # panel picture\r
244     PictureSizeHelper.add_helper()\r
245     PopupHelper.add_helper()\r
246     \r
247     $('.pettanr-panel-picture-wrapper').map ->\r
248       $(@).draggable {\r
249         stop: ( event, ui ) ->\r
250           trace = editor.element_tag_id($(@))\r
251           img = $(trace + 'img')\r
252           left = img.parent().position().left + $(@).position().left\r
253           top = img.parent().position().top + $(@).position().top\r
254           $(trace + 'x').val(parseInt(left))\r
255           $(trace + 'y').val(parseInt(top))\r
256       }\r
257     \r
258     $('.panel-picture').map ->\r
259       $(@).resizable {\r
260         stop: ( event, ui ) ->\r
261           resize_div = $(@)\r
262           panel_picture_div = resize_div.parent()\r
263           trace = editor.element_tag_id(panel_picture_div)\r
264           \r
265           resize_div.css('top', '0px')\r
266           resize_div.css('left', '0px')\r
267           if ui.originalPosition.top != ui.position.top\r
268             t = panel_picture_div.position().top + ui.position.top\r
269             $(trace + 'y').val(Math.floor(t))\r
270             panel_picture_div.css('top', t.toString() + 'px')\r
271           if ui.originalPosition.left != ui.position.left\r
272             l = panel_picture_div.position().left + ui.position.left\r
273             $(trace + 'x').val(Math.floor(l))\r
274             panel_picture_div.css('left', l.toString() + 'px')\r
275           w = if $(trace + 'width').val() < 0\r
276             -ui.size.width\r
277           else\r
278             ui.size.width\r
279           h = if $(trace + 'height').val() < 0\r
280             -ui.size.height\r
281           else\r
282             ui.size.height\r
283           $(trace + 'width').val(w)\r
284           $(trace + 'height').val(h)\r
285         resize: ( event, ui ) ->\r
286           resize_div = $(@)\r
287           panel_picture_div = resize_div.parent()\r
288           trace = editor.element_tag_id(panel_picture_div)\r
289         handles: 'all',\r
290         autoHide: true\r
291       }\r
292     \r
293     # sync view \r
294     $('input').map  ->\r
295       if editor.element_is('panel_picture', $(@))\r
296         $(@).focusout ->\r
297           switch $(@).attr('column')\r
298             when 'x'\r
299               trace = editor.element_tag_id($(@)) + 'div'\r
300               v = parseInt($(@).val()).toString() + 'px'\r
301               $(trace).css('left', v)\r
302             when 'y'\r
303               trace = editor.element_tag_id($(@)) + 'div'\r
304               v = parseInt($(@).val()).toString() + 'px'\r
305               $(trace).css('top', v)\r
306             when 'width'\r
307               trace = editor.element_tag_id($(@)) + 'img'\r
308               w = parseInt($(@).val())\r
309               $(trace).width(Math.abs(w))\r
310               $(trace).parent().width(Math.abs(w))\r
311               h = parseInt($(editor.element_tag_id($(@)) + 'height').val())\r
312             when 'height'\r
313               trace = editor.element_tag_id($(@)) + 'img'\r
314               h = parseInt($(@).val())\r
315               $(trace).height(Math.abs(h))\r
316               $(trace).parent().height(Math.abs(h))\r
317               w = parseInt($(editor.element_tag_id($(@)) + 'width').val())\r
318             else\r
319           PictureSizeHelper.refresh_picture($(trace), w, h)\r
320       else\r
321     \r
322     # speech_balloons\r
323     ColorHelper.add_helper($('.speech-fore_color-wrap'), 'fore_color')\r
324     \r
325     $('.pettanr-comic-balloon' ).map ->\r
326       $(@).draggable {\r
327         stop: ( event, ui ) ->\r
328           balloon = $('.pettanr-balloon', $(@))\r
329           trace = editor.element_part_tag_id(balloon)\r
330           left = $(@).position().left\r
331           top = $(@).position().top\r
332           $(trace + 'x').val(parseInt(left))\r
333           $(trace + 'y').val(parseInt(top))\r
334       }\r
335     \r
336     $('.pettanr-balloon' ).map ->\r
337       $(@).resizable {\r
338         stop: ( event, ui ) ->\r
339           resize_div = $(@)\r
340           speech_balloon_div = resize_div.parent()\r
341           balloon = $('.pettanr-balloon', $(@))\r
342           trace = editor.element_tag_id(speech_balloon_div)\r
343           trace_balloon = editor.element_part_tag_id(balloon)\r
344           \r
345           resize_div.css('top', '0px')\r
346           resize_div.css('left', '0px')\r
347           w = ui.size.width\r
348           h = ui.size.height\r
349           if ui.originalPosition.top != ui.position.top\r
350             t = speech_balloon_div.position().top + ui.position.top\r
351             $(trace_balloon + 'y').val(Math.floor(t))\r
352             speech_balloon_div.css('top', t.toString() + 'px')\r
353             speech_balloon_div.css('height', h + 'px')\r
354           if ui.originalPosition.left != ui.position.left\r
355             l = speech_balloon_div.position().left + ui.position.left\r
356             $(trace_balloon + 'x').val(Math.floor(l))\r
357             speech_balloon_div.css('left', l.toString() + 'px')\r
358             speech_balloon_div.css('width', w + 'px')\r
359           $(trace_balloon + 'width').val(w)\r
360           $(trace_balloon + 'height').val(h)\r
361           speech_balloon_div.css('width', w.toString() + 'px')\r
362           speech_balloon_div.css('height', h.toString() + 'px')\r
363        resize: ( event, ui ) ->\r
364           resize_div = $(@)\r
365           speech_balloon_div = resize_div.parent()\r
366           balloon = $('.pettanr-balloon', $(@))\r
367           trace = editor.element_tag_id(speech_balloon_div)\r
368           trace_balloon = editor.element_part_tag_id(balloon)\r
369         handles: 'all',\r
370         autoHide: true\r
371       }\r
372     \r
373     $('.pettanr-comic-speech-inner' ).map ->\r
374       $(@).mouseover -> \r
375         outer = $(@).parent()\r
376         sb = outer.parent()\r
377         trace = editor.element_tag_id(sb)\r
378         img = $('.pettanr-balloon', $(trace))\r
379         $('.ui-resizable-handle', img.parent()).map ->\r
380           $(@).css('display', 'block')\r
381       $(@).mouseout -> \r
382         outer = $(@).parent()\r
383         sb = outer.parent()\r
384         trace = editor.element_tag_id(sb)\r
385         img = $('.pettanr-balloon', $(trace))\r
386         $('.ui-resizable-handle', img.parent()).map ->\r
387           $(@).css('display', 'none')\r
388           \r
389     \r
390     # sync view \r
391     $('input').map  ->\r
392       if editor.element_is('speech_balloon', $(@))\r
393         $(@).focusout ->\r
394           switch $(@).attr('column')\r
395             when 'x'\r
396               trace = editor.element_tag_id($(@))\r
397               v = parseInt($(@).val()).toString() + 'px'\r
398               $(trace).css('left', v)\r
399             when 'y'\r
400               trace = editor.element_tag_id($(@))\r
401               v = parseInt($(@).val()).toString() + 'px'\r
402               $(trace).css('top', v)\r
403             when 'width'\r
404               trace = editor.element_tag_id($(@))\r
405               v = parseInt($(@).val())\r
406               $(trace).width(Math.abs(v))\r
407               img = $('.pettanr-balloon', $(trace))\r
408               img.parent().width(v)\r
409               img.width(v)\r
410             when 'height'\r
411               trace = editor.element_tag_id($(@))\r
412               v = parseInt($(@).val())\r
413               $(trace).height(Math.abs(v))\r
414               img = $('.pettanr-balloon', $(trace))\r
415               img.parent().height(v)\r
416               img.height(v)\r
417             else\r
418       else\r
419     $('textarea').map  ->\r
420       if editor.element_is('speech_balloon', $(@))\r
421         $(@).focusout ->\r
422           switch $(@).attr('column')\r
423             when 'content'\r
424               trace = editor.element_part_tag_id($(@))\r
425               wf_sel = $(trace + 'writing_format_id')\r
426               wf_id = parseInt(wf_sel.val())\r
427               v = WritingFormat.render(wf_id, $(@).val())\r
428               $(trace).html(v)\r
429     $('textarea').map  ->\r
430       if editor.element_is('speech_balloon', $(@))\r
431         switch $(@).attr('column')\r
432           when 'content'\r
433             $(@).bind('textchange', (event, previousText) ->\r
434               trace = editor.element_part_tag_id($(@))\r
435               wf_sel = $(trace + 'writing_format_id')\r
436               wf_id = parseInt(wf_sel.val())\r
437               v = WritingFormat.render(wf_id, $(@).val())\r
438               $(trace).html(v)\r
439             )\r
440     $('select').map  ->\r
441       if editor.element_is('speech_balloon', $(@))\r
442         $(@).change ->\r
443           switch $(@).attr('column')\r
444             when 'font_size'\r
445               trace = editor.element_part_tag_id($(@))\r
446               $(trace).css('font-size', $(@).val() + 'em')\r
447             when 'text_align'\r
448               trace = editor.element_part_tag_id($(@))\r
449               v = parseInt($(@).val())\r
450               $(trace).css('text-align', editor.text_align_texts[v])\r
451       else\r
452     $('input').map  ->\r
453       if editor.element_is('speech_balloon', $(@))\r
454         if $(@).attr('column') == 'fore_color'\r
455           $(@).hide()\r
456 \r
457     \r
458     # ground-picture\r
459     refresh_ground_picture = (element_trace)  ->\r
460       x = parseInt($(element_trace + 'x').val()).toString() + 'px'\r
461       y = parseInt($(element_trace + 'y').val()).toString() + 'px'\r
462       $(element_trace).css('background-position', x + ' ' + y)\r
463     \r
464     # sync view \r
465     $('input').map  ->\r
466       if editor.element_is('ground_picture', $(@))\r
467         switch $(@).attr('column')\r
468           when 'x', 'y'\r
469             $(@).focusout ->\r
470               trace = editor.element_tag_id($(@))\r
471               refresh_ground_picture(trace)\r
472             $(@).spinner {\r
473               stop: ( event, ui ) ->\r
474                 trace = editor.element_tag_id($(@))\r
475                 refresh_ground_picture(trace)\r
476             }\r
477     $('select').map  ->\r
478       if editor.element_is('ground_picture', $(@))\r
479         $(@).change ->\r
480           switch $(@).attr('column')\r
481             when 'repeat'\r
482               trace = editor.element_tag_id($(@))\r
483               v = parseInt($(@).val())\r
484               $(trace).css('background-repeat', editor.repeat_texts[v])\r
485       else\r
486     \r
487     \r
488     # ground_color\r
489     ColorHelper.add_helper($('.ground_color-code-wrap'), 'code')\r
490     \r
491     refresh_ground_color = (element_trace)  ->\r
492       orientation = parseInt( $(element_trace + 'orientation').val() )\r
493       xy = $(element_trace + 'xy').val()\r
494       wh = $(element_trace + 'wh').val()\r
495       div_offset = if xy\r
496         xy\r
497       else\r
498         0\r
499       div_size = if wh\r
500         wh\r
501       else\r
502         100 - div_offset\r
503       div_x = if orientation == 0\r
504         0\r
505       else\r
506         div_offset\r
507       div_y = if orientation == 0\r
508         div_offset\r
509       else\r
510         0\r
511       div_width = if orientation == 0\r
512         100\r
513       else\r
514         div_size\r
515       div_height = if orientation == 0\r
516         div_size\r
517       else\r
518         100\r
519       div = $(element_trace)\r
520       div.css('left', div_x.toString() + '%')\r
521       div.css('top', div_y.toString() + '%')\r
522       div.css('width', div_width.toString() + '%')\r
523       div.css('height', div_height.toString() + '%')\r
524     \r
525     # sync view \r
526     $('input').map  ->\r
527       if editor.element_is('ground_color', $(@))\r
528         switch $(@).attr('column')\r
529           when 'code'\r
530             $(@).hide()\r
531           when 'xy', 'wh'\r
532             $(@).spinner {\r
533               stop: ( event, ui ) ->\r
534                 trace = editor.element_tag_id($(@))\r
535                 refresh_ground_color(trace)\r
536               , min: 0\r
537               , max: 100\r
538             }\r
539             $(@).focusout ->\r
540               trace = editor.element_tag_id($(@))\r
541               refresh_ground_color(trace)\r
542     \r
543     $('select').map  ->\r
544       if editor.element_is('ground_color', $(@))\r
545         switch $(@).attr('column')\r
546           when 'orientation'\r
547             $(@).change ->\r
548               trace = editor.element_tag_id($(@))\r
549               refresh_ground_color(trace)\r
550 \r
551     update_t = (ultrace) -> \r
552       t = 0\r
553       $(ultrace + ' li').map ->\r
554         trace = editor.element_tag_id($(@))\r
555         if $(trace + '_destroy').val().length < 1\r
556           $(trace + 't').val(t)\r
557           t++\r
558         else\r
559     \r
560     $('.tsort').map -> \r
561       $(@).sortable {\r
562         update: ( event, ui ) ->\r
563           trace = editor.panel_tag_id($(@))\r
564           update_t(trace + 'tsort')\r
565       }\r
566     $('.t-sort li').map -> \r
567       $(@).disableSelection()\r
568     \r
569     update_z = (ultrace) -> \r
570       z = 1\r
571       $(ultrace + ' li').map ->\r
572         trace = editor.element_tag_id($(@))\r
573         # update panel\r
574         if $(trace + '_destroy').val().length < 1\r
575           $(trace + 'z').val(z)\r
576           switch $(@).attr('element_type')\r
577             when 'panel_picture'\r
578               trace = trace + 'div'\r
579           $(trace).css('zIndex', z)\r
580           z++\r
581         else\r
582     \r
583     $('.zsort').map -> \r
584       $(@).sortable {\r
585         update: ( event, ui ) ->\r
586           trace = editor.panel_tag_id($(@))\r
587           update_z(trace + 'zsort')\r
588       }\r
589     $('.z-sort li').map -> \r
590       $(@).disableSelection()\r
591     \r
592     # all\r
593     # disable form actions\r
594     # hide submit buttons\r
595     $('.edit_panel_picture' ).map ->\r
596       $(@).submit ->\r
597         false\r
598     $('.edit_speech_balloon' ).map ->\r
599       $(@).submit ->\r
600         false\r
601     $('.edit_ground_picture' ).map ->\r
602       $(@).submit ->\r
603         false\r
604     $('.edit_ground_color' ).map ->\r
605       $(@).submit ->\r
606         false\r
607     \r
608     $('.edit_panel' ).map ->\r
609       if $(@).attr('jqform')\r
610         $(@).submit ->\r
611           if validate_forms()\r
612             true\r
613           else\r
614             false\r
615       else\r
616         $(@).submit ->\r
617           false\r
618     \r
619     $('.submit' ).map ->\r
620       $(@).hide()\r
621     \r
622     # disable form z t\r
623     $('input').map  ->\r
624       if editor.is_element($(@))\r
625         switch $(@).attr('column')\r
626           when 'z' , 't'\r
627             $(@).hide()\r
628             $(@).parent().hide() #label\r
629     \r
630     # add button on new form\r
631     $('.submit-new-form').map ->\r
632       $(@).html('<button class="new-element">add</button>')\r
633     \r
634     $('.new-element').map ->\r
635       $(@).click -> \r
636         false\r
637 \r