OSDN Git Service

84e4a214b80531b425b0f70669c58ee925c1d9f3
[pettanr/pettanr.git] / app / assets / javascripts / work.js
1 /*\r
2  * pettanR work.js\r
3  *   version 0.4.19\r
4  *   \r
5  * author:\r
6  *   itozyun\r
7  * licence:\r
8  *   3-clause BSD\r
9  *\r
10  * \r
11  * ----------------------------------------\r
12  * naming rules\r
13  * \r
14  *  Class\r
15  *    ThisIsClass\r
16  *  \r
17  *  const\r
18  *    THIS_IS_CONST = 'this is const';\r
19  *  \r
20  *  var\r
21  *    thisIsVar\r
22  *   \r
23  *  value of jquery\r
24  *    jqWrapper, JQ_WRAPPER\r
25  *  \r
26  *  value of dom element\r
27  *    elmWrapper, ELM_WRAP\r
28  * \r
29  *      value of vml element\r
30  *    vmlImg, VML_SHAPE\r
31  * \r
32  */\r
33 \r
34 \r
35 /* ----------------------------------------\r
36  *   pettanr.editor\r
37  *    - MENU_BAR_CONTROL\r
38  *    - HISTORY_CONTROL\r
39  *    - SAVE_CONTROL\r
40  *    - WINDOW_CONTROL\r
41  *       - WindowClass\r
42  *    - INFOMATION_WINDOW\r
43  *    - TOOL_BOX_WINDOW\r
44  *    - HELP_DOCUMENTS_WINDOW\r
45  *    - PANEL_CONTROL\r
46  *    - GRID_CONTROL\r
47  *    - WHITE_GLASS_CONTROL\r
48  *    - PANEL_CONTROL\r
49  *    \r
50  * \r
51  *    - PanelResizerClass\r
52  *    - PANEL_RESIZER_TOP\r
53  *    - PANEL_RESIZER_BOTTOM\r
54  *    - CONSOLE_CONTROLER\r
55  * \r
56  *    - TAIL_OPERATOR\r
57  *    - RESIZE_OPERATOR\r
58  *    - POSITION_OPERATOR\r
59  *    - COMIC_ELEMENT_OPERATION_MANAGER\r
60  *      \r
61  *    - ImageElementClass\r
62  *    - TextElementClass\r
63  * \r
64  *    - COMIC_ELEMENT_CONTROL\r
65  * \r
66  * \r
67  */\r
68 pettanr.editor = pettanr.view.registerApplication( function(){\r
69 \r
70         var PANEL_ELEMENT_TYPE_IMAGE = 0,\r
71                 PANEL_ELEMENT_TYPE_TEXT = 1,\r
72                 MOUSE_LISTENER_ARRAY = [],\r
73                 COMIC_ELEMENT_ARRAY = [],\r
74                 ELM_MOUSE_EVENT_CHATCHER = document.getElementById( 'mouse-operation-catcher'),\r
75                 MIN_PANEL_HEIGHT = 20,\r
76                 MIN_ELEMENT_SIZE = 19,\r
77                 MOUSE_HIT_AREA = 10,\r
78                 jqMouseEventChacher,\r
79                 jqEditor,\r
80                 windowW, windowH,\r
81                 currentListener = null,\r
82                 currentCursor = '',\r
83                 instance = this,\r
84                 option,\r
85                 log;\r
86 \r
87 /* ----------------------------------------\r
88  * MENU BAR\r
89  *  - mouseEventListener\r
90  *  - controler\r
91  * \r
92  * div\r
93  *   div.title\r
94  *   ul\r
95  *     li\r
96  *        a\r
97  *          span\r
98  *          kbd shortcut\r
99  */\r
100         var MENU_BAR_CONTROL = ( function(){\r
101                 var ELM_BAR = document.getElementById( 'menu-bar'),\r
102                         ELM_ITEM_CLASSNAME = 'menu-bar-item',\r
103                         ELM_ITEM_ORIGN = ( function(){\r
104                                 var ret = document.createElement( 'div'),\r
105                                         div = document.createElement( 'div'),\r
106                                         ul = document.createElement( 'ul');\r
107                                 ret.className = ELM_ITEM_CLASSNAME;\r
108                                 ret.appendChild( div);\r
109                                 ret.appendChild( ul);\r
110                                 return ret;\r
111                         })(),\r
112                         ELM_SELECTION_ORIGN = ( function(){\r
113                                 var ret = document.createElement( 'li'),\r
114                                         a = document.createElement( 'a'),\r
115                                         span = document.createElement( 'span'),\r
116                                         key = document.createElement( 'kbd');\r
117                                 a.appendChild( span);\r
118                                 a.appendChild( key);\r
119                                 ret.appendChild( a);\r
120                                 a.href = '#';\r
121                                 return ret;\r
122                         })(),\r
123                         ITEM_ARRAY = [],\r
124                         barH = pettanr.util.getElementSize( ELM_BAR).height,\r
125                         itemW = pettanr.util.getElementSize( ELM_ITEM_ORIGN).width,\r
126                         selectionW = pettanr.util.getElementSize( ELM_ITEM_ORIGN.getElementsByTagName( 'ul')[ 0]).width,\r
127                         jqStage, jqBar;\r
128                 ELM_BAR.style.top = ( -barH) +'px';\r
129 \r
130                 var MenubarSelectionClass = function( container, title, shortcut, visible, separateAfter){\r
131                         var ELM_WRAPPER = ELM_SELECTION_ORIGN.cloneNode( true),\r
132                                 ELM_TITLE = ELM_WRAPPER.getElementsByTagName( 'span')[ 0],\r
133                                 elmShortcut = ELM_WRAPPER.getElementsByTagName( 'kbd')[ 0];\r
134                                 \r
135                         if( shortcut){\r
136                                 elmShortcut.innerHTML = shortcut;\r
137                         } else {\r
138                                 elmShortcut.parentNode.removeChild( elmShortcut);\r
139                         }\r
140                         elmShortcut = null;\r
141                         \r
142                         container.appendChild( ELM_WRAPPER);\r
143                         \r
144                         updateTitle( title);\r
145                         updateVisible( visible);\r
146                         \r
147                         function updateTitle( _title){\r
148                                 ELM_TITLE.innerHTML = title = _title;\r
149                         }\r
150                         function updateVisible( _visible){\r
151                                 if( _visible !== undefined){\r
152                                         visible = !!_visible;\r
153                                         ELM_WRAPPER.className = visible === true ? '' : 'disabled';\r
154                                 };\r
155                         }\r
156                         return {\r
157                                 elm: ELM_WRAPPER,\r
158                                 title: function( _title){\r
159                                         _title !== undefined && updateTitle( _title);\r
160                                         return title;\r
161                                 },\r
162                                 visible: function( _visible){\r
163                                         visible !== !!_visible && updateVisible( _visible);\r
164                                         return visible;\r
165                                 },\r
166                                 separateAfter: separateAfter\r
167                         }\r
168                 }\r
169 \r
170                 var MenuBarItemClass = function( title){\r
171                         var ELM_WRAPPER = ELM_ITEM_ORIGN.cloneNode( true),\r
172                                 ELM_TITLE = ELM_WRAPPER.getElementsByTagName( 'div')[ 0],\r
173                                 ELM_SELECTION = ELM_WRAPPER.getElementsByTagName( 'ul')[ 0],\r
174                                 INDEX = ITEM_ARRAY.length,\r
175                                 SELECTION_CALLBACK_ARRAY = [],\r
176                                 numSelection = 0,\r
177                                 visible = false;\r
178                         ELM_TITLE.innerHTML = title;\r
179                         \r
180                         ELM_WRAPPER.style.left = ( itemW * INDEX) +'px';\r
181                         ELM_BAR.appendChild( ELM_WRAPPER);\r
182                         \r
183                         function onClick( e){\r
184                                 var that = this,\r
185                                         i = pettanr.util.getChildIndex( this.parentNode, this);\r
186                                 i !== -1 && this.className !== 'disabled' && SELECTION_CALLBACK_ARRAY[ i]( i);\r
187                                 e.stopPropagation();\r
188                                 return false;\r
189                         }\r
190                         return {\r
191                                 elm: ELM_WRAPPER,\r
192                                 onClick: onClick,\r
193                                 init: function(){\r
194                                         $( ELM_SELECTION).children( 'li').click( onClick);\r
195                                         delete this.init;\r
196                                 },\r
197                                 show: function(){\r
198                                         if( visible === true) return;\r
199                                         jqStage.append( ELM_WRAPPER);\r
200                                         ELM_WRAPPER.className = ELM_ITEM_CLASSNAME +'-focus';\r
201                                         this.onShow && setTimeout( this.onShow, 0);\r
202                                         visible = true;\r
203                                 },\r
204                                 hide: function(){\r
205                                         if( visible === false) return;\r
206                                         ELM_BAR.appendChild( ELM_WRAPPER);\r
207                                         ELM_WRAPPER.className = ELM_ITEM_CLASSNAME;\r
208                                         this.onHide && setTimeout( this.onHide, 0);\r
209                                         visible = false;\r
210                                 },\r
211                                 createSelection: function( title, shortcut, callback, visible, separateBefore, separateAfter){\r
212                                         var ret = MenubarSelectionClass.apply( {}, [ ELM_SELECTION, title, shortcut, visible, separateAfter]),\r
213                                                 before = SELECTION_CALLBACK_ARRAY.length > 0 ? SELECTION_CALLBACK_ARRAY[ SELECTION_CALLBACK_ARRAY.length -1] : null;\r
214                                         SELECTION_CALLBACK_ARRAY.push( callback);\r
215                                         if( before !== null && ( separateBefore === true || before.separateAfter === true)){\r
216                                                 ret.elm.style.borderTop = '1px solid #ccc';\r
217                                         }\r
218                                         return ret;\r
219                                 }\r
220                         }\r
221                 }\r
222 \r
223                 \r
224                 function createMenubarItem( title){\r
225                         var _item = new MenuBarItemClass( title);\r
226                         ITEM_ARRAY.push( _item);\r
227                         return _item;\r
228                 }\r
229                 return {\r
230                         init: function(){\r
231                                 jqStage = jqEditor;\r
232                                 jqBar = $( ELM_BAR).animate( { top: 0});\r
233 \r
234                                 var l = ITEM_ARRAY.length;\r
235                                 for( var i=0; i<l; ++i){\r
236                                         ITEM_ARRAY[ i].init();\r
237                                 }\r
238 \r
239                                 delete MENU_BAR_CONTROL.init;\r
240                         },\r
241                         open: function(){\r
242                                 MENU_BAR_CONTROL.init && MENU_BAR_CONTROL.init();\r
243                                 // ELM_BAR.style.top = ( -barH) +'px';\r
244                                 // anime\r
245                         },\r
246                         close: function(){\r
247                                 var l = ITEM_ARRAY.length;\r
248                                 for( var i=0; i<l; ++i){\r
249                                         ITEM_ARRAY[ i].hide();\r
250                                 }\r
251                         },\r
252                         h: barH,\r
253                         onMouseMove: function( _mouseX, _mouseY){\r
254                                 if( barH >= _mouseY){\r
255                                         return true;\r
256                                 }\r
257                                 var l = ITEM_ARRAY.length;\r
258                                 for( var i=0; i<l; ++i){\r
259                                         ITEM_ARRAY[ i].hide();\r
260                                 }\r
261                                 return false;\r
262                         },\r
263                         onMouseUp: function( _mouseX, _mouseY){\r
264                                 return false;\r
265                         },\r
266                         onMouseDown: function( _mouseX, _mouseY){\r
267                                 var l = ITEM_ARRAY.length;\r
268                                 if( barH < _mouseY || itemW * l < _mouseX) return false;\r
269                                 for( var i=0; i<l; ++i){\r
270                                         if( i * itemW <= _mouseX && _mouseX < ( i +1) * itemW){\r
271                                                 ITEM_ARRAY[ i].show();\r
272                                         } else {\r
273                                                 ITEM_ARRAY[ i].hide();\r
274                                         }\r
275                                 }\r
276                                 return true;\r
277                         },\r
278                         busy: function( _busy){\r
279                                 return false;\r
280                         },\r
281                         onWindowResize: function( _windowW, _windowH){\r
282                                 \r
283                         },\r
284                         QUIT: createMenubarItem( 'Quit'),\r
285                         EDIT: createMenubarItem( 'Edit'),\r
286                         WINDOW: createMenubarItem( 'Window'),\r
287                         HELP: pettanr.util.extend( createMenubarItem( 'Help'), {\r
288                                         createAjaxSelection: function( callback){\r
289                                                 var elmLoading = document.createElement( 'li'),\r
290                                                         that = this,\r
291                                                         elmSelection = this.elm.getElementsByTagName( 'ul')[ 0];\r
292                                                 elmSelection.appendChild( elmLoading);\r
293                                                 elmLoading.className = 'loading';\r
294                                                 elmLoading.style.height = '90px';                                                       \r
295 \r
296                                                 this.onShow = callback;\r
297                                                 callback = null;\r
298                                                 \r
299                                                 delete this.createAjaxSelection;\r
300                                                 return function(){\r
301                                                         elmSelection.removeChild( elmLoading);\r
302                                                         $( elmSelection).children( 'li').click( that.onClick);\r
303                                                         elmLoading = elmSelection = null;\r
304                                                         delete that.onShow;\r
305                                                         that = null;\r
306                                                 }\r
307                                         }\r
308                                 })\r
309                 }\r
310         })();\r
311 \r
312 \r
313 /* ----------------------------------------\r
314  * HISTORY_CONTROL\r
315  *  - controler\r
316  */\r
317         var HISTORY_CONTROL = ( function() {\r
318                 var     STACK_BACK = [],\r
319                         STACK_FORWARD = [],\r
320                         MENUBAR_BACK = MENU_BAR_CONTROL.EDIT.createSelection( 'back', 'ctrl + z', back, false),\r
321                         MENUBAR_FORWARD = MENU_BAR_CONTROL.EDIT.createSelection( 'forward', 'ctrl + y', forward, false, false, true),\r
322                         log;\r
323                         \r
324                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 90, false, true, back);       // ctrl + Z\r
325                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 90, true, true, forward);     // ctrl + shift + Z\r
326                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 89, false, true, forward); // ctrl + Y\r
327 \r
328                 function back(){\r
329                         /*\r
330                          * currentを控えてSTACK_FORWARD.push(current)\r
331                          * STACK_BACK.pop()を実行してcurrentに\r
332                          */\r
333                         if( STACK_BACK.length === 0) return;\r
334 \r
335                         var state = STACK_BACK.pop();\r
336                         state && state.fn( state.argBack);\r
337                         MENUBAR_BACK.visible( STACK_BACK.length !== 0);\r
338                         SAVE_CONTROL.panelUpdated( STACK_BACK.length !== 0);\r
339                         \r
340                         STACK_FORWARD.push( state);\r
341                         MENUBAR_FORWARD.visible( true);\r
342                 }\r
343                 function forward(){\r
344                         if( STACK_FORWARD.length === 0) return;\r
345                         \r
346                         var state = STACK_FORWARD.pop();\r
347                         state.fn( state.argForword);\r
348                         MENUBAR_FORWARD.visible( STACK_FORWARD.length !== 0);\r
349                         \r
350                         STACK_BACK.push( state);\r
351                         MENUBAR_BACK.visible( true);\r
352                         SAVE_CONTROL.panelUpdated( true);\r
353                 }\r
354                 function destroyStack( _stack, _destroy){\r
355                         _stack.fn = null;\r
356                         \r
357                         var     _argBack = _stack.argBack,\r
358                                 _argForword = _stack.argForword,\r
359                                 _value;\r
360                         if( Type.isArray( _argBack ) === true ){ // isArray\r
361                                 while( _argBack.length > 0){\r
362                                         _value = _argBack.shift();\r
363                                         _destroy === true && typeof _value.destroy === 'function' && _value.destroy();\r
364                                 }\r
365                         }\r
366                         if( Type.isArray( _argForword ) === true ){\r
367                                 while( _argForword.length > 0){\r
368                                         _value = _argForword.shift();\r
369                                         _destroy === true && typeof _value.destroy === 'function' && _value.destroy();\r
370                                 }                                               \r
371                         }                       \r
372                 }\r
373                 return {\r
374                         init: function(){\r
375                                 log = $( '#history-log');\r
376                                 delete HISTORY_CONTROL.init;\r
377                         },\r
378                         open: function(){\r
379                                 HISTORY_CONTROL.init && HISTORY_CONTROL.init();\r
380                         },\r
381                         close: function(){\r
382                                 MENUBAR_BACK.visible( false);\r
383                                 MENUBAR_FORWARD.visible( false);\r
384                         while( STACK_BACK.length > 0){\r
385                                         destroyStack( STACK_BACK.shift(), true);\r
386                                 }\r
387                         while( STACK_FORWARD.length > 0){\r
388                                         destroyStack( STACK_FORWARD.shift(), true);\r
389                                 }\r
390                         },\r
391                     saveState: function( _function, _argBack, _argForword, _destroy) {\r
392                         STACK_BACK.push( {\r
393                                 fn:                     _function,\r
394                                 argBack:        _argBack,\r
395                                         argForword:     _argForword,\r
396                                         destroy:        _destroy\r
397                         });\r
398                         MENUBAR_BACK.visible( true);\r
399                                 SAVE_CONTROL.panelUpdated( true);\r
400                                 \r
401                                 var _stack;\r
402                         while( STACK_FORWARD.length > 0){\r
403                                         _stack = STACK_FORWARD.shift();\r
404                                         destroyStack( _stack, _stack.destroy);\r
405                                 }\r
406                                 MENUBAR_FORWARD.visible( false);\r
407                     }           \r
408                 }\r
409         })();\r
410 \r
411 /* ----------------------------------------\r
412  * SAVE_CONTROL\r
413  *  - controler\r
414  */\r
415         var SAVE_CONTROL = ( function(){\r
416                 var SAVE = MENU_BAR_CONTROL.QUIT.createSelection( 'save', 'ctrl + S', quit, false),\r
417                         SAVE_AND_QUIT = MENU_BAR_CONTROL.QUIT.createSelection( 'save & quit', null, quit, false, false, true),\r
418                         SAVE_AS_HTML = MENU_BAR_CONTROL.QUIT.createSelection( 'get as html', null, outputAsHtml, true, false, true),\r
419                         SAVE_AS_JSON_STRING = MENU_BAR_CONTROL.QUIT.createSelection( 'get JsonStr', null, outputAsJsonString, true, false, true),\r
420                         QUIT = MENU_BAR_CONTROL.QUIT.createSelection( 'quit', null, quit, true, true),\r
421                         updated = false;\r
422                 \r
423                 function quit(){\r
424                         // 本来は os.application.close();\r
425                         pettanr.editor.shutdown();\r
426                 }\r
427                 \r
428                 function outputAsHtml(){\r
429                         pettanr.outputConsole.bootInOverlay( COMIC_ELEMENT_CONTROL.getAsHTML( true, false));\r
430                 }\r
431                 function outputAsJsonString(){\r
432                         pettanr.outputConsole.bootInOverlay( COMIC_ELEMENT_CONTROL.getAsJsonString());\r
433                 }\r
434                 return {\r
435                         open: function(){},\r
436                         close: function(){},\r
437                         quit: quit,\r
438                         panelUpdated: function( _updated){\r
439                                 if( _updated !== undefined && updated !== _updated ){\r
440                                         SAVE.visible( !!_updated );\r
441                                         SAVE_AND_QUIT.visible( !!_updated );\r
442                                         updated = !!_updated;\r
443                                 }\r
444                                 return updated;\r
445                         },\r
446                         save: function(){\r
447                                 \r
448                         }\r
449                 }\r
450         })();\r
451 \r
452 /* ----------------------------------------\r
453  * WINDOWS_CONTROL\r
454  *  - contloler\r
455  *  - mouseEventListener\r
456  */     \r
457         var WINDOWS_CONTROL = ( function(){\r
458                 /*\r
459                  *  表示上手前にあるwindowは、WINDOW_ARRAYの先頭にあり、htmlでは後ろにある。\r
460                  */\r
461                 var DEFAULT_MIN_WINDOW_WIDTH = 200,\r
462                         DEFAULT_MIN_WINDOW_HEIGHT = 200,\r
463                         WINDOW_ARRAY = [],\r
464                         WINDOW_BODY_BODER_SIZE = 1,\r
465                         jqContainer,\r
466                         currentWindow,\r
467                         currentWindowIndex = -1,\r
468                         log;\r
469 \r
470                 var jqWindowOrigin,\r
471                         closeButtonWidth;\r
472                 var WindowClass = function( bodyTempleteID, title, x, y, w, h, visible, CLOSE_BUTTON_ENABLED, RESIZE_BUTTON_ENABLED, minWindowW, minWindowH){\r
473                         var MOUSE_CURSOR = updateMouseCursor,\r
474                                 MENUBAR_SELWCTION = MENU_BAR_CONTROL.WINDOW.createSelection( \r
475                                         ( visible !== true ? 'show ' : 'hide ') +title,\r
476                                         null, onMenuClick, true\r
477                                 ),\r
478                                 jqStage,\r
479                                 jqWrapper, jqHeader, jqFooter = null,\r
480                                 elmBody, elmBodyStyle,\r
481                                 startX, startY, startW, startH,\r
482                                 offsetX, offsetY,\r
483                                 headerH, bodyH, footerH = 0,\r
484                                 isDragging = false,\r
485                                 isResizing = false,\r
486                                 bodyIsTachable = false,\r
487                                 instance;\r
488 \r
489                         function onMenuClick(){\r
490                                 visible === true ? instance.close() : instance.open();\r
491                         }\r
492                         function update( _x, _y, _w, _h){\r
493                                 _x = _x !== undefined ? _x : x;\r
494                                 _y = _y !== undefined ? _y : y;\r
495                                 _y = _y > MENU_BAR_CONTROL.h ? _y : MENU_BAR_CONTROL.h;\r
496                                 _w = _w !== undefined ? _w : w;\r
497                                 _h = _h !== undefined ? _h : h;\r
498                                 jqWrapper.css( {\r
499                                         left:           _x,\r
500                                         top:            _y,\r
501                                         width:          _w,\r
502                                         height:         _h\r
503                                 });\r
504                                 bodyH = _h -headerH -footerH;\r
505                                 elmBodyStyle.height = bodyH +'px';\r
506                                 ( w !== _w || h !== _h) && instance.onResize && instance.onResize( _w, bodyH);\r
507                                 x = _x;\r
508                                 y = _y;\r
509                                 w = _w;\r
510                                 h = _h;\r
511                         }\r
512                         function bodyBackOrForward( isBack){\r
513                                 if( !instance) return;\r
514                                 if( bodyIsTachable === !isBack) return;\r
515                                 elmBodyStyle.position = isBack === true ? 'relative' : 'absolute';\r
516                                 elmBodyStyle.left =             isBack === true ? 0  : x +'px';\r
517                                 elmBodyStyle.top =              isBack === true ? 0  : y +headerH +'px';\r
518                                 elmBodyStyle.width =    isBack === true ? '' : ( w -WINDOW_BODY_BODER_SIZE *2) +'px';\r
519                                 bodyIsTachable === isBack && isBack === true ? jqHeader.after( elmBody) : jqStage.append( elmBody);\r
520                                 bodyIsTachable = !isBack;\r
521                         }\r
522                         function onWindowResize( e){\r
523                                 bodyBackOrForward( true);\r
524                                 isResizing = true;\r
525                                 startX = x;\r
526                                 startY = y;\r
527                                 startW = w;\r
528                                 startH = h;\r
529                                 offsetX = e.pageX;\r
530                                 offsetY = e.pageY;\r
531                                 MOUSE_CURSOR( 'nw-resize');\r
532                                 e.stopPropagation();\r
533                                 return false;\r
534                         }\r
535                         return {\r
536                                 init: function( jqContainer){\r
537                                         /*\r
538                                          * setTimeout で呼ばれるグローバルメソッド内では、this でなく instance を使う.\r
539                                          */\r
540                                         instance = this;\r
541                                         \r
542                                         jqWindowOrigin = jqWindowOrigin || ( function(){\r
543                                                 return $( $( '#windowTemplete').remove().html());\r
544                                         })();\r
545                                         closeButtonWidth = closeButtonWidth || ( function(){\r
546                                                 return pettanr.util.getElementSize( jqWindowOrigin.clone( true).find( '.window-close-button').get( 0)).width;\r
547                                         })();\r
548                                         \r
549                                         jqStage = jqEditor;\r
550                                         this.$ = jqWrapper = jqWindowOrigin.clone( true);\r
551                                         jqHeader = jqWrapper.children( '.window-header').eq( 0).html( title);\r
552                                         headerH = pettanr.util.getElementSize( jqHeader.get( 0)).height;\r
553                                         elmBody = jqWrapper.children( '.window-body').get( 0);\r
554                                         elmBodyStyle = elmBody.style;\r
555                                         \r
556                                         if( bodyTempleteID) {\r
557                                                 jqWrapper.find( '.window-body-insert-position').replaceWith( $( $( '#' +bodyTempleteID).remove().html()));\r
558                                         } else {\r
559                                                 jqWrapper.find( '.window-body-insert-position').remove();\r
560                                         }\r
561                                         CLOSE_BUTTON_ENABLED !== true && jqWrapper.find( '.window-close-button').remove();\r
562                                         \r
563                                         this.onInit && this.onInit();\r
564                                         delete this.init;\r
565                                 },\r
566                                 x: function(){ return x;},\r
567                                 y: function(){ return y;},\r
568                                 w: function(){ return w;},\r
569                                 h: function(){ return h;},\r
570                                 $: null,\r
571                                 title: function( _title){\r
572                                         typeof _title === 'string' && jqHeader.html( _title);\r
573                                         title = typeof _title === 'string' ? _title : title;\r
574                                         return title;\r
575                                 },\r
576                                 visible: visible,\r
577                                 firstOpen: function(){\r
578                                         if( RESIZE_BUTTON_ENABLED === true){\r
579                                                 footerH = pettanr.util.getElementSize( jqWrapper.find( '.window-footer').get( 0)).height;\r
580                                                 //jqWrapper.find( '.window-resize-button').eq( 0).mousedown( onWindowResize);\r
581                                         } else {\r
582                                                 jqWrapper.find( '.window-footer').remove();\r
583                                         }\r
584                                         this.onFirstOpen && this.onFirstOpen( w, h -headerH -footerH);\r
585                                         \r
586                                         update( x, y, w, h);\r
587                                         \r
588                                         delete this.firstOpen;\r
589                                 },\r
590                                 open: function(){\r
591                                         if( visible === true) return;\r
592                                         instance.visible = visible = true;\r
593                                         openWindow( instance);\r
594                                         MENUBAR_SELWCTION.title( 'hide ' +title);\r
595                                         \r
596                                         for( var i=0, l = WINDOW_ARRAY.length; i<l; ++i){\r
597                                                 if( WINDOW_ARRAY[ i] === instance){\r
598                                                         WINDOW_ARRAY.splice( i, 1);\r
599                                                         WINDOW_ARRAY.unshift( instance);\r
600                                                         currentWindow = null;\r
601                                                         currentWindowIndex = -1;\r
602                                                 }\r
603                                         }\r
604                                 },\r
605                                 onFadeIn: function(){\r
606                                         instance.firstOpen && instance.firstOpen();\r
607                                         instance.onOpen && setTimeout( callOnOpen, 0);\r
608                                         function callOnOpen(){\r
609                                                 instance.onOpen( w, bodyH);\r
610                                         }\r
611                                 },\r
612                                 onFadeOut: function(){\r
613                                         var elmWrapper = jqWrapper.get(0);\r
614                                         elmWrapper.parentNode.removeChild( elmWrapper);\r
615                                         instance.onClose && setTimeout( instance.onClose, 0);\r
616                                 },\r
617                                 close: function(){\r
618                                         if( visible === false) return;\r
619                                         instance.visible = visible = false;\r
620                                         jqWrapper.fadeOut( instance.onFadeOut);\r
621                                         MENUBAR_SELWCTION.title( 'show ' +title);\r
622                                 },\r
623                                 bodyBackOrForward: bodyBackOrForward,\r
624                                 onMouseDown: function( _mouseX, _mouseY){\r
625                                         if( RESIZE_BUTTON_ENABLED === true && x +w -20 <= _mouseX && _mouseX < x +w && y +headerH +bodyH < _mouseY && _mouseY <= y +h){\r
626                                                 bodyBackOrForward( true);\r
627                                                 isResizing = true;\r
628                                                 startX = x;\r
629                                                 startY = y;\r
630                                                 startW = w;\r
631                                                 startH = h;\r
632                                                 offsetX = _mouseX;\r
633                                                 offsetY = _mouseY;\r
634                                                 MOUSE_CURSOR( 'nw-resize');\r
635                                                 return;\r
636                                         }\r
637                                         \r
638                                         if( x > _mouseX || y > _mouseY || x +w < _mouseX || y +headerH < _mouseY ) return;\r
639                                         if( CLOSE_BUTTON_ENABLED === true && x +w -closeButtonWidth < _mouseX){\r
640                                                 instance.close();\r
641                                                 return;\r
642                                         }\r
643                                         \r
644                                         isDragging = true;\r
645                                         MOUSE_CURSOR( 'move');                          \r
646                                         startX = x;\r
647                                         startY = y;\r
648                                         startW = w;\r
649                                         startH = h;\r
650                                         offsetX = _mouseX;\r
651                                         offsetY = _mouseY;\r
652                                 },\r
653                                 onMouseUp: function( _mouseX, _mouseY){\r
654                                         isDragging = isResizing = false;\r
655                                         MOUSE_CURSOR( '');\r
656                                 },\r
657                                 onMouseMove: function( _mouseX, _mouseY){\r
658                                         var _updateX = _mouseX -offsetX,\r
659                                                 _updateY = _mouseY -offsetY;\r
660                                         \r
661                                         if( isResizing === true){\r
662                                                 var _w = startW +_updateX,\r
663                                                         _h = startH +_updateY;\r
664                                                 update( startX, startY, _w < minWindowW ? minWindowW : _w, _h < minWindowH ? minWindowH : _h);\r
665                                                 return;\r
666                                         } else\r
667                                         if( isDragging === true) {\r
668                                                 update( startX +_updateX, startY +_updateY);\r
669                                                 return;\r
670                                         } else\r
671                                         if( x > _mouseX || x +w < _mouseX ) return;\r
672         \r
673                                         ( y <= _mouseY && y +headerH >= _mouseY ) ?\r
674                                                 MOUSE_CURSOR( 'pointer') :      // hit to header\r
675                                                 MOUSE_CURSOR( '');\r
676                                         bodyBackOrForward( y +headerH > _mouseY || y +headerH +bodyH < _mouseY);\r
677                                 },\r
678                                 onMouseOut: function( _mouseX, _mouseY){\r
679                                         bodyIsTachable === true && bodyBackOrForward( true);\r
680                                         isDragging = false;\r
681                                         MOUSE_CURSOR( '');\r
682                                 },\r
683                                 busy: function(){\r
684                                         return isDragging === true || isResizing === true;\r
685                                 },\r
686                                 bodyHeight: function(){\r
687                                         return  bodyH;\r
688                                 }\r
689                         }\r
690                 };\r
691                 \r
692                 function getCurrentIndex( _mouseX, _mouseY){\r
693                         if( currentWindow && currentWindow.busy() === true) return currentWindowIndex;\r
694                         var l = WINDOW_ARRAY.length,\r
695                                 _currentWindow = null,\r
696                                 _win, _x, _y;\r
697                         currentWindowIndex = -1;\r
698                         for( var i=0; i<l; i++){\r
699                                 _win = WINDOW_ARRAY[ i];\r
700                                 if( _win.visible !== true) continue;\r
701                                 _x = _win.x();\r
702                                 _y = _win.y();\r
703                                 if( _x <= _mouseX && _y <= _mouseY && _x +_win.w() >= _mouseX && _y +_win.h() >= _mouseY){\r
704                                         _currentWindow = _win;\r
705                                         currentWindowIndex = i;\r
706                                         break;\r
707                                 }\r
708                         }\r
709                         currentWindow && currentWindow !== _currentWindow && currentWindow.onMouseOut( _mouseX, _mouseY);\r
710                         currentWindow = _currentWindow;\r
711                         return currentWindowIndex;\r
712                 }\r
713                 function openWindow( _window){\r
714                         if( _window.visible !== true) return;\r
715                         var _jqWindow = _window.$;\r
716                         jqContainer.append( _jqWindow);// appendした後に fadeIn() しないと ie で filterが適用されない.\r
717                         _jqWindow.fadeIn( _window.onFadeIn);\r
718                         return;\r
719                 }\r
720                 \r
721                 return {\r
722                         init: function(){\r
723                                 jqContainer = $( '#window-container');\r
724                                 \r
725                                 var l = WINDOW_ARRAY.length,\r
726                                         _window;\r
727                                 for( var i=l-1; i >= 0; --i){\r
728                                         _window = WINDOW_ARRAY[ i];\r
729                                         _window.init && _window.init( jqContainer);\r
730                                         _window.visible === true && openWindow( _window);\r
731                                 }\r
732                                 log = $( '#window-log');\r
733                                 \r
734                                 delete WINDOWS_CONTROL.init;\r
735                         },\r
736                         open: function(){\r
737                                 WINDOWS_CONTROL.init && WINDOWS_CONTROL.init();\r
738                         },\r
739                         close: function(){\r
740                                 \r
741                         },\r
742                         onMouseMove: function( _mouseX, _mouseY){\r
743                                 var _index = getCurrentIndex( _mouseX, _mouseY);\r
744                                 if( _index === 0){\r
745                                         currentWindow.onMouseMove( _mouseX, _mouseY);\r
746                                         return true;\r
747                                 } else\r
748                                 if( _index > 0){ // 先頭のクリックでない場合\r
749                                 // Array を前に\r
750                                         WINDOW_ARRAY.splice( currentWindowIndex, 1);\r
751                                         WINDOW_ARRAY.unshift( currentWindow);\r
752                                 // Domを最後に\r
753                                         jqContainer.append( currentWindow.$);\r
754                                         currentWindowIndex = 0;\r
755                                         return true;\r
756                                 }\r
757                                 return false;\r
758                         },\r
759                         onMouseUp: function( _mouseX, _mouseY){\r
760                                 if( getCurrentIndex( _mouseX, _mouseY) === 0){\r
761                                         currentWindow.onMouseUp( _mouseX, _mouseY);\r
762                                         return true;\r
763                                 }\r
764                                 return false;\r
765                         },\r
766                         onMouseDown: function( _mouseX, _mouseY){\r
767                                 if( getCurrentIndex( _mouseX, _mouseY) === 0){\r
768                                         currentWindow.onMouseDown( _mouseX, _mouseY);\r
769                                         return true;\r
770                                 }\r
771                                 return false;\r
772                         },\r
773                         busy: function(){\r
774                                 return currentWindow !== null;\r
775                         },\r
776                         onWindowResize: function( _windowW, _windowH){\r
777                                 /*\r
778                                  * 画面外に出るwindowの移動\r
779                                  */\r
780                         },\r
781                         createWindow: function( EXTENDS, bodyTempleteID, title, x, y, w, h, opt_visible, opt_closeButtonEnabled, opt_resizeButtonEnabled, opt_minWindowW, opt_minWindowH){\r
782                                 opt_visible = opt_visible !== false;\r
783                                 opt_closeButtonEnabled = opt_closeButtonEnabled === true;\r
784                                 opt_resizeButtonEnabled = opt_resizeButtonEnabled === true;\r
785                                 opt_minWindowW = opt_minWindowW || ( w < DEFAULT_MIN_WINDOW_WIDTH) ? w : DEFAULT_MIN_WINDOW_WIDTH;\r
786                                 opt_minWindowH = opt_minWindowH || ( h < DEFAULT_MIN_WINDOW_HEIGHT) ? h : DEFAULT_MIN_WINDOW_HEIGHT;\r
787                                 \r
788                                 var _window = pettanr.util.extend(\r
789                                         new WindowClass(\r
790                                                 bodyTempleteID, title, x, y, w, h, opt_visible, opt_closeButtonEnabled, opt_resizeButtonEnabled, opt_minWindowW, opt_minWindowH\r
791                                         ),\r
792                                         EXTENDS\r
793                                 );\r
794                                 WINDOW_ARRAY.unshift( _window);\r
795                                 WINDOWS_CONTROL.init === undefined && _window.init( jqContainer);\r
796                                 WINDOWS_CONTROL.init === undefined && openWindow( _window);\r
797                                 return _window;\r
798                         }\r
799                 }\r
800         })();\r
801 \r
802 /* ----------------------------------------\r
803  * TOOL_BOX_WINDOW\r
804  * - window\r
805  */\r
806         var TOOL_BOX_WINDOW = ( function(){\r
807                 var addImageButton, addTextButton, editBgButton, switchGridButton, popupHelpButton, postButton,\r
808                         instance;\r
809                         \r
810                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 73, false, true, addImage);\r
811                 MENU_BAR_CONTROL.EDIT.createSelection( 'Add Image', 'ctrl + I', addImage, true, true, false);\r
812                 \r
813                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 84, false, true, addText);\r
814                 MENU_BAR_CONTROL.EDIT.createSelection( 'Add Text', 'ctrl + T', addText, true, false, true);\r
815 \r
816                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 71, false, true, switchGrid);\r
817                 MENU_BAR_CONTROL.EDIT.createSelection( 'show Grid', 'ctrl + G', switchGrid, true, true, true);\r
818 \r
819                 function addImage( e){\r
820                         setTimeout( COMIC_ELEMENT_CONTROL.createImageElement, 0);\r
821                         e && e.preventDefault && e.preventDefault();\r
822                         return false;\r
823                 }\r
824                 function addText( e){\r
825                         setTimeout( COMIC_ELEMENT_CONTROL.createTextElement, 0);\r
826                         e && e.preventDefault && e.preventDefault();\r
827                         return false;\r
828                 }\r
829                 function switchGrid( e){\r
830                         setTimeout( GRID_CONTROL.update, 0);\r
831                         e && e.preventDefault && e.preventDefault();\r
832                         return false;\r
833                 }\r
834                 function popupHelp( e){\r
835                         instance.bodyBackOrForward( true);\r
836                         setTimeout( HELP_DOCUMENTS_WINDOW.open, 0);\r
837                         e && e.preventDefault && e.preventDefault();\r
838                         return false;\r
839                 }\r
840                 function editBG( e){\r
841                         instance.bodyBackOrForward( true);\r
842                         setTimeout( INFOMATION_WINDOW.open, 0); \r
843                         e && e.preventDefault && e.preventDefault();\r
844                         return false;\r
845                 }\r
846                 \r
847                 return WINDOWS_CONTROL.createWindow(\r
848                         {\r
849                                 onInit: function(){\r
850                                         instance = this;\r
851                                         delete this.onInit;\r
852                                 },\r
853                                 onFirstOpen: function(){\r
854                                         addImageButton = $( '#toolbox-add-image-button').click( addImage);\r
855                                         addTextButton = $( '#toolbox-add-text-button').click( addText);\r
856                                         editBgButton = $( '#toolbox-edit-bg-button').click( editBG);\r
857                                         switchGridButton = $( '#toolbox-switch-grid').click( switchGrid);\r
858                                         popupHelpButton = $( '#toolbox-popup-help-button').click( popupHelp);\r
859                                         \r
860                                         postButton = $( '#toolbox-post-button');\r
861                                         \r
862                                         delete this.onFirstOpen;\r
863                                 }\r
864                         },\r
865                         'toolbox-window', 'Tool box', 0, 215, 110, 290, true\r
866                 );\r
867         })();\r
868         \r
869         \r
870 /* ----------------------------------------\r
871  * IMAGE_EXPROLER\r
872  *  - window\r
873  */\r
874         var IMAGE_EXPLORER_WINDOW = ( function(){\r
875                 var instance, finder;\r
876                 \r
877                 return WINDOWS_CONTROL.createWindow(\r
878                         {\r
879                                 onInit: function(){\r
880                                         instance = this;\r
881                                         delete this.onInit;\r
882                                 },\r
883                                 onOpen: function( _w, _h){\r
884                                         finder = finder || pettanr.finder.createFinder( document.getElementById( 'image-exproler-container'), pettanr.driver.createPictureTree());\r
885                                         finder.open( _w, _h );\r
886                                 },\r
887                                 onResize: function( _w, _h ){\r
888                                         finder.resize( _w, _h );\r
889                                 }\r
890                         },\r
891                         'image-exproler', 'Album', 0, 215, 400, 350, false, true, true, 300, 300\r
892                 );\r
893         })();\r
894         \r
895         \r
896 /* ----------------------------------------\r
897  * INFOMATION_WINDOW\r
898  *  - window\r
899  */                     \r
900         var INFOMATION_WINDOW = ( function(){\r
901                 var FADE_EFFECT_ENABLED = true, //pettanr.ua.isIE === false || pettanr.ua.ieVersion >= 8,\r
902                         FADE_IN_EFFECT = FADE_EFFECT_ENABLED === true ? 'fadeIn' : 'show',\r
903                         FADE_OUT_EFFECT = FADE_EFFECT_ENABLED === true ? 'fadeOut' : 'hide',\r
904                         backgroundInfomationElm,\r
905                         jqComicElementInformation,\r
906                         inputX, inputY, inputZ, inputA, inputW, inputH, inputAspectRatio,\r
907                         inputPercentW, inputPercentH,\r
908                         currentComicElement = null,\r
909                         currentElementType = -1,\r
910                         currentLock = false;\r
911 \r
912                 return WINDOWS_CONTROL.createWindow(\r
913                         {\r
914                                 onFirstOpen: function( _w, _h){\r
915                                         backgroundInfomationElm = $( '#panel-background-information');\r
916                                         \r
917                                         jqComicElementInformation = $( '#comic-element-infomation').hide().css( {\r
918                                                 height:         _h\r
919                                         });\r
920                                         var TAB_GROUP_ID = 'comic-element-attribute';\r
921                                         var CREATER = pettanr.form.createInputText;//pettanr.key.createEditableText;\r
922                                         inputX = CREATER( document.getElementById( 'comic-element-x'), null, TAB_GROUP_ID);\r
923                                         inputY = CREATER( document.getElementById( 'comic-element-y'), null, TAB_GROUP_ID);\r
924                                         inputZ = CREATER( document.getElementById( 'comic-element-z'), null, TAB_GROUP_ID);\r
925                                         inputA = CREATER( document.getElementById( 'comic-element-a'), null, TAB_GROUP_ID);\r
926                                         inputW = CREATER( document.getElementById( 'comic-element-w'), null, TAB_GROUP_ID);\r
927                                         inputH = CREATER( document.getElementById( 'comic-element-h'), null, TAB_GROUP_ID);\r
928                                         inputPercentW = CREATER( document.getElementById( 'comic-element-w-percent'), null, TAB_GROUP_ID);\r
929                                         inputPercentH = CREATER( document.getElementById( 'comic-element-h-percent'), null, TAB_GROUP_ID);\r
930                                         inputAspectRatio = $( '#comic-element-keep-aspect');\r
931                                         delete this.onFirstOpen;\r
932                                 },\r
933                                 onResize: function(  _w, _h){\r
934                                         jqComicElementInformation.css( {\r
935                                                 height: _h\r
936                                         });\r
937                                 },\r
938                                 update: function( currentElement){\r
939                                         \r
940                                         if( currentLock === true && currentElement === null) return;\r
941                                         \r
942                                         var _elementType = currentElement === null ? -1 : currentElement.type,\r
943                                                 x = currentElement !== null ? currentElement.x : 0,\r
944                                                 y = currentElement !== null ? currentElement.y : 0,\r
945                                                 z = currentElement !== null ? currentElement.z : 0,\r
946                                                 a = _elementType === PANEL_ELEMENT_TYPE_TEXT ? Math.floor( currentElement.angle()) : 0,\r
947                                                 w = currentElement !== null ? currentElement.w : 0,\r
948                                                 h = currentElement !== null ? currentElement.h : 0,\r
949                                                 actualW = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? currentElement.actualW() : 1,\r
950                                                 actualH = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? currentElement.actualH() : 1,\r
951                                                 wPercent = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? Math.floor( w / actualW *100) : 0,\r
952                                                 hPercent = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? Math.floor( h / actualH *100) : 0,\r
953                                                 keepAspect = currentElement !== null && currentElement.keepAspect === true;\r
954                                         \r
955                                         if( currentElementType !== _elementType){\r
956                                                 if( _elementType !== -1){\r
957                                                         if( _elementType === 1){\r
958                                                                 inputA.visible( true);\r
959                                                                 inputPercentW.visible( false);\r
960                                                                 inputPercentH.visible( false);\r
961                                                                 inputAspectRatio.hide();\r
962                                                         } else {\r
963                                                                 inputA.visible( false);\r
964                                                                 inputPercentW.visible( true);\r
965                                                                 inputPercentH.visible( true);\r
966                                                                 inputAspectRatio.show();\r
967                                                         }\r
968                                                         currentElementType === -1 && jqComicElementInformation.stop().css( {\r
969                                                                 filter:         '',\r
970                                                                 opacity:        ''\r
971                                                         })[ FADE_IN_EFFECT]();\r
972                                                 } else {\r
973                                                         currentElementType !== -1 && jqComicElementInformation.stop().css({\r
974                                                                 filter:         '',\r
975                                                                 opacity:        ''\r
976                                                         })[ FADE_OUT_EFFECT]();\r
977                                                 }\r
978                                                 currentElementType = _elementType;\r
979                                         }\r
980                                         if( currentElementType !== -1){\r
981                                                 inputX.value( x);\r
982                                                 inputY.value( y);\r
983                                                 inputZ.value( z);\r
984                                                 _elementType === 1 && inputA.value( a);\r
985                                                 inputW.value( w);\r
986                                                 inputH.value( h);\r
987                                                 _elementType === 0 && inputPercentW.value( wPercent);\r
988                                                 _elementType === 0 && inputPercentH.value( hPercent);                                   \r
989                                         } else {\r
990                                                 \r
991                                         }\r
992                                 },\r
993                                 lock: function( _currentLock){\r
994                                         currentLock = !!_currentLock;\r
995                                         this.bodyBackOrForward( !currentLock);\r
996                                 }\r
997                         },\r
998                         'infomation-window', 'Infomation', 0, 30, 200, 180, true\r
999                 );\r
1000         })();\r
1001 \r
1002 /* ----------------------------------------\r
1003  * HELP_WINDOW\r
1004  *  - window\r
1005  */\r
1006         var HELP_DOCUMENTS_WINDOW = ( function(){\r
1007                 var visible = true,\r
1008                         jqAjaxContents,\r
1009                         jqNaviItems,\r
1010                         jqPages,\r
1011                         currentPageIndex = 0,\r
1012                         numPage = 0,\r
1013                         HELP = MENU_BAR_CONTROL.HELP,\r
1014                         onLoadFunction = HELP.createAjaxSelection( onAjaxStart),\r
1015                         instance;\r
1016 \r
1017                 function onAjaxStart( _pageIndex){\r
1018                         currentPageIndex = _pageIndex || currentPageIndex;\r
1019                         if( onHelpLoad !== null){\r
1020                                 $.ajax({\r
1021                                         url:            'help/jp.xml',\r
1022                                         dataType:       'xml',\r
1023                                         success:        onHelpLoad\r
1024                                 });\r
1025                                 onHelpLoad = null;\r
1026                         }\r
1027                         onAjaxStart = new Function;\r
1028                 }\r
1029                 var onHelpLoad = function( _xml){\r
1030                         var jqXML = $( _xml),\r
1031                                 helpTitle = jqXML.find( 'pages').eq( 0).attr( 'title'),\r
1032                                 elmNavi = document.createElement( 'div'),\r
1033                                 elmItemOrigin = document.createElement( 'a'),\r
1034                                 elmPages = document.createElement( 'div'),\r
1035                                 elmPageOrigin = document.createElement( 'div'),\r
1036                                 elmTitleOrigin = document.createElement( 'h2'),\r
1037                                 elmPage;\r
1038                         elmNavi.className = 'sidenavi';\r
1039                         elmItemOrigin.className = 'sidenavi-item';\r
1040                         elmItemOrigin.href = '#';\r
1041                         elmPages.className = 'page-contents';\r
1042                         elmPageOrigin.className = 'page-content main';\r
1043                         elmPageOrigin.appendChild( elmTitleOrigin);\r
1044                         \r
1045                         //helpTitle && instance.title( helpTitle);\r
1046                         \r
1047                         jqXML.find( 'page').each( function(){\r
1048                                 var xmlPage = $( this),\r
1049                                         title = xmlPage.attr( 'title'),\r
1050                                         content = xmlPage.text();\r
1051                                 \r
1052                                 elmItemOrigin.innerHTML = title;\r
1053                                 elmNavi.appendChild( elmItemOrigin.cloneNode( true));\r
1054                                 \r
1055                                 elmTitleOrigin.innerHTML = title;\r
1056                                 \r
1057                                 elmPage = elmPageOrigin.cloneNode( true);\r
1058                                 elmPage.innerHTML = content;\r
1059                                 \r
1060                                 pettanr.util.cleanElement( elmPage);\r
1061                                 \r
1062                                 if( elmPage.childNodes.length > 0){\r
1063                                         elmPage.insertBefore( elmTitleOrigin.cloneNode( true), elmPage.childNodes[0]);\r
1064                                 } else {\r
1065                                         elmPage.appendChild( elmTitleOrigin.cloneNode( true));\r
1066                                 }\r
1067                                 elmPages.appendChild( elmPage);\r
1068                                 \r
1069                                 HELP.createSelection( title, null, onSelectionClick, true);\r
1070                                 ++numPage;\r
1071                         });\r
1072                         onLoadFunction();\r
1073                         onLoadFunction = null;\r
1074                         \r
1075                         jqAjaxContents.removeClass( 'loading').append( elmNavi, elmPages);\r
1076                         \r
1077                         jqNaviItems = jqAjaxContents.find( 'a.' +elmItemOrigin.className).click( onNaviClick);\r
1078                         jqPages = jqAjaxContents.find( '.page-content');\r
1079                         jqPages.find( 'a').click( onInnerLinkClick);\r
1080                         \r
1081                         setTimeout( jumpPage, 0);\r
1082                 }\r
1083                 function onSelectionClick( _pageIndex){\r
1084                         HELP_DOCUMENTS_WINDOW.open();\r
1085                         jumpPage( _pageIndex);\r
1086                 }\r
1087                 function jumpPage( _index){\r
1088                         if( typeof _index === 'number' && 0 <= _index && _index < numPage && currentPageIndex !== _index){\r
1089                                 currentPageIndex = _index;\r
1090                         }\r
1091                         jqNaviItems.removeClass( 'current').eq( currentPageIndex).addClass( 'current');\r
1092                         jqPages.hide().eq( currentPageIndex).show();\r
1093                 }\r
1094                 function onNaviClick( e){\r
1095                         // this は <a>\r
1096                         jumpPage( pettanr.util.getChildIndex( this.parentNode, this));\r
1097                         e.stopPropagation();\r
1098                         return false;\r
1099                 }\r
1100                 function onInnerLinkClick( e){\r
1101                         var jump = ( this.href || '').split( '#jump'),\r
1102                                 n = jump[1];\r
1103                         if( !n) return;\r
1104                         jumpPage( '' + parseFloat( n) === n ? parseFloat( n) : -1);\r
1105                         e.stopPropagation();\r
1106                         return false;                           \r
1107                 }\r
1108                 return WINDOWS_CONTROL.createWindow(\r
1109                         {\r
1110                                 onInit: function(){\r
1111                                         instance = this;\r
1112                                         jqAjaxContents = this.$.find( '.window-body').addClass( 'loading');\r
1113                                         delete this.onInit;\r
1114                                 },\r
1115                                 onFirstOpen: function( _w, _h){\r
1116                                         jqAjaxContents.css( { height: _h});\r
1117                                         onAjaxStart();\r
1118                                         delete this.onFirstOpen;\r
1119                                 },\r
1120                                 onResize: function( _w, _h){\r
1121                                         jqAjaxContents && jqAjaxContents.css( { height: _h});\r
1122                                 }\r
1123                         },\r
1124                         null, 'Help', 0, 215, 400, 350, false, true, true, 300, 300\r
1125                 );\r
1126         })();\r
1127 \r
1128 /* ----------------------------------------\r
1129  * GRID_CONTROL\r
1130  *  - control\r
1131  *  - panelResizeListener\r
1132  */\r
1133         var GRID_CONTROL = ( function(){\r
1134                 var ELM_GRID = document.getElementById( 'grid'),\r
1135                         BG_URL = "url('images/grid.gif')",\r
1136                         jqGrid,\r
1137                         visible = false;\r
1138 \r
1139                 return {\r
1140                         init: function(){\r
1141                                 jqGrid = $( ELM_GRID);\r
1142                                 delete GRID_CONTROL.init;\r
1143                         },\r
1144                         open: function(){\r
1145                                 GRID_CONTROL.init && GRID_CONTROL.init();\r
1146                         },\r
1147                         close: function(){\r
1148                                 \r
1149                         },\r
1150                         onPanelResize: function( _panelX, _panelY){\r
1151                                 ELM_GRID.style.backgroundPosition = [ _panelX % 10, 'px ', _panelY % 10, 'px'].join( '');\r
1152                                 ELM_GRID.style.height = windowH +'px';\r
1153                         },\r
1154                         enabled: function(){\r
1155                                 return visible;\r
1156                         },\r
1157                         update: function(){\r
1158                                 jqGrid.css( {\r
1159                                         opacity:        '',\r
1160                                         fliter:         ''\r
1161                                 }).stop()[ visible === true ? 'fadeOut' : 'fadeIn']();\r
1162                                 \r
1163                                 visible = !visible;\r
1164                                 \r
1165                                 if( visible === true && BG_URL !== null){\r
1166                                         ELM_GRID.style.backgroundImage = BG_URL;\r
1167                                         BG_URL = null;\r
1168                                 }\r
1169                                 return visible;                         \r
1170                         }\r
1171                 }\r
1172         })();\r
1173                 \r
1174 /* ----------------------------------------\r
1175  * WHITE_GLASS_CONTROL\r
1176  *  - panelResizeListener\r
1177  */\r
1178         var WHITE_GLASS_CONTROL = ( function(){\r
1179                 var styleTop = document.getElementById( 'whiteGlass-top').style,\r
1180                         styleLeft = document.getElementById( 'whiteGlass-left').style,\r
1181                         styleRight = document.getElementById( 'whiteGlass-right').style,\r
1182                         styleBottom = document.getElementById( 'whiteGlass-bottom').style;\r
1183 \r
1184                 return {\r
1185                         onPanelResize: function( _panelX, _panelY, _panelW, _panelH){\r
1186                                 var     _w = _panelW,\r
1187                                         _h = _panelH,\r
1188                                         marginTop = _panelY,\r
1189                                         marginBottom = windowH -_h -marginTop,\r
1190                                         marginX = _panelX,\r
1191                                         rightWidth = windowW -_w -marginX;\r
1192                                 \r
1193                                 styleTop.height = ( marginTop < 0 ? 0 : marginTop) +'px';\r
1194                                 \r
1195                                 styleLeft.top = marginTop +'px';\r
1196                                 styleLeft.width = ( marginX < 0 ? 0 : marginX) +'px';\r
1197                                 styleLeft.height = ( _h + marginBottom) +'px';\r
1198                                 \r
1199                                 styleRight.top = marginTop +'px';\r
1200                                 styleRight.left = _w +marginX +'px';\r
1201                                 styleRight.width = ( rightWidth < 0 ? 0 : rightWidth) +'px';\r
1202                                 styleRight.height = ( _h + marginBottom) +'px';\r
1203                                 \r
1204                                 styleBottom.top = ( _h +marginTop) +'px';\r
1205                                 styleBottom.left = marginX +'px';\r
1206                                 styleBottom.width = _w +'px';\r
1207                                 styleBottom.height = ( marginBottom < 0 ? 0 : marginBottom) +'px';\r
1208                         }\r
1209                 }\r
1210         })();\r
1211 \r
1212 \r
1213 /* ----------------------------------------\r
1214  * PANEL_CONTROL\r
1215  *  - controler\r
1216  *  - mouseEventListener\r
1217  * \r
1218  * panel-border の表示と onPanelResize の通知.\r
1219  * panel drag.\r
1220  * \r
1221  */\r
1222         var PANEL_CONTROL = ( function(){\r
1223                 var ELM_PANEL = document.getElementById('panel-tools-container'),\r
1224                         ELM_PANEL_STYLE = ELM_PANEL.style,\r
1225                         DEFAULT_PANEL_WIDTH = 400,\r
1226                         DEFAULT_PANEL_HEIGHT = 300,\r
1227                         borderSize = 2,\r
1228                         panelW, panelH, panelX, panelY,\r
1229                         offsetX, offsetY, startX, startY,\r
1230                         isDragging = false,\r
1231                         isDraggable = false;\r
1232                 \r
1233                 pettanr.key.addKeyUpdateEvent( pettanr.view.EDITOR, 32, false, false, onSpaceUpdate);\r
1234                 \r
1235                 function onSpaceUpdate(e){\r
1236                         if( e.type === 'keyup'){\r
1237                                 currentListener === null && updateMouseCursor( '');\r
1238                                 isDraggable = false;\r
1239                         } else {\r
1240                                 currentListener === null && updateMouseCursor( 'move');\r
1241                                 isDraggable = true;\r
1242                         }\r
1243                 }\r
1244                 \r
1245                 return {\r
1246                         open: function( _panelW, _panelH, _borderSize ){\r
1247                                 panelW = Type.isFinite( _panelW ) === true ? _panelW : DEFAULT_PANEL_WIDTH;\r
1248                                 panelH = Type.isFinite( _panelH ) === true ? _panelH : DEFAULT_PANEL_HEIGHT;\r
1249                                 //panelX = Math.floor( ( windowW -panelW) /2);\r
1250                                 //panelY = Math.floor( ( windowH -panelH) /2);\r
1251                                 borderSize = Type.isFinite( _borderSize ) === true ? _borderSize : borderSize;\r
1252                                 \r
1253                                 //setTimeout( PANEL_CONTROL.resize, 0);\r
1254                         },\r
1255                         close: function(){\r
1256                                 \r
1257                         },\r
1258                         x: function(){\r
1259                                 return panelX;\r
1260                         },\r
1261                         y: function(){\r
1262                                 return panelY;\r
1263                         },\r
1264                         resize: function( isResizerTopAction, _x, _y, _w, _h){\r
1265                                 panelX = _x !== undefined ? _x : panelX;\r
1266                                 panelY = _y !== undefined ? _y : panelY;\r
1267                                 panelW = _w !== undefined ? _w : panelW;\r
1268                                 panelH = _h !== undefined ? _h : panelH;\r
1269                                 \r
1270                                 ELM_PANEL_STYLE.left    = ( panelX -borderSize) +'px';\r
1271                                 ELM_PANEL_STYLE.top             = ( panelY -borderSize) +'px';\r
1272                                 ELM_PANEL_STYLE.width   = panelW +'px';\r
1273                                 ELM_PANEL_STYLE.height  = panelH +'px';\r
1274                                 \r
1275                                 PANEL_RESIZER_TOP.onPanelResize( panelX, panelY, panelW, panelH);\r
1276                                 PANEL_RESIZER_BOTTOM.onPanelResize( panelX, panelY, panelW, panelH);\r
1277                                 GRID_CONTROL.onPanelResize( panelX, panelY);\r
1278                                 WHITE_GLASS_CONTROL.onPanelResize( panelX, panelY, panelW, panelH);\r
1279                                 COMIC_ELEMENT_CONTROL.onPanelResize( panelX, panelY, panelW, panelH, isResizerTopAction === true);\r
1280                         },\r
1281                         onWindowResize: function( _windowW, _windowH){\r
1282                                 panelX = Math.floor(( _windowW - panelW) / 2);\r
1283                                 panelY = Math.floor(( _windowH - panelH) / 2);\r
1284                                 PANEL_CONTROL.resize();\r
1285                         },\r
1286                         onMouseMove: function( _mouseX, _mouseY){\r
1287                                 if( isDraggable === true && isDragging === true){\r
1288                                         PANEL_CONTROL.resize( false, startX +_mouseX -offsetX, startY +_mouseY -offsetY);\r
1289                                 }\r
1290                         },\r
1291                         onMouseUp: function( _mouseX, _mouseY){\r
1292                                 if( isDraggable === true){\r
1293                                         isDragging = false;\r
1294                                         updateMouseCursor( '');\r
1295                                 }\r
1296                         },\r
1297                         onMouseDown: function( _mouseX, _mouseY){\r
1298                                 if( isDraggable === true){\r
1299                                         offsetX = _mouseX;\r
1300                                         offsetY = _mouseY;\r
1301                                         startX = panelX;\r
1302                                         startY = panelY;\r
1303                                         isDragging = true;\r
1304                                         updateMouseCursor( 'move');\r
1305                                         return true;\r
1306                                 }\r
1307                         },\r
1308                         busy: function(){\r
1309                                 return isDragging === true;\r
1310                         }                               \r
1311                 }\r
1312         })();\r
1313 \r
1314 /* --------------------------------------------------------------------------------------------\r
1315  * PanelResizerClass\r
1316  *  - mouseEventListener\r
1317  */\r
1318         var PanelResizerClass = function( ID, isTop){\r
1319                 var ELM = document.getElementById( ID),\r
1320                         BORDER_WIDTH = 2,\r
1321                         RESIZER_HEIGHT = 30,\r
1322                         x = -BORDER_WIDTH /2,\r
1323                         y = isTop === true ? ( -5 -RESIZER_HEIGHT -BORDER_WIDTH) : 0,\r
1324                         w,\r
1325                         h = RESIZER_HEIGHT,\r
1326                         panelX, panelY, panelW, panelH,\r
1327                         offsetY, startY, startH,\r
1328                         isDragging = false,\r
1329                         MOUSE_CURSOR = updateMouseCursor;\r
1330                         \r
1331                 function restoreState( arg){\r
1332                         if( arg && arg.length > 3){\r
1333                                 PANEL_CONTROL.resize( isTop, arg[ 0] || panelX, arg[ 1] || panelY, arg[ 2] || panelW, arg[ 3] || panelH);\r
1334                         }\r
1335                 }\r
1336                         \r
1337                 this.onMouseDown = function( _mouseX, _mouseY){\r
1338                         var _x = _mouseX -panelX,\r
1339                                 _y = _mouseY -panelY;\r
1340                         if( _x < x || x + w < _x || _y < y || y + h < _y) return false;\r
1341                         offsetY = _y;\r
1342                         startY = panelY;\r
1343                         startH = panelH;\r
1344                         isDragging = true;\r
1345                         MOUSE_CURSOR( 'n-resize');\r
1346                         return true;\r
1347                 }\r
1348                 this.onMouseMove = function( _mouseX, _mouseY){\r
1349                         var _x = _mouseX -panelX,\r
1350                                 _y = _mouseY -panelY;\r
1351                         if( isDragging !== true){\r
1352                                 if( _x < x || x + w < _x || _y < y || y + h < _y) return false;\r
1353                                 COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
1354                                 MOUSE_CURSOR( 'pointer');\r
1355                                 return true;\r
1356                         } else {\r
1357                                 var move = _y -offsetY;\r
1358                                 if( isTop === true){\r
1359                                         if( panelH - move < MIN_PANEL_HEIGHT){\r
1360                                                 move = panelH -MIN_PANEL_HEIGHT;\r
1361                                         }\r
1362                                         PANEL_CONTROL.resize( true, panelX, panelY + move, panelW, panelH - move);\r
1363                                 } else {\r
1364                                         var _h = startH +move;\r
1365                                         if( 0 < _h && _h < windowH -panelY -RESIZER_HEIGHT -5 -BORDER_WIDTH){\r
1366                                                 PANEL_CONTROL.resize( false, panelX, panelY, panelW, _h < MIN_PANEL_HEIGHT ? MIN_PANEL_HEIGHT : _h);\r
1367                                         }\r
1368                                 }\r
1369                         }\r
1370                         return true;\r
1371                 }\r
1372                 this.onMouseUp = function( _mouseX, _mouseY){\r
1373                         if( isDragging !== true) return;\r
1374                         ( startY !== panelY || startH !== panelH) && HISTORY_CONTROL.saveState( restoreState, [ NaN, startY, NaN, startH], [ NaN, panelY, NaN, panelH]);\r
1375                         isDragging = false;\r
1376                         MOUSE_CURSOR( '');\r
1377                 }\r
1378                 this.busy = function(){\r
1379                         return isDragging\r
1380                 }\r
1381                 this.onPanelResize = function( _x, _y, _w, _h){\r
1382                         panelX = _x;\r
1383                         panelY = _y;\r
1384                         if( panelW !== _w){\r
1385                                 ELM.style.width = ( _w +2) +'px';\r
1386                                 panelW = _w;\r
1387                         }\r
1388                         panelH = _h;\r
1389                         y = isTop === true ? y : ( panelH +5 +BORDER_WIDTH);\r
1390                         w = panelW +2;\r
1391                 }\r
1392         };\r
1393         var     PANEL_RESIZER_TOP = new PanelResizerClass( 'panel-resizer-top', true ),\r
1394                 PANEL_RESIZER_BOTTOM = new PanelResizerClass( 'panel-resizer-bottom', false );\r
1395                 \r
1396         PanelResizerClass = undefined;\r
1397 \r
1398 /* --------------------------------------------------------------------------------------------\r
1399  * CONSOLE_CONTROLER\r
1400  */\r
1401         var CONSOLE_CONTROLER = ( function(){\r
1402                 var LAYER_BACK_BUTTON = MENU_BAR_CONTROL.EDIT.createSelection( 'layer back', 'ctrl + B', layerBack, false, true, false),\r
1403                         LAYER_FORWARD_BUTTON = MENU_BAR_CONTROL.EDIT.createSelection( 'layer forward', 'ctrl + F', layerForward, false, false, false),\r
1404                         DELETE_BUTTON = MENU_BAR_CONTROL.EDIT.createSelection( 'delete', 'ctrl + D', del, false, true, true),\r
1405                         EDIT_BUTTON = MENU_BAR_CONTROL.EDIT.createSelection( 'Edit Text', 'ctrl + E', edit, false, true, false),\r
1406                         CHANGE_BUTTON = MENU_BAR_CONTROL.EDIT.createSelection( 'change', 'ctrl + U', change, false, false, true),\r
1407                         SAVE = HISTORY_CONTROL.saveState,\r
1408                         jqStage,\r
1409                         jqConsoleParent,\r
1410                         jqConsoleWrapper,\r
1411                         jqConsoleTail,\r
1412                         jqImgConsole, jqTextConsole,\r
1413                         currentElement = null,\r
1414                         currentType = -1,\r
1415                         visible = false,\r
1416                         imgConsoleWidth, imgConsoleHeight,\r
1417                         textConsoleWidth, textConsoleHeight,\r
1418                         consoleWidth, consoleHeight,\r
1419                         consoleX, consoleY,\r
1420                         tailSize = 10,\r
1421                         buttonClickable = false;\r
1422                 \r
1423                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 66, false, true, layerBack);\r
1424                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 70, false, true, layerForward);\r
1425                 \r
1426                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 68, false, true, del);\r
1427                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 69, false, true, edit);\r
1428                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 85, false, true, change);\r
1429                 \r
1430                 function buttonBackOrForward( isBack){\r
1431                         var     offest = jqConsoleWrapper.offset();\r
1432                         jqConsoleWrapper.css( {\r
1433                                 position:       isBack === true ? '' : 'absolute',\r
1434                                 left:           isBack === true ? consoleX  : offest.left,\r
1435                                 top:            isBack === true ? consoleY  : offest.top\r
1436                         });\r
1437                         buttonClickable === isBack && ( isBack === true ? jqConsoleParent : jqStage).append( jqConsoleWrapper);\r
1438                         buttonClickable = !isBack;\r
1439                 }\r
1440                 function layerBack(){\r
1441                         if( currentElement === null) return;\r
1442                         if( COMIC_ELEMENT_CONTROL.replace( currentElement, false) === false) return;\r
1443                         INFOMATION_WINDOW.update( currentElement);\r
1444                         SAVE( COMIC_ELEMENT_CONTROL.restoreReplace, [ currentElement, true], [ currentElement, false]);\r
1445                         var _z = currentElement.z;\r
1446                         LAYER_BACK_BUTTON.visible( _z > 0);\r
1447                         LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
1448                 }\r
1449                 function layerForward(){\r
1450                         if( currentElement === null) return;\r
1451                         if( COMIC_ELEMENT_CONTROL.replace( currentElement, true) === false) return;\r
1452                         INFOMATION_WINDOW.update( currentElement);\r
1453                         SAVE( COMIC_ELEMENT_CONTROL.restoreReplace, [ currentElement, false], [ currentElement, true]);\r
1454                         var _z = currentElement.z;\r
1455                         LAYER_BACK_BUTTON.visible( _z > 0);\r
1456                         LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
1457                 }\r
1458                 function del(){\r
1459                         if( currentElement === null) return;\r
1460                         buttonBackOrForward( true);\r
1461                         COMIC_ELEMENT_CONTROL.remove( currentElement);\r
1462                         SAVE( COMIC_ELEMENT_CONTROL.restore, [ true, currentElement], [ false, currentElement], true);\r
1463                         COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
1464                 }\r
1465                 function edit(){\r
1466                         if( currentElement === null || currentElement.type !== PANEL_ELEMENT_TYPE_TEXT) return;\r
1467                         pettanr.textEditor.bootInOverlay( PANEL_CONTROL.x(), PANEL_CONTROL.y(), currentElement );\r
1468                         buttonBackOrForward( true);\r
1469                 }\r
1470                 function change(){\r
1471                         if( currentElement === null) return;\r
1472                         buttonBackOrForward( true);\r
1473                         pettanr.premiumSatge.bootInOverlay( currentElement.getArtistID(), currentElement.resourcePicture );\r
1474                 }\r
1475                 function onImageSelect( resourcePicture ){\r
1476                         currentElement.resourcePicture( resourcePicture );\r
1477                 }\r
1478                 return {\r
1479                         init: function(){\r
1480                                 jqStage = jqEditor;\r
1481                                 jqConsoleTail = $( '#comic-element-consol-tail');\r
1482                                 jqImgConsole = $( '#image-element-consol').hide();\r
1483                                 var imgConsoleSize = pettanr.util.getElementSize( jqImgConsole.get( 0));\r
1484                                 imgConsoleWidth = imgConsoleSize.width;\r
1485                                 imgConsoleHeight = imgConsoleSize.height;\r
1486                                 \r
1487                                 jqTextConsole = $( '#text-element-consol').hide();\r
1488                                 var textConsoleSize = pettanr.util.getElementSize( jqTextConsole.get( 0));\r
1489                                 textConsoleWidth = textConsoleSize.width;\r
1490                                 textConsoleHeight = textConsoleSize.height;\r
1491                                 \r
1492                                 jqConsoleWrapper = $( '#comic-element-consol-wrapper').hide();\r
1493                                 jqConsoleParent = jqConsoleWrapper.parent();\r
1494                                 \r
1495                                 $( '#edit-text-button').click( edit);\r
1496                                 $( '#delete-image-button, #delete-text-button').click( del);\r
1497                                 $( '#change-image-button').click( change);\r
1498                                 $( '#layer-forward-button, #forward-text-button').click( layerForward);\r
1499                                 $( '#layer-back-button, #back-text-button').click( layerBack);\r
1500                                                                                         \r
1501                                 delete CONSOLE_CONTROLER.init;\r
1502                         },\r
1503                         show: function( _currentElement, _w, _h ){\r
1504                                 CONSOLE_CONTROLER.init && CONSOLE_CONTROLER.init();\r
1505                                 \r
1506                                 visible === false && jqConsoleWrapper.show();\r
1507                                 visible = true;\r
1508                                 currentElement = _currentElement;\r
1509                                 var _currentType = _currentElement.type,\r
1510                                         _z = _currentElement.z;\r
1511                                 if( currentType !== _currentType){\r
1512                                         currentType = _currentType;\r
1513                                         jqImgConsole.toggle( _currentType === PANEL_ELEMENT_TYPE_IMAGE);\r
1514                                         jqTextConsole.toggle( _currentType === PANEL_ELEMENT_TYPE_TEXT);\r
1515                                         consoleWidth = _currentType === PANEL_ELEMENT_TYPE_IMAGE ? imgConsoleWidth : textConsoleWidth;\r
1516                                         consoleHeight = _currentType === PANEL_ELEMENT_TYPE_IMAGE ? imgConsoleHeight : textConsoleHeight;\r
1517                                 }\r
1518                                 consoleX = Math.floor( ( _w -consoleWidth) /2);\r
1519                                 \r
1520                                 LAYER_BACK_BUTTON.visible( _z > 0);\r
1521                                 LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
1522                                 DELETE_BUTTON.visible( true);\r
1523                                 EDIT_BUTTON.visible( _currentType === PANEL_ELEMENT_TYPE_TEXT);\r
1524                                 CHANGE_BUTTON.visible( false);\r
1525                                 \r
1526                                 if( _w > consoleWidth * 1.5 && _h > consoleHeight * 1.5){\r
1527                                         consoleY = Math.floor( ( _h -consoleHeight) /2);\r
1528                                         jqConsoleWrapper.css( {\r
1529                                                 left:                   consoleX,\r
1530                                                 top:                    consoleY\r
1531                                         }).removeClass( 'console-out');\r
1532                                 } else {\r
1533                                         consoleY = _h +tailSize;\r
1534                                         jqConsoleWrapper.css( {\r
1535                                                 left:                   consoleX,\r
1536                                                 top:                    consoleY\r
1537                                         }).addClass( 'console-out');\r
1538                                 }\r
1539                         },\r
1540                         hide: function (){\r
1541                                 visible === true && jqConsoleWrapper.hide();\r
1542                                 visible = false;\r
1543                                 currentElement = null;\r
1544                                 LAYER_BACK_BUTTON.visible( false);\r
1545                                 LAYER_FORWARD_BUTTON.visible( false);\r
1546                                 DELETE_BUTTON.visible( false);\r
1547                                 EDIT_BUTTON.visible( false);\r
1548                                 CHANGE_BUTTON.visible( false);\r
1549                         },\r
1550                         x: function(){ return consoleX;},\r
1551                         y: function(){ return consoleY;},\r
1552                         w: function(){ return consoleWidth;},\r
1553                         h: function(){ return consoleHeight;},\r
1554                         onMouseMove: function( _mouseX, _mouseY){\r
1555                                 if( consoleX > _mouseX || consoleY > _mouseY || consoleX +consoleWidth < _mouseX || consoleY +consoleHeight < _mouseY){\r
1556                                         buttonClickable === true && buttonBackOrForward( true);\r
1557                                         return false;\r
1558                                 }\r
1559                                 buttonClickable === false && buttonBackOrForward( false);\r
1560                                 return true;\r
1561                         },\r
1562                         onMouseOut: function( _mouseX, _mouseY){\r
1563                                 buttonClickable === true && buttonBackOrForward( true);\r
1564                         }\r
1565                 }\r
1566         })();\r
1567 \r
1568 /* --------------------------------------------------------------------------------------------\r
1569  * TAIL_OPERATOR\r
1570  *  - comicElementOperator\r
1571  */\r
1572         var TAIL_OPERATOR = ( function(){\r
1573                 var     MOUSE_CURSOR = updateMouseCursor,\r
1574                         ELM_MOVER = document.getElementById( 'balloon-tail-mover'),\r
1575                         SIZE = pettanr.util.getElementSize( ELM_MOVER).width,\r
1576                         SIN = Math.sin,\r
1577                         COS = Math.cos,\r
1578                         ATAN = Math.atan,\r
1579                         FLOOR = Math.floor,\r
1580                         DEG_TO_RAD = Math.PI / 180,\r
1581                         RAD_TO_DEG = 1 /DEG_TO_RAD,\r
1582                         currentText = null,\r
1583                         tailX, tailY,\r
1584                         x, y, w, h,\r
1585                         balloonW, balloonH, balloonA, radA,\r
1586                         visible = false,\r
1587                         startA;\r
1588                 \r
1589                 return {\r
1590                         update: function ( _w, _h, _a){\r
1591                                 balloonW = _w !== undefined ? _w : balloonW;\r
1592                                 balloonH = _h !== undefined ? _h : balloonH;\r
1593                                 balloonA = _a !== undefined ? _a : balloonA;\r
1594                                 radA = balloonA *DEG_TO_RAD;\r
1595                                 tailX = FLOOR( ( ( COS( radA) /2 +0.5) *( balloonW +SIZE)) -SIZE /2);\r
1596                                 tailY = FLOOR( ( ( SIN( radA) /2 +0.5) *( balloonH +SIZE)) -SIZE /2);\r
1597                                 ELM_MOVER.style.left = tailX +'px';\r
1598                                 ELM_MOVER.style.top = tailY +'px';\r
1599                                 //log.html( [ balloonW, balloonH, balloonA].join());\r
1600                         },\r
1601                         show: function( _currentText){\r
1602                                 /*\r
1603                                  * visibilityのほうがいい, display:none だと ie で描画が狂う\r
1604                                  */\r
1605                                 ELM_MOVER.style.visibility = '';\r
1606                                 this.update( _currentText.w, _currentText.h, _currentText.angle());\r
1607                                 currentText = _currentText;\r
1608                         },\r
1609                         hitTest: function( _mouseX, _mouseY){\r
1610                                 var _x = tailX -SIZE /2,\r
1611                                         _y = tailY -SIZE /2;\r
1612                                         ret = _x <= _mouseX && _y <= _mouseY && _x +SIZE >= _mouseX && _y +SIZE >= _mouseY;\r
1613                                 ret === true && MOUSE_CURSOR( 'move');\r
1614                                 return ret;\r
1615                         },\r
1616                         hide: function(){\r
1617                                 ELM_MOVER.style.visibility = 'hidden';\r
1618                                 currentText = null;\r
1619                         },\r
1620                         onStart: function( _currentText, _mouseX, _mouseY){\r
1621                                 if( _currentText.type !== PANEL_ELEMENT_TYPE_TEXT) return false;\r
1622                                 x = _currentText.x;\r
1623                                 y = _currentText.y;\r
1624                                 if( this.hitTest( _mouseX -x, _mouseY -y) === true){\r
1625                                         w = _currentText.w;\r
1626                                         h = _currentText.h;\r
1627                                         currentText = _currentText;\r
1628                                         startA = _currentText.angle();\r
1629                                         return true;\r
1630                                 }\r
1631                                 return false;\r
1632                         },\r
1633                         onDrag: function( _mouseX, _mouseY){\r
1634                                 _mouseX = _mouseX -x -w /2;\r
1635                                 _mouseY = _mouseY -y -h /2; //Balloonの中心を0,0とする座標系に変換\r
1636                                 \r
1637                                 this.update( w, h,\r
1638                                         _mouseX !== 0 ?\r
1639                                                 ATAN( _mouseY /_mouseX) *RAD_TO_DEG +( _mouseX < 0 ? 180 : 0) :\r
1640                                                 _mouseY > 0 ? 90 : -90\r
1641                                 );\r
1642                                 currentText && currentText.angle( balloonA);\r
1643                                 INFOMATION_WINDOW.update( currentText);\r
1644                         },\r
1645                         onFinish: function(){\r
1646                                 startA !== currentText.angle() && COMIC_ELEMENT_OPERATION_MANAGER.saveStatus( x, y, w, h, startA);\r
1647                                 startA !== currentText.angle() && COMIC_ELEMENT_OPERATION_MANAGER.resize( x, y, w, h, currentText.angle());\r
1648                                 currentText = null;\r
1649                         },\r
1650                         onCancel: function(){\r
1651                                 currentText.angle( startA);\r
1652                                 COMIC_ELEMENT_OPERATION_MANAGER.resize( x, y, w, h, startA);\r
1653                                 currentText = null;\r
1654                         }\r
1655                 }\r
1656         })();\r
1657 \r
1658 /* --------------------------------------------------------------------------------------------\r
1659  * RESIZE_OPERATOR\r
1660  *  - comicElementOperator\r
1661  */\r
1662         var RESIZE_OPERATOR = ( function(){\r
1663                 var     MOUSE_CURSOR = updateMouseCursor,\r
1664                         GRID_ENABLED = GRID_CONTROL.enabled;\r
1665                 \r
1666                 var     HIT_AREA = MOUSE_HIT_AREA,\r
1667                         POSITION_ARRAY = [],\r
1668                         FLOOR = Math.floor,\r
1669                         CURSOR_AND_FLIP = [\r
1670                                 { cursor:       'n-resize',             v: 3},\r
1671                                 { cursor:       'e-resize',             h: 2},\r
1672                                 { cursor:       'e-resize',             h: 1},\r
1673                                 { cursor:       'n-resize',             v: 0},\r
1674                                 { cursor:       'nw-resize',    h: 5, v: 6, vh: 7},\r
1675                                 { cursor:       'ne-resize',    h: 4, v: 7, vh: 6},\r
1676                                 { cursor:       'ne-resize',    h: 7, v: 4, vh: 5},\r
1677                                 { cursor:       'nw-resize',    h: 6, v: 5, vh: 4}\r
1678                         ],\r
1679                         elmResizerContainer = document.getElementById( 'comic-element-resizer-container'),\r
1680                         elmResizerContainerStyle = elmResizerContainer.style,\r
1681                         elmResizerTopStyle = document.getElementById( 'comic-element-resizer-top').style,\r
1682                         elmResizerLeftStyle = document.getElementById( 'comic-element-resizer-left').style,\r
1683                         elmResizerRightStyle = document.getElementById( 'comic-element-resizer-right').style,\r
1684                         elmResizerBottomStyle = document.getElementById( 'comic-element-resizer-bottom').style,\r
1685                         x, y, w, h,\r
1686                         currentIndex = -1,\r
1687                         currentElement,\r
1688                         currentIsTextElement = false;\r
1689                 \r
1690                 elmResizerContainerStyle.display = 'none';\r
1691                 \r
1692                 var RESIZE_WORK_ARRAY = [\r
1693                                 { x:    0, w:    0, y:  1, h:   -1}, //top\r
1694                                 { x:    1, w:   -1, y:  0, h:    0}, //left\r
1695                                 { x:    0, w:    1, y:  0, h:    0}, //right\r
1696                                 { x:    0, w:    0, y:  0, h:    1}, //bottom\r
1697                                 { x:    1, w:   -1, y:  1, h:   -1}, //top-left\r
1698                                 { x:    0, w:    1, y:  1, h:   -1}, //top-right\r
1699                                 { x:    1, w:   -1, y:  0, h:    1}, //bottom-left\r
1700                                 { x:    0, w:    1, y:  0, h:    1}  //bottom-right\r
1701                         ],\r
1702                         startX, startY, startW, startH, startFilpV, startFilpH, startAspect,\r
1703                         baseX, baseY, baseW, baseH,\r
1704                         currentX, currentY, currentW, currentH,\r
1705                         offsetX, offsetY,\r
1706                         lock = false,\r
1707                         error = 0;\r
1708                 \r
1709                 function draw( _x, _y, _w, _h){\r
1710                         x = _x !== undefined ? _x : x;\r
1711                         y = _y !== undefined ? _y : y;\r
1712                         w = _w !== undefined ? _w : w;\r
1713                         h = _h !== undefined ? _h : h;\r
1714                         try {\r
1715                                 elmResizerContainerStyle.left = x +'px';\r
1716                                 elmResizerContainerStyle.top = y +'px';\r
1717                                 elmResizerContainerStyle.width = w +'px';\r
1718                                 elmResizerContainerStyle.height = h +'px';\r
1719                                 elmResizerTopStyle.left = FLOOR( w /2 -10 /2) +'px';\r
1720                                 elmResizerLeftStyle.top = FLOOR( h /2 -10 /2) +'px';\r
1721                                 elmResizerRightStyle.top = FLOOR( h /2 -10 /2) +'px';\r
1722                                 elmResizerBottomStyle.left = FLOOR( w /2 -10 /2) +'px';                         \r
1723                         } catch(e){\r
1724                                 alert( [x, y, w, h].join( ','));\r
1725                                 return;\r
1726                         }\r
1727 \r
1728                         \r
1729                         POSITION_ARRAY.splice( 0, POSITION_ARRAY.length);\r
1730                         POSITION_ARRAY.push(\r
1731                                 {x:     x +5,                                   y:      y -HIT_AREA,            w:      w -5 *2,                h:      HIT_AREA +5},\r
1732                                 {x: x -HIT_AREA,                        y:      y +HIT_AREA +5,         w:      HIT_AREA +5,    h:      h -5 *2},\r
1733                                 {x: x +w -5,                            y:      y +HIT_AREA +5,         w:      HIT_AREA +5,    h:      h -5 *2},\r
1734                                 {x:     x +5,                                   y:      y +h -5,                        w:      w -5 *2,                h:      HIT_AREA +5},\r
1735                                 {x:     x -HIT_AREA,                    y:      y -HIT_AREA,            w:      HIT_AREA +5,    h:      HIT_AREA +5},\r
1736                                 {x: x +w -HIT_AREA,                     y:      y -HIT_AREA,            w:      HIT_AREA +5,    h:      HIT_AREA +5},\r
1737                                 {x:     x -HIT_AREA,                    y:      y +h -5,                        w:      HIT_AREA +5,    h:      HIT_AREA +5},\r
1738                                 {x:     x +w -5,                                y:      y +h -5,                        w:      HIT_AREA +5,    h:      HIT_AREA +5}\r
1739                         );\r
1740                 }\r
1741                 \r
1742                 function update( _x, _y, _w, _h){\r
1743                         x = _x !== undefined ? _x : currentX;\r
1744                         y = _y !== undefined ? _y : currentY;\r
1745                         w = _w !== undefined ? _w : currentW;\r
1746                         h = _h !== undefined ? _h : currentH;\r
1747                         \r
1748                         if( currentIsTextElement === false && currentIndex > 3 && pettanr.key.shiftEnabled() === true){\r
1749                                 if( startAspect >= 1){\r
1750                                         _w = w;\r
1751                                         w = Math.floor( startAspect * h);\r
1752                                         x = x +( currentIndex % 2 === 0 ? _w -w : 0);\r
1753                                 } else {\r
1754                                         _h = h;\r
1755                                         h = Math.floor( w / startAspect);\r
1756                                         y = y + ( currentIndex <= 5 ? _h -h : 0);\r
1757                                 }\r
1758                         }\r
1759                         draw( x, y, w, h);\r
1760                         currentElement.resize( x, y, w, h);\r
1761                         currentIsTextElement === true && TAIL_OPERATOR.update( w, h);\r
1762                         CONSOLE_CONTROLER.show( currentElement, w, h);\r
1763                         INFOMATION_WINDOW.update( currentElement);\r
1764                 }\r
1765                 \r
1766                 function flip( _flipH, _flipV){\r
1767                         var p = CURSOR_AND_FLIP[ currentIndex];\r
1768                         currentIndex = _flipH === true || _flipV === true ? p[\r
1769                                         _flipH === true && _flipV === true ? 'vh' : ( _flipH === true ? 'h' : 'v')\r
1770                                 ] : currentIndex;\r
1771                         MOUSE_CURSOR( CURSOR_AND_FLIP[ currentIndex].cursor);\r
1772                         elmResizerContainer.className = 'current-resizer-is-' +currentIndex;\r
1773                         currentElement.flip( _flipH, _flipV);\r
1774                 }\r
1775                 return {\r
1776                         update: draw,\r
1777                         index: function( _mouseX, _mouseY){\r
1778                                 var     p, i;\r
1779                                 for( i=4; i<8; i++){\r
1780                                         p = POSITION_ARRAY[ i];\r
1781                                         if( p.x <= _mouseX && p.y <= _mouseY && p.x + p.w >= _mouseX && p.y +p.h >= _mouseY){\r
1782                                                 MOUSE_CURSOR( CURSOR_AND_FLIP[ i].cursor);\r
1783                                                 elmResizerContainer.className = 'current-resizer-is-' +i;\r
1784                                                 return currentIndex = i;\r
1785                                         }\r
1786                                 }\r
1787                                 for( i=0; i<4; i++){\r
1788                                         p = POSITION_ARRAY[ i];\r
1789                                         if( p.x <= _mouseX && p.y <= _mouseY && p.x + p.w >= _mouseX && p.y +p.h >= _mouseY){\r
1790                                                 MOUSE_CURSOR( CURSOR_AND_FLIP[ i].cursor);\r
1791                                                 elmResizerContainer.className = 'current-resizer-is-' +i;\r
1792                                                 return currentIndex = i;\r
1793                                         }\r
1794                                 }\r
1795                                 MOUSE_CURSOR( '');\r
1796                                 elmResizerContainer.className = '';\r
1797                                 return -1;\r
1798                         },\r
1799                         show: function( _currentElement){\r
1800                                 currentElement = _currentElement;\r
1801                                 currentIsTextElement = _currentElement.type === PANEL_ELEMENT_TYPE_TEXT;\r
1802                                 elmResizerContainerStyle.display = '';\r
1803                         },\r
1804                         hide: function(){\r
1805                                 currentElement = null;\r
1806                                 elmResizerContainerStyle.display = 'none';\r
1807                         },\r
1808                         onStart: function( _currentElement, _mouseX, _mouseY){\r
1809                                 currentElement = _currentElement;\r
1810                                 currentIsTextElement = _currentElement.type === PANEL_ELEMENT_TYPE_TEXT;\r
1811                                 if( _currentElement.keepSize === true) return false;\r
1812                                 currentIndex = this.index( _mouseX, _mouseY);\r
1813                                 if( currentIndex === -1) return false;\r
1814                                 offsetX = _mouseX;\r
1815                                 offsetY = _mouseY;\r
1816                                 startX = baseX = _currentElement.x;\r
1817                                 startY = baseY = _currentElement.y;\r
1818                                 startW = baseW = _currentElement.w;\r
1819                                 startH = baseH = _currentElement.h;\r
1820                                 if( _currentElement.type === PANEL_ELEMENT_TYPE_IMAGE){\r
1821                                         startFilpV = _currentElement.flipV();\r
1822                                         startFilpH = _currentElement.flipH();                                                   \r
1823                                 }\r
1824                                 startAspect = startW /startH;\r
1825                                 return true;\r
1826                         },\r
1827                         onDrag: function( _mouseX, _mouseY){\r
1828                                 var com = RESIZE_WORK_ARRAY[ currentIndex],\r
1829                                         moveX = _mouseX -offsetX,\r
1830                                         moveY = _mouseY -offsetY,\r
1831                                         _updated = moveX !== 0 || moveY !== 0,\r
1832                                         _x, _y, _w, _h,\r
1833                                         _thisError = 0;\r
1834                                         \r
1835                                 var _memoryX = 0,\r
1836                                         _memoryY = 0,\r
1837                                         _momoryW = 0,\r
1838                                         _momoryH = 0;\r
1839                                 /*\r
1840                                  * Opera 11+ often forget values, why ??\r
1841                                  */\r
1842                                 while( _x === undefined || _y === undefined || _w === undefined || _h === undefined){\r
1843                                         _x = _x !== undefined ? _x : baseX +moveX *com.x;\r
1844                                         _y = _y !== undefined ? _y : baseY +moveY *com.y;\r
1845                                         _w = _w !== undefined ? _w : baseW +moveX *com.w;\r
1846                                         _h = _h !== undefined ? _h : baseH +moveY *com.h;\r
1847                                         error += _thisError === 0 ? 0 : 1;\r
1848                                         ++_thisError;\r
1849                                         if( _thisError > 9999){\r
1850                                                 ++error\r
1851                                                 //alert( 'opera error' +error);\r
1852                                                 this.onCancel;\r
1853                                                 return;\r
1854                                         }\r
1855                                 }\r
1856                                 \r
1857                                 if( _w >= MIN_ELEMENT_SIZE && _h >= MIN_ELEMENT_SIZE){\r
1858                                         \r
1859                                 } else \r
1860                                 if( _w >= -MIN_ELEMENT_SIZE && _h >= -MIN_ELEMENT_SIZE){\r
1861                                         //return;\r
1862                                         if( _w < MIN_ELEMENT_SIZE){\r
1863                                                 //_x += Math.abs( MIN_ELEMENT_SIZE -_w);\r
1864                                                 _x = currentX;\r
1865                                                 _w = MIN_ELEMENT_SIZE;\r
1866                                         }\r
1867                                         if( _h < MIN_ELEMENT_SIZE){\r
1868                                                 //_y += Math.abs( MIN_ELEMENT_SIZE -_h);\r
1869                                                 _y = currentY;\r
1870                                                 _h = MIN_ELEMENT_SIZE;\r
1871                                         }\r
1872                                 } else \r
1873                                 if( currentElement.type === PANEL_ELEMENT_TYPE_TEXT){\r
1874                                         return;\r
1875                                 } else \r
1876                                 if( _w < -MIN_ELEMENT_SIZE || _h < -MIN_ELEMENT_SIZE){\r
1877 \r
1878                                         if( _w < -MIN_ELEMENT_SIZE && _h > MIN_ELEMENT_SIZE){\r
1879                                         // flipH\r
1880                                                 _memoryX = _x;\r
1881                                                 baseX = _x = _x +_w;\r
1882                                                 baseY = _y;\r
1883                                                 baseW = _w = _memoryX -_x;\r
1884                                                 baseH = _h;\r
1885                                                 flip( true, false);\r
1886                                                 flipV = currentElement.flipV();\r
1887                                         } else \r
1888                                         if( _w > MIN_ELEMENT_SIZE && _h < -MIN_ELEMENT_SIZE){\r
1889                                         // flipV\r
1890                                                 _memoryY = _y;\r
1891                                                 baseX = _x;\r
1892                                                 baseY = _y = _y +_h;\r
1893                                                 baseW = _w;\r
1894                                                 baseH = _h = _memoryY -_y;\r
1895                                                 flip( false, true);\r
1896                                                 flipH = currentElement.flipH();\r
1897                                         } else {\r
1898                                         // flipVH\r
1899                                                 _memoryX = _x;\r
1900                                                 _memoryY = _y;\r
1901                                                 baseX = _x = _x +_w;\r
1902                                                 baseY = _y = _y +_h;\r
1903                                                 baseW = _w = _memoryX -_x;\r
1904                                                 baseH = _h = _memoryY -_y;\r
1905                                                 flip( true, true);\r
1906                                                 flipV = currentElement.flipV();\r
1907                                                 flipH = currentElement.flipH();\r
1908                                         }\r
1909                                         _updated = true;\r
1910                                         offsetX = _mouseX;\r
1911                                         offsetY = _mouseY;      \r
1912                                 }\r
1913                                 currentX = _x;\r
1914                                 currentY = _y;\r
1915                                 currentW = _w;\r
1916                                 currentH = _h;\r
1917                                 _updated === true && update( _x, _y, _w, _h);\r
1918                                 \r
1919                                 log.html( [\r
1920                                                 'currentIndex:', currentIndex, \r
1921                                                 'baseW', baseW, 'baseH', baseH,'<br>',\r
1922                                                 'mouse', _mouseX, _mouseY,'<br>',\r
1923                                                 'move', moveX, moveY,'<br>',\r
1924                                                 'xy', _x, _y, 'wh',_w, _h,'<br>',\r
1925                                                 'com.w', com.w, 'com.h', com.h,'<br>',\r
1926                                                 'current',currentW, currentH,'<br>',\r
1927                                                 'result', y, h,\r
1928                                                 'err', error\r
1929                                 ].join( ' , '));\r
1930                         },\r
1931                         onFinish: function(){\r
1932                                 MOUSE_CURSOR( '');\r
1933                                 if( w === startW && h === startH && x === startX && y === startY) return;\r
1934                                 COMIC_ELEMENT_OPERATION_MANAGER.resize( x, y, w, h);\r
1935                                 currentElement.resize( x, y, w, h);\r
1936                                 COMIC_ELEMENT_OPERATION_MANAGER.saveStatus( startX, startY, startW, startH, undefined, startFilpV, startFilpH);\r
1937                         },\r
1938                         onCancel: function(){\r
1939                                 MOUSE_CURSOR( '');\r
1940                                 COMIC_ELEMENT_OPERATION_MANAGER.resize( startX, startY, startW, startH);\r
1941                                 currentElement.type === PANEL_ELEMENT_TYPE_IMAGE ?\r
1942                                         currentElement.animate( startX, startY, startW, startH, startFilpV, startFilpH) :\r
1943                                         currentElement.animate( startX, startY, startW, startH, angle);\r
1944                         },\r
1945                         lock: function( _lock){\r
1946                                 if( _lock !== undefined){\r
1947                                         elmResizerContainerStyle.borderColor = _lock === true ? 'blue' : '';\r
1948                                         lock = _lock;\r
1949                                 }\r
1950                                 return lock;\r
1951                         },\r
1952                         onShiftUpdate: update,\r
1953                         onCtrlUpdate: update\r
1954                 }\r
1955         })();\r
1956 \r
1957 /* --------------------------------------------------------------------------------------------\r
1958  * POSITION_OPERATOR\r
1959  *  - comicElementOperator\r
1960  */\r
1961         var POSITION_OPERATOR = ( function(){\r
1962                 var     MOUSE_CURSOR = updateMouseCursor,\r
1963                         GRID_ENABLED = GRID_CONTROL.enabled;\r
1964                 \r
1965                 var currentElement,\r
1966                         startX, startY,\r
1967                         x, y,\r
1968                         offsetX, offsetY,\r
1969                         isCopy = false;\r
1970                 \r
1971                 function update( _x, _y){\r
1972                         x = _x !== undefined ? _x : x;\r
1973                         y = _y !== undefined ? _y : y;\r
1974                         RESIZE_OPERATOR.update( x, y);\r
1975                         currentElement.resize( x, y);\r
1976                         INFOMATION_WINDOW.update( currentElement);\r
1977                 }\r
1978                 \r
1979                 return {\r
1980                         onStart: function( _currentElement, _mouseX, _mouseY){\r
1981                                 currentElement = _currentElement;\r
1982                                 offsetX = _mouseX;\r
1983                                 offsetY = _mouseY;\r
1984                                 startX = x = _currentElement.x;\r
1985                                 startY = y = _currentElement.y;\r
1986                                 MOUSE_CURSOR( 'move');\r
1987                         },\r
1988                         onDrag: function( _mouseX, _mouseY){\r
1989                                 var moveX = _mouseX -offsetX,\r
1990                                         moveY = _mouseY -offsetY,\r
1991                                         _x = startX +moveX,\r
1992                                         _y = startY +moveY;\r
1993                                 if( GRID_ENABLED() === true){\r
1994                                         _x = Math.floor( _x / 10) * 10;\r
1995                                         _y = Math.floor( _y / 10) * 10;\r
1996                                 }\r
1997                                 update( _x, _y);\r
1998                         },\r
1999                         onFinish: function(){\r
2000                                 MOUSE_CURSOR( '');\r
2001                                 if( x === startX && y === startY) return;\r
2002                                 COMIC_ELEMENT_OPERATION_MANAGER.resize( x, y);\r
2003                                 currentElement.resize( x, y);\r
2004                                 COMIC_ELEMENT_OPERATION_MANAGER.saveStatus( startX, startY);\r
2005                         },\r
2006                         onCancel: function(){\r
2007                                 MOUSE_CURSOR( '');\r
2008                                 COMIC_ELEMENT_OPERATION_MANAGER.resize( startX, startY);\r
2009                                 currentElement.animate( startX, startY);\r
2010                         },\r
2011                         onShiftUpdate: update,\r
2012                         onCtrlUpdate: update\r
2013                 }\r
2014         })();\r
2015 \r
2016 \r
2017 /* --------------------------------------------------------------------------------------------\r
2018  * COMIC_ELEMENT_OPERATION_MANAGER\r
2019  */\r
2020         var COMIC_ELEMENT_OPERATION_MANAGER = ( function(){\r
2021                 var     MOUSE_CURSOR = updateMouseCursor,\r
2022                         SAVE = HISTORY_CONTROL.saveState,\r
2023                         GRID_ENABLED = GRID_CONTROL.enabled,\r
2024                         HIT_AREA = MOUSE_HIT_AREA,\r
2025                         currentIsTextElement = false,\r
2026                         currentOperator = null,\r
2027                         currentElement = null,\r
2028                         currentx, currenty, currentw, currenth, angle, flipV, flipH;\r
2029 \r
2030                         function resize( _x, _y, _w, _h, _angle){\r
2031                                 currentx = _x !== undefined ? _x : currentx;\r
2032                                 currenty = _y !== undefined ? _y : currenty;\r
2033                                 currentw = _w !== undefined ? _w : currentw;\r
2034                                 currenth = _h !== undefined ? _h : currenth;\r
2035                                 angle = _angle !== undefined ? _angle : angle;\r
2036 \r
2037                                 RESIZE_OPERATOR.update( currentx, currenty, currentw, currenth);\r
2038                                 currentIsTextElement === true && TAIL_OPERATOR.update( currentw, currenth, angle);\r
2039                                 CONSOLE_CONTROLER.show( currentElement, currentw, currenth);\r
2040                                 INFOMATION_WINDOW.update( currentElement);\r
2041                         }\r
2042                         function show( _currentElement){\r
2043                                 currentElement === null && RESIZE_OPERATOR.show( _currentElement);\r
2044                                 if( currentElement !== _currentElement){\r
2045                                         currentElement = _currentElement;\r
2046                                         \r
2047                                         currentIsTextElement = ( _currentElement.type === PANEL_ELEMENT_TYPE_TEXT);\r
2048                                         currentIsTextElement === true ? TAIL_OPERATOR.show( _currentElement) : TAIL_OPERATOR.hide();\r
2049                                         \r
2050                                         flipV = currentIsTextElement === false ? _currentElement.flipV() : 0;\r
2051                                         flipH = currentIsTextElement === false ? _currentElement.flipH() : 0;\r
2052                                         \r
2053                                         resize(\r
2054                                                 _currentElement.x, _currentElement.y, _currentElement.w, _currentElement.h,\r
2055                                                 currentIsTextElement === true ? _currentElement.angle() : 0\r
2056                                         );\r
2057                                 }\r
2058                         }\r
2059 \r
2060                         pettanr.key.addKeyUpdateEvent( pettanr.view.EDITOR, 16, undefined, undefined, function( e){\r
2061                                 currentOperator !== null && currentOperator.onShiftUpdate && currentOperator.onShiftUpdate();\r
2062                         });\r
2063                         pettanr.key.addKeyUpdateEvent( pettanr.view.EDITOR, 17, undefined, undefined, function( e){\r
2064                                 currentOperator !== null && currentOperator.onCtrlUpdate && currentOperator.onCtrlUpdate();\r
2065                         });\r
2066                         pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 27, false, false, function( e){\r
2067                                 currentOperator !== null && currentOperator.onCancel && currentOperator.onCancel();\r
2068                                 currentOperator = null;\r
2069                         });\r
2070                 return {\r
2071                         open: function(){\r
2072                                 this.hide();\r
2073                         },\r
2074                         close: function(){\r
2075                                 \r
2076                         },\r
2077                         hide: function(){\r
2078                                 currentElement !== null && RESIZE_OPERATOR.hide();\r
2079                                 currentElement = null;\r
2080                                 MOUSE_CURSOR( '');\r
2081                                 TAIL_OPERATOR.hide();\r
2082                                 CONSOLE_CONTROLER.hide();\r
2083                                 INFOMATION_WINDOW.update( null);\r
2084                         },\r
2085                         resize: resize,\r
2086                         restoreState: function( arg){\r
2087                                 if( arg && arg.length !== 8) return;\r
2088                                 var _currentElement = arg[ 0],\r
2089                                         _x = arg[ 1], _y = arg[ 2], _w = arg[ 3], _h = arg[ 4],\r
2090                                         _a = arg[ 5],\r
2091                                         _flipV = arg[ 6], _flipH = arg[ 7];\r
2092                                 if( !_currentElement && !currentOperator) return;\r
2093                                 _currentElement.type === PANEL_ELEMENT_TYPE_IMAGE ?\r
2094                                         _currentElement.animate( _x, _y, _w, _h, _flipV, _flipH) :\r
2095                                         _currentElement.animate( _x, _y, _w, _h, _a);\r
2096                                 currentOperator !== null && currentOperator.onCancel && currentOperator.onCancel();\r
2097                                 currentOperator = null;\r
2098                                 currentElement === _currentElement ? resize( _x, _y, _w, _h, _a) : show( _currentElement);\r
2099                         },\r
2100                         saveStatus: function( startX, startY, startW, startH, startA, startFilpV, startFilpH){\r
2101                                 startX = startX !== undefined ? startX : currentx;\r
2102                                 startY = startY !== undefined ? startY : currenty;\r
2103                                 startW = startW !== undefined ? startW : currentw;\r
2104                                 startH = startH !== undefined ? startH : currenth;\r
2105                                 startA = startA !== undefined ? startA : angle;\r
2106                                 startFilpV = startFilpV !== undefined ? startFilpV : flipV;\r
2107                                 startFilpH = startFilpH !== undefined ? startFilpH : flipH;\r
2108                                 currentElement && SAVE( COMIC_ELEMENT_OPERATION_MANAGER.restoreState,\r
2109                                         [ currentElement, startX, startY, startW, startH, startA, startFilpV, startFilpH],\r
2110                                         [ currentElement, currentx, currenty, currentw, currenth, angle, flipV, flipH]\r
2111                                 );\r
2112                         },\r
2113                         busy: function(){\r
2114                                 return currentOperator !== null;\r
2115                         },\r
2116                         hitTest: function( _mouseX, _mouseY, _comicElement ){\r
2117                                 var _x, _y, _w, _h;\r
2118                                 if( _comicElement === currentElement){\r
2119                                         var _consoleX = CONSOLE_CONTROLER.x();\r
2120                                         _x = currentx +( _consoleX < 0 ? _consoleX : 0) -HIT_AREA;\r
2121                                         _y = currenty -HIT_AREA;\r
2122                                         var _consoleW = CONSOLE_CONTROLER.w();\r
2123                                         _w = ( _consoleW < currentw ? currentw : _consoleW) +HIT_AREA *2;\r
2124                                         var _consoleY = CONSOLE_CONTROLER.y();\r
2125                                         _h = ( _consoleY < currenth ? currenth : _consoleY +CONSOLE_CONTROLER.h()) +HIT_AREA *2;\r
2126                                 } else {\r
2127                                         _x = _comicElement.x -HIT_AREA;\r
2128                                         _y = _comicElement.y -HIT_AREA;\r
2129                                         _w = _comicElement.w +HIT_AREA *2;\r
2130                                         _h = _comicElement.h +HIT_AREA *2;\r
2131                                 }\r
2132                                 log.html( [ _x, _y, _w, _h ].join( ' ') );\r
2133                                 return _x <= _mouseX && _mouseX <= _x + _w && _y <= _mouseY && _mouseY <= _y + _h;\r
2134                         },\r
2135                         onMouseDown: function( _currentElement, _mouseX, _mouseY){\r
2136                                 //show( _currentElement);\r
2137                                 if( currentIsTextElement === true && TAIL_OPERATOR.onStart( _currentElement, _mouseX, _mouseY) === true){\r
2138                                         currentOperator = TAIL_OPERATOR;\r
2139                                 } else\r
2140                                 if( RESIZE_OPERATOR.onStart( _currentElement, _mouseX, _mouseY) === true){\r
2141                                         currentOperator = RESIZE_OPERATOR;\r
2142                                 } else {\r
2143                                         POSITION_OPERATOR.onStart( _currentElement, _mouseX, _mouseY)\r
2144                                         currentOperator = POSITION_OPERATOR;\r
2145                                 }\r
2146                         },\r
2147                         onMouseMove: function( _currentElement, _mouseX, _mouseY){\r
2148                                 show( _currentElement);\r
2149                                 if( currentOperator !== null){\r
2150                                         currentOperator.onDrag( _mouseX, _mouseY);                                              \r
2151                                 } else\r
2152                                 if( currentElement !== null){\r
2153                                         CONSOLE_CONTROLER.onMouseMove( _mouseX -currentx, _mouseY -currenty);\r
2154                                         if( currentIsTextElement === false || TAIL_OPERATOR.hitTest( _mouseX -currentx, _mouseY -currenty) === false){\r
2155                                                 RESIZE_OPERATOR.index( _mouseX, _mouseY);\r
2156                                         }\r
2157                                 }\r
2158                         },\r
2159                         onMouseUp: function( _currentElement, _mouseX, _mouseY){\r
2160                                 currentOperator !== null && currentOperator.onFinish();\r
2161                                 currentOperator = null;\r
2162                         }\r
2163                 }\r
2164         })();\r
2165         /*\r
2166          *  // COMIC_ELEMENT_OPERATION_MANAGER\r
2167          */\r
2168 \r
2169         var AbstractComicElement = function( COMIC_ELM_TYPE ){\r
2170                 this.type = COMIC_ELM_TYPE;\r
2171                 this.hitTest = function( _mouseX, _mouseY ){\r
2172                         return COMIC_ELEMENT_OPERATION_MANAGER.hitTest( _mouseX, _mouseY, this );\r
2173                 }\r
2174                 this.shift = function( _shiftX, _shiftY ){\r
2175                         this.resize( this.x + _shiftX, this.y + _shiftY);\r
2176                 }\r
2177                 this.busy = function(){\r
2178                         return COMIC_ELEMENT_OPERATION_MANAGER.busy();\r
2179                 }\r
2180                 this.onMouseMove = function( _mouseX, _mouseY ){\r
2181                         COMIC_ELEMENT_OPERATION_MANAGER.onMouseMove( this, _mouseX, _mouseY );\r
2182                 }\r
2183                 this.onMouseUp = function( _mouseX, _mouseY ){\r
2184                         COMIC_ELEMENT_OPERATION_MANAGER.onMouseUp( this, _mouseX, _mouseY );\r
2185                 }\r
2186                 this.onMouseDown = function( _mouseX, _mouseY ){\r
2187                         COMIC_ELEMENT_OPERATION_MANAGER.onMouseDown( this, _mouseX, _mouseY );\r
2188                 }\r
2189         };\r
2190 \r
2191 /* --------------------------------------------------------------------------------------------\r
2192  * ImageElementClass\r
2193  */\r
2194         var     jqImageElementOrigin;\r
2195         var ImageElementClass = function( data ){\r
2196                 jqImageElementOrigin = jqImageElementOrigin || $( $( '#imgElementTemplete').remove().html());\r
2197                 \r
2198                 var JQ_WRAPPER = jqImageElementOrigin.clone( true ),\r
2199                         SAVE = HISTORY_CONTROL.saveState,\r
2200                         HIT_AREA = MOUSE_HIT_AREA,\r
2201                         w = data.width,\r
2202                         h = data.height,\r
2203                         x, y, z, timing,\r
2204                         flipH = w < 0 ? -1 : 1,\r
2205                         flipV = h < 0 ? -1 : 1,\r
2206                         resourcePicture,\r
2207                         actualW,\r
2208                         actualH,\r
2209                         reversibleImage = null,\r
2210                         instance = this;\r
2211                 w = Math.floor( w );\r
2212                 h = Math.floor( h );\r
2213 \r
2214                 function onAnimeComplete(){\r
2215                         reversibleImage.resize( flipH * w, flipV * h );\r
2216                 }\r
2217                 function updateResourcePicture( _resourcePicture ){\r
2218                         resourcePicture = _resourcePicture;\r
2219                         \r
2220                         actualW = _resourcePicture.width;\r
2221                         actualH = _resourcePicture.height;\r
2222                         \r
2223                         var _reversibleImage = pettanr.image.createReversibleImage( \r
2224                                 [ pettanr.CONST.RESOURCE_PICTURE_PATH, _resourcePicture.id, '.', _resourcePicture.ext ].join(''),\r
2225                                 flipH * w, flipV * h\r
2226                         );\r
2227                         if( reversibleImage !== null){\r
2228                                 JQ_WRAPPER.children( reversibleImage.elm ).replaceWith( _reversibleImage.elm );\r
2229                                 reversibleImage.destroy();\r
2230                         } else {\r
2231                                 JQ_WRAPPER.append( _reversibleImage.elm );\r
2232                         }\r
2233                         reversibleImage = _reversibleImage;\r
2234                 }\r
2235                 /* global methods */\r
2236                 this.$ = JQ_WRAPPER;\r
2237                 //this.x = x;\r
2238                 //this.y = y;\r
2239                 //this.w = w;\r
2240                 //this.h = h;                                   \r
2241                 this.z = data.z;\r
2242                 this.timing = timing;\r
2243                 this.init = function(){\r
2244                         updateResourcePicture( data.resource_picture );\r
2245                         instance.resize( data.x, data.y, data.width, data.height );\r
2246                         delete instance.init;\r
2247                 }\r
2248                 this.flip = function( _updateH, _updateV ){\r
2249                         if( _updateH !== true && _updateV !== true ) return;\r
2250                         flipH = _updateH === true ? -flipH : flipH;\r
2251                         flipV = _updateV === true ? -flipV : flipV;\r
2252                         reversibleImage.resize( flipH * w, flipV * h );\r
2253                 }\r
2254                 this.flipV = function(){\r
2255                         return flipV;\r
2256                 }\r
2257                 this.flipH = function(){\r
2258                         return flipH;\r
2259                 }\r
2260                 this.resourcePicture = function( _resourcePicture ){\r
2261                         if( _resourcePicture && _resourcePicture !== resourcePicture ){\r
2262                                 SAVE( updateResourcePicture, resourcePicture, _resourcePicture );\r
2263                                 updateResourcePicture( _resourcePicture );\r
2264                         }\r
2265                         return resourcePicture;\r
2266                 }\r
2267                 this.getArtistID = function(){\r
2268                         return resourcePicture.artist_id || resourcePicture.artist.id || -1;\r
2269                 }\r
2270                 this.actualW = function(){ return actualW;}\r
2271                 this.actualH = function(){ return actualH;}\r
2272                 this.keepSize = false;\r
2273                 this.resize = function( _x, _y, _w, _h, animate ){\r
2274                         instance.x = x = _x !== undefined ? _x : x;\r
2275                         instance.y = y = _y !== undefined ? _y : y;\r
2276                         instance.w = w = _w !== undefined ? _w : w;\r
2277                         instance.h = h = _h !== undefined ? _h : h;\r
2278                         JQ_WRAPPER[ animate === true ? 'animate' : 'css' ]( { \r
2279                                 left:   x,\r
2280                                 top:    y,\r
2281                                 width:  w,\r
2282                                 height: h\r
2283                         }, 250, onAnimeComplete );\r
2284                         animate !== true && onAnimeComplete();\r
2285                 }\r
2286                 this.animate = function ( _x, _y, _w, _h, _flipH, _flipV ){\r
2287                         flipH = _flipH !== undefined ? _flipH : flipH;\r
2288                         flipV = _flipV !== undefined ? _flipV : flipV;\r
2289                         instance.resize( _x, _y, _w, _h, true);\r
2290                 }\r
2291                 this.getAsHTML = function( isAbsoluteUrl, isXHTML ){\r
2292                         return [\r
2293                                 '<img ',\r
2294                                         'src="', isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url), '" ',\r
2295                                         'width="', w, '" ',\r
2296                                         'height="', h, '" ',\r
2297                                         'style="',                                                                      \r
2298                                                 'left:', x, 'px;',\r
2299                                                 'top:', y, 'px;',\r
2300                                                 'z-index:', this.z, ';',\r
2301                                         '"',\r
2302                                 isXHTML !== true ? '>' : ' \/>'\r
2303                         ].join( '');\r
2304                 }\r
2305                 this.getAsJsonString = function(){\r
2306                         var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
2307                         return [\r
2308                                 '"new', this.timing, '": {', cr,\r
2309                                         '"resource_picture_id": 1,', cr,\r
2310                                         '"x": ', x, ',', cr,\r
2311                                         '"y": ', y, ',', cr,\r
2312                                         '"z": ', this.z, ',', cr,\r
2313                                         '"width": ', w, ',', cr,\r
2314                                         '"height": ', h, ',', cr,\r
2315                                         '"flipv": ', flipV === true ? 1 : 0, ',', cr,\r
2316                                         '"fliph": ', flipH === true ? 1 : 0, ',', cr,\r
2317                                         '"t": ', this.timing, cr,\r
2318                                 '}'\r
2319                         ].join( '');\r
2320                 }\r
2321                 this.destroy = function(){\r
2322                         reversibleImage.destroy();\r
2323                         JQ_WRAPPER.remove();\r
2324                         JQ_WRAPPER = reversibleImage = resourcePicture = data = instance = SAVE = null;\r
2325                         delete this.destroy;\r
2326                 }\r
2327         }\r
2328         ImageElementClass.prototype = new AbstractComicElement( PANEL_ELEMENT_TYPE_IMAGE );\r
2329 /*\r
2330  * / ImageElementClass\r
2331  * --------------------------------------------------------------------------------------------\r
2332  */\r
2333 \r
2334 \r
2335 /* --------------------------------------------------------------------------------------------\r
2336  * TextElementClass\r
2337  * \r
2338  * type\r
2339  * 0.none\r
2340  * 1.speach balloon\r
2341  * 2.think\r
2342  * 3.bom\r
2343  * 4.black-box( dq style)\r
2344  * 5.blue-box( ff style)\r
2345  * \r
2346  */\r
2347         var jqTextElementOrigin;\r
2348         var TextElementClass = function( data ){\r
2349                 jqTextElementOrigin = jqTextElementOrigin || ( function(){\r
2350                         var _OLD_IE = $( $( '#textElementTempleteForOldIE').remove().html()),\r
2351                                 _MODERN = $( $( '#textElementTemplete').remove().html());\r
2352                         return pettanr.ua.isIE === true && pettanr.ua.ieRenderingVersion < 8 ? _OLD_IE : _MODERN;\r
2353                 })();\r
2354                 \r
2355                 var JQ_WRAPPER = jqTextElementOrigin.clone( true ),\r
2356                         TEXT_ELM = JQ_WRAPPER.find( 'td,.speach-inner').eq( 0),\r
2357                         HIT_AREA = MOUSE_HIT_AREA,\r
2358                         SAVE     = HISTORY_CONTROL.saveState,\r
2359                         type     = data.balloon_template_id,\r
2360                         text     = ( function(){\r
2361                                 var _speachs = data.speaches_attributes;\r
2362                                 for( var k in _speachs ){\r
2363                                         return _speachs[ k ].content || '';\r
2364                                 }\r
2365                                 return '';\r
2366                         }),\r
2367                         balloon = pettanr.balloon.createBalloon( data.width, data.height, data.tail, type ),\r
2368                         x, y, w, h, a,\r
2369                         instance = this;\r
2370                 \r
2371                 JQ_WRAPPER.find( 'img').eq( 0).replaceWith( balloon.elm );\r
2372                 \r
2373                 function updateType( _type ){\r
2374                         if( type !== _type ){\r
2375                                 type = _type || type;\r
2376                                 balloon.type( type );\r
2377                         }\r
2378                 }\r
2379                 function updateAngle( _a){\r
2380                         if( _a !== undefined && a !== _a ){\r
2381                                 a = _a !== undefined ? _a : a;\r
2382                                 balloon.angle( a );\r
2383                         }\r
2384                 }\r
2385                 function updateText( _text){\r
2386                         text = _text || text || '';\r
2387                         TEXT_ELM.html( text );\r
2388                 }\r
2389                 \r
2390                 /* global methods */\r
2391                 this.$ = JQ_WRAPPER;\r
2392                 //this.x = x;\r
2393                 //this.y = y;\r
2394                 //this.w = w;\r
2395                 //this.h = h;\r
2396                 this.z = data.z;\r
2397                 this.timing = data.t;\r
2398                 this.init = function(){\r
2399                         updateText();\r
2400                         instance.resize( data.x, data.y, data.width, data.height, data.tail );\r
2401                         delete instance.init;\r
2402                 }\r
2403                 this.angle = function( _a){\r
2404                         _a !== undefined && instance.resize( undefined, undefined, undefined, undefined, _a);\r
2405                         return a;\r
2406                 }\r
2407                 this.text = function( _text){\r
2408                         if( _text && text !== _text) {\r
2409                                 SAVE( updateText, text || '', _text);\r
2410                                 updateText( _text);\r
2411                         }\r
2412                         return text;\r
2413                 }\r
2414                 this.resize = function( _x, _y, _w, _h, _a, animate ){\r
2415                         instance.x = x = _x !== undefined ? _x : x;\r
2416                         instance.y = y = _y !== undefined ? _y : y;\r
2417                         instance.w = w = _w !== undefined ? _w : w;\r
2418                         instance.h = h = _h !== undefined ? _h : h;\r
2419                         a = _a !== undefined ? _a : a;\r
2420                         \r
2421                         JQ_WRAPPER[ animate === true ? 'animate' : 'css']( {\r
2422                                         left:           x,\r
2423                                         top:            y,\r
2424                                         width:          w,\r
2425                                         height:         h\r
2426                                 }, 250,\r
2427                                 function(){\r
2428                                         balloon.resize( a, w, h);\r
2429                                 }\r
2430                         );              \r
2431                         animate !== true && balloon.resize( a, w, h);\r
2432                 }\r
2433                 this.animate = function ( _x, _y, _w, _h, _a ){\r
2434                         instance.resize( _x, _y, _w, _h, _a, true);\r
2435                 }\r
2436                 this.destroy = function(){\r
2437                         JQ_WRAPPER.remove();\r
2438                         balloon.destroy();\r
2439                         balloon = null;\r
2440                         delete instance.destroy;\r
2441                 }\r
2442                 this.getAsJSON = function(){\r
2443                         \r
2444                 }\r
2445                 this.getAsJsonString = function(){\r
2446                         var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
2447                         return [\r
2448                                 '"new', this.timing, '": {', cr,\r
2449                                         '"balloon_template_id": ', 1, ',', cr,\r
2450                                         '"system_picture_id": ', 1, ',', cr,\r
2451                                         '"size": ', 1, ',', cr,\r
2452                                         '"tail": ', a, ',', cr,\r
2453                                         '"x": ', x, ',', cr,\r
2454                                         '"y": ', y, ',', cr,\r
2455                                         '"z": ', this.z, ',', cr,\r
2456                                         '"t": ', this.timing, ',', cr,\r
2457                                         '"width": ', w, ',', cr,\r
2458                                         '"height": ', h, ',', cr,\r
2459                                         '"speaches_attributes": {', cr,\r
2460                                                 '"newf', this.timing, '": {', cr,\r
2461                                                 '"content": "', text, '",', cr,\r
2462                                                         '"x": ', x, ',', cr,\r
2463                                                         '"y": ', y, ',', cr,\r
2464                                                         '"t": ', 0, ',', cr,\r
2465                                                         '"width": ', w, ',', cr,\r
2466                                                         '"height": ', h, cr,\r
2467                                                 '}', cr,\r
2468                                         '}', cr,\r
2469                                 '}'\r
2470                         ].join( '');\r
2471                 }\r
2472                 this.getAsHTML = function( isAbsoluteUrl, isXHTML){\r
2473                         var url = balloon.getURL();\r
2474                         return [\r
2475                                 '<img ',\r
2476                                         'src="', isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url), '" ',\r
2477                                         'width="', w, '" ',\r
2478                                         'height="', h, '" ',\r
2479                                         'style="',                                                                      \r
2480                                                 'left:', x, 'px;',\r
2481                                                 'top:', y, 'px;',\r
2482                                                 'z-index:', this.z, ';',\r
2483                                         '"',\r
2484                                 isXHTML !== true ? '>' : ' \/>',\r
2485                                 pettanr.LINE_FEED_CODE_TEXTAREA,\r
2486                                 '<div class="balloon" style="',\r
2487                                         'left:', x, 'px;',\r
2488                                         'top:', y, 'px;',\r
2489                                         'width:', w, 'px;',\r
2490                                         'height:', h, 'px;',\r
2491                                         'z-index:', this.z,\r
2492                                 '"><span>', text, '<\/span>', '<\/div>'\r
2493                                         \r
2494                         ].join( '');\r
2495                 }\r
2496                 this.getAsXML = function(){}\r
2497         }\r
2498         TextElementClass.prototype = new AbstractComicElement( PANEL_ELEMENT_TYPE_TEXT );\r
2499 \r
2500 /* --------------------------------------------------------------------------------------------\r
2501  * COMIC_ELEMENT_CONTROL\r
2502  *  - mouseEventListener\r
2503  */\r
2504         var COMIC_ELEMENT_CONTROL = ( function(){\r
2505                 var     SAVE = HISTORY_CONTROL.saveState,\r
2506                         ELM_CONTAINER = document.getElementById( 'comic-element-container'),\r
2507                         currentElement = null,\r
2508                         currentLockTest = false,\r
2509                         currentLock = false,\r
2510                         panelX, panelY, panelW, panelH,\r
2511                         startX, startY;\r
2512         /*\r
2513          * append, remove, replace\r
2514          * \r
2515          * comicElement には、z-position と dom-index がある。\r
2516          *   z-position は 表示上の位置。大きいほど前に表示される( z-index)\r
2517          *   dom-index は 意味上の順番。htmlタグの登場順で、検索結果や音声読み上げブラウザで正しく意味が取れる順番。\r
2518          * \r
2519          * editerでは、実際には z-index は使わず、htmlの順序で前後を表現する。\r
2520          * dom-index は、数値のみ保持して、投稿時にcomicElementを適宜に並び替える。\r
2521          * \r
2522          * append comicElement\r
2523          * 1. 新しい comicElement の z-position を得る\r
2524          * 2. z の同じ comicElementを見つけ、その前に加える。または一番先頭へ。(COMIC_ELEMENT_ARRAY)\r
2525          *    zが大きいほど、COMIC_ELEMENT_ARRAYの先頭へ。\r
2526          * 3. dom位置は、COMIC_ELEMENT_ARRAY とは反対に、前のものほど後ろへ。\r
2527          * \r
2528          * \r
2529          * remove comicElement\r
2530          * 1. remove\r
2531          * 2. renumber z\r
2532          */\r
2533                 function appendComicElement( _comicElement ) {\r
2534                         var z = _comicElement.z,\r
2535                                 l = COMIC_ELEMENT_ARRAY.length,\r
2536                                 _jqElm = _comicElement.$.stop().css( {\r
2537                                         filter:         '',\r
2538                                         opacity:        ''\r
2539                                 });\r
2540                         if( typeof z !== 'number' || z < 0 || z >= l ){\r
2541                                 COMIC_ELEMENT_ARRAY.unshift( _comicElement );\r
2542                                 ELM_CONTAINER.appendChild( _jqElm.get( 0 ));\r
2543                                 _jqElm.fadeIn();\r
2544                         } else {\r
2545                                 var insertIndex = 0;\r
2546                                 for( var i = 0; i < l; ++i ){\r
2547                                         if( COMIC_ELEMENT_ARRAY[ i ].z <= z ){\r
2548                                                 insertIndex = i;\r
2549                                                 break;\r
2550                                         }\r
2551                                 }\r
2552                                 COMIC_ELEMENT_ARRAY[ insertIndex ].$.before( _jqElm.fadeIn() );\r
2553                                 COMIC_ELEMENT_ARRAY.splice( insertIndex, 0, _comicElement );\r
2554                         }\r
2555                         renumber();\r
2556                 }\r
2557                 function removeComicElement( _comicElement ) {\r
2558                         var l = COMIC_ELEMENT_ARRAY.length;\r
2559                         for( var i=0; i<l; ++i){\r
2560                                 if( COMIC_ELEMENT_ARRAY[ i ] === _comicElement ){\r
2561                                         COMIC_ELEMENT_ARRAY.splice( i, 1 );\r
2562                                         renumber();\r
2563                                         _comicElement.$.stop().css( {\r
2564                                                 filter:         '',\r
2565                                                 opacity:        ''\r
2566                                         }).fadeOut( onFadeOut );\r
2567                                         currentElement = currentElement === _comicElement ? null : currentElement;\r
2568                                         return;\r
2569                                 }\r
2570                         }\r
2571                         function onFadeOut(){\r
2572                                 this.parentNode.removeChild( this );\r
2573                         }\r
2574                 }\r
2575                 function restoreComicElement( arg ){\r
2576                         var isAppend = arg[ 0 ],\r
2577                                 comicElement = arg[ 1 ];\r
2578                         isAppend === true ? appendComicElement( comicElement ) : removeComicElement( comicElement );\r
2579                 }\r
2580                 /*\r
2581                  * COMIC_ELEMENT_ARRAY の順番を基準に、zの再計算\r
2582                  * jqElmの並び替え。\r
2583                  */\r
2584                 function renumber(){\r
2585                         var l = COMIC_ELEMENT_ARRAY.length,\r
2586                                 _comicElement, jqElm, jqNext;\r
2587                         for( var i=0; i < l; ++i){\r
2588                                 _comicElement = COMIC_ELEMENT_ARRAY[ i ];\r
2589                                 jqElm = _comicElement.$;\r
2590                                 jqNext && jqNext.before( jqElm );\r
2591                                 _comicElement.z = l -i -1;\r
2592                                 jqNext = jqElm;\r
2593                         }\r
2594                 }\r
2595                 function replaceComicElement( _comicElement, goForward ){\r
2596                         // COMIC_ELEMENT_ARRAYの再構築\r
2597                         var l = COMIC_ELEMENT_ARRAY.length,\r
2598                                 i = ( function(){\r
2599                                         for( var ret = 0; ret < l; ++ret ){\r
2600                                                 if( COMIC_ELEMENT_ARRAY[ ret] === _comicElement ) return ret;\r
2601                                         }\r
2602                                         return -1;\r
2603                                 })();\r
2604                         if( i === -1) return false;\r
2605                         if( goForward === true){\r
2606                                 if( i === 0) return false;\r
2607                                 COMIC_ELEMENT_ARRAY.splice( i, 1);\r
2608                                 COMIC_ELEMENT_ARRAY.splice( i -1, 0, _comicElement);\r
2609                         } else {\r
2610                                 if( i === l -1) return false;\r
2611                                 COMIC_ELEMENT_ARRAY.splice( i, 1);\r
2612                                 COMIC_ELEMENT_ARRAY.splice( i +1, 0, _comicElement);\r
2613                         }\r
2614                         renumber();\r
2615                         return true;\r
2616                 }\r
2617                 function restoreReplaceElement( arg){\r
2618                         replaceComicElement( arg[ 0], arg[ 1]);\r
2619                 }\r
2620                 \r
2621                 return {\r
2622                         init: function(){\r
2623                                 log = $( '#operation-catcher-log');\r
2624                                 \r
2625                                 delete COMIC_ELEMENT_CONTROL.init;\r
2626                         },\r
2627                         open: function(){\r
2628                                 COMIC_ELEMENT_CONTROL.init && COMIC_ELEMENT_CONTROL.init();\r
2629                         },\r
2630                         close: function(){\r
2631                                 var _comicElm;\r
2632                                 while( COMIC_ELEMENT_ARRAY.length > 0){\r
2633                                         _comicElm = COMIC_ELEMENT_ARRAY.shift();\r
2634                                         _comicElm.destroy && _comicElm.destroy();\r
2635                                 }\r
2636                         },\r
2637                         remove: removeComicElement,\r
2638                         restore: restoreComicElement,\r
2639                         replace: replaceComicElement,\r
2640                         restoreReplace: restoreReplaceElement,\r
2641                         onPanelResize : function ( _panelX, _panelY, _panelW, _panelH, isResizerTopAction ){\r
2642                         /*\r
2643                          * リサイズが、ResizerTopによって行われた場合、comicElementのyを動かして見かけ上動かないようにする。\r
2644                          */                                     \r
2645                                 if( isResizerTopAction === true){\r
2646                                         var     _shiftX = _panelW -panelW,\r
2647                                                 _shiftY = _panelH -panelH,\r
2648                                                 l = COMIC_ELEMENT_ARRAY.length;\r
2649                                         for( var i = 0; i < l; i++){\r
2650                                                 COMIC_ELEMENT_ARRAY[ i].shift( _shiftX, _shiftY);\r
2651                                         }\r
2652                                 }\r
2653                                 panelX = _panelX;\r
2654                                 panelY = _panelY;\r
2655                                 panelW = _panelW;\r
2656                                 panelH = _panelH;\r
2657                                 \r
2658                                 ELM_CONTAINER.style.width       = _panelW +'px';\r
2659                                 ELM_CONTAINER.style.height      = _panelH +'px';\r
2660                                 ELM_CONTAINER.style.left        = _panelX +'px';\r
2661                                 ELM_CONTAINER.style.top         = _panelY +'px';\r
2662                         },\r
2663                         onMouseMove: function( _mouseX, _mouseY ){\r
2664                                 var l = COMIC_ELEMENT_ARRAY.length,\r
2665                                         _x = _mouseX -panelX,\r
2666                                         _y = _mouseY -panelY,\r
2667                                         _elm = currentElement;\r
2668                                         \r
2669                                 if( _elm !== null){\r
2670                                         currentLockTest = currentLockTest === true && _x === 0 && _y === 0;\r
2671                                         if( _elm.busy() === true ){\r
2672                                                 _elm.onMouseMove( _x, _y);\r
2673                                                 return true;\r
2674                                         }\r
2675                                         if( _elm.hitTest( _x, _y) === true ){\r
2676                                                 _elm.onMouseMove( _x, _y ); // cursor\r
2677                                                 return true;\r
2678                                         }\r
2679                                         if( currentLock === true){\r
2680                                                 currentLockTest = true;\r
2681                                                 return true;\r
2682                                         }\r
2683                                 }\r
2684                                 for( var i=0; i<l; i++){\r
2685                                         _elm = COMIC_ELEMENT_ARRAY[ i ];\r
2686                                         // hitTest\r
2687                                         if( _elm.hitTest( _x, _y ) === true ){\r
2688                                                 _elm.onMouseMove( _x, _y ); // cursor\r
2689                                                 log.html( [ _x, _y, i].join( ','));\r
2690                                                 currentElement = _elm;\r
2691                                                 return true;\r
2692                                         } else {\r
2693                                                 log.html( [ _elm.x, _elm.y, i].join( ','));\r
2694                                         }\r
2695                                 }\r
2696                                 currentElement = null;                                                  \r
2697                                 COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
2698                                 return false;\r
2699                         },\r
2700                         onMouseUp: function( _mouseX, _mouseY){\r
2701                                 var ret = currentElement !== null && currentElement.busy() === true;\r
2702                                 ret === true && currentElement.onMouseUp( _mouseX -startX || panelX, _mouseY -startY || panelY);\r
2703                                 currentLock = currentLockTest === true && currentElement.hitTest( _mouseX -panelX, _mouseY -panelY) === true;\r
2704                                 RESIZE_OPERATOR.lock( currentLock);\r
2705                                 INFOMATION_WINDOW.lock( currentLock);\r
2706                                 return ret;\r
2707                         },\r
2708                         onMouseDown: function( _mouseX, _mouseY){\r
2709                                 startX = panelX;\r
2710                                 startY = panelY;\r
2711                                 if( currentElement === null) return false\r
2712                                 currentElement.onMouseDown( _mouseX -startX, _mouseY -startY);\r
2713                                 currentLockTest = true;\r
2714                                 return true;\r
2715                         },\r
2716                         busy: function(){\r
2717                                 return currentElement !== null;\r
2718                         },\r
2719                         createImageElement: function( data ){\r
2720                                 if( Type.isObject( data ) === false ){\r
2721                                         pettanr.premiumSatge.bootInOverlay( 1, onImageSelect );\r
2722                                 } else {\r
2723                                         onImageSelect( data, true );\r
2724                                 }\r
2725                                 function onImageSelect( data, isPanelPictureData ){\r
2726                                         if( isPanelPictureData !== true ){\r
2727                                                 data = {\r
2728                                                         resource_picture:data,\r
2729                                                         x:               Math.floor( panelW /2 - data.width /2 ),\r
2730                                                         y:               Math.floor( panelH /2 - data.height /2 ),\r
2731                                                         z:               -1,\r
2732                                                         t:               COMIC_ELEMENT_ARRAY.length,\r
2733                                                         width:           data.width,\r
2734                                                         height:          data.height\r
2735                                                 }\r
2736                                         }\r
2737                                         var _comicElement = new ImageElementClass( data );\r
2738                                         _comicElement.init && _comicElement.init();\r
2739                                         appendComicElement( _comicElement );\r
2740                                         _comicElement.animate( undefined, undefined, data.width, data.height );\r
2741                                         SAVE( restoreComicElement, [ false, _comicElement], [ true, _comicElement], true );\r
2742                                 }\r
2743                         },\r
2744                         createTextElement: function( data ){\r
2745                                 var _comicElement;\r
2746                                 if( Type.isObject( data ) === false ){\r
2747                                         data = {\r
2748                                                 balloon_template_id:1,\r
2749                                                 size:               1,\r
2750                                                 tail:               0,\r
2751                                                 x:                                      Math.floor( panelW /2 - 100 +Math.random() *10 ),\r
2752                                                 y:                  Math.floor( panelH /2 - 100 +Math.random() *10 ),\r
2753                                                 z:                  -1,\r
2754                                                 t:                  COMIC_ELEMENT_ARRAY.length,\r
2755                                                 width:              200,\r
2756                                                 height:             200,\r
2757                                                 speaches_attributes: {\r
2758                                                         text1: {\r
2759                                                                 content:    'Hello'\r
2760                                                         }\r
2761                                                 }\r
2762                                         }\r
2763                                         _comicElement = new TextElementClass( data );\r
2764                                         _comicElement.init();\r
2765                                         pettanr.textEditor.bootInOverlay( PANEL_CONTROL.x(), PANEL_CONTROL.y(), _comicElement, onTextInput );\r
2766                                 } else {\r
2767                                         _comicElement = new TextElementClass( data );\r
2768                                         _comicElement.init();\r
2769                                         onTextInput( _comicElement );\r
2770                                 }\r
2771                                 function onTextInput( _comicElement ){\r
2772                                         appendComicElement( _comicElement );\r
2773                                         SAVE( restoreComicElement, [ false, _comicElement ], [ true, _comicElement ], true );\r
2774                                 }\r
2775                         },\r
2776                         getAsHTML: function( isAbsoluteUrl, isXHTML){\r
2777                                 var HTML_ARRAY = [],\r
2778                                         l = COMIC_ELEMENT_ARRAY.length,\r
2779                                         _timing = 0,\r
2780                                         _comicElement;\r
2781 \r
2782                                 while( HTML_ARRAY.length < l){\r
2783                                         _comicElement = getComicElementByTiming();\r
2784                                         if( _comicElement === null) break;\r
2785                                         HTML_ARRAY.push( _comicElement.getAsHTML( isAbsoluteUrl, isXHTML));\r
2786                                 }\r
2787                                 function getComicElementByTiming(){\r
2788                                         while( _timing < l *2){\r
2789                                                 for(var i=0; i<l; ++i){\r
2790                                                         if( _timing === COMIC_ELEMENT_ARRAY[ i].timing){\r
2791                                                                 ++_timing;\r
2792                                                                 return COMIC_ELEMENT_ARRAY[ i];\r
2793                                                         }\r
2794                                                 }\r
2795                                                 ++_timing;\r
2796                                         }\r
2797                                         return null;\r
2798                                 }\r
2799                                 HTML_ARRAY.unshift(\r
2800                                         [\r
2801                                                 '<div class="panel" ',\r
2802                                                         'style="',\r
2803                                                                 'height:', panelH, 'px;',\r
2804                                                                 'background-color:', ';',\r
2805                                                         '"',\r
2806                                                 '>'\r
2807                                         ].join( '')\r
2808                                 );              \r
2809                                 HTML_ARRAY.push( '</div>');\r
2810                                 \r
2811                                 return HTML_ARRAY.join( pettanr.LINE_FEED_CODE_TEXTAREA);\r
2812                         },\r
2813                         getAsJsonString: function(){\r
2814                                 var JSON_STRING_ARRAY = [],\r
2815                                         IMAGE_ARRAY = [],\r
2816                                         BALLOON_ARRAY = [],\r
2817                                         l = COMIC_ELEMENT_ARRAY.length,\r
2818                                         _timing = 0,\r
2819                                         _comicElement,\r
2820                                         cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
2821                                         \r
2822                                 while( IMAGE_ARRAY.length + BALLOON_ARRAY.length < l){\r
2823                                         _comicElement = getComicElementByTiming();\r
2824                                         if( _comicElement === null) break;\r
2825                                         _comicElement.type === PANEL_ELEMENT_TYPE_IMAGE ? \r
2826                                                 IMAGE_ARRAY.push( _comicElement.getAsJsonString()) :\r
2827                                                 BALLOON_ARRAY.push( _comicElement.getAsJsonString());\r
2828                                 }\r
2829                                 function getComicElementByTiming(){\r
2830                                         while( _timing < l *2){\r
2831                                                 for(var i=0; i<l; ++i){\r
2832                                                         if( _timing === COMIC_ELEMENT_ARRAY[ i].timing){\r
2833                                                                 ++_timing;\r
2834                                                                 return COMIC_ELEMENT_ARRAY[ i];\r
2835                                                         }\r
2836                                                 }\r
2837                                                 ++_timing;\r
2838                                         }\r
2839                                         return null;\r
2840                                 }\r
2841                                 return [\r
2842                                         '{', cr,\r
2843                                                 '"panel": {', cr,\r
2844                                                     '"border": 1,', cr,\r
2845                                                     '"comic_id": 5,', cr,\r
2846                                                     '"resource_picture_id": 1,', cr,\r
2847                                                         '"x": ', 0, ',', cr,\r
2848                                                         '"y": ', 0, ',', cr,\r
2849                                                         '"z": ', 0, ',', cr,\r
2850                                                         '"t": ', 0, ',', cr,\r
2851                                                     '"width": ', panelW, ',', cr,\r
2852                                                     '"height": ', panelH, ',', cr,\r
2853                                                     '"panel_pictures_attributes": {', cr,\r
2854                                                         IMAGE_ARRAY.join( ',' +cr), cr,\r
2855                                                     '},', cr,\r
2856                                                     '"balloons_attributes": {', cr,\r
2857                                                         BALLOON_ARRAY.join( ',' +cr), cr,\r
2858                                                     '}', cr,\r
2859                                                 '}', cr,\r
2860                                         '}'\r
2861                                 ].join( '');\r
2862                         }\r
2863                 }\r
2864         })();\r
2865         \r
2866         /*\r
2867          * end of COMIC_ELEMENT_CONTROL\r
2868          */\r
2869 \r
2870 \r
2871 \r
2872         function updateMouseCursor( _cursor){\r
2873                 if( currentCursor !== _cursor){\r
2874                         currentCursor = _cursor;\r
2875                         setTimeout( update, 0);\r
2876                 }\r
2877                 function update(){\r
2878                         ELM_MOUSE_EVENT_CHATCHER.style.cursor = currentCursor;\r
2879                 }\r
2880         }\r
2881         function centering(){\r
2882                 instance.onPaneResize( windowW, windowH);\r
2883         }       \r
2884         function mouseEventRellay( e){\r
2885                 var _mouseX = e.pageX,\r
2886                         _mouseY = e.pageY,\r
2887                         rellayMethod = e.type === 'mousedown' ?\r
2888                                         'onMouseDown' :\r
2889                                         ( e.type === 'mousemove' ? 'onMouseMove' : 'onMouseUp');\r
2890                 if( currentListener !== null && currentListener.busy() === true){\r
2891                         currentListener[ rellayMethod]( _mouseX, _mouseY);\r
2892                 } else {\r
2893                         currentListener = null;\r
2894                         var l = MOUSE_LISTENER_ARRAY.length,\r
2895                                 _listener;\r
2896                         for( var i=0; i<l; ++i){\r
2897                                 _listener = MOUSE_LISTENER_ARRAY[ i];\r
2898                                 if( _listener[ rellayMethod]( _mouseX, _mouseY) === true){\r
2899                                         currentListener = _listener;\r
2900                                         break;\r
2901                                 }\r
2902                         }\r
2903                 }\r
2904                 // 文字選択の禁止\r
2905                 //!document.selection && window.getSelection().removeAllRanges();\r
2906                 e.stopPropagation();\r
2907                 return false;\r
2908         }\r
2909 \r
2910         /* grobal method */\r
2911         this.rootElement = document.getElementById( 'editor' );\r
2912         this.displayName = pettanr.view.EDITOR;\r
2913         this.ID          = pettanr.view.EDITOR;\r
2914         this.MIN_WIDTH   = 320;\r
2915         this.MIN_HEIGHT  = 320;\r
2916         this.firstOpen = function(){\r
2917         /*\r
2918          * MOUSE_LISTENER_ARRAY は、表示順に格納.手前の要素が最初\r
2919          * MENU_BAR_CONTROL,\r
2920          * WINDOW_CONTROL,\r
2921          * COMIC_ELEMENT_CONTROL,\r
2922          * PANEL_CONTROL\r
2923          * .busy() === true なら、そのままonMouseMove()にイベントを流す.\r
2924          * onMouseMove()に流してみて、false が帰れば、次にリスナーにも流す.\r
2925          */\r
2926                 MOUSE_LISTENER_ARRAY.push( MENU_BAR_CONTROL, WINDOWS_CONTROL, PANEL_RESIZER_TOP, PANEL_RESIZER_BOTTOM, COMIC_ELEMENT_CONTROL, PANEL_CONTROL);\r
2927         /*\r
2928          * centering\r
2929          */\r
2930                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 96, false, true, centering);  // ctrl + 0\r
2931                 pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 48, false, true, centering);  // ctrl + 0\r
2932                 MENU_BAR_CONTROL.EDIT.createSelection( 'centering', 'ctrl + 0', centering, true, true, true);\r
2933         /*\r
2934          * jqMouseEventChacher は透明な要素で、\r
2935          * マウスイベントをcurrentElement(currentElement)に伝えるのが仕事\r
2936          * このような実装になるのは、ここの表示オブジェクトにイベントを設定した場合、表示が追いつかずマウスカーソルが外れたタイミングでイベントが終わってしまうため。\r
2937          */                     \r
2938                 jqMouseEventChacher = $( ELM_MOUSE_EVENT_CHATCHER)\r
2939                         .mousemove( mouseEventRellay)\r
2940                         .mousedown( mouseEventRellay)\r
2941                         .mouseup( mouseEventRellay)\r
2942                         .mouseout( mouseEventRellay);\r
2943                 \r
2944                 delete instance.firstOpen;\r
2945         }\r
2946         this.onOpen = function( _w, _h, _file ){\r
2947                 var panelW, panelH,\r
2948                         borderSize,\r
2949                         fileData, panelElements, panelElm;\r
2950                 \r
2951                 \r
2952                 if( pettanr.file.isFileInstance( _file ) === true ){\r
2953                         if( pettanr.driver.isPettanrFileInstance( _file ) === true ){\r
2954                                 if( _file.getType() === pettanr.driver.FILE_TYPE.COMIC ){\r
2955                                         fileData = _file.read();\r
2956                                         panelW = fileData.width;\r
2957                                         panelH = fileData.height;\r
2958                                 } else\r
2959                                 if( _file.getType() === pettanr.driver.FILE_TYPE.PANEL ){\r
2960                                         fileData = _file.read();\r
2961                                         panelW = fileData.width;\r
2962                                         panelH = fileData.height;\r
2963                                         borderSize = fileData.border;\r
2964                                         panelElements = fileData.panel_elements;\r
2965                                         \r
2966                                         if( Type.isArray( panelElements ) === true ){\r
2967                                                 for( var i=0; i<panelElements.length; ++i){\r
2968                                                         panelElm = panelElements[ i ];\r
2969                                                         if( panelElm.resource_picture ){\r
2970                                                                 COMIC_ELEMENT_CONTROL.createImageElement( panelElm );\r
2971                                                         } else\r
2972                                                         if( panelElm.balloon_template_id ){\r
2973                                                                 COMIC_ELEMENT_CONTROL.createTextElement( panelElm );\r
2974                                                         }\r
2975                                                 }                                               \r
2976                                         }\r
2977                                 }\r
2978                         } else {\r
2979                                 \r
2980                         }\r
2981                 }\r
2982                 jqEditor = jqEditor || $( '#editor');\r
2983                 \r
2984                 HISTORY_CONTROL.open();\r
2985                 \r
2986                 WINDOWS_CONTROL.open();\r
2987                 \r
2988                 GRID_CONTROL.open();\r
2989                 PANEL_CONTROL.open( panelW, panelH, borderSize );\r
2990                 \r
2991                 COMIC_ELEMENT_OPERATION_MANAGER.open();\r
2992                 COMIC_ELEMENT_CONTROL.open();\r
2993                 \r
2994                 instance.firstOpen !== undefined && instance.firstOpen();\r
2995                 \r
2996                 // last\r
2997                 MENU_BAR_CONTROL.open();\r
2998                 \r
2999                 windowW = _w;\r
3000                 windowH = _h;\r
3001                 instance.onPaneResize( _w, _h );\r
3002         }\r
3003         this.onClose = function(){\r
3004                 HISTORY_CONTROL.close();\r
3005                 \r
3006                 WINDOWS_CONTROL.close();\r
3007                 \r
3008                 GRID_CONTROL.close();\r
3009                 PANEL_CONTROL.close();\r
3010                 \r
3011                 COMIC_ELEMENT_OPERATION_MANAGER.close();\r
3012                 COMIC_ELEMENT_CONTROL.close();\r
3013                 \r
3014                 // last\r
3015                 MENU_BAR_CONTROL.open();\r
3016         }\r
3017         this.onPaneResize = function( _windowW, _windowH){\r
3018                 windowW = _windowW || windowW;\r
3019                 windowH = _windowH || windowH;\r
3020                 if( instance.firstOpen) return;\r
3021                 /*\r
3022                  * ieは +'px'が不要みたい\r
3023                  */\r
3024                 jqEditor.get( 0).style.height = _windowH +'px';\r
3025                 ELM_MOUSE_EVENT_CHATCHER.style.height = _windowH +'px';\r
3026                 \r
3027                 WINDOWS_CONTROL.onWindowResize( _windowW, _windowH);\r
3028                 MENU_BAR_CONTROL.onWindowResize( _windowW, _windowH);\r
3029                 PANEL_CONTROL.onWindowResize( _windowW, _windowH);\r
3030         }\r
3031 });\r
3032 \r
3033 \r
3034 pettanr.comicConsole = pettanr.view.registerApplication( function(){\r
3035         var jqWrap,\r
3036                 ID = 'comicConsole',\r
3037                 elmWrap = document.getElementById( 'comic-console-wrapper' ),\r
3038                 elmHeader = document.getElementById( 'comic-console-header' ),\r
3039                 elmProgress = document.getElementById( 'comic-console-progress' ),\r
3040                 inputTitle, inputW, inputH, inputVisible, inputEditable,\r
3041                 elmUploader = null,\r
3042                 elmScript = null,\r
3043                 elmIframe = null,\r
3044                 elmForm = null,\r
3045                 timer = null,\r
3046                 isUploading = false,\r
3047                 instance = this;\r
3048         //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
3049         \r
3050         function clickOK(){\r
3051                 if( !elmForm || !elmIframe || isUploading === true ) return false;\r
3052                 // validate\r
3053                 isUploading = true;\r
3054                 elmProgress.innerHTML = '■';\r
3055                 copyAndSubmit();\r
3056         }\r
3057 \r
3058                 function copyAndSubmit(){\r
3059                         var _inputList = elmForm.getElementsByTagName( 'input' ),\r
3060                                 _input, _name;\r
3061                         for( var i=0, l= _inputList.length; i<l; ++i){\r
3062                                 _input = _inputList[ i ];\r
3063                                 _name = _input.name;\r
3064                                 if( _name === 'comic[title]'){\r
3065                                         _input.value = inputTitle.value();\r
3066                                 } else\r
3067                                 if( _name === 'comic[width]'){\r
3068                                         _input.value = inputW.value();\r
3069                                 } else\r
3070                                 if( _name === 'comic[height]'){\r
3071                                         _input.value = inputH.value();\r
3072                                 }\r
3073                         }\r
3074                         var _selectList = elmForm.getElementsByTagName( 'select' ),\r
3075                                 _select, _optionList;\r
3076                         for( i=0, l= _selectList.length; i<l; ++i){\r
3077                                 _select = _selectList[ i ];\r
3078                                 _name = _select.name;\r
3079                                 _optionList = _select.getElementsByTagName( 'option' )\r
3080                                 if( _name === 'comic[visible]'){\r
3081                                         _select.selectedIndex = 1;\r
3082                                 } else\r
3083                                 if( _name === 'comic[editable]'){\r
3084                                         _select.selectedIndex = 0;\r
3085                                 }\r
3086                         }\r
3087                         try {\r
3088                                 elmForm.submit();\r
3089                         } catch( e){\r
3090                                 elmProgress.innerHTML = 'submit() err..';\r
3091                                 isUploading = false;\r
3092                                 setTimeout( clickCancel , 3000);\r
3093                                 return;\r
3094                         }\r
3095                         if( pettanr.ua.isIE){\r
3096                                 elmIframe.onreadystatechange = detectIframe;\r
3097                         } else {\r
3098                                 elmIframe.onload = onIframeUpdate;\r
3099                         }\r
3100                         elmProgress.innerHTML = 'uploading..';\r
3101                 }\r
3102         /*\r
3103          * ie の 場合、readyState をチェック.\r
3104          */\r
3105                         function detectIframe(){\r
3106                     if ( elmIframe.readyState === 'complete') {\r
3107                         elmIframe.onreadystatechange = new Function();\r
3108                         elmIframe.onreadystatechange = null;\r
3109                         onIframeUpdate();\r
3110                     }\r
3111                         }\r
3112                                 function onIframeUpdate(){\r
3113                                         elmIframe.onload = null;\r
3114                                         ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
3115                                         elmIframe = null;\r
3116                                         elmProgress.innerHTML = 'success!';\r
3117                                         setTimeout( clickCancel , 1000);\r
3118                                         isUploading = false;\r
3119                                 }\r
3120                         \r
3121         function clickCancel(){\r
3122                 if( isUploading === true) return false;\r
3123                 pettanr.comicConsole.shutdown();\r
3124         }\r
3125         function detectForm(){\r
3126                 elmForm = elmUploader.getElementsByTagName( 'form' )[ 0 ];\r
3127                 if( elmForm){\r
3128                         window.clearInterval( timer);\r
3129                         timer = null;\r
3130                         pettanr.util.createIframe( 'targetFrameCreateComic', onCreateIframe );\r
3131                         elmProgress.innerHTML = 'create iframe';\r
3132                 }\r
3133         }\r
3134         function onCreateIframe( _iframe ){\r
3135                 elmUploader.appendChild( _iframe );\r
3136                 elmIframe = _iframe;\r
3137                 elmForm.target = _iframe.name;\r
3138                 elmProgress.innerHTML = '';\r
3139         }\r
3140 \r
3141         /* grobal method */\r
3142         this.rootElement = document.getElementById( 'comic-console-wrapper' );\r
3143         this.displayName = ID;\r
3144         this.ID          = ID;\r
3145         this.MIN_WIDTH   = 320;\r
3146         this.MIN_HEIGHT  = 320;\r
3147         this.init = function(){\r
3148                 instance.jqWrap = jqWrap = $( '#comic-console-wrapper').hide();\r
3149                 $( '#comic-console-post-button').click( clickOK );\r
3150                 $( '#comic-console-cancel-button').click( clickCancel );\r
3151                 \r
3152                 var CREATER = pettanr.form.createInputText;//pettanr.key.createEditableText;\r
3153                 inputTitle    = CREATER( document.getElementById( 'comic-console-title'), null, ID);\r
3154                 inputW        = CREATER( document.getElementById( 'comic-console-width'), null, ID);\r
3155                 inputH        = CREATER( document.getElementById( 'comic-console-height'), null, ID);\r
3156                 inputVisible  = CREATER( document.getElementById( 'comic-console-visible'), null, ID);\r
3157                 inputEditable = CREATER( document.getElementById( 'comic-console-editable'), null, ID);\r
3158                 \r
3159                 delete instance.init;\r
3160         }\r
3161         this.jqWrap = null;\r
3162         this.onOpen = function( w, h ){\r
3163                 instance.init && instance.init();\r
3164                 \r
3165                 jqWrap.show();\r
3166                 \r
3167                 inputTitle.start();\r
3168                 \r
3169                 elmUploader = document.createElement( 'div' );\r
3170                 elmUploader.id = 'newcomic';\r
3171                 elmUploader.style.cssText = 'height:1px;line-height:1px;visibility:hidden;overflow:hidden;';\r
3172                 elmWrap.appendChild( elmUploader);\r
3173                 \r
3174                 var elmScript = document.createElement( 'script');\r
3175                 elmScript.type = 'text\/javascript';\r
3176                 elmScript.src = pettanr.CONST.CREATE_COMIC_JS;\r
3177                 elmWrap.appendChild( elmScript);\r
3178                 \r
3179                 elmProgress.innerHTML = 'loading form.';\r
3180                 \r
3181                 if( timer === null){\r
3182                         timer = window.setInterval( detectForm, 250);\r
3183                 }\r
3184                 \r
3185                 instance.onPaneResize( w, h );\r
3186         }\r
3187         this.onPaneResize = function( _windowW, _windowH){\r
3188                 jqWrap.css(\r
3189                         {\r
3190                                 left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
3191                                 top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
3192                         }\r
3193                 );\r
3194         }\r
3195         this.onClose = function(){\r
3196                 elmForm !== null && $( elmUploader ).remove();\r
3197                 elmForm  = null;\r
3198                 isUploading = false;\r
3199                 \r
3200                 if( elmScript !== null ){\r
3201                         document.body.removeChild( elmScript);\r
3202                         elmScript = null;                                       \r
3203                 }\r
3204                 if( timer !== null){\r
3205                         window.clearInterval( timer);\r
3206                         timer = null;\r
3207                 }\r
3208                 \r
3209                 jqWrap.hide();\r
3210         }\r
3211 });\r
3212 \r
3213 pettanr.uploadConsole = pettanr.view.registerApplication( function(){\r
3214         var jqWrap, windowW, windowH,\r
3215                 ID = 'uploadConsole',\r
3216                 TARGET_FRAME_NAME = 'targetFrame',\r
3217                 elmContainer = document.getElementById( 'uploader'),\r
3218                 elmProgress = document.getElementById( 'upload-console-progress'),\r
3219                 timer = null,\r
3220                 elmScript = null,\r
3221                 elmForm = null,\r
3222                 elmFile = null,\r
3223                 elmIframe = null,\r
3224                 isUploading = false,\r
3225                 instance = this;\r
3226         /*\r
3227          * upload ボタンが押されたらまず iframe をつくる.
3228          */\r
3229         function clickOK(){\r
3230                 if( !elmForm || !elmIframe || isUploading === true ) return false;\r
3231                 if( elmFile.value.length === 0) return false;\r
3232                 elmProgress.innerHTML = 'uploading.';\r
3233                 isUploading = true;\r
3234                 submit();\r
3235                 return false;\r
3236         }\r
3237         /*\r
3238          * form の target に iframe を指定したのち submit();
3239          */\r
3240                 function submit(){\r
3241                         try {\r
3242                                 elmForm.submit();\r
3243                         } catch( e){\r
3244                                 elmProgress.innerHTML = 'submit() err..';\r
3245                                 isUploading = false;\r
3246                                 setTimeout( clickCancel , 3000);\r
3247                                 return;\r
3248                         }\r
3249                         \r
3250                         if( pettanr.ua.isIE){\r
3251                                 elmIframe.onreadystatechange = detectIframe;\r
3252                         } else {\r
3253                                 elmIframe.onload = onLoad;\r
3254                         }\r
3255                         elmProgress.innerHTML = 'uploading..';\r
3256                 }\r
3257         /*\r
3258          * ie の 場合、readyState をチェック.
3259          */\r
3260                         function detectIframe(){\r
3261                     if ( elmIframe.readyState === 'complete') {\r
3262                         elmIframe.onreadystatechange = new Function();\r
3263                         elmIframe.onreadystatechange = null;\r
3264                         onLoad();\r
3265                     }\r
3266                         }\r
3267                                 function onLoad(){\r
3268                                         elmIframe.onload = null;\r
3269                                         ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
3270                                         elmProgress.innerHTML = 'success!';\r
3271                                         setTimeout( clickCancel , 1000);\r
3272                                         isUploading = false;\r
3273                                 }\r
3274         \r
3275         function detectForm(){\r
3276                 elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
3277                 if( elmForm){\r
3278                         var _inputList = elmForm.getElementsByTagName( 'input' ),\r
3279                                 _input;\r
3280                         for( var i=0, l= _inputList.length; i<l; ++i){\r
3281                                 _input = _inputList[ i ];\r
3282                                 if( _input.type === 'file'){\r
3283                                         elmFile = _input;\r
3284                                 }\r
3285                                 if( _input.type === 'submit'){\r
3286                                         _input.style.display = 'none';\r
3287                                 }\r
3288                         }\r
3289                         window.clearInterval( timer);\r
3290                         timer = null;\r
3291                         pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
3292                         elmProgress.innerHTML = 'create iframe';\r
3293                 }\r
3294         }\r
3295         function onCreateIframe( _iframe ){\r
3296                 elmContainer.appendChild( _iframe );\r
3297                 elmIframe = _iframe;\r
3298                 elmForm.target = _iframe.name;\r
3299                 elmProgress.innerHTML = '';\r
3300                 instance.onPaneResize( windowW, windowH );\r
3301         }\r
3302         /*\r
3303          * 
3304          */\r
3305         function clickCancel(){\r
3306                 if( isUploading === true) return false;\r
3307                 pettanr.uploadConsole.shutdown();\r
3308                 return false;\r
3309         }\r
3310 \r
3311         /* grobal method */\r
3312         this.rootElement = document.getElementById( 'upload-console-wrapper' );\r
3313         this.displayName = ID;\r
3314         this.ID          = ID;\r
3315         this.MIN_WIDTH   = 320;\r
3316         this.MIN_HEIGHT  = 320;\r
3317         this.init = function(){\r
3318                 instance.jqWrap = jqWrap = $( '#upload-console-wrapper').hide();\r
3319                 $( '#upload-console-post-button').click( clickOK );\r
3320                 $( '#upload-console-cancel-button').click( clickCancel );\r
3321 \r
3322                 delete instance.init;\r
3323         }\r
3324         this.jqWrap = null;\r
3325         this.onOpen = function( w, h){\r
3326                 instance.init && instance.init();\r
3327                 /*\r
3328                  * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.
3329                  */                             \r
3330                 elmScript = document.createElement( 'script');\r
3331                 elmScript.type = 'text\/javascript';\r
3332                 elmScript.src = pettanr.CONST.UPLOAD_PICTURE_JS;\r
3333                 document.body.appendChild( elmScript);\r
3334                 \r
3335                 jqWrap.show();\r
3336 \r
3337                 if( timer === null){\r
3338                         timer = window.setInterval( detectForm, 250);\r
3339                 }\r
3340                 \r
3341                 elmProgress.innerHTML = 'loading form.';\r
3342                 \r
3343                 instance.onPaneResize( w, h);\r
3344         }\r
3345         this.onPaneResize = function( _windowW, _windowH){\r
3346                 windowW = _windowW;\r
3347                 windowH = _windowH;\r
3348                 jqWrap.css(\r
3349                         {\r
3350                                 left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
3351                                 top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
3352                         }\r
3353                 );\r
3354         }\r
3355         this.onClose = function(){\r
3356                 elmForm !== null && $( elmContainer.children ).remove();\r
3357                 elmForm = elmFile = elmIframe = null;\r
3358                 isUploading = false;\r
3359                 \r
3360                 if( elmScript !== null ){\r
3361                         document.body.removeChild( elmScript);\r
3362                         elmScript = null;                                       \r
3363                 }\r
3364                 if( timer !== null){\r
3365                         window.clearInterval( timer);\r
3366                         timer = null;\r
3367                 }\r
3368                 jqWrap.hide();\r
3369         }\r
3370 });\r
3371 \r
3372 pettanr.panelConsole = pettanr.view.registerApplication( function(){\r
3373         var jqWrap, windowW, windowH,\r
3374                 ID = 'panelConsole',\r
3375                 TARGET_FRAME_NAME = 'targetFrameCreateNewPanel',\r
3376                 elmContainer = document.getElementById( 'newpanel'),\r
3377                 elmProgress = document.getElementById( 'panel-console-progress'),\r
3378                 timer = null,\r
3379                 elmScript = null,\r
3380                 elmForm = null,\r
3381                 elmIframe = null,\r
3382                 isUploading = false,\r
3383                 instance = this;\r
3384         /*\r
3385          * upload ボタンが押されたらまず iframe をつくる.\r
3386          */\r
3387         function clickOK(){\r
3388                 if( !elmForm || !elmIframe || isUploading === true ) return false;\r
3389                 elmProgress.innerHTML = 'uploading.';\r
3390                 isUploading = true;\r
3391                 submit();\r
3392                 return false;\r
3393         }\r
3394         /*\r
3395          * form の target に iframe を指定したのち submit();\r
3396          */\r
3397                 function submit(){\r
3398                         try {\r
3399                                 elmForm.submit();\r
3400                         } catch( e){\r
3401                                 elmProgress.innerHTML = 'submit() err..';\r
3402                                 isUploading = false;\r
3403                                 setTimeout( clickCancel , 3000);\r
3404                                 return;\r
3405                         }\r
3406                         \r
3407                         if( pettanr.ua.isIE){\r
3408                                 elmIframe.onreadystatechange = detectIframe;\r
3409                         } else {\r
3410                                 elmIframe.onload = onLoad;\r
3411                         }\r
3412                         elmProgress.innerHTML = 'uploading..';\r
3413                 }\r
3414         /*\r
3415          * ie の 場合、readyState をチェック.\r
3416          */\r
3417                         function detectIframe(){\r
3418                     if ( elmIframe.readyState === 'complete') {\r
3419                         elmIframe.onreadystatechange = new Function();\r
3420                         elmIframe.onreadystatechange = null;\r
3421                         onLoad();\r
3422                     }\r
3423                         }\r
3424                                 function onLoad(){\r
3425                                         elmIframe.onload = null;\r
3426                                         ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
3427                                         elmProgress.innerHTML = 'success!';\r
3428                                         setTimeout( clickCancel , 1000);\r
3429                                         isUploading = false;\r
3430                                 }\r
3431         \r
3432         function detectForm(){\r
3433                 elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
3434                 if( elmForm){\r
3435                         var _inputList = elmForm.getElementsByTagName( 'input' ),\r
3436                                 _input;\r
3437                         for( var i=0, l= _inputList.length; i<l; ++i){\r
3438                                 _input = _inputList[ i ];\r
3439                                 if( _input.type === 'submit'){\r
3440                                         _input.style.display = 'none';\r
3441                                 }\r
3442                         }\r
3443                         window.clearInterval( timer);\r
3444                         timer = null;\r
3445                         pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
3446                         elmProgress.innerHTML = 'create iframe';\r
3447                 }\r
3448         }\r
3449         function onCreateIframe( _iframe ){\r
3450                 elmContainer.appendChild( _iframe );\r
3451                 elmIframe = _iframe;\r
3452                 elmForm.target = _iframe.name;\r
3453                 elmProgress.innerHTML = '';\r
3454                 instance.onPaneResize( windowW, windowH );\r
3455         }\r
3456         /*\r
3457          * \r
3458          */\r
3459         function clickCancel(){\r
3460                 if( isUploading === true) return false;\r
3461                 pettanr.panelConsole.shutdown();\r
3462                 return false;\r
3463         }\r
3464 \r
3465         /* grobal method */\r
3466         this.rootElement = document.getElementById( 'panel-console-wrapper' );\r
3467         this.displayName = ID;\r
3468         this.ID          = ID;\r
3469         this.MIN_WIDTH   = 320;\r
3470         this.MIN_HEIGHT  = 320;\r
3471         this.init = function(){\r
3472                 instance.jqWrap = jqWrap = $( '#panel-console-wrapper').hide();\r
3473                 $( '#panel-console-post-button').click( clickOK );\r
3474                 $( '#panel-console-cancel-button').click( clickCancel );\r
3475 \r
3476                 delete instance.init;\r
3477         }\r
3478         this.jqWrap = null;\r
3479         this.onOpen = function( w, h ){\r
3480                 instance.init && instance.init();\r
3481                 /*\r
3482                  * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
3483                  */                             \r
3484                 elmScript = document.createElement( 'script');\r
3485                 elmScript.type = 'text\/javascript';\r
3486                 elmScript.src = pettanr.CONST.CREATE_PANEL_JS;\r
3487                 document.body.appendChild( elmScript);\r
3488                 \r
3489                 jqWrap.show();\r
3490 \r
3491                 if( timer === null){\r
3492                         timer = window.setInterval( detectForm, 250 );\r
3493                 }\r
3494                 \r
3495                 elmProgress.innerHTML = 'loading form.';\r
3496                 \r
3497                 instance.onPaneResize( w, h );\r
3498         }\r
3499         this.onPaneResize = function( _windowW, _windowH ){\r
3500                 windowW = _windowW;\r
3501                 windowH = _windowH;\r
3502                 jqWrap.css(\r
3503                         {\r
3504                                 left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
3505                                 top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
3506                         }\r
3507                 );\r
3508         }\r
3509         this.onClose = function(){\r
3510                 elmForm !== null && $( elmContainer.children ).remove();\r
3511                 elmForm = elmIframe = null;\r
3512                 isUploading = false;\r
3513                 \r
3514                 if( elmScript !== null ){\r
3515                         document.body.removeChild( elmScript);\r
3516                         elmScript = null;                                       \r
3517                 }\r
3518                 if( timer !== null){\r
3519                         window.clearInterval( timer);\r
3520                         timer = null;\r
3521                 }\r
3522                 jqWrap.hide();\r
3523         }\r
3524 });\r
3525 \r
3526 pettanr.artistConsole = pettanr.view.registerApplication( function(){\r
3527         var jqWrap, windowW, windowH,\r
3528                 ID = 'artistConsole',\r
3529                 TARGET_FRAME_NAME = 'targetFrameRegisterArtist',\r
3530                 elmContainer = document.getElementById( 'register'),\r
3531                 elmProgress = document.getElementById( 'artist-console-progress'),\r
3532                 timer = null,\r
3533                 elmScript = null,\r
3534                 elmForm = null,\r
3535                 elmIframe = null,\r
3536                 isUploading = false,\r
3537                 instance = this;\r
3538         /*\r
3539          * upload ボタンが押されたらまず iframe をつくる.\r
3540          */\r
3541         function clickOK(){\r
3542                 if( !elmForm || !elmIframe || isUploading === true ) return false;\r
3543                 elmProgress.innerHTML = 'uploading.';\r
3544                 isUploading = true;\r
3545                 submit();\r
3546                 return false;\r
3547         }\r
3548         /*\r
3549          * form の target に iframe を指定したのち submit();\r
3550          */\r
3551                 function submit(){\r
3552                         try {\r
3553                                 elmForm.submit();\r
3554                         } catch( e){\r
3555                                 elmProgress.innerHTML = 'submit() err..';\r
3556                                 isUploading = false;\r
3557                                 setTimeout( clickCancel , 3000);\r
3558                                 return;\r
3559                         }\r
3560                         \r
3561                         if( pettanr.ua.isIE){\r
3562                                 elmIframe.onreadystatechange = detectIframe;\r
3563                         } else {\r
3564                                 elmIframe.onload = onLoad;\r
3565                         }\r
3566                         elmProgress.innerHTML = 'uploading..';\r
3567                 }\r
3568         /*\r
3569          * ie の 場合、readyState をチェック.\r
3570          */\r
3571                         function detectIframe(){\r
3572                     if ( elmIframe.readyState === 'complete') {\r
3573                         elmIframe.onreadystatechange = new Function();\r
3574                         elmIframe.onreadystatechange = null;\r
3575                         onLoad();\r
3576                     }\r
3577                         }\r
3578                                 function onLoad(){\r
3579                                         elmIframe.onload = null;\r
3580                                         ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
3581                                         elmProgress.innerHTML = 'success!';\r
3582                                         setTimeout( clickCancel , 1000);\r
3583                                         isUploading = false;\r
3584                                 }\r
3585         \r
3586         function detectForm(){\r
3587                 elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
3588                 if( elmForm){\r
3589                         var _inputList = elmForm.getElementsByTagName( 'input' ),\r
3590                                 _input;\r
3591                         for( var i=0, l= _inputList.length; i<l; ++i){\r
3592                                 _input = _inputList[ i ];\r
3593                                 if( _input.type === 'submit'){\r
3594                                         _input.style.display = 'none';\r
3595                                 }\r
3596                         }\r
3597                         window.clearInterval( timer);\r
3598                         timer = null;\r
3599                         pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
3600                         elmProgress.innerHTML = 'create iframe';\r
3601                 }\r
3602         }\r
3603         function onCreateIframe( _iframe ){\r
3604                 elmContainer.appendChild( _iframe );\r
3605                 elmIframe = _iframe;\r
3606                 elmForm.target = _iframe.name;\r
3607                 elmProgress.innerHTML = '';\r
3608                 instance.onPaneResize( windowW, windowH );\r
3609         }\r
3610         /*\r
3611          * \r
3612          */\r
3613         function clickCancel(){\r
3614                 if( isUploading === true) return false;\r
3615                 pettanr.artistConsole.shutdown();\r
3616                 return false;\r
3617         }\r
3618 \r
3619         /* grobal method */\r
3620         this.rootElement = document.getElementById( 'artist-console-wrapper' );\r
3621         this.displayName = ID;\r
3622         this.ID          = ID;\r
3623         this.MIN_WIDTH   = 320;\r
3624         this.MIN_HEIGHT  = 320;\r
3625         this.init = function(){\r
3626                 instance.jqWrap = jqWrap = $( '#artist-console-wrapper').hide();\r
3627                 $( '#artist-console-post-button').click( clickOK );\r
3628                 $( '#artist-console-cancel-button').click( clickCancel );\r
3629 \r
3630                 delete instance.init;\r
3631         }\r
3632         this.jqWrap = null;\r
3633         this.onOpen = function( w, h ){\r
3634                 instance.init && instance.init();\r
3635                 /*\r
3636                  * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
3637                  */                             \r
3638                 elmScript = document.createElement( 'script' );\r
3639                 elmScript.type = 'text\/javascript';\r
3640                 elmScript.src = pettanr.CONST.REGISTER_ARTIST_JS;\r
3641                 document.body.appendChild( elmScript );\r
3642                 \r
3643                 jqWrap.show();\r
3644 \r
3645                 if( timer === null){\r
3646                         timer = window.setInterval( detectForm, 250 );\r
3647                 }\r
3648                 \r
3649                 elmProgress.innerHTML = 'loading form.';\r
3650                 \r
3651                 instance.onPaneResize( w, h );\r
3652         }\r
3653         this.onPaneResize = function( _windowW, _windowH ){\r
3654                 windowW = _windowW;\r
3655                 windowH = _windowH;\r
3656                 jqWrap.css(\r
3657                         {\r
3658                                 left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
3659                                 top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
3660                         }\r
3661                 );\r
3662         }\r
3663         this.onClose = function(){\r
3664                 elmForm !== null && $( elmContainer.children ).remove();\r
3665                 elmForm = elmIframe = null;\r
3666                 isUploading = false;\r
3667                 \r
3668                 if( elmScript !== null ){\r
3669                         document.body.removeChild( elmScript);\r
3670                         elmScript = null;                                       \r
3671                 }\r
3672                 if( timer !== null){\r
3673                         window.clearInterval( timer);\r
3674                         timer = null;\r
3675                 }\r
3676                 jqWrap.hide();\r
3677         }\r
3678 });\r
3679 \r
3680 pettanr.outputConsole = pettanr.view.registerApplication( function(){\r
3681         var jqWrap, jqOutputArea,\r
3682                 ID = 'outputConsole',\r
3683                 instance = this;\r
3684         //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
3685         \r
3686         function clickOK(){\r
3687                 pettanr.overlay.hide();\r
3688                 pettanr.outputConsole.shutdown();\r
3689         }\r
3690         \r
3691         /* grobal method */\r
3692         this.rootElement = document.getElementById( 'output-console-wrapper' );\r
3693         this.displayName = ID;\r
3694         this.ID          = ID;\r
3695         \r
3696         this.MIN_WIDTH   = 320;\r
3697         this.MIN_HEIGHT  = 320;\r
3698         this.init = function(){\r
3699                 instance.jqWrap = jqWrap = $( '#output-console-wrapper').hide();\r
3700                 jqOutputArea = $( '#output-area');\r
3701                 delete instance.init;\r
3702         }\r
3703         this.jqWrap = null;\r
3704         this.onOpen = function( _w, _h, _text ){\r
3705                 instance.init && instance.init();\r
3706                 \r
3707                 jqWrap.show();\r
3708                 instance.onWindowResize( _w, _h );\r
3709                 jqOutputArea.val( _text).focus();\r
3710         }\r
3711         this.onWindowResize = function( _w, _h){\r
3712                 jqWrap.css(\r
3713                         {\r
3714                                 left:   Math.floor( ( _w -jqWrap.width()) /2),\r
3715                                 top:    Math.floor( ( _h -jqWrap.height()) /2)\r
3716                         }\r
3717                 );\r
3718         }\r
3719         this.onClose = function(){\r
3720                 jqWrap.hide();\r
3721                 jqOutputArea.val('');\r
3722         }\r
3723 });\r