OSDN Git Service

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