OSDN Git Service

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