OSDN Git Service

pettanR version0.4.28
authoritozyun <itozyun@git.sourceforge.jp>
Wed, 2 May 2012 15:03:27 +0000 (00:03 +0900)
committeritozyun <itozyun@git.sourceforge.jp>
Wed, 2 May 2012 15:03:27 +0000 (00:03 +0900)
17 files changed:
0.4.x/javascripts/common.js
0.4.x/javascripts/system.js
0.4.x/javascripts/work.js
0.4.x/js/create_new_comic.js
0.4.x/stylesheets/common.css
0.4.x/stylesheets/work.css
0.4.x/test/activex.html
0.4.x/test/comic-html-structure.html
0.4.x/test/dynamic-comic-html.html [new file with mode: 0644]
0.4.x/test/flip.svg
0.4.x/test/index.html
0.4.x/test/pettanr.xsl
0.4.x/test/svg.html
0.4.x/test/transform.html
0.4.x/test/type.html
0.4.x/test/vertical-center.html [new file with mode: 0644]
0.4.x/work.html

index 744cd38..41d9bb2 100644 (file)
@@ -1,16 +1,16 @@
 /*\r
  * pettanR common.js\r
- *   version 0.4.15\r
+ *   version 0.4.28\r
  * \r
  * author: itozyun\r
  */\r
 \r
 /*\r
- * http://pettanr.sourceforge.jp/test/type.html
+ * http://pettanr.sourceforge.jp/test/type.html\r
  */\r
        var Type = {\r
                isObject : function(v) {\r
-                       return typeof v === 'object';\r
+                       return v !== null && Type.isArray(v) === false && typeof v === 'object';\r
                },\r
                isFunction : function(v) {\r
                        return typeof v === 'function';\r
@@ -105,10 +105,10 @@ var pettanr = ( function(){
                    }\r
                    return {};\r
                })(),\r
-               IS_DEBUG = typeof URL_PARAMS.debug === 'boolean' ? URL_PARAMS.debug : IS_LOCAL === true,\r
+               IS_DEBUG = Type.isBoolean( URL_PARAMS.debug ) ? URL_PARAMS.debug : IS_LOCAL === true,\r
                jqWindow , jqDocument , jqBody;\r
        return {\r
-               version: '0.4.13',\r
+               version: '0.4.28',\r
                init: function(){\r
                        jqWindow = $( window);\r
                        jqDocument = $( document);\r
@@ -118,7 +118,7 @@ var pettanr = ( function(){
                                _fn;\r
                        for( var i=0; i<l; i++){\r
                                _fn = FUNCTION_ARRAY[ i];\r
-                               _fn.init && _fn.init( _fn === pettanr.view ? FUNCTION_ARRAY : undefined);\r
+                               _fn.init && _fn.init( _fn === pettanr.view ? FUNCTION_ARRAY : undefined );\r
                        }\r
                        \r
                        delete pettanr.init;\r
@@ -221,7 +221,7 @@ pettanr.util = ( function(){
                        }\r
                        var i, l, _children = _elm.childNodes, _array = [];\r
                        if( _children && typeof _children.length === 'number'){\r
-                               // liveNode > array\r
+                               // liveNode > array\r
                                for( i=0, l=_children.length; i<l; ++i){\r
                                        _array.push( _children[ i ] );\r
                                }\r
@@ -316,7 +316,6 @@ pettanr.util = ( function(){
                        } else {\r
                                parentElm && parentElm.appendChild( img);\r
                        }\r
-                       return size;\r
                        \r
                /* LICENSE: MIT\r
                 * AUTHOR: uupaa.js@gmail.com\r
@@ -359,114 +358,8 @@ pettanr.util = ( function(){
                                // HTMLCanvasElement\r
                                return { width: image.width, height: image.height };\r
                        }\r
-               },\r
-               loadImage: function( URLorELM, onLoad, onError, delay, timeout){\r
-                       delay = delay || 250;\r
-                       timeout = timeout || 5000;\r
-                       var type = typeof URLorELM,\r
-                               img, images, src, abstractPath;\r
-                       if( type === 'string'){\r
-                               src = URLorELM;\r
-                               // images = [];\r
-                       } else\r
-                       // http://d.hatena.ne.jp/hottolinkblog/20090228/1235823487\r
-                       if( type === 'object' && typeof URLorELM.hspace !== 'undefined' && typeof URLorELM.vspace !== 'undefined'){\r
-                               img = URLorELM;\r
-                               images = [ img];\r
-                               src = img.src;\r
-                       } else {\r
-                               return;\r
-                       }\r
-                       abstractPath = this.getAbsolutePath( src);\r
-                       \r
-                       loadImage( images, abstractPath, onLoadAsync, onErrorAsync, delay, timeout);\r
                        \r
-                       function onLoadAsync( abspath, actualW, actualH){\r
-                               if( abstractPath !== abspath) return;\r
-                               var _g_onUpdateFunction = pettanr.util.createGlobalFunction( onLoad);\r
-                                       _onTimeout = pettanr.util.createGlobalFunc( [\r
-                                               'function(){',\r
-                                                       'window["', _g_onUpdateFunction, '"]( "', abspath, '", ', actualW, ',  ', actualH, ');',\r
-                                                       'window["', _g_onUpdateFunction, '"] = null;',\r
-                                               '}'\r
-                                       ].join( ''));\r
-                               onLoad && setTimeout( window[ _onTimeout], 0);\r
-                               window[ _onTimeout] = null;\r
-                       }\r
-                       function onErrorAsync( abspath){\r
-                               if( abstractPath !== abspath) return;\r
-                               var _g_onUpdateFunction = pettanr.util.createGlobalFunction( onError);\r
-                                       _onTimeout = pettanr.util.createGlobalFunc( [\r
-                                               'function(){',\r
-                                                       'window["', _g_onUpdateFunction, '"]( "', abspath, '");',\r
-                                                       'window["', _g_onUpdateFunction, '"] = null;',\r
-                                               '}'\r
-                                       ].join( ''));\r
-                               onError && setTimeout( window[ _onTimeout], 0);\r
-                               window[ _onTimeout] = null;\r
-                       }\r
-                       \r
-               /*  LICENSE: MIT?\r
-                *  URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631\r
-                *  AUTHOR: uupaa.js@gmail.com\r
-                * \r
-                *  fixed for ie6-8 by pettanr\r
-                *   new Image -> document.createElement( 'img')\r
-                */\r
-                       function loadImage( images, abspath, onLoad, onError, delay, timeout) {\r
-                               images = images || document.images;\r
-                               var img,\r
-                                       i = 0, l = images.length,\r
-                                       tick = 0;\r
-                               for(; i < l; ++i) {\r
-                                       img = images[i];\r
-                                       if ( img.src === abspath && img.complete) {\r
-                                               var size = pettanr.util.getImageSize( img);\r
-                                               onLoad( abspath, size.width, size.height);\r
-                                               return;\r
-                                       }\r
-                               }\r
-                               img = document.createElement( 'img'); //var img = new Image(); ではieでimgのsizeが取れない、、、removeChildも失敗し、imgSizeGetterにimgが残る\r
-                               img.finish = false;\r
-                               img.onabort = img.onerror = function() {\r
-                                       if (img.finish) { return; }\r
-                                       img.finish = true;\r
-                                       onError(abspath);\r
-                                       img.onload = img.onabort = img.onerror = "";\r
-                               };\r
-                               img.onload  = function() {\r
-                                       img.finish = true;\r
-                                       if (window.opera && !img.complete) {\r
-                                               onError(abspath);\r
-                                               img.onload = img.onabort = img.onerror = "";\r
-                                               return;\r
-                                       }\r
-                                       var size = pettanr.util.getImageSize( img);\r
-                                       onLoad( abspath, size.width, size.height);\r
-                                       img.onload = img.onabort = img.onerror = "";\r
-                                       //img = void 0;\r
-                               };\r
-                               img.src = abspath;\r
-                               if (!img.finish && timeout) {\r
-                                       setTimeout(function() {\r
-                                               if (img.finish) { return; }\r
-                                               if (img.complete) {\r
-                                                       img.finish = true;\r
-                                                       if (img.width) { return; }\r
-                                                       onError(abspath);\r
-                                                       img.onload = img.onabort = img.onerror = "";\r
-                                                       return;\r
-                                               }\r
-                                               if ((tick += delay) > timeout) {\r
-                                                       img.finish = true;\r
-                                                       onError(abspath);\r
-                                                       img.onload = img.onabort = img.onerror = "";\r
-                                                       return;\r
-                                               }\r
-                                               setTimeout(arguments.callee, delay);\r
-                                       }, 0);\r
-                               }\r
-                       }\r
+                       return size;\r
                },\r
                getAbsolutePath: function( path) {\r
                        var e = document.createElement("div");\r
@@ -511,7 +404,7 @@ pettanr.util = ( function(){
                        return ret;\r
                },\r
                getChildIndex: function( _parent, _child){\r
-                       var _children = _parent.getElementsByTagName( _child.tagName),\r
+                       var _children = _parent.getElementsByTagName( _child.tagName ),\r
                                l = _children.length;\r
                        for(var i=0; i<l; ++i){\r
                                if( _children[ i] === _child) return i;\r
@@ -537,7 +430,7 @@ pettanr.util = ( function(){
                        }\r
                },\r
                getIndex: function( _array, _element){\r
-                       if( Array.prototype.indexof){\r
+                       if( Array.prototype.indexof ){\r
                                pettanr.util.getIndex = function( _array, _element){\r
                                        return _array.indexof( _element);\r
                                }\r
@@ -551,6 +444,13 @@ pettanr.util = ( function(){
                        }\r
                        return pettanr.util.getIndex( _array, _element);\r
                },\r
+               copyArray: function( _array ){\r
+                       var ret = new Array( l );\r
+                       for(var i=0, l = _array.length; i<l; ++i){\r
+                               ret[ i ] = _array[ i ];\r
+                       }\r
+                       return ret;\r
+               },\r
                /*\r
                 * \r
                 */\r
@@ -765,7 +665,13 @@ pettanr.ua = ( function(){
 pettanr.CONST = ( function(){\r
        var isLocal = pettanr.LOCAL === true || pettanr.URL_PARAMS.exjson === false,\r
                isLocalhost = document.location.href.indexOf( 'http:\/\/localhost:3000\/' ) === 0,\r
-               PETTANR_ROOT_PATH = isLocalhost === true ? 'http:\/\/localhost:3000\/' : 'http:\/\/pettanr.heroku.com\/';\r
+               PETTANR_ROOT_PATH = isLocalhost === true ? 'http:\/\/localhost:3000\/' : 'http:\/\/pettanr.heroku.com\/',\r
+               location = document.location.pathname,\r
+               deep =  location.indexOf( '\/diary\/' ) !== -1 ||\r
+                               location.indexOf( '\/test\/' ) !== -1 ||\r
+                               location.indexOf( '\/help\/' ) !== -1 ||\r
+                               location.indexOf( '\/sitemap\/' ) !== -1 ||\r
+                               location.indexOf( '\/wiki\/' ) !== -1;\r
                \r
        return {\r
                PETTANR_ROOT_PATH:                      PETTANR_ROOT_PATH,\r
@@ -774,7 +680,7 @@ pettanr.CONST = ( function(){
                URL_COMICS_JSON:                        ( isLocal === true ? 'json\/' : PETTANR_ROOT_PATH) + 'comics.json',\r
                URL_PANELS_JSON:                        ( isLocal === true ? 'json\/' : PETTANR_ROOT_PATH) + 'panels.json',\r
                NS_PETTANR_COMIC:                       'pettanr-comic',\r
-               RESOURCE_PICTURE_PATH:          ( isLocal === true ? pettanr.ROOT_PATH : PETTANR_ROOT_PATH) + 'resource_pictures\/',\r
+               RESOURCE_PICTURE_PATH:          ( isLocal === true ? ( deep === true ? '..\/' : '' ) : PETTANR_ROOT_PATH ) + 'resource_pictures\/',\r
                CREATE_COMIC_JS:                        isLocal === true ? 'js\/create_new_comic.js' : PETTANR_ROOT_PATH + 'comics\/new.js',\r
                CREATE_PANEL_JS:                        isLocal === true ? 'js\/create_new_panel.js' : PETTANR_ROOT_PATH + 'panels\/new.js',\r
                UPLOAD_PICTURE_JS:                      isLocal === true ? 'js\/upload_picture.js' : PETTANR_ROOT_PATH + 'original_pictures\/new.js',\r
@@ -787,15 +693,16 @@ pettanr.view = ( function(){
        /* create iframe overlay for user console */\r
        var location = document.location.pathname,\r
                isWorkPage =    document.location.href.indexOf( 'http:\/\/localhost:3000\/' ) === 0 ||\r
-                                               location.indexOf( pettanr.CONST.PETTANR_ROOT_PATH ) === 0 ||\r
-                                               location.indexOf( '\/work.html') !== -1,\r
+                                               document.location.href.indexOf( pettanr.CONST.PETTANR_ROOT_PATH ) === 0 ||\r
+                                               location.indexOf( '\/work.html') !== -1 ||\r
+                                               location.indexOf( '\work.html') !== -1, // for ie6\r
                deep =  location.indexOf( '\/diary\/') !== -1 ||\r
                                location.indexOf( '\/test\/') !== -1 ||\r
                                location.indexOf( '\/help\/') !== -1 ||\r
                                location.indexOf( '\/sitemap\/') !== -1 ||\r
                                location.indexOf( '\/wiki\/') !== -1,\r
                LoginUserNavi;\r
-       \r
+\r
        if( isWorkPage === false){\r
                LoginUserNavi = {\r
                        show: function(){\r
@@ -813,76 +720,13 @@ pettanr.view = ( function(){
                LoginUserNavi = {\r
                        show: function(){\r
                                var i = pettanr.util.getChildIndex( this.parentNode, this );\r
-                               i !== -1 && pettanr.view.show( i );\r
+                               i !== -1 && bootApplication( i );\r
                                return false;\r
                        },\r
                        hide: function(){}\r
                }\r
-               \r
-               if( pettanr.DEBUG === true){\r
-                       var elmDl = document.getElementById( 'useragent'),\r
-                               elmDt, elmDd,\r
-                               data = {\r
-                                       pettanR:        pettanr.version,\r
-                                       ua:                     navigator.userAgent,\r
-                                       platform:       navigator.platform,\r
-                                       appVersion:     navigator.appVersion,\r
-                                       appCodeName:navigator.appCodeName,\r
-                                       appName:        navigator.appName,\r
-                                       language:       navigator.browserLanguage || navigator.language,\r
-                                       ActiveX:        pettanr.ua.ACTIVEX\r
-                               },\r
-                               ua = pettanr.ua;\r
-                       if( ua.IE){\r
-                               //data.ua = 'Internet Explorer';\r
-                               data.version = ua.IE;\r
-                               if( ua.ieVersion >= 8) data.RenderingVersion = ua.ieRenderingVersion;\r
-                               data.browserType = ua.STANDALONE === true ? 'Standalone' : 'bundle';\r
-                               if( ua.ieVersion < 9) {\r
-                                       data.vml = ua.VML;\r
-                               } else {\r
-                                       data.svg = ua.SVG;\r
-                               }\r
-                       }\r
-                       data.RenderingMode = ua.isStanderdMode === true ? 'Standerd' : 'Quirks';\r
-                       \r
-                       for( var key in data){\r
-                               elmDt = document.createElement( 'dt');\r
-                               elmDt.innerHTML = key;\r
-                               elmDd = document.createElement( 'dd');\r
-                               elmDd.innerHTML = '' + data[ key];\r
-                               if( !data[ key]) elmDd.style.color = 'red';\r
-                               elmDl.appendChild( elmDt);\r
-                               elmDl.appendChild( elmDd);\r
-                       }\r
-               } else {\r
-                       var _debug = document.getElementById( 'debug');\r
-                       if( _debug){\r
-                               pettanr.util.removeAllChildren( _debug);\r
-                               _debug.parentNode.removeChild( _debug);\r
-                       }\r
-               }\r
        }\r
 \r
-       /* global-navi */\r
-       var navi = document.getElementById('global-navi'),\r
-               origin = document.createElement('a'),\r
-               items = ( function(){\r
-                       var ret = ['Home', 'Comic list', 'Picture', 'Setting'];\r
-                       pettanr.DEBUG === true && ret.push( 'debug');\r
-                       return ret;\r
-               })(),\r
-               item;\r
-       origin.href = '#';\r
-       for(var i=0, l = items.length; i<l; ++i){\r
-               item = origin.cloneNode( true);\r
-               item.appendChild( document.createTextNode( items[ i]) );\r
-               item.onclick = LoginUserNavi.show;\r
-               navi.appendChild( item);\r
-       }\r
-       navi.style.width = ( ( item.offsetWidth || 80) * l) +'px';\r
-       location = origin = item = null;\r
-       \r
        /* debug info */\r
        // ua version, lang, os, plugin ( vml, svg), standerdmode, balloon, rimg\r
 \r
@@ -894,69 +738,11 @@ pettanr.view = ( function(){
  */\r
 \r
        var jqWindow,\r
-               funcArray,\r
-               HOME_ID = 'entrance',\r
-               VIEW_ID_ARRAY = [ HOME_ID, 'cabinet', 'gallery', 'backyard'],\r
-               elmCurrent,\r
-               currentView,\r
-               currentID = ( function( _view){\r
-                       var _viewID;\r
-                       \r
-                       if( typeof _view === 'number' && _view < VIEW_ID_ARRAY.length){\r
-                               _viewID = VIEW_ID_ARRAY[ _view];\r
-                       } else\r
-                       if( typeof _view === 'string'){\r
-                               _viewID = _view;\r
-                       } else {\r
-                               _viewID = HOME_ID;\r
-                       }\r
-\r
-                       if( document.getElementById( _viewID)){\r
-                               return _viewID;\r
-                       }\r
-                       return HOME_ID;\r
-               })( pettanr.URL_PARAMS.view);\r
-       \r
-       pettanr.DEBUG === true && VIEW_ID_ARRAY.push( 'debug');\r
-       \r
-       open();\r
-       \r
-       function onWindowResize(){\r
-               var _fn,\r
-                       l = funcArray.length,\r
-                       w = jqWindow.width(),\r
-                       h = jqWindow.height();\r
-               currentView && currentView.onWindowResize && currentView.onWindowResize( w, h);\r
-               pettanr.overlay.currentID !== null && pettanr.overlay.onWindowResize( w, h);\r
-       }\r
-       function open( _option ){\r
-               if( isWorkPage === false) return;\r
-               \r
-               var _elm = document.getElementById( currentID);\r
-               if( elmCurrent) elmCurrent.style.display = 'none';\r
-               _elm.style.display = 'block';\r
-               elmCurrent = _elm;\r
-               \r
-               var     nodesA = navi.getElementsByTagName( 'a') || [],\r
-                       l = nodesA.length,\r
-                       _a;\r
-               for(var i=0; i<l; ++i){\r
-                       if( nodesA[ i]){\r
-                               nodesA[ i].className = VIEW_ID_ARRAY[ i] === currentID ? 'current' : '';\r
-                       }\r
-               }\r
-               \r
-               if( !pettanr.view || pettanr.view.init !== undefined) return;\r
-               typeof currentView.onClose === 'function' && currentView.onClose();\r
-               currentView = pettanr[ currentID ];\r
-               typeof currentView.onOpen === 'function' && currentView.onOpen( jqWindow.width(), jqWindow.height(), _option );\r
-               // setTimeout( onWindowResize, 0);\r
-       }\r
+               APPLICATION_LIST = [],\r
+               LUNCHER_APPLICATION_LIST = [],\r
+               currentApplication = null;\r
        \r
        var AbstractBasicPane = function(){\r
-               this.rootElement = null;\r
-               this.onOpen = function( _w, _h, _option ){};\r
-               this.onClose = function(){ return true; } // false の場合、close の拒否 \r
                this.onPaneResize = function( _w, _h ){}\r
                this.resize = function( _w, _h ){\r
                        if( this.MIN_WIDTH > _w || this.MIN_HEIGHT > _h ){\r
@@ -970,51 +756,206 @@ pettanr.view = ( function(){
                this.MIN_WIDTH = 240;\r
                this.MIN_HEIGHT = 240;\r
        }\r
+       \r
        var AbstractApplication = function(){\r
-               this.prototype = new AbstractBasicPane();\r
+               this.displayName = 'app name';\r
+               this.ID = 'app id';\r
+               this.rootElement = null;\r
+               this.parentElement = null;\r
+               this.nextSibling = null;\r
+               this.open = function( _w, _h /*, _option */ ){\r
+                       if( this.MIN_WIDTH > _w || this.MIN_HEIGHT > _h ){\r
+                               if( Type.isHTMLElement( this.rootElement ) === true ){\r
+                                       // 小さすぎる!、と表示\r
+                               }\r
+                       }\r
+                       if( arguments.length > 2){\r
+                               // argumentsRellay( this.onOpen, arguments );\r
+                               this.onOpen.apply( this, arguments );\r
+                       } else {\r
+                               this.onOpen( _w, _h );\r
+                       }\r
+               }\r
+               this.close = function(){\r
+                       if( this.onClose() === false ){\r
+                               return false;\r
+                       }\r
+               }\r
+               this.onOpen = function( _w, _h /*, _option */ ){\r
+                       // overrride\r
+               };\r
+               this.onClose = function(){\r
+                       // overrride\r
+                       return true;\r
+               } // false の場合、close の拒否 \r
+       }\r
+       AbstractApplication.prototype = new AbstractBasicPane();\r
+       \r
+       var ApplicationReference = function( application ){\r
+               this.inOverlay = false;\r
+               this.getUID = function(){\r
+                       return pettanr.util.getIndex( APPLICATION_LIST, application );\r
+               }\r
+               this.boot = function( /* _option */ ){\r
+                       if( arguments.length > 0 ){\r
+                               bootApplication( application, pettanr.util.copyArray( arguments ) );\r
+                       } else {\r
+                               bootApplication( application );\r
+                       }\r
+               }\r
+               this.bootInOverlay = function( /* _option */ ){\r
+                       this.inOverlay = true;\r
+                       pettanr.overlay.show( application, pettanr.util.copyArray( arguments ) );\r
+               }\r
+               this.shutdown = function(){\r
+                       if( this.inOverlay === true ){\r
+                               pettanr.overlay.hide();\r
+                               this.inOverlay = false;\r
+                       } else {\r
+                               bootApplication( 0 );\r
+                       }\r
+               }\r
+               this.addToLancher = function(){\r
+                       if( pettanr.util.getIndex( LUNCHER_APPLICATION_LIST, application ) !== -1 ) return;\r
+                       LUNCHER_APPLICATION_LIST.push( application );\r
+       \r
+                       var navi = document.getElementById('global-navi'),\r
+                               item = document.createElement('a');\r
+                       navi.appendChild( item );\r
+                       navi.style.width = ( ( item.offsetWidth || 80 ) * LUNCHER_APPLICATION_LIST.length ) + 'px';\r
+                       item.href = '#';\r
+                       item.appendChild( document.createTextNode( application.displayName ));\r
+                       item.onclick = LoginUserNavi.show;\r
+               }\r
+       }\r
+\r
+       function bootApplication( APPLICATIONorINDEX, _arguments ){\r
+               if( isWorkPage === false ) return;\r
+\r
+               var _application,\r
+                       i, j, l, \r
+                       nodesA = document.getElementById('global-navi').getElementsByTagName( 'a') || [],\r
+                       _index = -1;\r
+               if( typeof APPLICATIONorINDEX === 'number' && APPLICATIONorINDEX < LUNCHER_APPLICATION_LIST.length){\r
+                       _application = LUNCHER_APPLICATION_LIST[ APPLICATIONorINDEX ];\r
+               } else\r
+               if( typeof APPLICATIONorINDEX === 'string' ){\r
+                       for( i=0, l=LUNCHER_APPLICATION_LIST.length; i<l; ++i ){\r
+                               if( APPLICATIONorINDEX === APPLICATION_LIST[ i ].ID ){\r
+                                       _application = APPLICATION_LIST[ i ];\r
+                                       break;\r
+                               }\r
+                       }\r
+               } else\r
+               if( pettanr.view.isApplicationInstance( APPLICATIONorINDEX ) === true ){\r
+                       _application = APPLICATIONorINDEX;\r
+               } else\r
+               if( !currentApplication ){\r
+                       _application = LUNCHER_APPLICATION_LIST[ 0 ];\r
+               } else {\r
+                       return;\r
+               }\r
+               \r
+               if( !_application ) return;\r
+               \r
+               for( i=0, l=LUNCHER_APPLICATION_LIST.length; i<l; ++i ){\r
+                       if( _application === LUNCHER_APPLICATION_LIST[ i ] ){\r
+                               for( j=0, l=nodesA.length; j<l; ++j ){\r
+                                       nodesA[ j ].className = i === j ? 'current' : '';\r
+                               }                                       \r
+                               break;\r
+                       }\r
+               }\r
+               \r
+               if( currentApplication === _application ) return;\r
+               if( currentApplication ){\r
+                       currentApplication.close();\r
+                       currentApplication.rootElement && currentApplication.rootElement.parentNode &&\r
+                               currentApplication.rootElement.parentNode.removeChild( currentApplication.rootElement );\r
+               }\r
+                       \r
+               currentApplication = _application;\r
+               \r
+               if( _application.nextSibling && _application.nextSibling.parentNode === _application.parentElement ){\r
+                       _application.parentElement.insertBefore( _application.rootElement, _application.nextSibling );\r
+               } else\r
+               if( _application.parentElement ){\r
+                       _application.parentElement.appendChild( _application.rootElement );\r
+               } else {\r
+                       _application.rootElement && document.body.appendChild( _application.rootElement );\r
+               }\r
+                       \r
+               if( _arguments ){\r
+                       _arguments.unshift( jqWindow.width(), jqWindow.height() );\r
+                       _application.open.apply( _application, _arguments );\r
+                       // argumentsRellay( _application.open, _arguments );\r
+               } else {\r
+                       _application.open( jqWindow.width(), jqWindow.height() );\r
+               }\r
+               pettanr.view.currentID = _application.ID;\r
+       }\r
+       \r
+       function argumentsRellay( _method, _arguments ){\r
+               alert( typeof _method )\r
+               l = _arguments.length;\r
+               if( l > 0 ){\r
+                       var _arg = [];\r
+                       for( i=0; i<l; ++i ){\r
+                               _arg.push( 'a[' + i + ']' );\r
+                       }\r
+                       window['_method'] = _method;\r
+                       //eval( '_method(' + _arg.join(',') + ')' );\r
+                       var f = new Function( 'a', '_method(' + _arg.join(',') + ')' );\r
+                       f( _arguments );\r
+                       window['_method'] = undefined;\r
+               } else {\r
+                       _method();\r
+               }               \r
        }\r
        \r
+       function onWindowResize(){\r
+               var w = jqWindow.width(),\r
+                       h = jqWindow.height();\r
+               currentApplication && currentApplication.resize( w, h );\r
+               pettanr.overlay.onWindowResize( w, h );\r
+               pettanr.form.onWindowResize( w, h );\r
+       }\r
+\r
        return {\r
-               init: function( _funcArray){\r
-                       funcArray = _funcArray;\r
+               init: function( _funcArray ){\r
                        jqWindow = pettanr.jqWindow();\r
-                       jqWindow.resize( onWindowResize);\r
+                       jqWindow.resize( onWindowResize );\r
                        \r
-                       currentView = currentView || pettanr[ currentID ];\r
                        var _option = {}; // urlパラメータ\r
-                       currentView && typeof currentView.onOpen === 'function' && currentView.onOpen( jqWindow.width(), jqWindow.height(), _option );\r
                        \r
-                       // setTimeout( onWindowResize, 100);\r
+                       onWindowResize();\r
+                       \r
+                       bootApplication( pettanr.URL_PARAMS.view || 0 );\r
                        \r
                        delete pettanr.view.init;\r
                },\r
-               show: function( _viewID ){\r
-                       if( typeof _viewID === 'number' && _viewID < VIEW_ID_ARRAY.length){\r
-                               _viewID = VIEW_ID_ARRAY[ _viewID];\r
-                       } else\r
-                       if( typeof _viewID === 'string'){\r
-                               _viewID = _viewID;\r
-                       } else {\r
-                               _viewID = HOME_ID;\r
-                       }\r
-                       for( var key in pettanr.view){\r
-                               if( pettanr.view[ key] === _viewID){\r
-                                       if( currentID !== _viewID && document.getElementById( _viewID)){\r
-                                               this.currentID = currentID = _viewID;\r
-                                               open();\r
-                                       }\r
-                                       return;\r
-                               }\r
-                       }\r
-                       alert( _viewID);\r
+               createBasicPane: function( _class, _options ){\r
+                       _class.prototype = new AbstractBasicPane();\r
+                       return new _class( _options );\r
                },\r
-               registerAsBasicPane: function( _basicPane ){\r
-                       if( pettanr.view.isBasicPaneInstance( _basicPane ) === true ) return;\r
-                       _basicPane.prototype = new AbstractBasicPane();\r
+               _getAbstractApplication: function(){\r
+                       return new AbstractApplication();\r
                },\r
-               registerApplication: function( _application ){\r
-                       if( pettanr.view.isApplicationInstance( _application ) === true ) return;\r
-                       _application.prototype = new AbstractApplication();\r
+               registerApplication: function( _class, _options ){\r
+                       _class.prototype = new AbstractApplication();\r
+                       _application = new _class( _options );\r
+                       \r
+                       var elm = _application.rootElement;\r
+                       if( Type.isHTMLElement( elm ) === false ) return null;\r
+                        \r
+                       _application.parentElement = elm.parentNode;\r
+                       _application.nextSibling = elm.nextSibling;\r
+                       \r
+                       if( elm.parentNode ){\r
+                               elm.parentNode.removeChild( elm );\r
+                       }\r
+                       APPLICATION_LIST.push( _application );\r
+                       return new ApplicationReference( _application );\r
                },\r
                isBasicPaneInstance: function( _basicPane ){\r
                        return  _basicPane instanceof AbstractBasicPane;\r
@@ -1022,12 +963,10 @@ pettanr.view = ( function(){
                isApplicationInstance: function( _application ){\r
                        return _application instanceof AbstractApplication;\r
                },\r
-               currentID:      currentID,\r
-               HOME:           HOME_ID,\r
-               COMICS:         VIEW_ID_ARRAY[ 1],\r
-               IMAGES:         VIEW_ID_ARRAY[ 2],\r
-               SETTING:        VIEW_ID_ARRAY[ 3],\r
-               DEBUG:          VIEW_ID_ARRAY[ 4],\r
+               isApplicationReference: function( _reference ){\r
+                       return _reference instanceof ApplicationReference;\r
+               },\r
+               currentID:      null,\r
                EDITOR:         'editor',\r
                OVERLAY:        'overlay'\r
        }\r
@@ -1035,88 +974,96 @@ pettanr.view = ( function(){
 \r
 pettanr.overlay = ( function(){\r
        var SHADOW_OPACITY = 0.5,\r
+               ELM_CONTAINER = document.getElementById( 'overlay-container' ),\r
                jqConteiner, jqShadow, jqCloseButton,// jqBody, \r
                currentOverlay = null,\r
+               bootParams = null,\r
                visible = false,\r
                windowW, windowH;\r
 \r
-       function close(){\r
-               currentOverlay && currentOverlay.onClose && currentOverlay.onClose();\r
-               pettanr.overlay.hide();         \r
-       }\r
        function asyncResize(){\r
-               currentOverlay.onWindowResize( windowW, windowH);\r
+               currentOverlay.resize( windowW, windowH );\r
        }\r
        function onCloseClick( e){\r
-               close();\r
+               pettanr.overlay.hide();\r
                e.preventDefault();\r
                return false;           \r
        }\r
+       function onFadeInComplete(){\r
+\r
+       }\r
+       function onFadeOutComplete(){\r
+               currentOverlay.close();\r
+               currentOverlay.rootElement.style.display = 'none';\r
+               currentOverlay.rootElement.style.visibility = 'hidden';\r
+               currentOverlay = null;  \r
+       }\r
        return {\r
                init: function(){\r
                        //jqBody = pettanr.jqBody();\r
                        jqConteiner = $( '#overlay-container');\r
                        jqShadow = $( '#overlay-shadow');\r
-                       jqCloseButton = $( '#overlay-close-button').click( onCloseClick);\r
+                       jqCloseButton = $( '#overlay-close-button').click( onCloseClick );\r
                        \r
-                       pettanr.key.addKeyDownEvent( pettanr.view.OVERLAY, 27, false, false, close); // 27.esc\r
+                       pettanr.key.addKeyDownEvent( pettanr.view.OVERLAY, 27, false, false, pettanr.overlay.hide ); // 27.esc\r
                        \r
                        delete pettanr.overlay.init;\r
                },\r
-               show: function( _currentOverlay){\r
-                       if( visible === true && currentOverlay === _currentOverlay) return;\r
+               show: function( _overlay, _bootParams ){\r
+                       if( visible === true && currentOverlay === _overlay ) return;\r
+                       if( pettanr.view.isApplicationInstance( _overlay ) === false ) return;\r
+                       \r
                        document.body.style.overflow = 'hidden';\r
+                       \r
+                       this.visible = visible = true;\r
+                       this.currentID = _overlay.ID;\r
+                       currentOverlay = _overlay;\r
+                       bootParams = _bootParams;\r
+\r
                        jqConteiner.stop().css( {\r
                                filter:         '',\r
                                opacity:        '',\r
                                top:            document.documentElement.scrollTop || document.body.scrollTop\r
-                       }).fadeIn();\r
-                       this.visible = visible = true;\r
-                       currentOverlay = _currentOverlay;\r
-                       this.currentID = _currentOverlay.ID;\r
-                       jqCloseButton.toggle( !!_currentOverlay.onClose);\r
+                       }).fadeIn( onFadeInComplete );\r
+                       \r
+                       currentOverlay.rootElement.style.display = '';\r
+                       currentOverlay.rootElement.style.visibility = 'visible';\r
+                       \r
+                       ELM_CONTAINER.insertBefore( currentOverlay.rootElement, document.getElementById( 'overlay-close-button' ));\r
+       \r
+                       if( Type.isArray( bootParams ) === true ){\r
+                               bootParams.unshift( windowW, windowH )\r
+                               currentOverlay.open.apply( currentOverlay, bootParams );\r
+                       } else {\r
+                               currentOverlay.open( windowW, windowH, bootParams );\r
+                       }\r
                },\r
                hide: function(){\r
-                       currentOverlay = null;\r
                        if( visible === false) return;\r
                        document.body.style.overflow = '';\r
+                       \r
                        jqConteiner.stop().css( {\r
                                filter:         '',\r
                                opacity:        ''\r
-                       }).fadeOut();\r
+                       }).fadeOut( onFadeOutComplete );\r
                        this.visible = visible = false;\r
                        this.currentID = null;\r
                },\r
                visible: visible,\r
                currentID: null,\r
-               onWindowResize: function( _windowW, _windowH){\r
+               onWindowResize: function( _windowW, _windowH ){\r
+                       windowW = _windowW;\r
+                       windowH = _windowH;                     \r
+                       \r
+                       if( currentOverlay === null ) return;\r
+                       \r
                        jqConteiner.css({\r
                                height:         _windowH,\r
                                top:            document.documentElement.scrollTop || document.body.scrollTop\r
                        });\r
-                       jqShadow.css( { height: _windowH});\r
-                       windowW = _windowW;\r
-                       windowH = _windowH;\r
+                       jqShadow.css( { height: _windowH });\r
                        // 先にeditorのcanvasを確定する。\r
-                       currentOverlay && currentOverlay.onWindowResize && setTimeout( asyncResize, 0);\r
-               },\r
-               registerOverlay: function( _basicPane){\r
-                       var _api = pettanr.view.registerAsBasicPane( _basicPane);\r
-                       // OverlayAPI\r
-                       return {\r
-                               show: function( _basicPane ){\r
-                                       \r
-                               },\r
-                               hide: function( _basciPane ){\r
-                                       \r
-                               },\r
-                               isCurrent: function( _basicPane ){\r
-                                       \r
-                               }\r
-                       }\r
-               },\r
-               isOverlay: function( _basicPane ){\r
-                       \r
+                       setTimeout( asyncResize, 0);\r
                }\r
        }\r
 })();\r
@@ -1157,7 +1104,7 @@ pettanr.key = ( function(){
                        overlayEnabled = pettanr.overlay.visible === true,\r
                        currentViewID = overlayEnabled === true ? pettanr.overlay.currentID : pettanr.view.currentID;\r
                if( callback === 'keypress') callback = 'keydown';\r
-               if( pettanr.form.keyEventRellay( e) === false){\r
+               if( pettanr.form.keyEventRellay( e ) === false){\r
                        var shift = e.shiftKey,\r
                                ctrl = e.ctrlKey,\r
                                l = KEYEVENT_ARRAY.length,\r
@@ -1212,12 +1159,12 @@ pettanr.key = ( function(){
 \r
                        jqWindow = pettanr.jqWindow().focus();\r
                        keyOperationChatcher = pettanr.jqDocument()\r
-                               .keydown( keyHit)\r
-                               .keyup( keyHit)\r
+                               .keydown( keyHit )\r
+                               .keyup( keyHit )\r
                                .mouseenter( function(){\r
                                        jqWindow.focus();\r
                                });\r
-                       keyPress && keyOperationChatcher.keypress( keyPress);\r
+                       keyPress && keyOperationChatcher.keypress( keyPress );\r
 \r
                        delete pettanr.key.init;\r
                },\r
@@ -1266,6 +1213,8 @@ pettanr.form = ( function(){
        var     FORM_GROUP_TABLE = {},\r
                currentID = null,\r
                currentItem = null,\r
+               CLASSNAME_COMBOBOX_OPTION = 'combobox-option',\r
+               windowW, windowH,\r
                ELM_A_ORIGIN = ( function(){\r
                        var ret = document.createElement( 'a');\r
                        ret.href = '#';\r
@@ -1275,98 +1224,151 @@ pettanr.form = ( function(){
                        var ret = document.createElement( 'input');\r
                        ret.type = 'text';\r
                        return ret;\r
+               })(),\r
+               ELM_COMBOBOX = ( function(){\r
+                       var ret = document.createElement( 'a'),\r
+                               elmToggle = document.createElement( 'span' ),\r
+                               elmValue = document.createElement( 'span' );\r
+                       ret.href = '#';\r
+                       ret.appendChild( elmToggle );\r
+                       ret.appendChild( elmValue );\r
+                       elmToggle.className = 'combobox-toggle';\r
+                       elmValue.className = 'combobox-value';\r
+                       \r
+                       elmToggle.appendChild( document.createTextNode( '▼' ));\r
+                       elmValue.appendChild( document.createTextNode( 'null' ));\r
+                       return ret;\r
                })();\r
                \r
-       var InputTextClass = function( WRAPPER_ELM, ON_UPDATE_FUNCTION, GROUP_ID, validater){\r
-               validater = typeof validater === 'function' ? validater : null;\r
+       var InputTextClass = function( WRAPPER_ELM, ON_UPDATE_FUNCTION, GROUP_ID, validater ){\r
+               validater = Type.isFunction( validater ) === true ? validater : null;\r
                \r
-               var elmValue = pettanr.util.getElementsByClassName( WRAPPER_ELM, 'editable-value')[ 0],\r
+               var elmValue = pettanr.util.getElementsByClassName( WRAPPER_ELM, 'editable-value' )[ 0],\r
                        value,\r
-                       index = GROUP_ID ? FORM_GROUP_TABLE[ GROUP_ID].length : -1,\r
-                       instance,\r
+                       instance = this,\r
                        focus = false,\r
                        visible = true,\r
                        enabled = true,\r
-                       elmA = ELM_A_ORIGIN.cloneNode( true);\r
+                       elmA = ELM_A_ORIGIN.cloneNode( true );\r
                \r
-               if( elmValue === undefined){\r
+               if( elmValue === undefined ){\r
                        alert( 'error!');\r
                }\r
                value = elmValue.innerHTML;\r
                elmValue.innerHTML = '';\r
                elmValue.className += ' editable-text';\r
+               try {\r
+                       elmA.innerHTML = value;\r
+               } catch(e){\r
+                       alert( value )\r
+               }\r
                \r
-               elmA.innerHTML = value;\r
-               elmValue.appendChild( elmA);\r
+               elmValue.appendChild( elmA );\r
                WRAPPER_ELM.onclick = onClick;\r
                \r
-               function onClick( e){\r
+               function onClick(){\r
                        focus = true;\r
-                       start( instance);\r
+                       start( instance );\r
                        elmA.style.display = 'none';\r
-                       elmValue.appendChild( ELM_INPUT_TEXT);\r
+                       elmValue.appendChild( ELM_INPUT_TEXT );\r
                        ELM_INPUT_TEXT.value = value;\r
                        ELM_INPUT_TEXT.focus();\r
                        ELM_INPUT_TEXT.select();\r
-                       e && e.preventDefault();\r
                        return false;\r
                }\r
                \r
-               return {\r
-                       init: function(){\r
-                               instance = this;\r
-                               delete this.init;\r
-                       },\r
-                       value: function( _value){\r
-                               if( _value !== undefined){\r
-                                       elmA.innerHTML = _value;\r
-                                       value = _value;\r
-                                       \r
-                                       if( focus === true){\r
-                                               ELM_INPUT_TEXT.value = value;\r
-                                       }\r
-                               }\r
-                               currentItem === instance && this.finish();\r
-                               return value;\r
-                       },\r
-                       start: function(){\r
-                               onClick();\r
-                       },\r
-                       finish: function( keep){\r
-                               var _newValue = ELM_INPUT_TEXT.value,\r
-                                       _validated = validater !== null ? '' + validater( _newValue) : _newValue;\r
-                               _newValue = keep !== true ? _validated : value;\r
-\r
-                               elmValue.removeChild( ELM_INPUT_TEXT);\r
-                               \r
-                               elmA.innerHTML = _newValue;\r
-                               elmA.style.display = 'block';\r
+               this.value = function( _value ){\r
+                       if( _value !== undefined){\r
+                               elmA.innerHTML = _value;\r
+                               value = _value;\r
                                \r
-                               ON_UPDATE_FUNCTION && _newValue !== value && ON_UPDATE_FUNCTION( _newValue, value);\r
-                               finish( instance);\r
-                               value = _newValue;\r
-                               focus = false;\r
-                       },\r
-                       enabled: function(){\r
-                               return enabled;\r
-                       },\r
-                       visible: function( _visible){\r
-                               if( _visible === true){\r
-                                       WRAPPER_ELM.style.display = '';\r
-                                       visible = true;\r
-                               } else\r
-                               if( _visible === false){\r
-                                       WRAPPER_ELM.style.display = 'none';\r
-                                       visible = false;\r
+                               if( focus === true){\r
+                                       ELM_INPUT_TEXT.value = value;\r
                                }\r
-                               return visible;\r
-                       },\r
-                       index : index,\r
-                       groupID: GROUP_ID\r
+                       }\r
+                       currentItem === instance && instance.blur();\r
+                       return value;\r
+               }\r
+               this.focus = function(){\r
+                       onClick();\r
                }\r
+               this.blur = function( keep ){\r
+                       var _newValue = ELM_INPUT_TEXT.value,\r
+                               _validated = validater !== null ? '' + validater( _newValue ) : _newValue;\r
+                       _newValue = keep !== 27 ? _validated : value; // 27:ESC\r
+\r
+                       elmValue.removeChild( ELM_INPUT_TEXT );\r
+                       \r
+                       elmA.innerHTML = _newValue;\r
+                       elmA.style.display = 'block';\r
+                       \r
+                       ON_UPDATE_FUNCTION && _newValue !== value && ON_UPDATE_FUNCTION( _newValue, value );\r
+                       \r
+                       value = _newValue;\r
+                       focus = false;\r
+                       \r
+                       currentItem = null;\r
+               }\r
+               this.enabled = function(){\r
+                       return enabled;\r
+               }\r
+               this.visible = function( _visible ){\r
+                       if( _visible === true){\r
+                               WRAPPER_ELM.style.display = '';\r
+                               visible = true;\r
+                       } else\r
+                       if( _visible === false){\r
+                               WRAPPER_ELM.style.display = 'none';\r
+                               visible = false;\r
+                       }\r
+                       return visible;\r
+               }\r
+               this.groupID = GROUP_ID;\r
+       }\r
+       \r
+       var ButtonClass = function( WRAPPER_ELM, ON_CLICK_FUNCTION, GROUP_ID ){\r
+               var className = WRAPPER_ELM.className || '',\r
+                       instance = this,\r
+                       focus = false,\r
+                       visible = true,\r
+                       enabled = true;\r
+                       \r
+               WRAPPER_ELM.onclick = onClick;\r
+               \r
+               function onClick(){\r
+                       focus = true;\r
+                       ON_CLICK_FUNCTION();\r
+                       return false;\r
+               }\r
+               this.focus = function(){\r
+                       focus = true;\r
+                       WRAPPER_ELM.className = className + ' button-has-focus';\r
+                       start( instance );\r
+               }\r
+               this.blur = function( keyCode ){\r
+                       keyCode === 13 && ON_CLICK_FUNCTION();\r
+                       WRAPPER_ELM.className = className;\r
+                       focus = false;\r
+                       finish( instance );\r
+               }\r
+               this.enabled = function(){\r
+                       return enabled;\r
+               }\r
+               this.visible = function( _visible ){\r
+                       if( _visible === true){\r
+                               WRAPPER_ELM.style.display = '';\r
+                               visible = true;\r
+                       } else\r
+                       if( _visible === false){\r
+                               WRAPPER_ELM.style.display = 'none';\r
+                               visible = false;\r
+                       }\r
+                       return visible;\r
+               }\r
+               this.groupID = GROUP_ID;\r
        }\r
 \r
-       var FileInputClass = function( WRAPPER_ELM, ON_UPDATE_FUNCTION, GROUP_ID, validater, elmFileInput){\r
+       var FileInputClass = function( WRAPPER_ELM, ON_UPDATE_FUNCTION, GROUP_ID, validater, elmFileInput ){\r
                validater = typeof validater === 'function' ? validater : null;\r
                \r
                var elmFilePath = pettanr.util.getElementsByClassName( WRAPPER_ELM, 'file-path')[ 0],\r
@@ -1375,8 +1377,8 @@ pettanr.form = ( function(){
                        instance,\r
                        focus = false,\r
                        visible = true,\r
-                       enabled = true,\r
-                       elmFileInput = WRAPPER_ELM.getElementsByTagName('input')[0] || elmFileInput || document.createElement( 'input');\r
+                       enabled = true;\r
+               elmFileInput = WRAPPER_ELM.getElementsByTagName('input')[0] || elmFileInput || document.createElement( 'input');\r
                elmFileInput.type = 'file';\r
                elmFileInput.style.visivility = 'hidden';\r
 \r
@@ -1385,7 +1387,7 @@ pettanr.form = ( function(){
                \r
                function onClick( e){\r
                        focus = true;\r
-                       start( instance);\r
+                       start( instance );\r
                        elmFileInput.click();\r
                        return false;\r
                }\r
@@ -1398,10 +1400,10 @@ pettanr.form = ( function(){
                                instance = this;\r
                                delete this.init;\r
                        },\r
-                       start: function(){\r
+                       focus: function(){\r
                                onClick();\r
                        },\r
-                       finish: function( keep){\r
+                       blur: function( keep ){\r
                                focus = false;\r
                        },\r
                        enabled: function(){\r
@@ -1423,30 +1425,261 @@ pettanr.form = ( function(){
                }\r
        }\r
 \r
+       var ComboBoxClass = function( WRAPPER_ELM, ON_UPDATE_FUNCTION, GROUP_ID ){\r
+               var elmBox = pettanr.util.getElementsByClassName( WRAPPER_ELM, 'combobox' )[ 0 ],\r
+                       elmA = ELM_COMBOBOX.cloneNode( true ),\r
+                       elmToggle = pettanr.util.getElementsByClassName( elmA, 'combobox-toggle' )[ 0 ],\r
+                       elmValue = pettanr.util.getElementsByClassName( elmA, 'combobox-value' )[ 0 ].firstChild,\r
+                       value, index = 0,\r
+                       optionList = [],\r
+                       instance = this,\r
+                       oldBodyMouseupHandler,\r
+                       focus = false,\r
+                       visible = true,\r
+                       enabled = true;\r
+                       \r
+               elmBox.appendChild( elmA );\r
+               WRAPPER_ELM.onclick = onClick;\r
+               \r
+               function onClick(){\r
+                       WRAPPER_ELM.onclick = null;\r
+                       focus = true;\r
+                       elmA.className = 'combobox-has-focus';\r
+                       start( instance );\r
+                       OptionControl.show( instance, optionList );\r
+                       return false;\r
+               }\r
+               this.elm = elmBox;\r
+               this.focus = function(){\r
+                       onClick();\r
+               }\r
+               this.blur = function( keyCode ){\r
+                       OptionControl.hide( instance );\r
+                       focus = false;\r
+                       elmA.className = '';\r
+                       finish( instance );\r
+                       WRAPPER_ELM.onclick = onClick;\r
+               }\r
+               this.enabled = function(){\r
+                       return enabled;\r
+               }\r
+               this.visible = function( _visible ){\r
+                       if( _visible === true){\r
+                               WRAPPER_ELM.style.display = '';\r
+                               visible = true;\r
+                       } else\r
+                       if( _visible === false){\r
+                               WRAPPER_ELM.style.display = 'none';\r
+                               visible = false;\r
+                       }\r
+                       return visible;\r
+               }\r
+               this.value = function( _value ){\r
+                       var i, j,\r
+                               l=optionList.length,\r
+                               _option;\r
+                       if( Type.isString( _value ) === true && value !== _value ){\r
+                               for( i=0; i<l; ++i ){\r
+                                       _option = optionList[ i ];\r
+                                       if( _value === _option.value ){\r
+                                               value = _value;\r
+                                               index = i;\r
+                                               elmValue.data = _option.displayValue;\r
+                                               if( focus === true ){\r
+                                                       OptionControl.update( instance, _value );\r
+                                               }\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+                       return value;\r
+               }\r
+               this.selectIndex = function(){\r
+                       return index;\r
+               }\r
+               this.createOption = function( displayValue, _value, isSelected ){\r
+                       var exist = false,\r
+                               option = null, _option,\r
+                               _index;\r
+                       for( var i = 0, l = optionList.length; i < l; ++i ){\r
+                               if( _value === optionList[ i ].value ){\r
+                                       option = optionList[ i ];\r
+                                       _index = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if( option === null ){\r
+                               option = new OptionClass( instance, displayValue, _value );\r
+                               _index = optionList.length;\r
+                               optionList.push( option );\r
+                       }\r
+                       if( isSelected === true ){\r
+                               elmValue.data = option.displayValue;\r
+                               value = _value;\r
+                               index = _index;\r
+                               for( i = 0, l = optionList.length; i < l; ++i ){\r
+                                       _option = optionList[ i ];\r
+                                       _option.current( _option.value === _value );\r
+                               }\r
+                       }\r
+                       return option;\r
+               }\r
+               this.groupID = GROUP_ID;\r
+       }\r
+       \r
+       var OptionControl = ( function(){\r
+               var ELM_OPTION_WRAPPER = ( function(){\r
+                               var ret = document.createElement( 'ul' );\r
+                               ret.className = 'option-container';\r
+                               return ret;\r
+                       })();\r
+               var currentCombobox = null,\r
+                       optionList,\r
+                       elm,\r
+                       value,\r
+                       currentOption,\r
+                       currentIndex;\r
+               \r
+               function updateCurrrentOption( _value, _updateCombobox ){\r
+                       var _option;\r
+                       for( var i=0, l=optionList.length; i<l; ++i ){\r
+                               _option = optionList[ i ]\r
+                               if( _value === _option.value ){\r
+                                       currentOption && currentOption.current( false );\r
+                                       _option.current( true );\r
+                                       currentOption = _option;\r
+                                       currentIndex = i;\r
+                                       _updateCombobox === true && currentCombobox.value( _value );\r
+                               }\r
+                       }\r
+               }\r
+               function bodyMouseupHandler(){\r
+                       currentCombobox.blur();\r
+                       OptionControl.hide( currentCombobox );\r
+               }\r
+               function updateWrapperPosition(){\r
+                       var position = pettanr.util.getAbsolutePosition( elm );\r
+                       \r
+                       ELM_OPTION_WRAPPER.style.cssText = [\r
+                                       'width:', elm.offsetWidth - 2, 'px;',\r
+                                       'left:', position.x, 'px;',\r
+                                       'top:', position.y + elm.offsetHeight, 'px;'\r
+                               ].join('');                     \r
+               }\r
+               return {\r
+                       show: function( _combobox, _optionList ){\r
+                               if( currentItem !== _combobox || currentCombobox === _combobox ) return;\r
+                               currentCombobox && currentCombobox.blur();\r
+                               \r
+                               currentCombobox = _combobox;\r
+                               optionList = _optionList;\r
+                               elm = _combobox.elm;\r
+                               \r
+                               updateCurrrentOption( _combobox.value(), false );\r
+                               \r
+                               for( var i=0, l=optionList.length; i<l; ++i ){\r
+                                       ELM_OPTION_WRAPPER.appendChild( optionList[ i ].elm );\r
+                               }\r
+                               \r
+                               document.body.appendChild( ELM_OPTION_WRAPPER );\r
+                               oldBodyMouseupHandler = document.body.onmouseup;\r
+                               document.body.onmouseup = bodyMouseupHandler;\r
+                               \r
+                               updateWrapperPosition();\r
+                       },\r
+                       hide: function( _combobox ){\r
+                               if( currentCombobox !== _combobox ) return;\r
 \r
-       function start( _currentItem){\r
-               currentItem !== _currentItem && currentItem && currentItem.finish();\r
+                               ELM_OPTION_WRAPPER.parentNode && ELM_OPTION_WRAPPER.parentNode.removeChild( ELM_OPTION_WRAPPER );\r
+                               while( ELM_OPTION_WRAPPER.firstChild ){\r
+                                       ELM_OPTION_WRAPPER.removeChild( ELM_OPTION_WRAPPER.firstChild );\r
+                               }\r
+                               currentCombobox = null;\r
+                               currentOption = null;\r
+                               currentIndex = 0;\r
+                               \r
+                               document.body.onmouseup = oldBodyMouseupHandler;\r
+                       },\r
+                       change: function( down ){\r
+                               var l = optionList.length,\r
+                                       way = down === true ? 1 : -1;\r
+                                       i = currentIndex + way\r
+                               if( currentCombobox === false || l < 2 ) return;\r
+                               i = i < 0 ?\r
+                                               l - 1 :\r
+                                               i < l ? i : 0;\r
+                               updateCurrrentOption( optionList[ i ].value, false );\r
+                       },\r
+                       update: function( _combobox, _value ){\r
+                               if( currentCombobox !== _combobox || currentItem !== _combobox ) return;\r
+                               if( currentOption.value === _value ) return;\r
+                               updateCurrrentOption( _value, true );\r
+                       },\r
+                       decide: function(){\r
+                               currentCombobox.value( currentOption.value );\r
+                               currentCombobox.blur();\r
+                               OptionControl.hide( currentCombobox );\r
+                       },\r
+                       onWindowResize: function( _w, _h ){\r
+                               setTimeout( updateWrapperPosition, 0 );\r
+                       }\r
+               }\r
+       })();\r
+       \r
+               var OptionClass = function( combobox, displayValue, value ){\r
+                       var elm = document.createElement( 'li' ),\r
+                               a = document.createElement( 'a' ),\r
+                               isCurrent = undefined;\r
+                       elm.appendChild( a );\r
+                       a.appendChild( document.createTextNode( displayValue ));\r
+                       elm.className = CLASSNAME_COMBOBOX_OPTION;\r
+                       a.href = '#';\r
+                       \r
+                       a.onmousedown = onClick; // onclick では 選択ボックス 隠すように body に設定した onmouseup が先に動いてしまう!\r
+                       function onClick(){\r
+                               OptionControl.update( combobox, value );\r
+                               OptionControl.hide( combobox );\r
+                               combobox.blur();\r
+                               return false;\r
+                       }\r
+                       this.elm = elm;\r
+                       this.displayValue = displayValue;\r
+                       this.value = value = value || displayValue;\r
+                       this.current = function( _isCurrent ){\r
+                               if( Type.isBoolean( _isCurrent ) === true && isCurrent !== _isCurrent ){\r
+                                       elm.className = CLASSNAME_COMBOBOX_OPTION + ( _isCurrent === true ? ' current-option' : '' );\r
+                                       isCurrent = _isCurrent;\r
+                               }\r
+                               return !!isCurrent;\r
+                       }\r
+               }\r
+       \r
+\r
+       function start( _currentItem ){\r
+               currentItem !== _currentItem && currentItem && currentItem.blur();\r
                currentItem = _currentItem;\r
        }\r
-       function finish( _currentItem){\r
-               if( currentItem !== _currentItem) return;\r
-               currentItem = null;\r
+       function finish( _currentItem ){\r
+               currentItem = currentItem === _currentItem ? null : currentItem;\r
        }\r
 \r
-       function tabShift( _groupID, _index, _way){\r
-               var GROUP_ARRAY = FORM_GROUP_TABLE[ _groupID] || [],\r
+       function tabShift( _groupID, _index, _way ){\r
+               var GROUP_ARRAY = FORM_GROUP_TABLE[ _groupID ] || [],\r
                        l = GROUP_ARRAY.length,\r
-                       i = _index +_way;\r
-               if( l < 2) return;\r
-               while( i !== _index){\r
+                       i = _index + _way,\r
+                       _item;\r
+               if( l < 2 ) return;\r
+               while( i !== _index ){\r
                        i = i < 0 ?\r
-                               l -1 :\r
-                               i === l ? 0 : i; // 0 < i < l\r
-                       if( GROUP_ARRAY[ i].enabled() === true && GROUP_ARRAY[ i].visible() === true) break;\r
+                               l - 1 :\r
+                               i < l ? i : 0; // 0 < i < l\r
+                       _item = GROUP_ARRAY[ i ];\r
+                       if( _item.enabled() === true && _item.visible() === true ){\r
+                               setTimeout( _item.focus, 0 );\r
+                               return;\r
+                       }\r
                        i += _way;\r
                }\r
-               if( i === _index) return;\r
-               setTimeout( GROUP_ARRAY[ i].start, 0);\r
        }\r
 \r
        return {\r
@@ -1454,49 +1687,72 @@ pettanr.form = ( function(){
                focus: function(){\r
                        return currentItem !== null; \r
                },\r
-               keyEventRellay: function( e){\r
-                       if( e.type === 'keyup') return false;\r
-                       if( currentItem === null) return false;\r
+               keyEventRellay: function( e ){\r
+                       if( e.type === 'keyup' ) return false;\r
+                       if( currentItem === null ) return false;\r
                        \r
                        var keyCode = e.keyCode;\r
-                       if( keyCode === 13 || keyCode === 27 || keyCode === 9 || keyCode === 18 || e.altKey === true){ // 13.return 27.esc 9.tab 18.alt\r
-                               var _groupID = currentItem.groupID,\r
-                                       _index = currentItem.index;\r
-                               currentItem.finish( keyCode === 27);\r
-                               keyCode === 9 && _groupID && tabShift( _groupID, _index, e.shiftKey === true ? -1 : 1);\r
-                               keyCode === 13 && _groupID && tabShift( _groupID, _index, 1);\r
+                       var _groupID = currentItem.groupID,\r
+                                       _index = pettanr.util.getIndex( FORM_GROUP_TABLE[ _groupID ], currentItem );\r
+                       if( currentItem instanceof ComboBoxClass ) {\r
+                               if( 37 <= keyCode && keyCode <= 40 ){ // ↑38 ←37 →39 ↓40\r
+                                       OptionControl.change( keyCode === 40 );\r
+                                       return true;\r
+                               } else\r
+                               keyCode === 13 && OptionControl.decide();\r
+                       }\r
+                       if( keyCode === 13 || keyCode === 27 || keyCode === 9 || keyCode === 18 || e.altKey === true ){ // 13.return 27.esc 9.tab 18.alt\r
+                               currentItem && currentItem.blur( keyCode );\r
+                               keyCode === 9 && _groupID && tabShift( _groupID, _index, e.shiftKey === true ? -1 : 1 );\r
+                               keyCode === 13 && _groupID && tabShift( _groupID, _index, 1 );\r
                        }\r
                        return true;\r
                },\r
-               createInputText: function( _elm, _onUpdate, _groupID, _validater){\r
+               createUIGroup: function( _applicationReferance ){\r
+                       \r
+               },\r
+               createInputText: function( _elm, _onUpdate, _groupID, _validater ){\r
                        if( typeof _groupID === 'string' && !FORM_GROUP_TABLE[ _groupID]){\r
                                FORM_GROUP_TABLE[ _groupID] = [];\r
                        }\r
-                       var ret = new InputTextClass( _elm, _onUpdate, _groupID, _validater);\r
-                       ret.init();\r
-                       _groupID && FORM_GROUP_TABLE[ _groupID].push( ret);\r
+                       var ret = new InputTextClass( _elm, _onUpdate, _groupID, _validater );\r
+                       _groupID && FORM_GROUP_TABLE[ _groupID ].push( ret );\r
+                       return ret;\r
+               },\r
+               createButton: function( _elm, _onClick, _groupID ){\r
+                       if( typeof _groupID === 'string' && !FORM_GROUP_TABLE[ _groupID]){\r
+                               FORM_GROUP_TABLE[ _groupID ] = [];\r
+                       }\r
+                       var ret = new ButtonClass( _elm, _onClick, _groupID );\r
+                       _groupID && FORM_GROUP_TABLE[ _groupID ].push( ret );\r
                        return ret;\r
                },\r
-               createFileInput: function( _elm, _onUpdate, _groupID, _validater, _elmFileInput){\r
+               createFileInput: function( _elm, _onUpdate, _groupID, _validater, _elmFileInput ){\r
                        if( typeof _groupID === 'string' && !FORM_GROUP_TABLE[ _groupID]){\r
                                FORM_GROUP_TABLE[ _groupID] = [];\r
                        }\r
-                       var ret = FileInputClass( _elm, _onUpdate, _groupID, _validater, _elmFileInput);\r
-                       ret.init();\r
+                       var ret = FileInputClass( _elm, _onUpdate, _groupID, _validater, _elmFileInput );\r
                        _groupID && FORM_GROUP_TABLE[ _groupID].push( ret);\r
                        return ret;\r
                },\r
+               createCombobox: function( _elm, _onUpdate, _groupID, _optionList ){\r
+                       if( typeof _groupID === 'string' && !FORM_GROUP_TABLE[ _groupID]){\r
+                               FORM_GROUP_TABLE[ _groupID ] = [];\r
+                       }\r
+                       var ret = new ComboBoxClass( _elm, _onUpdate, _groupID );\r
+                       _groupID && FORM_GROUP_TABLE[ _groupID ].push( ret );\r
+                       return ret;\r
+               },\r
                createCheckBox: function(){\r
                        \r
                },\r
                createRadio: function(){\r
                        \r
                },\r
-               createButton: function(){\r
-                       \r
-               },\r
-               createListBox: function(){\r
-                       \r
+               onWindowResize: function( w, h ){\r
+                       windowW = w;\r
+                       windowH = h;\r
+                       currentItem instanceof ComboBoxClass && OptionControl.onWindowResize( w, h );\r
                }\r
        }\r
 })();\r
@@ -1565,37 +1821,39 @@ pettanr.balloon = ( function() {
                })(),\r
                NUM_BALLOON_IMAGE = 24,\r
                vectorEnabled = ELM_BALLOON_ORIGIN !== null && pettanr.URL_PARAMS.vector !== false;\r
-       if( IS_VML === true && pettanr.ua.VML === false) vectorEnabled = false;\r
+       if( IS_VML === true && pettanr.ua.VML === false ) vectorEnabled = false;\r
 \r
-       var XBROWSER_BALLOON_CLASS = function( w, h, a){\r
-               var balloonElm = vectorEnabled === true ? ELM_BALLOON_ORIGIN.cloneNode( true) : document.createElement( 'img'), // pettanr.imageに変更\r
-                       path = balloonElm.getElementsByTagName( 'path')[ 0],\r
-                       shape = balloonElm.getElementsByTagName( 'shape')[ 0],\r
-                       cos = Math.cos, sin = Math.sin,\r
-                       abs = Math.abs, pow = Math.pow,\r
-                       round = Math.round,\r
-                       floor = Math.floor,\r
-                       TARGET = TAIL_WIDTH * TAIL_WIDTH,\r
-                       DEG_TO_RAD = Math.PI / 180,\r
+       var cos = Math.cos, sin = Math.sin,\r
+               abs = Math.abs, pow = Math.pow,\r
+               round = Math.round,\r
+               floor = Math.floor,\r
+               TARGET = TAIL_WIDTH * TAIL_WIDTH,\r
+               DEG_TO_RAD = Math.PI / 180;\r
+\r
+       var XBROWSER_BALLOON_CLASS = function( w, h, a ){\r
+               var balloonElm = vectorEnabled === true ? ELM_BALLOON_ORIGIN.cloneNode( true ) : document.createElement( 'img' ), // pettanr.imageに変更\r
+                       path = balloonElm.getElementsByTagName( 'path' )[ 0 ],\r
+                       shape = balloonElm.getElementsByTagName( 'shape' )[ 0 ],\r
+                       instance = this,\r
                        l = ',';\r
                \r
-               draw( a, w, h);\r
+               draw( a, w, h );\r
                \r
-               function draw( _a, _w, _h){\r
+               function draw( _a, _w, _h ){\r
                        a = _a !== undefined ? _a : a;\r
-                       w = _w !== undefined ? _w -PADDING_TOP *2 : w;\r
-                       h = _h !== undefined ? _h -PADDING_LEFT *2 : h;\r
+                       w = _w !== undefined ? _w - PADDING_TOP * 2 : w;\r
+                       h = _h !== undefined ? _h - PADDING_LEFT * 2 : h;\r
 \r
                        if( vectorEnabled === false){\r
-                               balloonElm.setAttribute( 'src', balloonUrlBuilder( a));\r
+                               balloonElm.setAttribute( 'src', balloonUrlBuilder( a ));\r
                                return;\r
                        }\r
                        \r
                        var rx = w /2,\r
                                ry = h /2,\r
                                tailRad = a * DEG_TO_RAD,\r
-                               tailX = rx +( rx +TAIL_HEIGHT) * cos( tailRad),\r
-                               tailY = ry +( ry +TAIL_HEIGHT) * sin( tailRad),\r
+                               tailX = rx +( rx +TAIL_HEIGHT ) * cos( tailRad ),\r
+                               tailY = ry +( ry +TAIL_HEIGHT ) * sin( tailRad ),\r
                                startX, startY, endX, endY;\r
                /*\r
                 * tailの太さをTAIL_WIDTHに一致させるため、角度を絞りつつ計算\r
@@ -1605,16 +1863,16 @@ pettanr.balloon = ( function() {
                                tailDeg = 0, d;\r
                        \r
                        for( var i = 45; i > 0.01; i /= 2){\r
-                               d = ( tailDeg +i) /2;\r
-                               startRad = ( a +d) * DEG_TO_RAD;\r
-                               endRad = ( a -d) * DEG_TO_RAD;\r
+                               d = ( tailDeg + i ) /2;\r
+                               startRad = ( a + d ) * DEG_TO_RAD;\r
+                               endRad = ( a - d ) * DEG_TO_RAD;\r
                                \r
-                               _startX = rx +cos( startRad) *rx;\r
-                               _startY = ry +sin( startRad) *ry;\r
-                               _endX = rx +cos( endRad) *rx;\r
-                               _endY = ry +sin( endRad) *ry;   //円弧上のY位置=円中心Y+sin(角度×PI÷180)×円半径\r
+                               _startX = rx +cos( startRad ) * rx;\r
+                               _startY = ry +sin( startRad ) * ry;\r
+                               _endX = rx +cos( endRad) * rx;\r
+                               _endY = ry +sin( endRad) * ry;  //円弧上のY位置=円中心Y+sin(角度×PI÷180)×円半径\r
                                        \r
-                               if( pow( ( _startX -_endX), 2) + pow( ( _startY -_endY), 2) < TARGET){\r
+                               if( pow( ( _startX - _endX), 2 ) + pow( ( _startY - _endY ), 2 ) < TARGET ){\r
                                        tailDeg += i;\r
                                        startX = _startX;\r
                                        startY = _startY;\r
@@ -1626,7 +1884,7 @@ pettanr.balloon = ( function() {
                /*\r
                 * \r
                 */                     \r
-                       if( IS_VML === true){\r
+                       if( IS_VML === true ){\r
                                var _tailX = tailX *10,\r
                                        _tailY = tailY *10,\r
                                        __startX = startX *10,\r
@@ -1636,67 +1894,65 @@ pettanr.balloon = ( function() {
                                        __w = w *10,\r
                                        __h = h *10;\r
                                \r
-                               shape.style.width = w +'px';\r
-                               shape.style.height = h +'px';\r
-                               shape.coordsize = [ __w, __h].join( l);\r
+                               shape.style.width = w + 'px';\r
+                               shape.style.height = h + 'px';\r
+                               shape.coordsize = [ __w, __h ].join( l );\r
                                shape.path = [\r
                                        ' ar ', 0, l, 0, l, __w, l, __h, l,\r
-                                       round( __endX), l, round( __endY), l,\r
-                                       round( __startX), l, round( __startY),\r
-                                       ' l ', round( _tailX), l, round( _tailY),\r
+                                       round( __endX ), l, round( __endY ), l,\r
+                                       round( __startX ), l, round( __startY ),\r
+                                       ' l ', round( _tailX ), l, round( _tailY ),\r
                                        ' x e'\r
                                ].join( '');\r
 \r
-                               balloonElm.style.marginTop =  _tailY < 0 ? floor( ( 60 +_tailY) /10) : 10;\r
-                               balloonElm.style.marginLeft = _tailX < 0 ? floor( ( 60 +_tailX) /10) : 10;\r
+                               balloonElm.style.marginTop =  _tailY < 0 ? floor( ( 60 + _tailY) / 10 ) : 10;\r
+                               balloonElm.style.marginLeft = _tailX < 0 ? floor( ( 60 + _tailX) / 10 ) : 10;\r
                        } else {\r
-                               balloonElm.setAttribute( 'width', w +PADDING_LEFT *2);\r
-                               balloonElm.setAttribute( 'height', h +PADDING_TOP *2);\r
+                               balloonElm.setAttribute( 'width', w + PADDING_LEFT *2 );\r
+                               balloonElm.setAttribute( 'height', h + PADDING_TOP *2 );\r
                                path.setAttribute( 'd', [\r
-                                       'M', cround( tailX + PADDING_LEFT), l, cround( tailY +PADDING_TOP),\r
-                                       'L', cround( startX +PADDING_LEFT), l, cround( startY +PADDING_TOP),\r
+                                       'M', cround( tailX + PADDING_LEFT ), l, cround( tailY + PADDING_TOP ),\r
+                                       'L', cround( startX + PADDING_LEFT ), l, cround( startY + PADDING_TOP ),\r
                                        'A', rx, l, ry,\r
                                        '0 1 1',                        // flag\r
-                                       cround( endX +PADDING_LEFT), l, cround( endY +PADDING_TOP),\r
+                                       cround( endX + PADDING_LEFT ), l, cround( endY + PADDING_TOP ),\r
                                        'z'\r
                                ].join( ' '));\r
                        }\r
                        function cround( v, r){\r
                                r = r || ACCURACY;\r
-                               return round( v *pow( 10.0, r)) /pow( 10.0, r);\r
+                               return round( v * pow( 10.0, r )) / pow( 10.0, r );\r
                        }\r
                }\r
                \r
-               function balloonUrlBuilder( _a){\r
-                       var d = 360 /NUM_BALLOON_IMAGE;\r
-                       _a += 90 +d /2;\r
-                       return [ 'system_pictures\/_w', _a < 360 -d /2 ? floor( _a /d) : 0, '.gif'].join( '');\r
+               function balloonUrlBuilder( _a ){\r
+                       var d = 360 / NUM_BALLOON_IMAGE;\r
+                       _a += 90 + d / 2;\r
+                       return [ 'system_pictures\/_w', _a < 360 - d / 2 ? floor( _a / d ) : 0, '.gif' ].join( '' );\r
                }\r
-               return {\r
-                       elm: balloonElm,\r
-                       resize: draw,\r
-                       angle: function( _a){\r
-                               _a !== undefined && _a !== a &&\r
-                                       vectorEnabled === false ? balloonUrlBuilder( _a) : draw( _a);\r
-                               return a;\r
-                       },\r
-                       type: function( _type){\r
-                               //draw( _a);\r
-                       },\r
-                       getURL: function(){\r
-                               return balloonUrlBuilder( a);\r
-                       },\r
-                       destroy: function(){\r
-                               balloonElm.parentNode && balloonElm.parentNode.removeChild( balloonElm);\r
-                               balloonElm = null;\r
-                               delete this.destroy;\r
-                       }\r
+               this.elm = balloonElm;\r
+               this.resize = draw;\r
+               this.angle = function( _a ){\r
+                       _a !== undefined && _a !== a &&\r
+                               vectorEnabled === false ? balloonUrlBuilder( _a ) : draw( _a );\r
+                       return a;\r
+               }\r
+               this.type = function( _type ){\r
+                       //draw( _a);\r
+               }\r
+               this.getURL = function(){\r
+                       return balloonUrlBuilder( a );\r
+               }\r
+               this.destroy = function(){\r
+                       delete instance.destroy;\r
+                       balloonElm.parentNode && balloonElm.parentNode.removeChild( balloonElm );\r
+                       balloonElm = path = shape = instance = null;\r
                }\r
        };\r
        \r
        IS_VML === false && vectorEnabled === true && ( function(){\r
-               var detect = XBROWSER_BALLOON_CLASS.apply( {}, [ 100, 100, 0]),\r
-                       size = pettanr.util.getElementSize( detect.elm);\r
+               var detect = new XBROWSER_BALLOON_CLASS( 100, 100, 0 ),\r
+                       size = pettanr.util.getElementSize( detect.elm );\r
                vectorEnabled = size.width !== 0 && size.height !== 0;\r
                detect.destroy();\r
                detect = size = null;\r
@@ -1704,7 +1960,7 @@ pettanr.balloon = ( function() {
 \r
        return {\r
            createBalloon: function( _w, _h, _a){\r
-               return XBROWSER_BALLOON_CLASS.apply( {}, [ _w, _h, _a]);\r
+               return new XBROWSER_BALLOON_CLASS( _w, _h, _a );\r
            },\r
                TYPE_NONE:                              0,\r
                TYPE_SPEACH_BALLOON:    1,\r
@@ -1738,6 +1994,122 @@ pettanr.balloon = ( function() {
  *     -moz-transform:scale( -1, -1);\r
  */\r
 pettanr.image = ( function(){\r
+       \r
+       var FetchImageControl = ( function(){\r
+               var TASK_LIST = [];\r
+\r
+               /* \r
+                * FetchClass original is\r
+                * \r
+                * LICENSE: MIT?\r
+                *  URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631\r
+                *  AUTHOR: uupaa.js@gmail.com\r
+                * \r
+                */\r
+\r
+               var FetchClass = function( abspath, onLoadCallback, onErrorCallback, delay, timeout ){\r
+                       var img,\r
+                               size,\r
+                               tick = 0,\r
+                               timer = null,\r
+                               finish = false;\r
+                               /*\r
+                       if( pettanr.ua.isIE === false && pettanr.ua.ieVersion < 8 ){\r
+                               var images = document.images,\r
+                                       i=0, l= images.length;\r
+                               for( i=0; i<l; ++i ){\r
+                                       img = images[ i ];\r
+                                       if( img.src === abspath && img.complete ){\r
+                                               finish = true;\r
+                                               size = pettanr.util.getImageSize( img );\r
+                                               timer = window.setTimeout( asyncCallback, 0 );\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               images = null;\r
+                       }*/\r
+                       //if( finish === false ){\r
+                               img = document.createElement( 'img' ); //var img = new Image(); ではieでimgのsizeが取れない、、、removeChildも失敗し、imgSizeGetterにimgが残る\r
+                               img.onabort = img.onerror = onError;\r
+                               img.onload = onLoad;\r
+                               img.src = abspath;\r
+                               finish === false && timeout && detect();\r
+                       //}\r
+                       \r
+                       function onError(){\r
+                               if( finish === true ) return;\r
+                               finish = true;\r
+                               timer = window.setTimeout( asyncCallback, 10 );\r
+                       }                       \r
+                       function onLoad(){\r
+                               // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
+                               // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
+                               finish = true;\r
+                               timer !== null && window.clearTimeout( timer );\r
+                               if( window.opera && !img.complete ){\r
+                                       timer = window.setTimeout( asyncCallback, 10 );\r
+                                       return;\r
+                               }\r
+                               size = pettanr.util.getImageSize( img );\r
+                               timer = window.setTimeout( asyncCallback, 10 );\r
+                       }\r
+                       function detect(){\r
+                               if( finish === true ) return;\r
+                               if( img.complete ){\r
+                                       finish = true;\r
+                                       if( img.width ) return;\r
+                                       timer = window.setTimeout( asyncCallback, 10 );\r
+                                       return;\r
+                               }\r
+                               if( ( tick += delay ) > timeout ){\r
+                                       finish = true;\r
+                                       timer = window.setTimeout( asyncCallback, 10 );\r
+                                       return;\r
+                               }\r
+                               timer = window.setTimeout( detect, delay );\r
+                       }\r
+                       \r
+                       function asyncCallback(){\r
+                               size ? onLoadCallback( abspath, size.width, size.height ) : onErrorCallback( abspath );\r
+                               destroy();\r
+                       }\r
+                       function destroy(){\r
+                               finish = true;\r
+                               img.src = img.onload = img.onabort = img.onerror = '';\r
+                               img = void 0\r
+                               size = onLoadCallback = onErrorCallback = timer = null;\r
+                       }\r
+                       this.stop = function(){\r
+                               timer !== null && window.clearTimeout( timer );\r
+                               destroy();                      \r
+                       }\r
+               }\r
+               \r
+               return {\r
+                       load: function( URLorELM, onLoad, onError, delay, opt_timeout ){\r
+                               var src, fetch;\r
+                               if( Type.isString( URLorELM ) === true ){\r
+                                       src = URLorELM;\r
+                               } else\r
+                               if( Type.isHTMLElement( URLorELM ) === true && URLorELM.tagName.toLowerCase() === 'img' ){\r
+                                       src = URLorELM.src;\r
+                               } else {\r
+                                       return;\r
+                               }\r
+                               \r
+                               fetch = new FetchClass(\r
+                                       pettanr.util.getAbsolutePath( src ),\r
+                                       onLoad, onError,\r
+                                       Type.isFinite( delay ) === true ? delay : 250,\r
+                                       Type.isFinite( opt_timeout ) === true ? opt_timeout : undefined\r
+                               );\r
+                               // TASK_LIST.push( fetch );\r
+                               \r
+                               return fetch;\r
+                       }\r
+               }\r
+       })();\r
+       \r
        var REG_PNG = /\.png?/i,\r
                IS_CSS3 = 0,\r
                IS_VML = 1,\r
@@ -1748,175 +2120,160 @@ pettanr.image = ( function(){
                IS_SERVER = 6,\r
                IS_ACTIVEX_SERVER = 7,\r
                BACKEND = ( function(){\r
-                       if( pettanr.DEBUG === true && pettanr.URL_PARAMS.rimg){\r
+                       if( pettanr.DEBUG === true && pettanr.URL_PARAMS.rimg ){\r
                                var rimg = pettanr.URL_PARAMS.rimg.toLowerCase();\r
-                               if( rimg === 'css3') return IS_CSS3;\r
-                               if( rimg === 'activex') return IS_ACTIVEX;\r
-                               if( rimg === 'vml') return IS_VML;\r
-                       }\r
-                       if( pettanr.ua.isIE === false || pettanr.ua.ieVersion >= 9) return IS_CSS3; // 不十分!\r
-                       if( pettanr.ua.VML === true) return IS_VML;\r
-                       if( pettanr.ua.ACTIVEX === true) return IS_ACTIVEX;\r
-                       if( pettanr.FLASH === true) return IS_FLASH;\r
-                       if( pettanr.SILVERLIGHT === true) return IS_SILVERLIGHT;\r
+                               if( rimg === 'css3' ) return IS_CSS3;\r
+                               if( rimg === 'activex' ) return IS_ACTIVEX;\r
+                               if( rimg === 'vml' ) return IS_VML;\r
+                       }\r
+                       if( pettanr.ua.isIE === false || pettanr.ua.ieVersion >= 9 ) return IS_CSS3; // 不十分!\r
+                       if( pettanr.ua.VML === true ) return IS_VML;\r
+                       if( pettanr.ua.ACTIVEX === true ) return IS_ACTIVEX;\r
+                       if( pettanr.FLASH === true ) return IS_FLASH;\r
+                       if( pettanr.SILVERLIGHT === true ) return IS_SILVERLIGHT;\r
                        return IS_SERVER;\r
                })(),\r
                BACKEND_WHEN_PNG = ( function(){\r
-                       if( pettanr.ua.isIE === false || pettanr.ua.ieVersion > 6) return BACKEND;\r
-                       if( pettanr.ua.VML === true) return IS_VML;\r
-                       if( pettanr.FLASH === true) return IS_FLASH;\r
-                       if( pettanr.SILVERLIGHT === true) return IS_SILVERLIGHT;\r
-                       if( pettanr.ua.ACTIVEX === true) return IS_ACTIVEX_SERVER;\r
+                       if( pettanr.ua.isIE === false || pettanr.ua.ieVersion > 6 ) return BACKEND;\r
+                       if( pettanr.ua.VML === true ) return IS_VML;\r
+                       if( pettanr.FLASH === true ) return IS_FLASH;\r
+                       if( pettanr.SILVERLIGHT === true ) return IS_SILVERLIGHT;\r
+                       if( pettanr.ua.ACTIVEX === true ) return IS_ACTIVEX_SERVER;\r
                        return IS_SERVER;\r
                })(),\r
+               CLASS_NAME = 'reversible-image-container',\r
+               CLASS_NAME_LOADING = CLASS_NAME + ' loading',\r
+               CLASS_NAME_ERROR = CLASS_NAME +' error',\r
+               RETRY_DELAY = 5000,\r
+               NUM_RETRY = 3,\r
                ReversibleImageClass,\r
                ReversibleImageClassWithPingfix;\r
        \r
-       var XBackendReversibleImageClass = ( function(){\r
-               var CLASS_NAME = 'reversible-image-container',\r
-                       CLASS_NAME_LOADING = CLASS_NAME + ' loading',\r
-                       CLASS_NAME_ERROR = CLASS_NAME +' error',\r
-                       RETRY_DELAY = 5000;\r
-                       NUM_RETRY = 3;\r
-               \r
-               var css3Image = function( url, w, h, onLoadCallback){\r
-                       var elmWrap = document.createElement( 'div'),\r
-                               elmImg,\r
-                               loaded = false,\r
-                               retryTimer = null;\r
+       var css3Image = function( url, w, h, onLoadCallback ){\r
+               var elmWrap = document.createElement( 'div' ),\r
+                       elmImg,\r
+                       loaded = false,\r
+                       retryTimer = null,\r
+                       fetch = FetchImageControl.load( url, onLoad, onError, 100, 10000 ),\r
+                       instance = this;\r
+               elmWrap.className = CLASS_NAME_LOADING;\r
+\r
+               function onLoad( _url, _actualW, _actualH ){\r
+                       if( elmWrap === null ) return;\r
+                       elmImg = new Image; // new Image でないと ie6,7 でクラッシュするかも、、、?\r
+                       /*\r
+                        * createElement 直後に append しないと、ie(ActiveX)で img が正しく表示されない.\r
+                        */\r
+                       elmWrap.appendChild( elmImg );\r
+                       elmImg.setAttribute( 'src', url );\r
+                       elmWrap.className = CLASS_NAME;\r
+                       onLoadCallback && onLoadCallback( _url, _actualW, _actualH );\r
+                       onLoadCallback = fetch = null;\r
+                       loaded = true;\r
+                       instance.resize( w, h );\r
+               }\r
+               function onError( _url ){\r
+                       if( elmWrap === null ) return;\r
+                       elmWrap.className = CLASS_NAME_ERROR;\r
+                       retryTimer = window.setTimeout( retry, RETRY_DELAY );\r
+                       fetch = null;\r
+               }\r
+               function retry(){\r
                        elmWrap.className = CLASS_NAME_LOADING;\r
-                       pettanr.util.loadImage( url, onLoad, onError, 100, 10000);\r
-                       function onLoad( _url, _actualW, _actualH){\r
-                               if( elmWrap === null) return;\r
-                               elmImg = new Image;\r
-                               /*\r
-                                * createElement 直後に append しないと、ie(ActiveX)で img が正しく表示されない.\r
-                                */\r
-                               elmWrap.appendChild( elmImg);\r
-                               elmImg.setAttribute( 'src', url);\r
-                               elmWrap.className = CLASS_NAME;\r
-                               onLoadCallback && onLoadCallback( _url, _actualW, _actualH);\r
-                               onLoadCallback = null;\r
-                               loaded = true;\r
-                               resize( w, h);\r
-                       }\r
-                       function onError( _url){\r
-                               if( elmWrap === null) return;\r
-                               elmWrap.className = CLASS_NAME_ERROR;\r
-                               retryTimer = setTimeout( function(){\r
-                                       elmWrap.className = CLASS_NAME_LOADING;\r
-                                       pettanr.util.loadImage( url, onLoad, onError, 100, 10000);\r
-                               }, RETRY_DELAY);\r
-                       }\r
-                       function resize( _w, _h){\r
-                               w = _w !== undefined ? _w : w;\r
-                               h = _h !== undefined ? _h : h;\r
-                               if( loaded === false) return;\r
-                               elmImg.className = w < 0 || h < 0 ? ( 'img-flip-' + ( w < 0 && h < 0 ? 'vh' : ( w < 0 ? 'h' : 'v'))) : '';\r
-                       }\r
-                       return {\r
-                               elm : elmWrap,\r
-                               resize: resize,\r
-                               destroy: function(){\r
-                                       loaded === true && elmWrap.removeChild( elmImg);\r
-                                       retryTimer !== null && clearTimeout( retryTimer);\r
-                                       elmWrap = vmlImg = onLoadCallback = retryTimer = null;\r
-                                       elmWrap = elmImg = onLoadCallback = null;\r
-                                       delete this.destroy;\r
-                               }\r
-                       }\r
+                       fetch = FetchImageControl.load( url, onLoad, onError, 100, 10000 );\r
+               }\r
+\r
+               this.elm = elmWrap;\r
+               this.resize = function( _w, _h ){\r
+                       w = _w !== undefined ? _w : w;\r
+                       h = _h !== undefined ? _h : h;\r
+                       if( loaded === false ) return;\r
+                       elmImg.className = w < 0 || h < 0 ? ( 'img-flip-' + ( w < 0 && h < 0 ? 'vh' : ( w < 0 ? 'h' : 'v'))) : '';\r
+               }\r
+               this.destroy = function(){\r
+                       delete instance.destroy;\r
+                       \r
+                       loaded === true && elmWrap.removeChild( elmImg );\r
+                       retryTimer !== null && window.clearTimeout( retryTimer );\r
+                       fetch !== null && fetch.stop();\r
+                       elmWrap = elmImg = onLoadCallback = retryTimer = fetch = instance = null;\r
                }\r
-               var activexImage = css3Image;\r
-               var vmlImage = function( url, w, h, onLoadCallback){\r
-                       var elmWrap = document.createElement( 'div'),\r
-                               vmlImg,\r
-                               loaded = false,\r
-                               retryTimer = null;\r
+       }\r
+               \r
+       var activexImage = css3Image;\r
+       \r
+       var vmlImage = function( url, w, h, onLoadCallback ){\r
+               var elmWrap = document.createElement( 'div' ),\r
+                       vmlImg,\r
+                       loaded = false,\r
+                       retryTimer = null,\r
+                       fetch = FetchImageControl.load( url, onLoad, onError, 100, 10000 ),\r
+                       instance = this;\r
+               elmWrap.className = CLASS_NAME_LOADING;\r
+               function onLoad( _url, _actualW, _actualH){\r
+                       if( elmWrap === null ) return;\r
+                       elmWrap.className = CLASS_NAME;\r
+                       vmlImg = document.createElement( 'v:image' );\r
+                       vmlImg.src = url;\r
+                       onLoadCallback && onLoadCallback( _url, _actualW, _actualH );\r
+                       onLoadCallback = fetch = null;\r
+                       loaded = true;\r
+                       instance.resize( w, h );\r
+               }\r
+               function onError( _url ){\r
+                       if( elmWrap === null) return;\r
+                       elmWrap.className = CLASS_NAME_ERROR;\r
+                       retryTimer = window.setTimeout( retry, RETRY_DELAY );\r
+                       fetch = null;\r
+               }\r
+               function retry(){\r
                        elmWrap.className = CLASS_NAME_LOADING;\r
-                       pettanr.util.loadImage( url, onLoad, onError, 100, 10000);\r
-                       function onLoad( _url, _actualW, _actualH){\r
-                               if( elmWrap === null) return;\r
-                               elmWrap.className = CLASS_NAME;\r
-                               vmlImg = document.createElement( 'v:image');\r
-                               vmlImg.src = url;\r
-                               loaded = true;\r
-                               resize( w, h);\r
-                               onLoadCallback && onLoadCallback( _url, _actualW, _actualH);\r
-                               onLoadCallback = null;\r
-                       }\r
-                       function onError( _url){\r
-                               if( elmWrap === null) return;\r
-                               elmWrap.className = CLASS_NAME_ERROR;\r
-                               retryTimer = setTimeout( function(){\r
-                                       elmWrap.className = CLASS_NAME_LOADING;\r
-                                       pettanr.util.loadImage( url, onLoad, onError, 100, 10000);\r
-                               }, RETRY_DELAY);\r
-                       }\r
-                       function resize( _w, _h){\r
-                               w = _w !== undefined ? _w : w;\r
-                               h = _h !== undefined ? _h : h;\r
-                               if( loaded !== true) return;\r
-                               vmlImg.style.width = w < 0 ? -w : w +'px';\r
-                               vmlImg.style.height = h < 0 ? -h : h +'px';\r
-                               //if( flipH !== _flipH || flipV !== _flipV){\r
-                                       vmlImg.parentNode === elmWrap && elmWrap.removeChild( vmlImg);\r
-                               //}\r
-                                       vmlImg.className = w < 0 || h < 0 ? ( 'img-flip-' + ( w < 0 && h < 0 ? 'vh' : ( w < 0 ? 'h' : 'v'))) : '';\r
-                                       elmWrap.appendChild( vmlImg);\r
-                       }\r
-                       return {\r
-                               elm : elmWrap,\r
-                               resize: resize,\r
-                               destroy: function(){\r
-                                       loaded === true && elmWrap.removeChild( vmlImg);\r
-                                       retryTimer !== null && clearTimeout( retryTimer);\r
-                                       elmWrap = vmlImg = onLoadCallback = retryTimer = null;\r
-                                       delete this.destroy;\r
-                               }\r
-                       }\r
+                       fetch = FetchImageControl.load( url, onLoad, onError, 100, 10000 );\r
+               }\r
+               \r
+               this.elm = elmWrap;\r
+               this.resize = function( _w, _h ){\r
+                       w = _w !== undefined ? _w : w;\r
+                       h = _h !== undefined ? _h : h;\r
+                       if( loaded !== true ) return;\r
+                       vmlImg.style.width = w < 0 ? -w : w +'px';\r
+                       vmlImg.style.height = h < 0 ? -h : h +'px';\r
+                       //if( flipH !== _flipH || flipV !== _flipV){\r
+                               vmlImg.parentNode === elmWrap && elmWrap.removeChild( vmlImg );\r
+                       //}\r
+                               vmlImg.className = w < 0 || h < 0 ? ( 'img-flip-' + ( w < 0 && h < 0 ? 'vh' : ( w < 0 ? 'h' : 'v'))) : '';\r
+                               elmWrap.appendChild( vmlImg );\r
                }\r
-               var serverImage = function( url, w, h, onLoadCallback){\r
+               this.destroy = function(){\r
+                       instance.destroy;\r
                        \r
+                       loaded === true && elmWrap.removeChild( vmlImg );\r
+                       retryTimer !== null && window.clearTimeout( retryTimer );\r
+                       fetch !== null && fetch.stop();\r
+                       elmWrap = vmlImg = onLoadCallback = retryTimer = fetch = instance = null;\r
                }\r
+       }\r
+       \r
+       var serverImage = function( url, w, h, onLoadCallback ){\r
                \r
-               return function( url, w, h, onLoadCallback){\r
-                               var flipH = w < 0,\r
-                                       flipV = h < 0,\r
-                                       onLoadCallbackAsync = onLoadCallback,// ? function(){ setTimeout( onLoadCallback, 0);} : undefined,// 一度読み込んだ画像は即座にonLoadになるため遅延\r
-                                       xBackendImage = ( function( urlIsXDomain){\r
-                                               if( BACKEND === IS_CSS3) return css3Image.apply( {}, [ url, w, h, onLoadCallbackAsync]);\r
-                                               if( BACKEND === IS_VML) return vmlImage.apply( {}, [ url, w, h, onLoadCallbackAsync]);\r
-                                               if( BACKEND === IS_ACTIVEX) return activexImage.apply( {}, [ url, w, h, onLoadCallbackAsync]);\r
-                                               return serverImage.apply( {}, [ url, w, h, onLoadCallbackAsync]);\r
-                                       })();\r
-                               return {\r
-                                       elm: xBackendImage.elm,\r
-                                       w: function( _w){\r
-                                               _w !== undefined && xBackendImage.resize( _w, h);\r
-                                               return w;\r
-                                       },\r
-                                       h: function( _h){\r
-                                               _h !== undefined && xBackendImage.resize( w, _h);\r
-                                               return h;\r
-                                       },\r
-                                       resize: xBackendImage.resize,\r
-                                       destroy: function(){\r
-                                               xBackendImage.destroy && xBackendImage.destroy();\r
-                                               xBackendImage = onLoadCallback = onLoadCallbackAsync = null;\r
-                                               delete this.destroy;\r
-                                       }\r
-                               }\r
-                       }\r
-       })();\r
+       }\r
+       \r
+       if( BACKEND === IS_CSS3 ) ReversibleImageClass = css3Image;\r
+       if( BACKEND === IS_VML ) ReversibleImageClass = vmlImage;\r
+       if( BACKEND === IS_ACTIVEX ) ReversibleImageClass = activexImage;\r
+       if( BACKEND === IS_SERVER ) ReversibleImageClass = activexImage;\r
+       \r
+       css3Image = vmlImage = activexImage = activexImage = null;\r
+       \r
        return {\r
                createReversibleImage: function( url, w, h, onLoadCallback){\r
-                       return XBackendReversibleImageClass.apply( {}, [ url, w, h, onLoadCallback]);\r
+                       return new ReversibleImageClass( url, w, h, onLoadCallback );\r
                }\r
        }\r
 })();\r
 \r
 /*\r
- * bind : 製本
+ * bind : 製本\r
  */\r
 pettanr.bind = ( function(){\r
        var BIND_WORKER_ARRAY = [],\r
@@ -2005,10 +2362,10 @@ pettanr.bind = ( function(){
                        \r
                        for( var i=0, l=_comicElements.length; i<l; ++i){\r
                                _comicElement = _comicElements[ i];\r
-                               if( _comicElement.resource_picture){\r
-                                       _rPic = _comicElement.resource_picture || {};\r
+                               _rPic = _comicElement.resource_picture;\r
+                               if( _rPic ){\r
                                        _rImg = pettanr.image.createReversibleImage(\r
-                                                       [ RESOURCE_PICTURE_PATH, _rPic.id, '.', _rPic.ext].join( ''),\r
+                                                       [ RESOURCE_PICTURE_PATH, _rPic.id, '.', _rPic.ext ].join( ''),\r
                                                        _comicElement.width, _comicElement.height\r
                                                );\r
                                        _elmImgWrap = document.createElement( 'div');\r
@@ -2016,15 +2373,15 @@ pettanr.bind = ( function(){
                                        _elmImgWrap.appendChild( _rImg.elm);\r
                                        _elmImgWrap.className = NAMESPACE_CLASSNAME + 'image';\r
                                        _elmImgWrap.style.cssText = [\r
-                                               'width:', Math.abs( _comicElement.width), 'px;',\r
-                                               'height:', Math.abs( _comicElement.height), 'px;',\r
-                                               'left:', _comicElement.x, 'px;',\r
-                                               'top:', _comicElement.y, 'px;',\r
-                                               'z-index:', _comicElement.z, ';'\r
+                                               'width:',  Math.abs( _comicElement.width ), 'px;',\r
+                                               'height:', Math.abs( _comicElement.height ), 'px;',\r
+                                               'left:',   _comicElement.x, 'px;',\r
+                                               'top:',    _comicElement.y, 'px;',\r
+                                               'z-index:',_comicElement.z, ';'\r
                                        ].join( '');\r
                                } else {\r
-                                       _elmBalloonWrap = document.createElement( 'div');\r
-                                       _elmPanel.appendChild( _elmBalloonWrap);\r
+                                       _elmBalloonWrap = document.createElement( 'div' );\r
+                                       _elmPanel.appendChild( _elmBalloonWrap );\r
                                        _elmBalloonWrap.className = NAMESPACE_CLASSNAME + 'balloon';\r
                                        _elmBalloonWrap.style.cssText = [\r
                                                'width:', _comicElement.width, 'px;',\r
@@ -2034,7 +2391,7 @@ pettanr.bind = ( function(){
                                                'z-index:', _comicElement.z, ';'\r
                                        ].join( '');\r
 \r
-                                       _balloon = pettanr.balloon.createBalloon( _comicElement.width, _comicElement.height, _comicElement.tail);\r
+                                       _balloon = pettanr.balloon.createBalloon( _comicElement.width, _comicElement.height, _comicElement.tail );\r
                                        _elmBalloonWrap.appendChild( _balloon.elm);\r
                                        \r
                                        _elmText = ELM_TEXT_ORIGN.cloneNode( true);\r
@@ -2144,7 +2501,7 @@ var VisualEffect = ( function(){
                 * coputedStyle と一致も削除\r
                 * updateTraget ととして記録\r
                 * 初期値を cssObject としてセット\r
-                * cssTest にセット zoom もセット 
+                * cssTest にセット zoom もセット\r
                 */\r
                \r
                //\r
@@ -2156,7 +2513,7 @@ var VisualEffect = ( function(){
 \r
                        // IE has trouble with opacity if it does not have layout\r
                        // Force it by setting the zoom level\r
-                       style.zoom = 1;
+                       style.zoom = 1;\r
                 */\r
                \r
                var _currentParameters = [],\r
@@ -2206,7 +2563,7 @@ var VisualEffect = ( function(){
                                        _target = _css.substr( 0, _separate +1);\r
                                        _value = _css.substr( _separate +1);\r
                                        /*\r
-                                        * ie filter
+                                        * ie filter\r
                                         */\r
                                        if( _target === FILTER){\r
                                                for( j=0; j<_numAttributes; ++j){\r
@@ -2219,7 +2576,7 @@ var VisualEffect = ( function(){
                                                        }\r
                                                }\r
                                        /*\r
-                                        * other
+                                        * other\r
                                         */\r
                                        } else {\r
                                                _number = '' + parseFloat( _value);\r
@@ -2238,7 +2595,7 @@ var VisualEffect = ( function(){
                        return; \r
                }\r
                /*\r
-                * 一度に update する Attributes が少ない場合、cssText は使用しない.
+                * 一度に update する Attributes が少ない場合、cssText は使用しない.\r
                 */\r
        }\r
        \r
@@ -2247,16 +2604,16 @@ var VisualEffect = ( function(){
                return {\r
                        elm:    ELM,\r
                        onEnterFrame: function(){\r
-                               var _updateCss = {};\r
+                               var _updateCss = {}, i;\r
                                if( numFrames === 1){\r
-                                       for( var i=0; i<l; ++i){\r
+                                       for( i=0; i<l; ++i){\r
                                                _updateCss[ targetAttributes[ i]] = endParameters[ i];\r
                                                ++i;\r
                                        }\r
                                        updateCss( ELM, currentParameters, targetAttributes, l);\r
                                        onComplete !== null && onComplete();\r
                                } else {\r
-                                       for( var i=0; i<l; ++i){\r
+                                       for( i=0; i<l; ++i){\r
                                                _updateCss[ targetAttributes[ i]] = currentParameters[ i] = Math.floor( currentParameters[ i] + offsetParameters[ i]);\r
                                                ++i;\r
                                        }\r
index 5941d01..46c3f1d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR system.js
- *   version 0.4.15
+ *   version 0.4.28
  *   
  * author:
  *   itozyun
@@ -8,20 +8,6 @@
  *   3-clause BSD
  */
 
-
-pettanr.log = ( function(){
-       return {
-               init: function(){}
-       }
-})();
-
-pettanr.io = ( function(){
-       
-       return {
-               init: function(){}
-       }
-})();
-
 /*
  * 画像一覧は
  *     お気に入り画像一覧 > tag:ペン次郎 > ペン次郎:笑う
@@ -46,6 +32,8 @@ pettanr.file = ( function(){
        
        var REQUEST_CONTROLER = ( function(){
                var REQUEST_TICKET_RESISTER = [],
+                       currentTicket = null,
+                       currentData = null,
                        DATA_TYPE_ARRAY = 'json,xml,html,text'.split( ','),
                        DATA_IS_JSON = 0,
                        DATA_IS_XML = 1,
@@ -63,21 +51,34 @@ pettanr.file = ( function(){
                };
                
                function request(){
-                       if( REQUEST_TICKET_RESISTER.length === 0) return;
-                       var _ticket = REQUEST_TICKET_RESISTER.shift();
+                       if( currentTicket !== null ) return;
+                       currentTicket = REQUEST_TICKET_RESISTER.shift();
                        $.ajax({
-                               url:            _ticket.url,
-                               dataType:       _ticket.type,
-                               success:        function( _data){
-                                       _ticket.onLoad( _ticket.data, _data);
-                               },
-                               error:          function(){
-                                       ++numError;
-                                       _ticket.onError( _ticket.data);
-                               }
+                               url:            currentTicket.url,
+                               dataType:       currentTicket.type,
+                               success:        onSuccess,
+                               error:          onError
                        });
                }
+               function onSuccess( _data ){
+                       currentData = _data;
+                       window.setTimeout( asyncSuccess, 0 );
+               }
+                       function asyncSuccess(){
+                               currentTicket.onLoad( currentTicket.data, currentData );
+                               currentTicket = currentData = null;
+                               REQUEST_TICKET_RESISTER.length !== 0 && window.setTimeout( request, 0 );
+                       }
                
+               function onError(){
+                       ++numError;
+                       window.setTimeout( asyncError, 0 );
+               }
+                       function asyncError(){
+                               currentTicket.onError( currentTicket.data );
+                               currentTicket = null;
+                               REQUEST_TICKET_RESISTER.length !== 0 && window.setTimeout( request, 0 );
+                       }
                return {
                        getNumTask: function(){
                                return REQUEST_TICKET_RESISTER.length;
@@ -85,9 +86,9 @@ pettanr.file = ( function(){
                        getNumError: function(){
                                return numError;
                        },
-                       getJson: function( _data, _url, _onLoad, _onError){
+                       getJson: function( _data, _url, _onLoad, _onError ){
                                REQUEST_TICKET_RESISTER.push( new RequestTicketClass( DATA_IS_JSON, _data, _url, _onLoad, _onError));
-                               request();
+                               currentTicket === null && request();
                        }
                }
        })();
@@ -101,6 +102,18 @@ pettanr.file = ( function(){
                        TREE_ARRAY.push( _tree);
                        return _tree;
                },
+               getFileUID: function( FILEDATAorFILE ){
+                       if( FILEDATAorFILE instanceof FileClass ){
+                               return FILEDATAorFILE.getUID();
+                       }
+                       
+                       var uid = pettanr.util.getIndex( FILEDATA_RESITER, FILEDATAorFILE );
+                       if( uid === -1){
+                               uid = FILEDATA_RESITER.length;
+                               FILEDATA_RESITER.push( FILEDATAorFILE );
+                       }
+                       return uid;
+               },
                getFileDataAccess: function( UIDorFILEorFILEDATA){
                        var _uid, _data, _access;
                        
@@ -109,7 +122,7 @@ pettanr.file = ( function(){
                        } else
                        if( UIDorFILEorFILEDATA instanceof FileClass){
                                _uid = UIDorFILEorFILEDATA.getUID();
-                               _data = FILEDATA_RESITER[ _uid] || null;
+                               _data = FILEDATA_RESITER[ _uid ] || null;
                        } else {
                                _data = UIDorFILEorFILEDATA || null;
                        }
@@ -120,7 +133,7 @@ pettanr.file = ( function(){
                                if( _access.DATA === _data) return _access;
                        }
                        return null;
-               },              
+               },      
                getFileData: function( UIDorFILEorFILEDATA){
                        var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
                        return _access !== null ? _access.DATA : null;
@@ -154,11 +167,11 @@ pettanr.file = ( function(){
                replace: function( _uid, _file, _newIndex){
                        
                },
-               addEventListener: function( FILEorNULL, _eventType, _callback){
+               addEventListener: function( FILEorNULL, _eventType, _callback ){
                        var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL;
                        EVENT_LISTENER_REGISTER.push( new FileEventTicketClass( _uid, _eventType, _callback));
                },
-               removeEventListener: function( FILEorNULL, _eventType, _callback){
+               removeEventListener: function( FILEorNULL, _eventType, _callback ){
                        var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
                                _ticket;
                        for(var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i){
@@ -169,58 +182,80 @@ pettanr.file = ( function(){
                                }
                        }
                },
-               fileEventRellay: function( _targetFile, _targetTree, _event){
-                       var _uid = _targetTree.getUID(),
-                               _access = TREE_ACCESS_ARRAY[ _uid ],
-                               _data = FILE_CONTROLER.getFileData( _targetFile ),
+               getTreeAccess: function(){
+                       
+               },
+               fileEventRellay: function( _uid, _event ){
+                       var _fileAccess = FILE_CONTROLER.getFileDataAccess( _uid );
+                       if( _fileAccess === null ) return;
+                       var _treeUID =  _fileAccess.TREE.getUID(),
+                               _treeAccess = TREE_ACCESS_ARRAY[ _treeUID ],
+                               _data = _fileAccess.DATA,
                                _tree;
-                       _access && _access.dispatchFileEvent( _event );
+                       if( !_treeAccess ) return;
+                       _treeAccess.dispatchFileEvent( _event );
                        for( var i=0, l = TREE_ARRAY.length; i<l; ++i){
-                               if( i !== _uid){
+                               if( i !== _treeUID ){
                                        _tree = TREE_ARRAY[ i ];
                                        if( FILE_CONTROLER.getFileData( _tree.getCurrentFile() ) === _data ){
-                                               _access = TREE_ACCESS_ARRAY[ _tree.getUID() ];
-                                               _access && _access.dispatchFileEvent( _event);
+                                               _treeAccess = TREE_ACCESS_ARRAY[ _tree.getUID() ];
+                                               _treeAccess && _treeAccess.dispatchFileEvent( _event );
                                        }
                                }
                        }
                }
        }
-
-       var TreeClass = function( ROOTFILE_DATA){
-               var UID = TREE_ACCESS_ARRAY.length,
-                       PARENT_FILE_RESITER = [],
+       
+       var AsyncEventDispatcher = ( function(){
+               var STACK_LIST = [];
+               
+               function dispatch(){
+                       var _stack = STACK_LIST.shift();
+                       _stack[ 0 ]( _stack[ 1 ], _stack[ 2 ], _stack[ 3 ], _stack[ 4 ] );
+                       
+                       while( _stack.length > 0 ){
+                               _stack.shift();
+                       }
+                       if( STACK_LIST.length !== 0 ){
+                               window.setTimeout( dispatch, 0 );
+                       }
+               }
+               return {
+                       addEvent: function( _callback, _eventType, _targetFile, _key, _value ){
+                               if( STACK_LIST.length === 0 ){
+                                       window.setTimeout( dispatch, 0 );
+                               }
+                               STACK_LIST.push( [ _callback, _eventType, _targetFile, _key, _value ] );
+                       }
+               }
+       })();
+       
+       var TreeClass = function( rootFileData ){
+               var PARENT_FILE_RESITER = [],
                        ACCESS = {
-                               dispatchFileEvent:      dispatchFileEvent,
-                               destroy:                        onDestroy
+                               dispatchFileEvent:      dispatchFileEvent
                        },
                        EVENT_LISTENER_ARRAY = [],
                        rootFile,
-                       rootFileData,
                        currentFile,
-                       currentFileData,
                        instance;
                        
-               TREE_ACCESS_ARRAY.push( ACCESS);
-               
-               function onDestroy(){
-                       
-               }
+               TREE_ACCESS_ARRAY.push( ACCESS );
                
-               function dispatchFileEvent( e){
+               function dispatchFileEvent( e ){
                        var _eventType = e.eventType,
                                _targetFile = e.targetFile,
                                _uid = _targetFile.getUID(),
                                _ticket, _type, _callback;
-                       for(var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i){
-                               _ticket = EVENT_LISTENER_REGISTER[i];
+                       for( var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i ){
+                               _ticket = EVENT_LISTENER_REGISTER[ i ];
                                _type = _ticket.eventType;
                                _callback = _ticket.callBack;
-                               if( _eventType === _type && _uid === _ticket.fileUID){
-                                       _callback( _eventType, _targetFile, e.key, e.value);
+                               if( _eventType === _type && _uid === _ticket.fileUID ){
+                                       AsyncEventDispatcher.addEvent( _callback, _eventType, _targetFile, e.key, e.value );
                                } else
-                               if( _type === pettanr.file.TREE_EVENT.UPDATE && _eventType === pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES){
-                                       _callback( _eventType, _targetFile);
+                               if( _type === pettanr.file.TREE_EVENT.UPDATE && _eventType === pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES ){
+                                       AsyncEventDispatcher.addEvent( _callback, _eventType, _targetFile );
                                }
                        }
                }
@@ -228,12 +263,14 @@ pettanr.file = ( function(){
                return {
                        init: function(){
                                instance = this;
-                               currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
+                               currentFile = rootFile = new FileClass( instance, null, rootFileData );
                                // rootFile.init();
                                currentFile.getSeqentialFiles();
                                delete this.init;
                        },
-                       getUID: function(){ return UID},
+                       getUID: function(){
+                               return pettanr.util.getIndex( TREE_ACCESS_ARRAY, ACCESS );
+                       },
                        getRootFile : function(){
                                return rootFile;
                        },
@@ -250,17 +287,23 @@ pettanr.file = ( function(){
                        },
                        down: function( _index){
                                if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
-                               PARENT_FILE_RESITER.unshift( currentFile);
-                               currentFile = currentFile.getChildFileByIndex( _index);
+                               PARENT_FILE_RESITER.unshift( currentFile );
+                               currentFile = currentFile.getChildFileByIndex( _index );
                                currentFile.getSeqentialFiles();
                                return currentFile;
                        },
                        up: function( _index){
                                var l = PARENT_FILE_RESITER.length;
                                if( l === 0) return null;
+                               
+                               if( currentFile ){
+                                       var _currentFile = currentFile;
+                                       currentFile = null;
+                                       _currentFile.destroy();
+                               }
                                if( typeof _index === 'number'){
                                        if( _index >= l) return null;
-                                       currentFile = this.getParentFileAt( _index);
+                                       currentFile = this.getParentFileAt( _index );
                                        PARENT_FILE_RESITER.splice( 0, l -_index);
                                } else {
                                        currentFile = PARENT_FILE_RESITER.shift();
@@ -275,7 +318,17 @@ pettanr.file = ( function(){
                                FILE_CONTROLER.removeEventListener( null, _eventType, _callback);
                        },
                        destroy: function(){
-                               FILE_CONTROLER.destroyTree( UID);
+                               FILE_CONTROLER.destroyTree( instance.getUID() );
+                               // removeEvent
+                               var _currentFile = currentFile;
+                               currentFile = rootFile = rootFileData = null;
+                               // currentFile, rootFile を null にしないと .File.destroy() ができない.
+                               _currentFile.destroy();
+                               while( PARENT_FILE_RESITER.length > 0 ){
+                                       _currentFile = PARENT_FILE_RESITER.shift();
+                                       _currentFile.destroy();
+                               }
+                               instance = null;
                        }
                }
        };
@@ -302,64 +355,31 @@ pettanr.file = ( function(){
  * fileの変更、それに付随して追加されたイベントは、TreeClassで管理される。
  * treeがdestryされると、fileのイベントリスナーも全て削除される。
  * 他の tree も data の共通する currentFile に対してのみは、file の変更イベントを受け取って流す.
+ * 
+ * parentData のほうがいい!
  */
        
-       var FileClass = function( TREE, parentFile, data){
-               var uid = pettanr.util.getIndex( FILEDATA_RESITER, data ),
+       var FileClass = function( tree, parentData, data ){
+               var uid = FILE_CONTROLER.getFileUID( data ),
                        instance = this;
                
-               if( uid === -1){
-                       uid = FILEDATA_RESITER.length;
-                       FILEDATA_RESITER.push( data );
-               }
-               
                FILEDATA_ACCESS.push(
                        {
+                               TREE:                           tree,
+                               parentData:                     parentData,
                                DATA:                           data,
-                               updateParent:           updateParent,
                                dispatchFileEvent:      dispatchEvent
                        }
                );
-
-               function updateParent( _parent){
-                       parentFile = _parent;
-               }
-               function dispatchEvent( e){
-                       FILE_CONTROLER.fileEventRellay( instance, TREE, e);
-               }
                
-               /* grobal Methods */
-
+               tree = parentData = data = null;
+               
+               function dispatchEvent( e ){
+                       FILE_CONTROLER.fileEventRellay( uid, e );
+               }
                this.getUID = function(){
                        return uid;
                }
-               /*
-                * ファイル構造は TRON のような ハイパーリンク方式 だが、文脈上の 親ファイルが存在する.その親ファイルを使う操作は.prototype に置く事ができない.
-                * 同様に TREE を使う操作も .prototype に置く事ができない.
-                */
-               this.getChildFileByIndex = function( _index){
-                       var _children = FILE_CONTROLER.getChildren( instance );
-                       if( typeof _index !== 'number' || _index < 0 || typeof _children.length !== 'number' || _index >= _children.length) return null;
-                       var _file = new FileClass( TREE, this, _children[ _index]);
-                       // _file.init();
-                       return _file;
-               }
-               this.move = function( _newFolder, _newIndex, opt_callback){
-                       TREE.move( parentFile, UID, _newFolder, _newIndex, opt_callback);
-               }
-               this.replace = function( _newIndex, opt_callback){
-                       TREE.replace( parentFile, UID, _newIndex, opt_callback);
-               }
-               this.destroy = function(){
-                       var _access = FILE_CONTROLER.getFileDataAccess( instance );
-                               _index = getChildIndex( FILEDATA_ACCESS, _access );
-                       if( _index === -1 || _access === null) return;
-                       FILEDATA_ACCESS.splice( _index, 1);
-                       TREE = parentFile = data = null;
-                       delete _access.DATA;
-                       delete _access.updateParent;
-                       delete _access.dispatchFileEvent;
-               }
        };
        
        FileClass.prototype = {
@@ -368,31 +388,39 @@ pettanr.file = ( function(){
                },
                getSeqentialFiles: function(){
                        var _driver = FILE_CONTROLER.getDriver( this );
-                       if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
+                       if( _driver !== null && typeof _driver.getSeqentialFiles === 'function' ){
                                _driver.getSeqentialFiles( this );
                        }
                },
-               addEventListener: function( _eventType, _callback){
-                       FILE_CONTROLER.addEventListener( this, _eventType, _callback);
+               addEventListener: function( _eventType, _callback ){
+                       FILE_CONTROLER.addEventListener( this, _eventType, _callback );
                },
-               removeEventListener: function( _eventType, _callback){
-                       FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
+               removeEventListener: function( _eventType, _callback ){
+                       FILE_CONTROLER.removeEventListener( this, _eventType, _callback );
                },
                getChildFileLength: function(){
-                       var children = FILE_CONTROLER.getChildren( this);
+                       var children = FILE_CONTROLER.getChildren( this );
                        return Type.isArray( children ) === true ? children.length : -1;
                },
-               getChildFileIndex: function( _FILEorFILEDATA){
+               getChildFileIndex: function( _FILEorFILEDATA ){
                        var children = FILE_CONTROLER.getChildren( this);
-                       if( Type.isArray( children.length ) === false ) return -1;
+                       if( Type.isArray( children ) === false ) return -1;
                        var l = children.length,
-                               _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA);
-                       if( _fileData === null) return -1;
-                       for(var i=0; i<l; ++i){
-                               if( children[ i] === _fileData) return i;
+                               _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA );
+                       if( _fileData === null ) return -1;
+                       for( var i=0; i<l; ++i ){
+                               if( children[ i ] === _fileData ) return i;
                        }
                        return -1;
                },
+               getChildFileByIndex: function( _index ){
+                       var _access = FILE_CONTROLER.getFileDataAccess( this ),
+                               _children = FILE_CONTROLER.getChildren( this );
+                       if( typeof _index !== 'number' || _index < 0 || Type.isArray( _children ) === false || _index >= _children.length) return null;
+                       var _file = new FileClass( _access.TREE, _access.DATA, _children[ _index ]);
+                       // _file.init();
+                       return _file;
+               },
                getName: function(){
                        var driver = FILE_CONTROLER.getDriver( this );
                        if( typeof driver.getName === 'function'){
@@ -423,33 +451,44 @@ pettanr.file = ( function(){
                        return FileDriverBase.getSummary( this);
                },
                isWritable: function(){
-                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.WRITE);
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.WRITE );
                },
                isSortable: function(){
-                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.SORT);
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.SORT );
                },              
                isCreatable: function(){
-                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.CREATE);
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.CREATE );
                },
                isRenamable: function(){
-                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.RENAME);
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.RENAME );
+               },
+               isDeletable: function(){
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.DELETE );
                },
                read: function(){
                        // simpleDeepCopy
-                       return false;
+                       var driver = FILE_CONTROLER.getDriver( this );
+                       if( typeof driver.read === 'function'){
+                               return driver.read( this );
+                       }
+                       return FileDriverBase.read( this );
                },
-               write: function( _newName, _newData){
-                       return false;
+               write: function( _newData, _onUpdateFunction ){
+                       var driver = FILE_CONTROLER.getDriver( this );
+                       if( typeof driver.write === 'function'){
+                               return driver.write( this, _newData, _onUpdateFunction );
+                       }
+                       return FileDriverBase.write( this, _newData, _onUpdateFunction );
                },
-               viwerApplicationList: function(){
+               viewerApplicationList: function(){
                        var driver = FILE_CONTROLER.getDriver( this );
-                       if( typeof driver.viwerApplicationList === 'function'){
-                               return driver.viwerApplicationList( this );
+                       if( typeof driver.viewerApplicationList === 'function'){
+                               return driver.viewerApplicationList( this );
                        }
-                       return FileDriverBase.viwerApplicationList( this );
+                       return FileDriverBase.viewerApplicationList( this );
                },
                editorApplicationList: function(){
-                       var driver = FILE_CONTROLER.editorApplicationList( this );
+                       var driver = FILE_CONTROLER.getDriver( this );
                        if( typeof driver.editorApplicationList === 'function'){
                                return driver.editorApplicationList( this );
                        }
@@ -466,6 +505,54 @@ pettanr.file = ( function(){
                },
                onDelete: function(){
                        
+               },
+               move: function( _newFolder, _newIndex, opt_callback ){
+                       var _access = FILE_CONTROLER.getFileDataAccess( this );
+                       _access.TREE.move( _access.parentData, this.getUID(), _newFolder, _newIndex, opt_callback );
+               },
+               replace: function( _newIndex, opt_callback ){
+                       var _access = FILE_CONTROLER.getFileDataAccess( this );
+                       _access.TREE.replace( _access.parentData, this.getUID(), _newIndex, opt_callback);
+               },
+               /**
+                * サーチ
+                * 探しているファイルの属性と値を指定.一致する child の index を配列で返す.
+                */
+               search: function( obj, rule ){
+                       var _children = FILE_CONTROLER.getChildren( this ),
+                               _child,
+                               ret = [], k, c;
+                       for( var i=0, l=_children.length; i<l; ++i ){
+                               _child = _children[ i ];
+                               c = true;
+                               for( k in obj ){
+                                       if( obj[ k ] !== _child[ k ] ){
+                                               c = false;
+                                               break;
+                                       }
+                               }
+                               c === true && ret.push( i );
+                       }
+                       return ret;
+               },
+               destroy: function(){
+                       var _access = FILE_CONTROLER.getFileDataAccess( this );
+                       var TREE = _access.TREE;
+                       if( TREE.getCurrentFile() === this ) return;
+                       if( TREE.getRootFile() === this ) return;
+                       for( var i=0, l = TREE.hierarchy(); i<l; ++i ){
+                               if( TREE.getParentFileAt( i ) === this ){
+                                       return;
+                               }
+                       }
+                       var _index = pettanr.util.getIndex( FILEDATA_ACCESS, _access );
+                       if( _index === -1 || _access === null ) return;
+                       // event の 削除
+                       FILEDATA_ACCESS.splice( _index, 1 );
+                       delete _access.DATA;
+                       delete _access.TREE;
+                       delete _access.parentData;
+                       delete _access.dispatchFileEvent;
                }
        }
 
@@ -535,17 +622,44 @@ pettanr.file = ( function(){
                        }
                        return '';
                },
-               getUpdatePolicy: function( _file){
+               getUpdatePolicy: function( _file ){
                        // debug用 全てのメニューを許可
-                       return pettanr.file.FILE_UPDATE_POLICY.SRWC;
+                       return pettanr.file.FILE_UPDATE_POLICY.DSRWC;
                },
-               read: function(){
-                       return false;
+               read: function( _file ){
+                       var data = FILE_CONTROLER.getFileData( _file ),
+                               protects = pettanr.file.FILE_DATA_PROPERTY_RESERVED;
+                       
+                       function clone( src ) {
+                               var ret;
+                               if( Type.isArray(src) === true ){
+                                       ret = [];
+                               } else
+                               if( Type.isObject(src) === true ){
+                                       ret = {};
+                               } else
+                               if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){
+                                       return src;
+                               } else {
+                                       return null;
+                               }
+                               for( var key in src ){
+                                       if( pettanr.util.getIndex( protects, key ) === -1 ){
+                                               //alert( key )
+                                               ret[ key ] = clone( src[ key ]);
+                                       }
+                               }
+                               return ret;
+                       };
+                               
+                       return clone( data );
                },
-               write: function( _newName, _newData){
+               write: function( _file, _newData, _onUpdateFunction ){
+                       var _data = FILE_CONTROLER.getFileData( _file ),
+                               _type = _data.type;
                        return false;
                },
-               viwerApplicationList: function(){
+               viewerApplicationList: function(){
                        return [];
                },
                editorApplicationList: function(){
@@ -591,7 +705,7 @@ pettanr.file = ( function(){
                        //FILE_CONTROLER.init();
                        delete pettanr.file.init;
                },
-               registerDriver: function( _driver){
+               registerDriver: function( _driver ){
                        _driver.prototype = FileDriverBase;
                        /*
                         * File API
@@ -632,26 +746,43 @@ pettanr.file = ( function(){
                        BROKEN:         4
                },
                FILE_UPDATE_POLICY: {
-                       ____:           parseInt( '0000', 2),
-                       ___C:           parseInt( '0001', 2), // hasCreateMenu
-                       __W_:           parseInt( '0010', 2), // isWritable
-                       __WC:           parseInt( '0011', 2), // isWritable
-                       _R__:           parseInt( '0000', 2), // isRenamable
-                       _R_C:           parseInt( '0101', 2), // hasCreateMenu
-                       _RW_:           parseInt( '0110', 2), // isWritable
-                       _RWC:           parseInt( '0111', 2), // isWritable
-                       S___:           parseInt( '1000', 2), // childrenIsSortable
-                       S__C:           parseInt( '1001', 2),
-                       S_W_:           parseInt( '1010', 2),
-                       S_WC:           parseInt( '1011', 2),
-                       SR__:           parseInt( '1000', 2),
-                       SR_C:           parseInt( '1101', 2),
-                       SRW_:           parseInt( '1110', 2),
-                       SRWC:           parseInt( '1111', 2),
+                       _____:          parseInt( '00000', 2),
+                       ____C:          parseInt( '00001', 2), // hasCreateMenu
+                       ___W_:          parseInt( '00010', 2), // isWritable
+                       ___WC:          parseInt( '00011', 2), // isWritable
+                       __R__:          parseInt( '00100', 2), // isRenamable
+                       __R_C:          parseInt( '00101', 2), // hasCreateMenu
+                       __RW_:          parseInt( '00110', 2), // isWritable
+                       __RWC:          parseInt( '00111', 2), // isWritable
+                       _S___:          parseInt( '01000', 2), // childrenIsSortable
+                       _S__C:          parseInt( '01001', 2),
+                       _S_W_:          parseInt( '01010', 2),
+                       _S_WC:          parseInt( '01011', 2),
+                       _SR__:          parseInt( '01100', 2),
+                       _SR_C:          parseInt( '01101', 2),
+                       _SRW_:          parseInt( '01110', 2),
+                       _SRWC:          parseInt( '01111', 2),
+                       D____:          parseInt( '10000', 2),
+                       D___C:          parseInt( '10001', 2), // hasCreateMenu
+                       D__W_:          parseInt( '10010', 2), // isWritable
+                       D__WC:          parseInt( '10011', 2), // isWritable
+                       D_R__:          parseInt( '10100', 2), // isRenamable
+                       D_R_C:          parseInt( '10101', 2), // hasCreateMenu
+                       D_RW_:          parseInt( '10110', 2), // isWritable
+                       D_RWC:          parseInt( '10111', 2), // isWritable
+                       DS___:          parseInt( '11000', 2), // childrenIsSortable
+                       DS__C:          parseInt( '11001', 2),
+                       DS_W_:          parseInt( '11010', 2),
+                       DS_WC:          parseInt( '11011', 2),
+                       DSR__:          parseInt( '11100', 2),
+                       DSR_C:          parseInt( '11101', 2),
+                       DSRW_:          parseInt( '11110', 2),
+                       DSRWC:          parseInt( '11111', 2),
                        CREATE:         1,
                        WRAITE:         2,
                        RENAME:         4,
-                       SORT:           8
+                       SORT:           8,
+                       DELETE:         16
                },
                TREE_EVENT: {
                        UPDATE:                         'onTreeUpdate'
@@ -669,7 +800,11 @@ pettanr.file = ( function(){
 pettanr.finder = ( function(){
        var FINDER_ARRAY = [],
                ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
-               ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
+               ELM_ORIGIN_FINDER_ICON = ( function(){
+                               var forIE = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon-ie'),
+                                       modern = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon');
+                               return pettanr.ua.isIE === true && pettanr.ua.ieVersion < 8 ? forIE : modern;
+                       })(),
                ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
                ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
                ICON_CLASSNAME = 'finder-icon-thumbnail',
@@ -682,50 +817,87 @@ pettanr.finder = ( function(){
                        ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, ICON_CLASSNAME )[0],
                        ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename' )[0],
                        ELM_DESCRIPTION = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-summary' )[0],
-                       file, w, index, style, instansce, callback;
+                       ELM_EDITOR_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-editor-apps' )[0],
+                       ELM_VIEWER_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-viewer-apps' )[0],
+                       ELM_ACTION_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-action' )[0],
+                       file, w, index, style, instansce,
+                       onDownCallback, onEditorCallback, onViewerCallback, onActionCallback,
+                       viewerList, editorList;
                
-               ELM_WRAPPER.onclick = onClick;
-               function onClick(){
-                       callback( index);
+               ELM_WRAPPER.onclick = onDownClick;
+               function onDownClick(){
+                       onDownCallback( index);
+                       return false;
+               }
+               ELM_EDITOR_BUTTON.onclick = onEditorClick;
+               function onEditorClick(){
+                       onEditorCallback( file, editorList[ 0 ] );
+                       return false;
+               }
+               ELM_VIEWER_BUTTON.onclick = onViwerClick;
+               function onViwerClick(){
+                       onViewerCallback( file, viewerList[ 0 ] );
+                       return false;
+               }
+               ELM_ACTION_BUTTON.onclick = onActionClick;
+               function onActionClick(){
+                       onActionCallback( file );
+                       return false;
                }
-
                function draw(){
                        var _thumb = file.getThumbnail();
-                       if( _thumb.image){
+                       if( _thumb.image ){
                                ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
                                ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
                        } else {
-                               ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' +_thumb.className;
+                               ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' + _thumb.className;
                                ELM_THUMBNAIL.style.backgroundImage = '';
                        }
-                       ELM_FILENAME.innerHTML = file.getName();
-                       ELM_DESCRIPTION.innerHTML = file.getSummary();
+                       ELM_FILENAME.firstChild.data = file.getName();
+                       ELM_DESCRIPTION.firstChild.data = file.getSummary();
+                       
+                       if( Type.isArray( viewerList ) === true && viewerList.length > 0 ){
+                               ELM_VIEWER_BUTTON.style.display = '';
+                       } else {
+                               ELM_VIEWER_BUTTON.style.display = 'none';
+                       };
+                       if( Type.isArray( editorList ) === true && editorList.length > 0 ){
+                               ELM_EDITOR_BUTTON.style.display = '';
+                       } else {
+                               ELM_EDITOR_BUTTON.style.display = 'none';
+                       };
                }
                function resize(){
-                       ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
+                       // ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
                }
                function onCollect(){
-                       elmContainer.removeChild( ELM_WRAPPER);
+                       elmContainer.removeChild( ELM_WRAPPER );
                        elmContainer = null;
-                       FINDER_ICON_POOL.push( instansce);
+                       FINDER_ICON_POOL.push( instansce );
                }
                
                return {
-                       init: function( _file, _elmContainer, _w, _index, _style, _callback){
+                       init: function( _file, _elmContainer, _w, _index, _style, _onDownCallback, _onEditorCallback, _onViewerCallback, _onActionCallback ){
                                instansce = this;
                                if( elmContainer !== _elmContainer){
                                        _elmContainer.appendChild( ELM_WRAPPER);
                                        elmContainer = _elmContainer;
                                }
                                if( file !== _file){
+                                       file && file.destroy();
                                        file = _file;
+                                       viewerList = file.viewerApplicationList();
+                                       editorList = file.editorApplicationList();
                                        draw();
                                }
                                if( index !== _index){
                                        index = _index;
                                        resize();
                                }
-                               callback = _callback;
+                               onDownCallback = _onDownCallback;
+                               onEditorCallback = _onEditorCallback;
+                               onViewerCallback = _onViewerCallback;
+                               onActionCallback = _onActionCallback;
                        },
                        elm: ELM_WRAPPER,
                        index: function( _index){
@@ -736,12 +908,13 @@ pettanr.finder = ( function(){
                                
                                return style;
                        },
-                       onResize: function( w){
+                       onResize: function( w ){
                                
                        },
                        destroy: function(){
-                               elmContainer.removeChild( ELM_WRAPPER);
-                               file = elmContainer = null;
+                               elmContainer.removeChild( ELM_WRAPPER );
+                               file && file.destroy();
+                               file = elmContainer = onDownCallback = onEditorCallback = onViewerCallback = onActionCallback = viewerList = editorList = null;
                                FINDER_ICON_POOL.push( instansce);
                        }
                }
@@ -769,9 +942,9 @@ pettanr.finder = ( function(){
                }
 
                return {
-                       init: function( _file, _elmContainer, _index, _callback){
+                       init: function( _file, _elmContainer, _index, _callback ){
                                instansce = this;
-                               if( elmContainer !== _elmContainer){
+                               if( elmContainer !== _elmContainer ){
                                        _elmContainer.appendChild( ELM_WRAPPER);
                                        elmContainer = _elmContainer;
                                }
@@ -796,7 +969,7 @@ pettanr.finder = ( function(){
                        destroy: function(){
                                elmContainer.removeChild( ELM_WRAPPER);
                                file = elmContainer = null;
-                               BREAD_OBJECT_POOL.push( this);
+                               BREAD_OBJECT_POOL.push( this );
                        }
                }
        }
@@ -804,9 +977,9 @@ pettanr.finder = ( function(){
        var FinderClass = function( ELM_CONTAINER, tree, header, footer ){
                var ICON_ARRAY = [],
                        BREAD_ARRAY = [],
-                       elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
-                       elmLocation = elmContainer.getElementsByTagName( 'ul')[0],
-                       nodesDiv = elmContainer.getElementsByTagName( 'div'),
+                       elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true ),
+                       elmLocation = elmContainer.getElementsByTagName( 'ul' )[0],
+                       nodesDiv = elmContainer.getElementsByTagName( 'div' ),
                        elmSidebarButton = nodesDiv[1],
                        elmStyleButton = nodesDiv[2],
                        elmActionButton = nodesDiv[3],
@@ -822,14 +995,16 @@ pettanr.finder = ( function(){
                        iconW = size.width,
                        iconH = size.height,
                        style = 0,
-                       w, h, bodyH;
+                       w, h, bodyH,
+                       instance = this;
                        
-               tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
+               tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw );
+               ELM_CONTAINER.appendChild( elmContainer );
                
                function draw( _w, _h ){
                        w = Type.isFinite( _w ) === true ? _w : w;
                        h = Type.isFinite( _h ) === true ? _h : h;
-                       bodyH = _h - headH;
+                       bodyH = h - headH;
                        var     l = tree.hierarchy() +1,
                                m = BREAD_ARRAY.length,
                                _file, _bread;
@@ -838,7 +1013,7 @@ pettanr.finder = ( function(){
                                if( i < m){
                                        BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
                                } else {
-                                       BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick));
+                                       BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick ));
                                }
                        }
                        while( l < BREAD_ARRAY.length){
@@ -850,9 +1025,9 @@ pettanr.finder = ( function(){
 
                        for( i=0; i<l; ++i){
                                if( i < m){
-                                       ICON_ARRAY[ i].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick);
+                                       ICON_ARRAY[ i ].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onDown, onEditor, onViwer, onAction );
                                } else {
-                                       ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, _w, i, style, onBodyClick));
+                                       ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, _w, i, style, onDown, onEditor, onViwer, onAction ));
                                }
                        }
                        if( _file.getState() === pettanr.file.FILE_STATE.LOADING ){
@@ -860,6 +1035,7 @@ pettanr.finder = ( function(){
                        } else {
                                elmBody.className = 'finder-body';
                        }
+                       
                        elmBody.style.height = bodyH + 'px';
                        
                        while( l < ICON_ARRAY.length){
@@ -877,35 +1053,43 @@ pettanr.finder = ( function(){
                                }
                        }
                }
-               function onBodyClick( i){
-                       var l = ICON_ARRAY.length;
-                       if( i < l){
-                               var _file = tree.getCurrentFile().getChildFileByIndex( i);
+               function onDown( i ){
+                       if( i < ICON_ARRAY.length ){
+                               var _file = tree.getCurrentFile().getChildFileByIndex( i );
                                if( _file !== null && ( _file.getChildFileLength() !== -1 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
-                                       tree.down( i);
+                                       tree.down( i );
                                        draw( w, h );
                                }
                        }
                }
-               
+               function onEditor( _file, _app ){
+                       _app.boot( _file );
+               }
+               function onViwer( _file, _app ){
+                       _app.bootInOverlay( _file );
+               }
+               function onAction( _file ){
+
+               }
+               this.rootElement = elmContainer;
+               this.parentElement = ELM_CONTAINER;
+               this.displayName = 'finder';
+               this.ID = 'finder';
+               this.MIN_WIDTH = 240;
+               this.MIN_HEIGHT = 240;
                this.init = function(){
-                       ELM_CONTAINER.appendChild( elmContainer);
                        //$( elmLocation).click( onHeadClick);
                        //$( elmContainer).click( onBodyClick);
-                       var position = pettanr.util.getAbsolutePosition( elmLocation);
+                       var position = pettanr.util.getAbsolutePosition( elmLocation );
                        headX = position.x;
                        headY = position.y;
-                       bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
-                       delete this.init;
-               }
-               this.onOpen = function( _w, _h, _option ){
-                       this.init !== undefined && this.init();
-                       draw( _w, _h );
+                       bodyY = pettanr.util.getAbsolutePosition( elmBody ).y;
+                       delete instance.init;
                }
-               this.onClose = function(){
-                       return true;
-               }
-               this.onPaneResize = function( _w, _h){
+               this.onPaneResize = function( _w, _h ){
+                       instance.init && instance.init();
+                       draw( _w, _h );                 
+                       
                        w = _w;
                        h = _h;
                        elmBody.style.height = ( _h - headH ) + 'px';
@@ -914,20 +1098,17 @@ pettanr.finder = ( function(){
                                ICON_ARRAY[ i].onResize( _w );
                        }
                }
-               this.MIN_WIDTH = 240;
-               this.MIN_HEIGHT = 240;
        }
+       FinderClass.prototype = pettanr.view._getAbstractApplication();
        
-       pettanr.view.registerAsBasicPane( FinderClass );
-       
-       function getFinderIcon( _file, _elmContainer, w, index, style, callback){
+       function getFinderIcon( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction){
                var _icon;
                if( FINDER_ICON_POOL.length > 0){
                        _icon = FINDER_ICON_POOL.shift();
                } else {
                        _icon = new FinderIconClass();
                }
-               _icon.init( _file, _elmContainer, w, index, style, callback);
+               _icon.init( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction );
                return _icon;
        }
        
@@ -946,9 +1127,11 @@ pettanr.finder = ( function(){
                init: function(){
                        
                },
-               createFinder: function( _elmTarget, _tree, _header, _footer ){
+               createFinder: function( _applicationReference, _elmTarget, _tree, _header, _footer ){
+                       if( pettanr.view.isApplicationReference( _applicationReference ) === false ) return;
+                       
                        var _finder = new FinderClass( _elmTarget, _tree, _header, _footer );
-                       FINDER_ARRAY.push( _finder);
+                       FINDER_ARRAY.push( _finder );
                        return _finder;
                },
                registerFinderHead: function(){
@@ -977,7 +1160,11 @@ pettanr.driver = ( function(){
                                var _data = FileAPI.getFileData( _file),
                                        _json = _data !== null ? _data.json : null;
                                if( _json === true && _data.type === pettanr.driver.FILE_TYPE.COMIC ){
-                                       _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'comics\/', _data.id, '.json\/play\/' ].join( '' );
+                                       if( pettanr.LOCAL === true ){
+                                               _json = [ 'json\/comics_', _data.id, '.json' ].join( '' );
+                                       } else {
+                                               _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'comics\/', _data.id, '.json\/play\/' ].join( '' );
+                                       }
                                }
                                if( typeof _json === 'string'){
                                        FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
@@ -999,10 +1186,10 @@ pettanr.driver = ( function(){
                                        return _data.title;
                                } else
                                if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
-                                       return [ _data.id , ':', _data.name, '画伯' ].join( '');
+                                       return [ _data.name, '画伯' ].join( '');
                                } else
                                if( _type === pettanr.driver.FILE_TYPE.AUTHOR ){
-                                       return [ _data.id , ':', _data.name, '先生' ].join( '');
+                                       return [ _data.name, '先生' ].join( '');
                                }
                                return _data.name;
                        },
@@ -1042,34 +1229,62 @@ pettanr.driver = ( function(){
                                        return 'cabinet file';
                                }
                                if( _type === pettanr.driver.FILE_TYPE.COMIC){
-                                       return 'comic file';
+                                       return 'comic file, id:' + _data.id;
                                }
                                if( _type === pettanr.driver.FILE_TYPE.PANEL){
                                        return [ _data.width, 'x', _data.height ].join( '' );
                                }
                                if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
-                                       return 'author file';
+                                       return 'author file, id:' + _data.id;
                                }
                                if( _type === pettanr.driver.FILE_TYPE.ARTIST){
-                                       return [ 'Email:', _data.email || 'empty' , ', HP:', _data.homepage_url || 'empty' ].join( '' );
+                                       return [ 'id:', _data.id, ' Email:', _data.email || 'empty' , ', HP:', _data.homepage_url || 'empty' ].join( '' );
                                }
                                if( _type === pettanr.file.FILE_TYPE.FOLDER){
                                        return 'pettanR folder';
                                }
                                return 'pettanR unknown file';
                        },
-                       viwerApplicationList: function( _file ){
+                       write: function( _file, _newData, _onUpdateFunction ){
                                var _data = FileAPI.getFileData( _file ),
                                        _type = _data !== null ? _data.type : null;
+                               if( _type === pettanr.driver.FILE_TYPE.COMIC ){
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL ){
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL_PICTURE ){
+                                       
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.BALLOON ){
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.PICTURE ){
+                               }                               
+                       },
+                       viewerApplicationList: function( _file ){
+                               var _data = FileAPI.getFileData( _file ),
+                                       _type = _data !== null ? _data.type : null;
+                                       
+                               if( _data === FILE_DATA_MY_PICTURES_ROOT ){
+                                       return [ pettanr.premiumSatge ];
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
+                                       return [ pettanr.premiumSatge ];
+                               }
                                return [];
                        },
                        editorApplicationList: function( _file ){
                                var _data = FileAPI.getFileData( _file ),
                                        _type = _data !== null ? _data.type : null;
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL ){
+                                       return [ pettanr.editor ];
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.COMIC ){
+                                       return [ pettanr.editor, pettanr.comicConsole ];
+                               }
                                return [];
                        }
                },
-               FileAPI = pettanr.file.registerDriver( Driver),
+               FileAPI = pettanr.file.registerDriver( Driver ),
                FILE_DATA_SERVICE_ROOT = {
                        name:           'PettanR root',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
@@ -1100,7 +1315,8 @@ pettanr.driver = ( function(){
                        name:           'My Comics',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       [],
-                       driver:         Driver
+                       driver:         Driver,
+                       id:                     MyAuthorID
                },
                FILE_DATA_LATEST_COMICS = {
                        name:           'Latest Comics',
@@ -1112,7 +1328,8 @@ pettanr.driver = ( function(){
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       [],
                        driver:         Driver,
-                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
+                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON,
+                       id:                     MyArtistID
                },
                FILE_DATA_AUTHOR_ROOT = {
                        name:           'Authors',
@@ -1293,13 +1510,13 @@ pettanr.driver = ( function(){
                        _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
 
                        // picture data をファイルに取り出し
-                       if( Type.isArray( _data.panel_elements ) === true ){
-                               var _elements,
-                                       _elm, _rpic;
+                       var _elements = _data.panel_elements,
+                               _elm;
+                       if( Type.isArray( _elements ) === true ){
                                for( i=0, l=_elements.length; i<l; ++i){
                                        _elm = _elements[ i];
                                        if( _elm.resource_picture ){
-                                               _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT); // 上記参照切れに備えてここで上書き
+                                               _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT ); // 上記参照切れに備えてここで上書き
                                        } else {
                                                _elm.resource_picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.resource_picture_id );
                                        }
@@ -1312,7 +1529,11 @@ pettanr.driver = ( function(){
                        if( _artist){
                                _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
                                addChildData( _artist, _data );
-                               _artist.id === MyArtistID && addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
+                               if( _artist.id === MyArtistID ){
+                                       addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
+                                       //FILE_DATA_MY_PICTURES_ROOT.type = pettanr.driver.FILE_TYPE.ARTIST;
+                                       //FILE_DATA_MY_PICTURES_ROOT.id = MyArtistID;
+                               }
                        }
                }
                return _data;
@@ -1334,21 +1555,33 @@ pettanr.driver = ( function(){
 
        return {
                createComicTree: function(){
-                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMICS_ROOT);
+                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT ); //FILE_DATA_COMICS_ROOT);
                },
                createPictureTree: function(){
-                       return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
+                       return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT );
+               },
+               createArtistTree: function(){
+                       return pettanr.file.createTree( FILE_DATA_ARTIST_ROOT );
                },
                createServiceTree: function(){
-                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
+                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT );
                },
-               isPettanrFileInstance: function( _file){
-                       if( pettanr.file.isPettanFileInstance( _file) === true){
+               isPettanrFileInstance: function( _file ){
+                       if( pettanr.file.isFileInstance( _file ) === true){
                                var _data = FileAPI.getFileData( _file);
                                return _data !== null && _data.driver === Driver;
                        }
                        return false;
                },
+               _getAPI: function(){
+                       return FileAPI;
+               },
+               _getPictureRootData: function(){
+                       return FILE_DATA_PICTURE_ROOT;
+               },
+               _getMyPicturesData: function(){
+                       return FILE_DATA_MY_PICTURES_ROOT;
+               },
                FILE_TYPE: {
                        COMIC:                          FileAPI.createFileTypeID(),
                        PANEL:                          FileAPI.createFileTypeID(),
@@ -1362,95 +1595,496 @@ pettanr.driver = ( function(){
        }
 })();
 
-pettanr.entrance = {
-               onOpen: function( _w, _h, _option ){
-                       var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
-                       document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
-               },
-               onClose: function(){
-                       document.getElementById('inner-wrapper').style.height = '0px';
-               },
-               onWindowResize: function( _w, _h){
-                       pettanr.entrance.onOpen( _w, _h );
-               }
+pettanr.entrance = pettanr.view.registerApplication( function(){
+       var wrap = document.getElementById('inner-wrapper'),
+               pageHeaderH = pettanr.util.getElementSize( document.getElementById( 'header' ) ).height,
+               instance = this;
+       this.displayName = 'Home';
+       this.ID          = 'Home';
+       this.rootElement = document.getElementById('entrance');
+       this.onOpen = function( _w, _h, _option ){
+               wrap.style.display = '';
+               wrap.style.height = ( _h - pageHeaderH ) + 'px';
        }
-pettanr.backyard = {
-               onOpen: function( _w, _h, _option ){
-               },
-               onClose: function(){
-               },
-               onWindowResize: function( _w, _h){
-               }
+       this.onClose = function(){
+               wrap.style.display = 'none';
        }
-pettanr.debug = {
-               onOpen: function( _w, _h, _option ){
-                       var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
-                       document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
-               },
-               onClose: function(){
-                       document.getElementById('inner-wrapper').style.height = '0px';
-               },
-               onWindowResize: function( _w, _h){
-                       pettanr.debug.onOpen( _w, _h );
-               }
+       this.onPaneResize = function( _w, _h){
+               instance.onOpen( _w, _h );
        }
+});
+pettanr.entrance.addToLancher();
 
-pettanr.gallery = ( function(){
+pettanr.cabinet = pettanr.view.registerApplication( function(){
        var finder,
-               elmContainer = document.getElementById( 'gallery'),
+               elmContainer = document.getElementById( 'cabinet'),
                option,
-               pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
-       return {
-               init: function( _option){
-                       option = _option;
-                       delete pettanr.gallery.init;
-               },
-               firstOpen: function(){
-                       finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
-                       delete pettanr.gallery.firstOpen;
-               },
-               onOpen: function( _w, _h, _option ){
-                       pettanr.gallery.firstOpen !== undefined && pettanr.gallery.firstOpen();
-                       finder.onOpen( _w, _h - pageHeaderH, _option );
-                       
-               },
-               onClose: function(){
-                       finder.onClose();
-               },
-               onWindowResize: function( _w, _h){
-                       finder.resize( _w, _h - pageHeaderH );
-               }
+               pageHeaderH = pettanr.util.getElementSize( document.getElementById( 'header' ) ).height;
+               
+       this.displayName = 'Comic list';
+       this.ID          = 'Comiclist';
+       this.rootElement = elmContainer;
+       this.onOpen = function( _w, _h ){
+               finder = finder || pettanr.finder.createFinder( pettanr.cabinet, elmContainer, pettanr.driver.createComicTree() );
+               finder.resize( _w, _h - pageHeaderH );
        }
-})();
+       this.onClose = function(){
+               // finder.close();
+       }
+       this.onPaneResize = function( _w, _h){
+               finder.resize( _w, _h - pageHeaderH );
+       }
+});
+pettanr.cabinet.addToLancher();
 
-pettanr.cabinet = ( function(){
+pettanr.gallery = pettanr.view.registerApplication( function(){
        var finder,
-               elmContainer = document.getElementById( 'cabinet'),
+               elmContainer = document.getElementById( 'gallery' ),
                option,
-               pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
+               pageHeaderH = pettanr.util.getElementSize( document.getElementById( 'header' ) ).height;
                
-       return {
-               init: function( _option){
-                       option = _option;
-                       delete pettanr.cabinet.init;
-               },
-               firstOpen: function(){
-                       finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
-                       delete pettanr.cabinet.firstOpen;
-               },
-               onOpen: function( _w, _h, _option ){
-                       pettanr.cabinet.firstOpen !== undefined && pettanr.cabinet.firstOpen();
-                       finder.onOpen( _w, _h - pageHeaderH, _option );
+       this.displayName = 'Pictures';
+       this.ID          = 'pictures';
+       this.rootElement = elmContainer;
+       this.onOpen = function( _w, _h ){
+               finder = finder || pettanr.finder.createFinder( pettanr.gallery, elmContainer, pettanr.driver.createPictureTree() );
+               finder.resize( _w, _h - pageHeaderH );
+       }
+       this.onClose = function(){
+               // finder.close();
+       }
+       this.onPaneResize = function( _w, _h){
+               finder.resize( _w, _h - pageHeaderH );
+       }
+});
+pettanr.gallery.addToLancher();
+
+pettanr.backyard = pettanr.view.registerApplication( function(){
+       this.displayName = 'Settings';
+       this.ID          = 'Settinds';
+       this.rootElement = document.getElementById( 'backyard' );
+       this.onOpen = function( _w, _h, _option ){
+       }
+       this.onClose = function(){
+       }
+       this.onPaneResize = function( _w, _h){
+       }
+});
+pettanr.backyard.addToLancher();
+
+if( pettanr.DEBUG === true){
+       pettanr.debug = pettanr.view.registerApplication( function(){
+               var elmDl = document.getElementById( 'useragent'),
+                       elmDt, elmDd,
+                       data = {
+                               pettanR:        pettanr.version,
+                               ua:                     navigator.userAgent,
+                               platform:       navigator.platform,
+                               appVersion:     navigator.appVersion,
+                               appCodeName:navigator.appCodeName,
+                               appName:        navigator.appName,
+                               language:       navigator.browserLanguage || navigator.language,
+                               ActiveX:        pettanr.ua.ACTIVEX
+                       },
+                       ua = pettanr.ua;
+               if( ua.IE){
+                       //data.ua = 'Internet Explorer';
+                       data.version = ua.IE;
+                       if( ua.ieVersion >= 8) data.RenderingVersion = ua.ieRenderingVersion;
+                       data.browserType = ua.STANDALONE === true ? 'Standalone' : 'bundle';
+                       if( ua.ieVersion < 9) {
+                               data.vml = ua.VML;
+                       } else {
+                               data.svg = ua.SVG;
+                       }
+               }
+               data.RenderingMode = ua.isStanderdMode === true ? 'Standerd' : 'Quirks';
+               
+               for( var key in data){
+                       elmDt = document.createElement( 'dt');
+                       elmDt.innerHTML = key;
+                       elmDd = document.createElement( 'dd');
+                       elmDd.innerHTML = '' + data[ key];
+                       if( !data[ key]) elmDd.style.color = 'red';
+                       elmDl.appendChild( elmDt);
+                       elmDl.appendChild( elmDd);
+               }
+               
+               var wrap = document.getElementById('inner-wrapper'),
+                       pageHeaderH = pettanr.util.getElementSize( document.getElementById( 'header' )).height,
+                       instance = this;
+               
+               this.displayName = 'Debug';
+               this.ID          = 'debug';
+               this.rootElement = document.getElementById( 'debug' );
+               this.onOpen = function( _w, _h, _option ){
+                       wrap.style.display = '';
+                       wrap.style.height = ( _h - pageHeaderH ) + 'px';
+               }
+               this.onClose = function(){
+                       wrap.style.display = 'none';
+               }
+               this.onPaneResize = function( _w, _h ){
+                       instance.onOpen( _w, _h );
+               }
+       });
+       pettanr.debug.addToLancher();
+       
+} else {
+       var _debug = document.getElementById( 'debug');
+       if( _debug){
+               pettanr.util.removeAllChildren( _debug);
+               _debug.parentNode.removeChild( _debug);
+               _debug = null;
+       }
+}
+
+/* ----------------------------------------
+ * Image Group Exproler
+ *  - overlay
+ */
+pettanr.premiumSatge = pettanr.view.registerApplication( function(){
+       var ICON_ARRAY = [],
+               WHEEL_DELTA = 64,
+               ARTIST_TREE = pettanr.driver.createArtistTree(),
+               ARTIST_ROOT_FILE = ARTIST_TREE.getRootFile(),
+               instance = this,
+               winW, winH,
+               wrapX,
+               elmWrap = document.getElementById( 'image-group-wrapper' ),
+               elmContainer = document.getElementById( 'image-group-icon-container' ),
+               containerW,
+               containerH = pettanr.util.getElementSize( elmContainer ).height,                
+               elmIconOrigin = ( function(){
+                       var ret = document.createElement( 'div' ),
+                               data = document.createElement( 'div' );
+                       ret.appendChild( data );
+                       ret.className = 'image-group-item';
+                       data.className = 'image-group-item-title';
+                       return ret;
+               })(),
+               jqContainer,
+               size = pettanr.util.getElementSize( elmIconOrigin ),
+               itemW = size.width,
+               itemH = size.height,
+               elmName = document.getElementById( 'image-group-name' ),
+               elmButton = document.getElementById( 'image-group-button' ),
+               buttonW = pettanr.util.getElementSize( elmButton ).width,
+               //onUpdateFunction,
+               onUpdateFunction = null,
+               onUpdateData = null,
+               artistID = -1,
+               onEnterInterval = null;
+
+       elmButton.onclick = clickOK;
+       
+       var BASE_PATH = pettanr.LOCAL === true ? 'resource_pictures\/' : pettanr.CONST.PETTANR_ROOT_PATH + 'resource_pictures\/',
+               THUMB_PATH = BASE_PATH, // + 'thumbnail/',
+               LIMIT_FILESIZE = 1024 * 10; // 10KB
+
+       var ImageGroupIconClass = function( INDEX, data ){
+               var elmIconWrap     = elmIconOrigin.cloneNode( true ),
+                       elmIconTitle    = pettanr.util.getElementsByClassName( elmIconWrap, 'image-group-item-title' )[ 0 ],
+                       SRC             = [ BASE_PATH, data.id, '.', data.ext ].join( ''),
+                       LOW_SRC         = data.filesize && data.filesize > LIMIT_FILESIZE ? [ THUMB_PATH, data.id, '.', data.ext ].join( '') : null,
+                       reversibleImage = null,
+                       timer           = null,
+                       onEnterFlag     = false,
+                       instance        = this;
+               elmContainer.appendChild( elmIconWrap );
+               elmIconWrap.style.left = ( INDEX * itemW ) + 'px';
+               elmIconTitle.appendChild( document.createTextNode( data.filesize + 'bytes' ) );
+               
+               function onImageLoad( url, _imgW, _imgH ){
+                       data.width = _imgW = _imgW || data.width || 64;
+                       data.height = _imgH = _imgH || data.height || 64;
+                       elmIconTitle.firstChild.data = _imgW + 'x' + _imgH;
+                       var zoom = 128 /( _imgW > _imgH ? _imgW : _imgH ),
+                               MATH_FLOOR = Math.floor,
+                               h = MATH_FLOOR( _imgH * zoom ),
+                               w = MATH_FLOOR( _imgW * zoom );
+                       reversibleImage.elm.style.cssText = [
+                               'width:',  w, 'px;',
+                               'height:', h, 'px;',
+                               'margin:', MATH_FLOOR( itemH / 2 - h / 2 ), 'px ', MATH_FLOOR( itemW / 2 - w / 2 ), 'px 0'
+                       ].join('');
+                       reversibleImage.resize( w, h );
+                       elmIconWrap.onclick = onClick;
+               }
+               
+               function onClick(){
+                       onUpdateData = data;
+                       pettanr.premiumSatge.shutdown();
+               }
+               
+               function asyncDraw(){
+                       reversibleImage = pettanr.image.createReversibleImage( LOW_SRC || SRC, itemW, itemH, onImageLoad );
+                       elmIconWrap.appendChild( reversibleImage.elm );
+                       onEnterFlag = true;
+                       timer = null;
+               }
+               
+               this.onEnter = function( delay ){
+                       timer = window.setTimeout( asyncDraw, delay );
+                       delete instance.onEnter;
+               }
+               this.destroy = function(){
+                       delete instance.destroy;
+                       timer && window.clearTimeout( timer );
+                       reversibleImage && reversibleImage.destroy();
+                       pettanr.util.removeAllChildren( elmIconWrap );
+                       elmContainer.removeChild( elmIconWrap );
+                       elmIconWrap.onclick = '';
+                       reversibleImage = elmIconWrap = elmIconTitle = data = timer = null;
+               }
+       }
+       
+       function onEnterShowImage(){
+               var l = ICON_ARRAY.length,
+                       _start = -wrapX /itemW -1,
+                       _end = _start + winW /itemW +1,
+                       _icon;
+               for( var i=0, c = 0; i<l; ++i){
+                       _icon = ICON_ARRAY[ i ];
+                       if( _start < i && i < _end && _icon.onEnter ){
+                               _icon.onEnter( c * 100 );
+                               c++;
+                       }
+               }
+               onEnterInterval !== null && window.clearTimeout( onEnterInterval );
+               onEnterInterval = null;
+       }
+       function clickOK(){
+               pettanr.premiumSatge.shutdown();
+       }
+       function onMouseWheel( e, delta ){
+               if( winW < containerW){
+                       wrapX += delta * WHEEL_DELTA;
+                       wrapX = wrapX > 0 ? 0 : wrapX < winW -containerW ? winW -containerW : wrapX;
+                       jqContainer.css( { left: wrapX});
                        
-               },
-               onClose: function(){
-                       finder.onClose();
-               },
-               onWindowResize: function( _w, _h){
-                       finder.resize( _w, _h - pageHeaderH);
+                       onEnterInterval !== null && window.clearTimeout( onEnterInterval );
+                       onEnterInterval = window.setTimeout( onEnterShowImage, 500 );
                }
+               //e.stopPropagation();
+               return false;                   
        }
-})();
+       
+       function drawIcons(){
+               while( ICON_ARRAY.length > 0 ){
+                       ICON_ARRAY.shift().destroy();
+               }
+               
+               var _index = ARTIST_ROOT_FILE.search( {
+                               id:   artistID,
+                               type: pettanr.driver.FILE_TYPE.ARTIST
+                       })[ 0 ],
+                       _artistFile = ARTIST_ROOT_FILE.getChildFileByIndex( _index ),
+                       _file;
+               if( _artistFile !== null ){
+                       for(var i=0, l=_artistFile.getChildFileLength(); i<l; ++i ){
+                               _file = _artistFile.getChildFileByIndex( i );
+                               ICON_ARRAY.push( new ImageGroupIconClass( i, pettanr.driver._getAPI().getFileData( _file ) ));
+                               _file.destroy();
+                       }
+                       elmName.firstChild.data = _artistFile.getName();
+                       _artistFile.destroy();
+               }
+       }
+       
+       function onFadeout(){
+               while( ICON_ARRAY.length > 0 ){
+                       ICON_ARRAY.shift().destroy();
+               }
+               onUpdateFunction !== null && onUpdateData !== null && onUpdateFunction( onUpdateData );
+               onUpdateFunction = onUpdateData = null;
+       }
+       
+       /* grobal method */
+       // this.rootElement = elmWrap;
+       this.displayName = 'premiumStage';
+       this.ID          = 'premiumStage';
+       this.rootElement = elmWrap;
+       this.MIN_WIDTH   = 320;
+       this.MIN_HEIGHT  = 320;
+       this.init = function(){
+               jqContainer = $( elmContainer ).mousewheel( onMouseWheel );
+               
+               // よくない! 一時的な処理,,,
+               //var tree = pettanr.driver.createPictureTree();
+               //tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, drawIcons );
+               
+               delete instance.init;
+       }
+       this.onOpen = function( _windowW, _windowH, _ARTISTIDorFILE, _onUpdateFunction ){
+               instance.init && instance.init();
+               
+               if( pettanr.driver.isPettanrFileInstance( _ARTISTIDorFILE ) === true ){
+                       var _data = pettanr.driver._getAPI().getFileData( _ARTISTIDorFILE );
+                       if( _ARTISTIDorFILE.getType() === pettanr.driver.FILE_TYPE.ARTIST || pettanr.driver._getMyPicturesData() === _data ){
+                               artistID = _data.id || -1;
+                       }
+               } else
+               if( Type.isNumber( _ARTISTIDorFILE ) === true ){
+                       artistID = _ARTISTIDorFILE;
+               }
+               
+               onUpdateFunction = _onUpdateFunction || null;
+               onUpdateData = null;
+               
+               drawIcons();
+               
+               wrapX = 0;
+               containerW = ICON_ARRAY.length * itemW;
+               
+               winW = _windowW;
+               winH = _windowH;
+               var w = winW > containerW ? winW : containerW,
+                       h = _windowH > containerH ? containerH : _windowH,
+                       MATH_FLOOR = Math.floor;
+               
+               jqContainer.css( {
+                       width:          w,
+                       height:         0,
+                       left:           0,
+                       top:            MATH_FLOOR( _windowH /2)
+               }).stop().animate( {
+                       height:         h,
+                       top:            MATH_FLOOR( _windowH /2 -h /2)
+               }, onEnterShowImage );
+               
+               elmButton.style.cssText = [
+                       'left:', MATH_FLOOR( winW /2 - buttonW /2), 'px;',
+                       'top:', MATH_FLOOR( _windowH /2 + containerH /2 +10), 'px'
+               ].join('');
+       }
+       this.onPaneResize = function( _windowW, _windowH ){
+               var w = _windowW > containerW ? _windowW : containerW,
+                       h = _windowH > containerH ? containerH : _windowH,
+                       MATH_FLOOR = Math.floor,
+                       offsetW = MATH_FLOOR( _windowW /2 -winW /2);
+                       
+               winW = _windowW;
+               winH = _windowH;
+               if( offsetW <= 0){ // smaller
+                       jqContainer.css( {
+                               left:                           offsetW,
+                               width:                          w
+                       }).animate( {
+                               left:                           0,
+                               top:                            MATH_FLOOR( _windowH /2 -h /2)
+                       });                                     
+               } else {
+                       jqContainer.css( { // bigger
+                               left:                           0,
+                               width:                          w,
+                               borderLeftWidth:        offsetW
+                       }).animate( {
+                               top:                            MATH_FLOOR( _windowH /2 -h /2),
+                               borderLeftWidth:        0
+                       });
+               }
+               elmButton.style.cssText = [
+                       'left:', MATH_FLOOR( _windowW /2 -buttonW /2), 'px;',
+                       'top:', MATH_FLOOR( _windowH /2 +containerH /2 +10), 'px'
+               ].join('');
+               onEnterShowImage();
+       }
+       this.onClose = function(){
+               jqContainer.stop().animate( {
+                               height: 0,
+                               top:    Math.floor( winH /2 )
+                       }, onFadeout );
+               onEnterInterval !== null && window.clearTimeout( onEnterInterval );
+               onEnterInterval = null;
+       }
+});
+
+
+/* ----------------------------------------
+ * Text Editor
+ *  - overlay
+ */
+pettanr.textEditor = pettanr.view.registerApplication( function(){
+       var jqWrap, jqTextarea, jqButton,
+               textElement, onUpdateFunction,
+               ID = 'textEditor',
+               panelX, panelY,
+               instance = this;
+       //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);
+       
+       function clickOK(){
+               textElement && textElement.text( jqTextarea.val() );
+               window.setTimeout( asyncCallback, 0 );
+       }
+       
+       function asyncCallback(){
+               onUpdateFunction && onUpdateFunction( textElement );
+               onUpdateFunction = textElement = null;
+               pettanr.textEditor.shutdown();
+       }
+       
+       function keyCancel( e ){
+               if( e.keyCode === 69 && e.shiftKey === false && e.ctrlKey === true){
+                       clickOK();
+                       e.preventDefault();
+               e.keyCode = 0;
+               e.cancelBubble = true;
+               e.returnValue = false;
+                       return false;
+               }       
+       }
+       function textareaFitHeight(){
+               var rows = 0;
+               while( jqTextarea.height() < textElement.h ){
+                       rows++;
+                       jqTextarea.attr( 'rows', rows );
+               }
+               rows > 1 && jqTextarea.attr( 'rows', --rows );
+       }
+       
+       /* grobal method */
+       // this.rootElement = elmWrap;
+       this.displayName = 'textEditor';
+       this.ID          = 'textEditor';
+       this.rootElement = document.getElementById( 'speach-editor-wrapper' );
+       this.MIN_WIDTH   = 320;
+       this.MIN_HEIGHT  = 320;
+       this.init = function(){
+               jqWrap     = $( '#speach-editor-wrapper' ).hide();
+               jqTextarea = $( '#speach-editor' ).keydown( keyCancel );
+               jqButton   = $( '#speach-edit-complete-button').click( clickOK );
+               delete instance.init;
+       }
+       this.onOpen = function( _w, _h, _panelX, _panelY, _textElement, _onUpdateFunction ){
+               instance.init && instance.init();
+               
+               panelX = _panelX;
+               panelY = _panelY;
+               textElement = _textElement;
+               onUpdateFunction = _onUpdateFunction || null;
+               
+               jqWrap.show();
+               instance.onPaneResize( _w, _h );
+               jqTextarea.val( _textElement.text() ).focus();
+               
+               /*
+                * ie6,7は、textarea { width:100%}でも高さが変わらない。rowsを設定。
+                */
+               pettanr.ua.isIE === true && pettanr.ua.ieVersion <= 7 && setTimeout( textareaFitHeight, 0);
+       }
+       this.onPaneResize = function( _w, _h ){
+               jqWrap.css( {
+                       left:                   textElement.x + panelX,
+                       top:                    textElement.y + panelY,
+                       width:                  textElement.w,
+                       height:                 textElement.h
+               });
+       }
+       this.onClose = function(){
+               jqWrap.hide();
+       }
+});
 
 // i18n
 // login
@@ -1462,10 +2096,6 @@ pettanr.fn( pettanr.key);
 pettanr.fn( pettanr.balloon);
 
 pettanr.fn( pettanr.editor);
-pettanr.fn( pettanr.comicConsole);
-pettanr.fn( pettanr.uploadConsole);
-pettanr.fn( pettanr.panelConsole);
-pettanr.fn( pettanr.artistConsole);
 
 pettanr.fn( pettanr.file);
 pettanr.fn( pettanr.finder);
index 291ee01..8565e27 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * pettanR work.js\r
- *   version 0.4.15\r
+ *   version 0.4.28\r
  *   \r
  * author:\r
  *   itozyun\r
@@ -37,8 +37,6 @@
  *    - MENU_BAR_CONTROL\r
  *    - HISTORY_CONTROL\r
  *    - SAVE_CONTROL\r
- *    - TEXT_EDITOR_CONTROL\r
- *    - IMAGE_GROUP_EXPROLER\r
  *    - WINDOW_CONTROL\r
  *       - WindowClass\r
  *    - INFOMATION_WINDOW\r
  * \r
  * \r
  */\r
-pettanr.editor = ( function(){\r
+pettanr.editor = pettanr.view.registerApplication( function(){\r
 \r
-       var COMIC_ELEMENT_TYPE_IMAGE = 0,\r
-               COMIC_ELEMENT_TYPE_TEXT = 1,\r
+       var PANEL_ELEMENT_TYPE_IMAGE = 0,\r
+               PANEL_ELEMENT_TYPE_TEXT = 1,\r
                MOUSE_LISTENER_ARRAY = [],\r
-               COMIC_ELEMENT_ARRAY = [],\r
+               PANEL_ELEMENT_ARRAY = [],\r
                ELM_MOUSE_EVENT_CHATCHER = document.getElementById( 'mouse-operation-catcher'),\r
                MIN_PANEL_HEIGHT = 20,\r
                MIN_ELEMENT_SIZE = 19,\r
@@ -82,7 +80,11 @@ pettanr.editor = ( function(){
                windowW, windowH,\r
                currentListener = null,\r
                currentCursor = '',\r
+               instance = this,\r
                option,\r
+               comicID = -1,\r
+               panelID = -1,\r
+               panelTimming = -1,\r
                log;\r
 \r
 /* ----------------------------------------\r
@@ -128,7 +130,7 @@ pettanr.editor = ( function(){
                        jqStage, jqBar;\r
                ELM_BAR.style.top = ( -barH) +'px';\r
 \r
-               var MenubarSelectionClass = function( container, title, shortcut, visible, separateAfter){\r
+               var MenubarSelectionClass = function( container, title, shortcut, visible, separateAfter ){\r
                        var ELM_WRAPPER = ELM_SELECTION_ORIGN.cloneNode( true),\r
                                ELM_TITLE = ELM_WRAPPER.getElementsByTagName( 'span')[ 0],\r
                                elmShortcut = ELM_WRAPPER.getElementsByTagName( 'kbd')[ 0];\r
@@ -182,8 +184,7 @@ pettanr.editor = ( function(){
                        ELM_BAR.appendChild( ELM_WRAPPER);\r
                        \r
                        function onClick( e){\r
-                               var that = this,\r
-                                       i = pettanr.util.getChildIndex( this.parentNode, this);\r
+                               var i = pettanr.util.getChildIndex( this.parentNode, this);\r
                                i !== -1 && this.className !== 'disabled' && SELECTION_CALLBACK_ARRAY[ i]( i);\r
                                e.stopPropagation();\r
                                return false;\r
@@ -358,16 +359,16 @@ pettanr.editor = ( function(){
                        var     _argBack = _stack.argBack,\r
                                _argForword = _stack.argForword,\r
                                _value;\r
-                       if( typeof _argBack.length === 'number'){ // isArray\r
+                       if( Type.isArray( _argBack ) === true ){ // isArray\r
                                while( _argBack.length > 0){\r
                                        _value = _argBack.shift();\r
-                                       _destroy === true && typeof _value.destroy === 'function' && _value.destroy();\r
+                                       _destroy === true && Type.isFunction( _value.destroy ) === true && _value.destroy();\r
                                }\r
                        }\r
-                       if( typeof _argForword.length === 'number'){\r
+                       if( Type.isArray( _argForword ) === true ){\r
                                while( _argForword.length > 0){\r
                                        _value = _argForword.shift();\r
-                                       _destroy === true && typeof _value.destroy === 'function' && _value.destroy();\r
+                                       _destroy === true && Type.isFunction( _value.destroy ) === true && _value.destroy();\r
                                }                                               \r
                        }                       \r
                }\r
@@ -383,10 +384,10 @@ pettanr.editor = ( function(){
                                MENUBAR_BACK.visible( false);\r
                                MENUBAR_FORWARD.visible( false);\r
                        while( STACK_BACK.length > 0){\r
-                                       destroyStack( STACK_BACK.shift(), true);\r
+                                       destroyStack( STACK_BACK.shift(), true );\r
                                }\r
                        while( STACK_FORWARD.length > 0){\r
-                                       destroyStack( STACK_FORWARD.shift(), true);\r
+                                       destroyStack( STACK_FORWARD.shift(), true );\r
                                }\r
                        },\r
                    saveState: function( _function, _argBack, _argForword, _destroy) {\r
@@ -402,65 +403,13 @@ pettanr.editor = ( function(){
                                var _stack;\r
                        while( STACK_FORWARD.length > 0){\r
                                        _stack = STACK_FORWARD.shift();\r
-                                       destroyStack( _stack, _stack.destroy);\r
+                                       destroyStack( _stack, _stack.destroy );\r
                                }\r
                                MENUBAR_FORWARD.visible( false);\r
                    }           \r
                }\r
        })();\r
 \r
-\r
-/* ----------------------------------------\r
- * OUTPUT_CONSOLE\r
- *  - overlay\r
- */\r
-       var OUTPUT_CONSOLE = ( function(){\r
-               var jqWrap, jqOutputArea,\r
-                       ID = 'outputConsole';\r
-               //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
-               \r
-               function close(){\r
-                       jqWrap.hide();\r
-                       jqOutputArea.val('');\r
-               }\r
-               function clickOK(){\r
-                       pettanr.overlay.hide();\r
-                       close();                        \r
-               }\r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#output-console-wrapper').hide();\r
-                               jqOutputArea = $( '#output-area');\r
-                               delete OUTPUT_CONSOLE.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( _text){\r
-                               jqWrap.show();\r
-\r
-                               \r
-                               pettanr.overlay.show( this);\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( windowH -jqWrap.height()) /2)\r
-                                       }\r
-                               );                              \r
-                               \r
-                               jqOutputArea.val( _text).focus();\r
-                       },\r
-                       onWindowResize: function(){\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( windowH -jqWrap.height()) /2)\r
-                                       }\r
-                               );\r
-                       },\r
-                       onClose: close,\r
-                       ID: 'textEditor'\r
-               }\r
-       })();\r
-\r
 /* ----------------------------------------\r
  * SAVE_CONTROL\r
  *  - controler\r
@@ -474,24 +423,35 @@ pettanr.editor = ( function(){
                        updated = false;\r
                \r
                function quit(){\r
-                       // 本来は os.application.close();\r
-                       pettanr.view.show( 'entrance');\r
+                       pettanr.editor.shutdown();\r
                }\r
                \r
                function outputAsHtml(){\r
-                       OUTPUT_CONSOLE.show( COMIC_ELEMENT_CONTROL.getAsHTML( true, false));\r
+                       pettanr.outputConsole.bootInOverlay(\r
+                               pettanr.outputConsole.HTML,\r
+                               comicID, panelID, panelTimming,\r
+                               PANEL_CONTROL.w(), PANEL_CONTROL.h(),\r
+                               1, // border, BackgroundImage\r
+                               PANEL_ELEMENT_ARRAY\r
+                       );\r
                }\r
                function outputAsJsonString(){\r
-                       OUTPUT_CONSOLE.show( COMIC_ELEMENT_CONTROL.getAsJsonString());\r
+                       pettanr.outputConsole.bootInOverlay(\r
+                               pettanr.outputConsole.JSON,\r
+                               comicID, panelID, panelTimming,\r
+                               PANEL_CONTROL.w(), PANEL_CONTROL.h(),\r
+                               1, // border, BackgroundImage\r
+                               PANEL_ELEMENT_ARRAY\r
+                       );\r
                }\r
                return {\r
                        open: function(){},\r
                        close: function(){},\r
                        quit: quit,\r
                        panelUpdated: function( _updated){\r
-                               if( _updated !== undefined && updated !== _updated){\r
-                                       SAVE.visible( !!_updated);\r
-                                       SAVE_AND_QUIT.visible( !!_updated);\r
+                               if( _updated !== undefined && updated !== _updated ){\r
+                                       SAVE.visible( !!_updated );\r
+                                       SAVE_AND_QUIT.visible( !!_updated );\r
                                        updated = !!_updated;\r
                                }\r
                                return updated;\r
@@ -503,469 +463,6 @@ pettanr.editor = ( function(){
        })();\r
 \r
 /* ----------------------------------------\r
- * Text Editor\r
- *  - overlay\r
- */\r
-       var TEXT_EDITOR_CONTROL = ( function(){\r
-               var jqWrap, jqTextarea, jqButton,\r
-                       textElement, onUpdateFunction,\r
-                       ID = 'textEditor';\r
-               //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
-               \r
-               function close(){\r
-                       jqWrap.hide();\r
-                       textElement = onUpdateFunction = null;          \r
-               }\r
-               function clickOK(){\r
-                       pettanr.overlay.hide();\r
-                       textElement && textElement.text( jqTextarea.val());\r
-                       onUpdateFunction && onUpdateFunction( textElement);\r
-                       close();                        \r
-               }\r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#speach-editor-wrapper').hide();\r
-                               jqTextarea = $( '#speach-editor').keydown( function( e){\r
-                                       if( e.keyCode === 69 && e.shiftKey === false && e.ctrlKey === true){\r
-                                               clickOK();\r
-                                               e.preventDefault();\r
-                                       e.keyCode = 0;\r
-                                       e.cancelBubble = true;\r
-                                       e.returnValue = false;\r
-                                               return false;\r
-                                       }\r
-                               });\r
-                               jqButton = $( '#speach-edit-complete-button').click( clickOK);\r
-                               delete TEXT_EDITOR_CONTROL.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( _textElement, _onUpdateFunction){\r
-                               textElement = _textElement;\r
-                               onUpdateFunction = _onUpdateFunction || null;\r
-                               pettanr.overlay.show( this);\r
-                               var h = _textElement.h;\r
-                               jqWrap.show().css( {\r
-                                       left:                   _textElement.x +PANEL_CONTROL.x(),\r
-                                       top:                    _textElement.y +PANEL_CONTROL.y(),\r
-                                       width:                  _textElement.w,\r
-                                       height:                 h\r
-                               });\r
-                               jqTextarea.val( _textElement.text()).focus();\r
-                               \r
-                               /*\r
-                                * ie6,7は、textarea { width:100%}でも高さが変わらない。rowsを設定。\r
-                                */\r
-                               pettanr.ua.isIE === true && pettanr.ua.ieVersion <= 7 && setTimeout( function(){\r
-                                       var rows = 0;\r
-                                       while( jqTextarea.height() < h){\r
-                                               rows++;\r
-                                               jqTextarea.attr( 'rows', rows);\r
-                                       }\r
-                                       rows > 1 && jqTextarea.attr( 'rows', rows -1);\r
-                               }, 0);\r
-                       },\r
-                       onWindowResize: function(){\r
-                               textElement && this.show( textElement);\r
-                       },\r
-                       onClose: close,\r
-                       ID: ID\r
-               }\r
-       })();\r
-\r
-/* ----------------------------------------\r
- * Image Group Exproler\r
- *  - overlay\r
- */\r
-       var IMAGE_GROUP_EXPROLER = ( function(){\r
-               var ICON_ARRAY = [],\r
-                       WHEEL_DELTA = 64,\r
-                       containerW, containerH, wrapX,\r
-                       jqWrap, jqContainer, jqItemOrigin,\r
-                       itemW, itemH,\r
-                       jqName, jqButton, buttonW,\r
-                       //onUpdateFunction,\r
-                       _g_onUpdateFunction,\r
-                       winW,\r
-                       onEnterInterval = null;\r
-               \r
-               var BASE_PATH = pettanr.LOCAL === false ? 'http://pettan.heroku.com/resource_pictures/' : 'resource_pictures/',\r
-                       THUMB_PATH = BASE_PATH, // + 'thumbnail/',\r
-                       LIMIT_FILESIZE = 1024 * 10; // 10KB\r
-               var IMAGE_DATA = {\r
-                               pen001: [\r
-                                   {\r
-                                       "created_at": "2011-11-13T08:57:39Z", \r
-                                       "ext": "png", \r
-                                       "filesize": 9969, \r
-                                       "height": 463, \r
-                                       "id": 1, \r
-                                       "updated_at": "2011-11-13T08:57:39Z", \r
-                                       "width": 441\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-13T08:57:54Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 5418, \r
-                                       "height": 500, \r
-                                       "id": 2, \r
-                                       "updated_at": "2011-11-13T08:57:54Z", \r
-                                       "width": 500\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-13T08:58:06Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 8758, \r
-                                       "height": 464, \r
-                                       "id": 3, \r
-                                       "updated_at": "2011-11-13T08:58:06Z", \r
-                                       "width": 366\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-13T08:58:23Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 9383, \r
-                                       "height": 480, \r
-                                       "id": 4, \r
-                                       "updated_at": "2011-11-13T08:58:23Z", \r
-                                       "width": 392\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-13T08:58:33Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 11061, \r
-                                       "height": 500, \r
-                                       "id": 5, \r
-                                       "updated_at": "2011-11-13T08:58:33Z", \r
-                                       "width": 500\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-20T09:50:43Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 1131, \r
-                                       "height": 126, \r
-                                       "id": 6, \r
-                                       "updated_at": "2011-11-20T09:50:43Z", \r
-                                       "width": 259\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-20T09:50:55Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 1125, \r
-                                       "height": 126, \r
-                                       "id": 7, \r
-                                       "updated_at": "2011-11-20T09:50:55Z", \r
-                                       "width": 259\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-20T11:33:12Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 17919, \r
-                                       "height": 600, \r
-                                       "id": 8, \r
-                                       "updated_at": "2011-11-20T11:33:12Z", \r
-                                       "width": 800\r
-                                   },\r
-                                   {\r
-                                       "created_at": "2011-11-20T11:33:12Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 17919, \r
-                                       "height": 600, \r
-                                       "id": 9, \r
-                                       "updated_at": "2011-11-20T11:33:12Z", \r
-                                       "width": 800\r
-                                   },\r
-                                   {\r
-                                       "created_at": "2011-11-20T11:33:12Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 17919, \r
-                                       "height": 600, \r
-                                       "id": 10, \r
-                                       "updated_at": "2011-11-20T11:33:12Z", \r
-                                       "width": 800\r
-                                   },\r
-                                   {\r
-                                       "created_at": "2011-11-20T11:33:12Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 17919, \r
-                                       "height": 600, \r
-                                       "id": 11, \r
-                                       "updated_at": "2011-11-20T11:33:12Z", \r
-                                       "width": 800\r
-                                   },\r
-                                   {\r
-                                       "created_at": "2011-11-22T09:17:20Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 9055, \r
-                                       "height": 473, \r
-                                       "id": 12, \r
-                                       "updated_at": "2011-11-22T09:17:20Z", \r
-                                       "width": 405\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-22T10:11:07Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 8758, \r
-                                       "height": 464, \r
-                                       "id": 13, \r
-                                       "updated_at": "2011-11-22T10:11:07Z", \r
-                                       "width": 366\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-24T09:05:12Z", \r
-                                       "ext": "gif", \r
-                                       "filesize": 6431, \r
-                                       "height": 386, \r
-                                       "id": 16, \r
-                                       "updated_at": "2011-11-24T09:05:12Z", \r
-                                       "width": 453\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-26T04:52:12Z",\r
-                                       "ext": "gif", \r
-                                       "filesize": 6421, \r
-                                       "height": 426, \r
-                                       "id": 17, \r
-                                       "updated_at": "2011-11-26T04:52:12Z", \r
-                                       "width": 306\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-26T04:52:12Z",\r
-                                       "ext": "gif", \r
-                                       "filesize": 6421, \r
-                                       "height": 426, \r
-                                       "id": 18, \r
-                                       "updated_at": "2011-11-26T04:52:12Z", \r
-                                       "width": 306\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-26T04:52:12Z",\r
-                                       "ext": "gif", \r
-                                       "filesize": 6421, \r
-                                       "height": 426, \r
-                                       "id": 19, \r
-                                       "updated_at": "2011-11-26T04:52:12Z", \r
-                                       "width": 306\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-26T04:52:12Z",\r
-                                       "ext": "gif", \r
-                                       "filesize": 6421, \r
-                                       "height": 426, \r
-                                       "id": 20, \r
-                                       "updated_at": "2011-11-26T04:52:12Z", \r
-                                       "width": 306\r
-                                   }, \r
-                                   {\r
-                                       "created_at": "2011-11-26T04:52:12Z",\r
-                                       "ext": "gif", \r
-                                       "filesize": 6421, \r
-                                       "height": 426, \r
-                                       "id": 21, \r
-                                       "updated_at": "2011-11-26T04:52:12Z",\r
-                                       "width": 306\r
-                                   }\r
-                               ]\r
-                       }\r
-               \r
-               var ImageGroupIconClass = function( INDEX, data){\r
-                       var JQ_ICON_WRAP = jqItemOrigin.clone( true),\r
-                               SRC = [ BASE_PATH, data.id, '.', data.ext].join( ''),\r
-                               LOW_SRC = data.filesize && data.filesize > LIMIT_FILESIZE ? [ THUMB_PATH, data.id, '.', data.ext].join( '') : null,\r
-                               reversibleImage = null,\r
-                               onEnterFlag = false,\r
-                               imgW, imgH;\r
-                       JQ_ICON_WRAP.children( 'div').eq( 0).html( data.filesize + 'bytes');\r
-                       jqContainer.append( JQ_ICON_WRAP.css( { left: INDEX * itemW}));\r
-                       \r
-                       function onImageLoad( url, _imgW, _imgH){\r
-                               if( reversibleImage === null) {\r
-                                       alert( url);\r
-                                       return;\r
-                               }\r
-                               imgW = _imgW || data.width || 64;\r
-                               imgH = _imgH || data.height || 64;\r
-                               JQ_ICON_WRAP.children( 'div').eq( 1).html( imgW +'x' +imgH);\r
-                               var zoom = 128 /( imgW > imgH ? imgW : imgH),\r
-                                       h = Math.floor( imgH *zoom),\r
-                                       w = Math.floor( imgW *zoom);\r
-                               reversibleImage.elm.style.width = w +'px';\r
-                               reversibleImage.elm.style.height = h +'px';\r
-                               reversibleImage.elm.style.margin = Math.floor( itemH /2 -h /2)+'px 0 0';\r
-                               reversibleImage.resize( w, h);\r
-                               JQ_ICON_WRAP.click( onClick);\r
-                       }\r
-                       \r
-                       function onClick( e){\r
-                               pettanr.overlay.hide();\r
-                               if( _g_onUpdateFunction) {\r
-                                       if( LOW_SRC === null){\r
-                                               window[ _g_onUpdateFunction]( SRC, imgW, imgH);\r
-                                               window[ _g_onUpdateFunction] = null;\r
-                                       } else {\r
-                                               var _onLoad = pettanr.util.createGlobalFunc( [\r
-                                                               'function( url, w, h){',\r
-                                                                       'window["', _g_onUpdateFunction, '"]( url, w || ', data.width,',  h || ', data.height,');',\r
-                                                                       'window["', _g_onUpdateFunction, '"] = null;',\r
-                                                               '}'\r
-                                                       ].join( '')),\r
-                                                       _onError = pettanr.util.createGlobalFunc( [\r
-                                                               'function( url){',\r
-                                                                       'window["', _g_onUpdateFunction, '"]( url, ', data.width || 64 ,', ', data.height || 64,');',\r
-                                                                       'window["', _g_onUpdateFunction, '"] = null;',\r
-                                                               '}'\r
-                                                       ].join( ''));\r
-                                               pettanr.util.loadImage( SRC, window[ _onLoad], window[ _onError]);\r
-                                               window[ _onLoad] = window[ _onError] = undefined;\r
-                                       }\r
-                               }\r
-                               close();\r
-                       }\r
-                       \r
-                       return {\r
-                               onEnter: function(){\r
-                                       if( onEnterFlag === true) return;\r
-                                       reversibleImage = pettanr.image.createReversibleImage( LOW_SRC || SRC, itemW, itemH, onImageLoad);\r
-                                       JQ_ICON_WRAP.children( 'img').replaceWith( reversibleImage.elm);\r
-                                       onEnterFlag = true;                                             \r
-                               },\r
-                               destroy: function(){\r
-                                       reversibleImage && reversibleImage.destroy();\r
-                                       JQ_ICON_WRAP.remove();\r
-                                       reversibleImage = JQ_ICON_WRAP = null;\r
-                                       delete this.destroy;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               function close(){\r
-                       jqContainer.stop().animate( {\r
-                                       height: 0,\r
-                                       top:    Math.floor( windowH /2)\r
-                               }, function(){\r
-                                       jqWrap.hide()\r
-                               });\r
-                       while( ICON_ARRAY.length > 0){\r
-                               ICON_ARRAY.shift().destroy();\r
-                       }\r
-                       onEnterInterval !== null && window.clearTimeout( onEnterInterval);\r
-                       onEnterInterval = _g_onUpdateFunction = null;\r
-               }\r
-               function onEnterShowImage(){\r
-                       var l = ICON_ARRAY.length,\r
-                               _start = -wrapX /itemW -1,\r
-                               _end = _start + winW /itemW +1;\r
-                       for( var i=0; i<l; ++i){\r
-                               _start < i && i < _end && ICON_ARRAY[ i].onEnter();\r
-                       }\r
-                       onEnterInterval !== null && window.clearTimeout( onEnterInterval);\r
-                       onEnterInterval = null;\r
-               }\r
-               function clickOK(){\r
-                       pettanr.overlay.hide();\r
-                       close();\r
-               }\r
-               function onMouseWheel( e, delta){\r
-                       if( winW < containerW){\r
-                               wrapX += delta *WHEEL_DELTA;\r
-                               wrapX = wrapX > 0 ? 0 : wrapX < winW -containerW ? winW -containerW : wrapX;\r
-                               jqContainer.css( { left: wrapX});\r
-                               \r
-                               onEnterInterval !== null && window.clearTimeout( onEnterInterval);\r
-                               onEnterInterval = window.setTimeout( onEnterShowImage, 500);\r
-                       }\r
-                       //e.stopPropagation();\r
-                       return false;                   \r
-               }\r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#image-gruop-wrapper').hide();\r
-                               jqContainer = $( '#image-icon-container').mousewheel( onMouseWheel);\r
-                               containerH = pettanr.util.getElementSize( jqContainer.get( 0)).height;\r
-                               jqItemOrigin = $( $( '#imageGruopItemTemplete').remove().html());\r
-                               var itemSize = pettanr.util.getElementSize( jqItemOrigin.get( 0));\r
-                               itemW = itemSize.width;\r
-                               itemH = itemSize.height;\r
-                               jqName = $( '#gruop-name-display');\r
-                               jqButton = $( '#image-gruop-button').click( clickOK);\r
-                               buttonW = pettanr.util.getElementSize( jqButton.get( 0)).width;\r
-                               \r
-                               delete IMAGE_GROUP_EXPROLER.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( _onUpdateFunction){\r
-                               //onUpdateFunction = _onUpdateFunction;\r
-                               if( _onUpdateFunction){\r
-                                       _g_onUpdateFunction = pettanr.util.createGlobalFunction( _onUpdateFunction);\r
-                               } else {\r
-                                       _g_onUpdateFunction = null;\r
-                               }\r
-                               pettanr.overlay.show( this);\r
-                               \r
-                               var CURRENT_GROUP_ARRAY = IMAGE_DATA[ 'pen001'] || [],\r
-                                       l = CURRENT_GROUP_ARRAY.length;\r
-                               for( var i=0; i<l; ++i){\r
-                                       ICON_ARRAY.push( ImageGroupIconClass.apply( {}, [ i, CURRENT_GROUP_ARRAY[ i]]));\r
-                               }\r
-                               wrapX = 0;\r
-                               containerW = l * itemW;\r
-                               \r
-                               winW = windowW;\r
-                               var w = winW > containerW ? winW : containerW,\r
-                                       h = windowH > containerH ? containerH : windowH;\r
-                               \r
-                               jqWrap.show();\r
-                               jqContainer.css( {\r
-                                       width:          w,\r
-                                       height:         0,\r
-                                       left:           0,\r
-                                       top:            Math.floor( windowH /2)\r
-                               }).stop().animate( {\r
-                                       height:         h,\r
-                                       top:            Math.floor( windowH /2 -h /2)\r
-                               });\r
-                               \r
-                               jqButton.css( {\r
-                                       left:           Math.floor( winW /2 -buttonW /2),\r
-                                       top:            Math.floor( windowH /2 +containerH /2 +10)\r
-                               });\r
-                               \r
-                               onEnterShowImage();\r
-                       },\r
-                       onWindowResize: function( _windowW, _windowH){\r
-                               var w = _windowW > containerW ? _windowW : containerW,\r
-                                       h = _windowH > containerH ? containerH : _windowH,\r
-                                       offsetW = Math.floor( _windowW /2 -winW /2);\r
-                               winW = _windowW;\r
-                               if( offsetW <= 0){ // smaller\r
-                                       jqContainer.css( {\r
-                                               left:                           offsetW,\r
-                                               width:                          w\r
-                                       }).animate( {\r
-                                               left:                           0,\r
-                                               top:                            Math.floor( _windowH /2 -h /2)\r
-                                       });                                     \r
-                               } else {\r
-                                       jqContainer.css( { // bigger\r
-                                               left:                           0,\r
-                                               width:                          w,\r
-                                               borderLeftWidth:        offsetW\r
-                                       }).animate( {\r
-                                               top:                            Math.floor( _windowH /2 -h /2),\r
-                                               borderLeftWidth:        0\r
-                                       });\r
-                               }\r
-                               jqButton.css( {\r
-                                       left:           Math.floor( _windowW /2 -buttonW /2),\r
-                                       top:            Math.floor( _windowH /2 +containerH /2 +10)\r
-                               });\r
-                               onEnterShowImage();\r
-                       },\r
-                       onClose: close,\r
-                       ID: 'imageGroupExproler'\r
-               }\r
-       })();\r
-\r
-/* ----------------------------------------\r
  * WINDOWS_CONTROL\r
  *  - contloler\r
  *  - mouseEventListener\r
@@ -1396,15 +893,12 @@ pettanr.editor = ( function(){
                                        instance = this;\r
                                        delete this.onInit;\r
                                },\r
-                               onFirstOpen: function( _w, _h){\r
-                                       finder = pettanr.finder.createFinder( document.getElementById( 'image-exproler-container'), pettanr.driver.createPictureTree());\r
-                                       delete this.onFirstOpen;\r
-                               },\r
                                onOpen: function( _w, _h){\r
-                                       finder.onOpen( _w, _h);\r
+                                       finder = finder || pettanr.finder.createFinder( pettanr.editor, document.getElementById( 'image-exproler-container'), pettanr.driver.createPictureTree());\r
+                                       finder.resize( _w, _h );\r
                                },\r
-                               onResize: function( _w, _h){\r
-                                       finder.resize( _w, _h);\r
+                               onResize: function( _w, _h ){\r
+                                       finder.resize( _w, _h );\r
                                }\r
                        },\r
                        'image-exproler', 'Album', 0, 215, 400, 350, false, true, true, 300, 300\r
@@ -1462,13 +956,13 @@ pettanr.editor = ( function(){
                                                x = currentElement !== null ? currentElement.x : 0,\r
                                                y = currentElement !== null ? currentElement.y : 0,\r
                                                z = currentElement !== null ? currentElement.z : 0,\r
-                                               a = _elementType === COMIC_ELEMENT_TYPE_TEXT ? Math.floor( currentElement.angle()) : 0,\r
+                                               a = _elementType === PANEL_ELEMENT_TYPE_TEXT ? Math.floor( currentElement.angle()) : 0,\r
                                                w = currentElement !== null ? currentElement.w : 0,\r
                                                h = currentElement !== null ? currentElement.h : 0,\r
-                                               actualW = _elementType === COMIC_ELEMENT_TYPE_IMAGE ? currentElement.actualW() : 1,\r
-                                               actualH = _elementType === COMIC_ELEMENT_TYPE_IMAGE ? currentElement.actualH() : 1,\r
-                                               wPercent = _elementType === COMIC_ELEMENT_TYPE_IMAGE ? Math.floor( w / actualW *100) : 0,\r
-                                               hPercent = _elementType === COMIC_ELEMENT_TYPE_IMAGE ? Math.floor( h / actualH *100) : 0,\r
+                                               actualW = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? currentElement.actualW() : 1,\r
+                                               actualH = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? currentElement.actualH() : 1,\r
+                                               wPercent = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? Math.floor( w / actualW *100) : 0,\r
+                                               hPercent = _elementType === PANEL_ELEMENT_TYPE_IMAGE ? Math.floor( h / actualH *100) : 0,\r
                                                keepAspect = currentElement !== null && currentElement.keepAspect === true;\r
                                        \r
                                        if( currentElementType !== _elementType){\r
@@ -1762,12 +1256,12 @@ pettanr.editor = ( function(){
                }\r
                \r
                return {\r
-                       open: function( _panelW, _panelH, _borderSize){\r
-                               panelW = _panelW || DEFAULT_PANEL_WIDTH;\r
-                               panelH = _panelH || DEFAULT_PANEL_HEIGHT;\r
+                       open: function( _panelW, _panelH, _borderSize ){\r
+                               panelW = Type.isFinite( _panelW ) === true ? _panelW : DEFAULT_PANEL_WIDTH;\r
+                               panelH = Type.isFinite( _panelH ) === true ? _panelH : DEFAULT_PANEL_HEIGHT;\r
                                //panelX = Math.floor( ( windowW -panelW) /2);\r
                                //panelY = Math.floor( ( windowH -panelH) /2);\r
-                               borderSize = _borderSize !== undefined ? _borderSize : borderSize;\r
+                               borderSize = Type.isFinite( _borderSize ) === true ? _borderSize : borderSize;\r
                                \r
                                //setTimeout( PANEL_CONTROL.resize, 0);\r
                        },\r
@@ -1780,6 +1274,12 @@ pettanr.editor = ( function(){
                        y: function(){\r
                                return panelY;\r
                        },\r
+                       w: function(){\r
+                               return panelW;\r
+                       },\r
+                       h: function(){\r
+                               return panelH;\r
+                       },\r
                        resize: function( isResizerTopAction, _x, _y, _w, _h){\r
                                panelX = _x !== undefined ? _x : panelX;\r
                                panelY = _y !== undefined ? _y : panelY;\r
@@ -1853,66 +1353,64 @@ pettanr.editor = ( function(){
                        }\r
                }\r
                        \r
-               return {\r
-                       onMouseDown: function( _mouseX, _mouseY){\r
-                               var _x = _mouseX -panelX,\r
-                                       _y = _mouseY -panelY;\r
+               this.onMouseDown = function( _mouseX, _mouseY){\r
+                       var _x = _mouseX -panelX,\r
+                               _y = _mouseY -panelY;\r
+                       if( _x < x || x + w < _x || _y < y || y + h < _y) return false;\r
+                       offsetY = _y;\r
+                       startY = panelY;\r
+                       startH = panelH;\r
+                       isDragging = true;\r
+                       MOUSE_CURSOR( 'n-resize');\r
+                       return true;\r
+               }\r
+               this.onMouseMove = function( _mouseX, _mouseY){\r
+                       var _x = _mouseX -panelX,\r
+                               _y = _mouseY -panelY;\r
+                       if( isDragging !== true){\r
                                if( _x < x || x + w < _x || _y < y || y + h < _y) return false;\r
-                               offsetY = _y;\r
-                               startY = panelY;\r
-                               startH = panelH;\r
-                               isDragging = true;\r
-                               MOUSE_CURSOR( 'n-resize');\r
+                               COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
+                               MOUSE_CURSOR( 'pointer');\r
                                return true;\r
-                       },\r
-                       onMouseMove: function( _mouseX, _mouseY){\r
-                               var _x = _mouseX -panelX,\r
-                                       _y = _mouseY -panelY;\r
-                               if( isDragging !== true){\r
-                                       if( _x < x || x + w < _x || _y < y || y + h < _y) return false;\r
-                                       COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
-                                       MOUSE_CURSOR( 'pointer');\r
-                                       return true;\r
+                       } else {\r
+                               var move = _y -offsetY;\r
+                               if( isTop === true){\r
+                                       if( panelH - move < MIN_PANEL_HEIGHT){\r
+                                               move = panelH -MIN_PANEL_HEIGHT;\r
+                                       }\r
+                                       PANEL_CONTROL.resize( true, panelX, panelY + move, panelW, panelH - move);\r
                                } else {\r
-                                       var move = _y -offsetY;\r
-                                       if( isTop === true){\r
-                                               if( panelH - move < MIN_PANEL_HEIGHT){\r
-                                                       move = panelH -MIN_PANEL_HEIGHT;\r
-                                               }\r
-                                               PANEL_CONTROL.resize( true, panelX, panelY + move, panelW, panelH - move);\r
-                                       } else {\r
-                                               var _h = startH +move;\r
-                                               if( 0 < _h && _h < windowH -panelY -RESIZER_HEIGHT -5 -BORDER_WIDTH){\r
-                                                       PANEL_CONTROL.resize( false, panelX, panelY, panelW, _h < MIN_PANEL_HEIGHT ? MIN_PANEL_HEIGHT : _h);\r
-                                               }\r
+                                       var _h = startH +move;\r
+                                       if( 0 < _h && _h < windowH -panelY -RESIZER_HEIGHT -5 -BORDER_WIDTH){\r
+                                               PANEL_CONTROL.resize( false, panelX, panelY, panelW, _h < MIN_PANEL_HEIGHT ? MIN_PANEL_HEIGHT : _h);\r
                                        }\r
                                }\r
-                               return true;\r
-                       },\r
-                       onMouseUp: function( _mouseX, _mouseY){\r
-                               if( isDragging !== true) return;\r
-                               ( startY !== panelY || startH !== panelH) && HISTORY_CONTROL.saveState( restoreState, [ NaN, startY, NaN, startH], [ NaN, panelY, NaN, panelH]);\r
-                               isDragging = false;\r
-                               MOUSE_CURSOR( '');\r
-                       },\r
-                       busy: function(){\r
-                               return isDragging\r
-                       },\r
-                       onPanelResize: function( _x, _y, _w, _h){\r
-                               panelX = _x;\r
-                               panelY = _y;\r
-                               if( panelW !== _w){\r
-                                       ELM.style.width = ( _w +2) +'px';\r
-                                       panelW = _w;\r
-                               }\r
-                               panelH = _h;\r
-                               y = isTop === true ? y : ( panelH +5 +BORDER_WIDTH);\r
-                               w = panelW +2;\r
                        }\r
+                       return true;\r
+               }\r
+               this.onMouseUp = function( _mouseX, _mouseY){\r
+                       if( isDragging !== true) return;\r
+                       ( startY !== panelY || startH !== panelH) && HISTORY_CONTROL.saveState( restoreState, [ NaN, startY, NaN, startH], [ NaN, panelY, NaN, panelH]);\r
+                       isDragging = false;\r
+                       MOUSE_CURSOR( '');\r
+               }\r
+               this.busy = function(){\r
+                       return isDragging\r
+               }\r
+               this.onPanelResize = function( _x, _y, _w, _h){\r
+                       panelX = _x;\r
+                       panelY = _y;\r
+                       if( panelW !== _w){\r
+                               ELM.style.width = ( _w +2) +'px';\r
+                               panelW = _w;\r
+                       }\r
+                       panelH = _h;\r
+                       y = isTop === true ? y : ( panelH +5 +BORDER_WIDTH);\r
+                       w = panelW +2;\r
                }\r
        };\r
-       var     PANEL_RESIZER_TOP = new PanelResizerClass( 'panel-resizer-top', true),\r
-               PANEL_RESIZER_BOTTOM = new PanelResizerClass( 'panel-resizer-bottom', false);\r
+       var     PANEL_RESIZER_TOP = new PanelResizerClass( 'panel-resizer-top', true ),\r
+               PANEL_RESIZER_BOTTOM = new PanelResizerClass( 'panel-resizer-bottom', false );\r
                \r
        PanelResizerClass = undefined;\r
 \r
@@ -1965,7 +1463,7 @@ pettanr.editor = ( function(){
                        SAVE( COMIC_ELEMENT_CONTROL.restoreReplace, [ currentElement, true], [ currentElement, false]);\r
                        var _z = currentElement.z;\r
                        LAYER_BACK_BUTTON.visible( _z > 0);\r
-                       LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
+                       LAYER_FORWARD_BUTTON.visible( _z < PANEL_ELEMENT_ARRAY.length -1);\r
                }\r
                function layerForward(){\r
                        if( currentElement === null) return;\r
@@ -1974,7 +1472,7 @@ pettanr.editor = ( function(){
                        SAVE( COMIC_ELEMENT_CONTROL.restoreReplace, [ currentElement, false], [ currentElement, true]);\r
                        var _z = currentElement.z;\r
                        LAYER_BACK_BUTTON.visible( _z > 0);\r
-                       LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
+                       LAYER_FORWARD_BUTTON.visible( _z < PANEL_ELEMENT_ARRAY.length -1);\r
                }\r
                function del(){\r
                        if( currentElement === null) return;\r
@@ -1984,14 +1482,17 @@ pettanr.editor = ( function(){
                        COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
                }\r
                function edit(){\r
-                       if( currentElement === null || currentElement.type !== COMIC_ELEMENT_TYPE_TEXT) return;\r
-                       TEXT_EDITOR_CONTROL.show( currentElement);\r
-                       buttonBackOrForward( true);\r
+                       if( currentElement === null || currentElement.type !== PANEL_ELEMENT_TYPE_TEXT) return;\r
+                       pettanr.textEditor.bootInOverlay( PANEL_CONTROL.x(), PANEL_CONTROL.y(), currentElement );\r
+                       buttonBackOrForward( true );\r
                }\r
                function change(){\r
                        if( currentElement === null) return;\r
                        buttonBackOrForward( true);\r
-                       IMAGE_GROUP_EXPROLER.show( currentElement.url);\r
+                       pettanr.premiumSatge.bootInOverlay( currentElement.getArtistID(), currentElement.resourcePicture );\r
+               }\r
+               function onImageSelect( resourcePicture ){\r
+                       currentElement.resourcePicture( resourcePicture );\r
                }\r
                return {\r
                        init: function(){\r
@@ -2018,7 +1519,9 @@ pettanr.editor = ( function(){
                                                                                        \r
                                delete CONSOLE_CONTROLER.init;\r
                        },\r
-                       show: function( _currentElement, _w, _h){\r
+                       show: function( _currentElement, _w, _h ){\r
+                               CONSOLE_CONTROLER.init && CONSOLE_CONTROLER.init();\r
+                               \r
                                visible === false && jqConsoleWrapper.show();\r
                                visible = true;\r
                                currentElement = _currentElement;\r
@@ -2026,17 +1529,17 @@ pettanr.editor = ( function(){
                                        _z = _currentElement.z;\r
                                if( currentType !== _currentType){\r
                                        currentType = _currentType;\r
-                                       jqImgConsole.toggle( _currentType === COMIC_ELEMENT_TYPE_IMAGE);\r
-                                       jqTextConsole.toggle( _currentType === COMIC_ELEMENT_TYPE_TEXT);\r
-                                       consoleWidth = _currentType === COMIC_ELEMENT_TYPE_IMAGE ? imgConsoleWidth : textConsoleWidth;\r
-                                       consoleHeight = _currentType === COMIC_ELEMENT_TYPE_IMAGE ? imgConsoleHeight : textConsoleHeight;\r
+                                       jqImgConsole.toggle( _currentType === PANEL_ELEMENT_TYPE_IMAGE);\r
+                                       jqTextConsole.toggle( _currentType === PANEL_ELEMENT_TYPE_TEXT);\r
+                                       consoleWidth = _currentType === PANEL_ELEMENT_TYPE_IMAGE ? imgConsoleWidth : textConsoleWidth;\r
+                                       consoleHeight = _currentType === PANEL_ELEMENT_TYPE_IMAGE ? imgConsoleHeight : textConsoleHeight;\r
                                }\r
                                consoleX = Math.floor( ( _w -consoleWidth) /2);\r
                                \r
                                LAYER_BACK_BUTTON.visible( _z > 0);\r
-                               LAYER_FORWARD_BUTTON.visible( _z < COMIC_ELEMENT_ARRAY.length -1);\r
+                               LAYER_FORWARD_BUTTON.visible( _z < PANEL_ELEMENT_ARRAY.length -1);\r
                                DELETE_BUTTON.visible( true);\r
-                               EDIT_BUTTON.visible( _currentType === COMIC_ELEMENT_TYPE_TEXT);\r
+                               EDIT_BUTTON.visible( _currentType === PANEL_ELEMENT_TYPE_TEXT);\r
                                CHANGE_BUTTON.visible( false);\r
                                \r
                                if( _w > consoleWidth * 1.5 && _h > consoleHeight * 1.5){\r
@@ -2134,7 +1637,7 @@ pettanr.editor = ( function(){
                                currentText = null;\r
                        },\r
                        onStart: function( _currentText, _mouseX, _mouseY){\r
-                               if( _currentText.type !== COMIC_ELEMENT_TYPE_TEXT) return false;\r
+                               if( _currentText.type !== PANEL_ELEMENT_TYPE_TEXT) return false;\r
                                x = _currentText.x;\r
                                y = _currentText.y;\r
                                if( this.hitTest( _mouseX -x, _mouseY -y) === true){\r
@@ -2291,8 +1794,8 @@ pettanr.editor = ( function(){
                return {\r
                        update: draw,\r
                        index: function( _mouseX, _mouseY){\r
-                               var     p;\r
-                               for( var i=4; i<8; i++){\r
+                               var     p, i;\r
+                               for( i=4; i<8; i++){\r
                                        p = POSITION_ARRAY[ i];\r
                                        if( p.x <= _mouseX && p.y <= _mouseY && p.x + p.w >= _mouseX && p.y +p.h >= _mouseY){\r
                                                MOUSE_CURSOR( CURSOR_AND_FLIP[ i].cursor);\r
@@ -2300,7 +1803,7 @@ pettanr.editor = ( function(){
                                                return currentIndex = i;\r
                                        }\r
                                }\r
-                               for( var i=0; i<4; i++){\r
+                               for( i=0; i<4; i++){\r
                                        p = POSITION_ARRAY[ i];\r
                                        if( p.x <= _mouseX && p.y <= _mouseY && p.x + p.w >= _mouseX && p.y +p.h >= _mouseY){\r
                                                MOUSE_CURSOR( CURSOR_AND_FLIP[ i].cursor);\r
@@ -2314,7 +1817,7 @@ pettanr.editor = ( function(){
                        },\r
                        show: function( _currentElement){\r
                                currentElement = _currentElement;\r
-                               currentIsTextElement = _currentElement.type === COMIC_ELEMENT_TYPE_TEXT;\r
+                               currentIsTextElement = _currentElement.type === PANEL_ELEMENT_TYPE_TEXT;\r
                                elmResizerContainerStyle.display = '';\r
                        },\r
                        hide: function(){\r
@@ -2323,7 +1826,7 @@ pettanr.editor = ( function(){
                        },\r
                        onStart: function( _currentElement, _mouseX, _mouseY){\r
                                currentElement = _currentElement;\r
-                               currentIsTextElement = _currentElement.type === COMIC_ELEMENT_TYPE_TEXT;\r
+                               currentIsTextElement = _currentElement.type === PANEL_ELEMENT_TYPE_TEXT;\r
                                if( _currentElement.keepSize === true) return false;\r
                                currentIndex = this.index( _mouseX, _mouseY);\r
                                if( currentIndex === -1) return false;\r
@@ -2333,7 +1836,7 @@ pettanr.editor = ( function(){
                                startY = baseY = _currentElement.y;\r
                                startW = baseW = _currentElement.w;\r
                                startH = baseH = _currentElement.h;\r
-                               if( _currentElement.type === COMIC_ELEMENT_TYPE_IMAGE){\r
+                               if( _currentElement.type === PANEL_ELEMENT_TYPE_IMAGE){\r
                                        startFilpV = _currentElement.flipV();\r
                                        startFilpH = _currentElement.flipH();                                                   \r
                                }\r
@@ -2386,7 +1889,7 @@ pettanr.editor = ( function(){
                                                _h = MIN_ELEMENT_SIZE;\r
                                        }\r
                                } else \r
-                               if( currentElement.type === COMIC_ELEMENT_TYPE_TEXT){\r
+                               if( currentElement.type === PANEL_ELEMENT_TYPE_TEXT){\r
                                        return;\r
                                } else \r
                                if( _w < -MIN_ELEMENT_SIZE || _h < -MIN_ELEMENT_SIZE){\r
@@ -2454,7 +1957,7 @@ pettanr.editor = ( function(){
                        onCancel: function(){\r
                                MOUSE_CURSOR( '');\r
                                COMIC_ELEMENT_OPERATION_MANAGER.resize( startX, startY, startW, startH);\r
-                               currentElement.type === COMIC_ELEMENT_TYPE_IMAGE ?\r
+                               currentElement.type === PANEL_ELEMENT_TYPE_IMAGE ?\r
                                        currentElement.animate( startX, startY, startW, startH, startFilpV, startFilpH) :\r
                                        currentElement.animate( startX, startY, startW, startH, angle);\r
                        },\r
@@ -2560,7 +2063,7 @@ pettanr.editor = ( function(){
                                if( currentElement !== _currentElement){\r
                                        currentElement = _currentElement;\r
                                        \r
-                                       currentIsTextElement = ( _currentElement.type === COMIC_ELEMENT_TYPE_TEXT);\r
+                                       currentIsTextElement = ( _currentElement.type === PANEL_ELEMENT_TYPE_TEXT);\r
                                        currentIsTextElement === true ? TAIL_OPERATOR.show( _currentElement) : TAIL_OPERATOR.hide();\r
                                        \r
                                        flipV = currentIsTextElement === false ? _currentElement.flipV() : 0;\r
@@ -2606,7 +2109,7 @@ pettanr.editor = ( function(){
                                        _a = arg[ 5],\r
                                        _flipV = arg[ 6], _flipH = arg[ 7];\r
                                if( !_currentElement && !currentOperator) return;\r
-                               _currentElement.type === COMIC_ELEMENT_TYPE_IMAGE ?\r
+                               _currentElement.type === PANEL_ELEMENT_TYPE_IMAGE ?\r
                                        _currentElement.animate( _x, _y, _w, _h, _flipV, _flipH) :\r
                                        _currentElement.animate( _x, _y, _w, _h, _a);\r
                                currentOperator !== null && currentOperator.onCancel && currentOperator.onCancel();\r
@@ -2629,9 +2132,9 @@ pettanr.editor = ( function(){
                        busy: function(){\r
                                return currentOperator !== null;\r
                        },\r
-                       hitTest: function( _mouseX, _mouseY, _comicElement){\r
+                       hitTest: function( _mouseX, _mouseY, _panelElement ){\r
                                var _x, _y, _w, _h;\r
-                               if( _comicElement === currentElement){\r
+                               if( _panelElement === currentElement){\r
                                        var _consoleX = CONSOLE_CONTROLER.x();\r
                                        _x = currentx +( _consoleX < 0 ? _consoleX : 0) -HIT_AREA;\r
                                        _y = currenty -HIT_AREA;\r
@@ -2640,11 +2143,12 @@ pettanr.editor = ( function(){
                                        var _consoleY = CONSOLE_CONTROLER.y();\r
                                        _h = ( _consoleY < currenth ? currenth : _consoleY +CONSOLE_CONTROLER.h()) +HIT_AREA *2;\r
                                } else {\r
-                                       _x = _comicElement.x -HIT_AREA;\r
-                                       _y = _comicElement.y -HIT_AREA;\r
-                                       _w = _comicElement.w +HIT_AREA *2;\r
-                                       _h = _comicElement.h +HIT_AREA *2;\r
+                                       _x = _panelElement.x -HIT_AREA;\r
+                                       _y = _panelElement.y -HIT_AREA;\r
+                                       _w = _panelElement.w +HIT_AREA *2;\r
+                                       _h = _panelElement.h +HIT_AREA *2;\r
                                }\r
+                               log.html( [ _x, _y, _w, _h ].join( ' ') );\r
                                return _x <= _mouseX && _mouseX <= _x + _w && _y <= _mouseY && _mouseY <= _y + _h;\r
                        },\r
                        onMouseDown: function( _currentElement, _mouseX, _mouseY){\r
@@ -2681,33 +2185,25 @@ pettanr.editor = ( function(){
         *  // COMIC_ELEMENT_OPERATION_MANAGER\r
         */\r
 \r
-       var AbstractComicElement = function( JQ_WAPPER, COMIC_ELM_TYPE, update, x, y, w, h, z, timing){\r
-               var OPERATOR = COMIC_ELEMENT_OPERATION_MANAGER;\r
-               return {\r
-                       $: JQ_WAPPER,\r
-                       type: COMIC_ELM_TYPE,\r
-                       x: x,\r
-                       y: y,\r
-                       w: w,\r
-                       h: h,                                   \r
-                       z: z,\r
-                       timing: timing,\r
-                       hitTest: function( _mouseX, _mouseY){ return OPERATOR.hitTest(  _mouseX, _mouseY, this);},\r
-                       shift: function( _shiftX, _shiftY){\r
-                               update( this.x +_shiftX, this.y +_shiftY);\r
-                       },\r
-                       busy: function(){\r
-                               return OPERATOR.busy();\r
-                       },\r
-                       onMouseMove: function( _mouseX, _mouseY){\r
-                               OPERATOR.onMouseMove( this, _mouseX, _mouseY);\r
-                       },\r
-                       onMouseUp: function( _mouseX, _mouseY){\r
-                               OPERATOR.onMouseUp( this, _mouseX, _mouseY);\r
-                       },\r
-                       onMouseDown: function( _mouseX, _mouseY){\r
-                               OPERATOR.onMouseDown( this, _mouseX, _mouseY);\r
-                       }\r
+       var AbstractComicElement = function( COMIC_ELM_TYPE ){\r
+               this.type = COMIC_ELM_TYPE;\r
+               this.hitTest = function( _mouseX, _mouseY ){\r
+                       return COMIC_ELEMENT_OPERATION_MANAGER.hitTest( _mouseX, _mouseY, this );\r
+               }\r
+               this.shift = function( _shiftX, _shiftY ){\r
+                       this.resize( this.x + _shiftX, this.y + _shiftY);\r
+               }\r
+               this.busy = function(){\r
+                       return COMIC_ELEMENT_OPERATION_MANAGER.busy();\r
+               }\r
+               this.onMouseMove = function( _mouseX, _mouseY ){\r
+                       COMIC_ELEMENT_OPERATION_MANAGER.onMouseMove( this, _mouseX, _mouseY );\r
+               }\r
+               this.onMouseUp = function( _mouseX, _mouseY ){\r
+                       COMIC_ELEMENT_OPERATION_MANAGER.onMouseUp( this, _mouseX, _mouseY );\r
+               }\r
+               this.onMouseDown = function( _mouseX, _mouseY ){\r
+                       COMIC_ELEMENT_OPERATION_MANAGER.onMouseDown( this, _mouseX, _mouseY );\r
                }\r
        };\r
 \r
@@ -2715,131 +2211,109 @@ pettanr.editor = ( function(){
  * ImageElementClass\r
  */\r
        var     jqImageElementOrigin;\r
-       var ImageElementClass = function( url, IMAGE_SET_ID, x, y, z, w, h, timing){\r
+       var ImageElementClass = function( data ){\r
                jqImageElementOrigin = jqImageElementOrigin || $( $( '#imgElementTemplete').remove().html());\r
                \r
-               var JQ_WRAPPER = jqImageElementOrigin.clone( true),\r
-                       OPERATOR = COMIC_ELEMENT_OPERATION_MANAGER,\r
-                       SAVE = HISTORY_CONTROL.saveState,\r
-                       HIT_AREA = MOUSE_HIT_AREA,\r
-                       reversibleImage = null,\r
-                       actualW = 0, actualH = 0,\r
+               var JQ_WRAPPER = jqImageElementOrigin.clone( true ),\r
+                       w = data.width,\r
+                       h = data.height,\r
+                       x, y, z,\r
                        flipH = w < 0 ? -1 : 1,\r
                        flipV = h < 0 ? -1 : 1,\r
-                       instance;\r
-               w = Math.floor( w);\r
-               h = Math.floor( h);\r
-               \r
-               function update( _x, _y, _w, _h, animate){\r
+                       resourcePicture = data.resource_picture,\r
+                       actualW = data.resource_picture.width,\r
+                       actualH = data.resource_picture.height,\r
+                       reversibleImage = null,\r
+                       instance = this;\r
+               w = Math.floor( w );\r
+               h = Math.floor( h );\r
+\r
+               function onAnimeComplete(){\r
+                       reversibleImage && reversibleImage.resize( flipH * w, flipV * h );\r
+               }\r
+               function updateResourcePicture( _resourcePicture ){\r
+                       resourcePicture = _resourcePicture;\r
+                       \r
+                       actualW = _resourcePicture.width;\r
+                       actualH = _resourcePicture.height;\r
+                       \r
+                       var _reversibleImage = pettanr.image.createReversibleImage( \r
+                                       [ pettanr.CONST.RESOURCE_PICTURE_PATH, _resourcePicture.id, '.', _resourcePicture.ext ].join(''),\r
+                                       flipH * w, flipV * h\r
+                               );\r
+                       if( reversibleImage !== null){\r
+                               JQ_WRAPPER.children( reversibleImage.elm ).replaceWith( _reversibleImage.elm );\r
+                               reversibleImage.destroy();\r
+                       } else {\r
+                               JQ_WRAPPER.append( _reversibleImage.elm );\r
+                       }\r
+                       reversibleImage = _reversibleImage;\r
+               }\r
+               /* global methods */\r
+               this.$ = JQ_WRAPPER;\r
+               //this.x = x;\r
+               //this.y = y;\r
+               //this.w = w;\r
+               //this.h = h;                                   \r
+               this.z = data.z;\r
+               this.timing = data.t;\r
+               this.init = function(){\r
+                       updateResourcePicture( data.resource_picture );\r
+                       instance.resize( data.x, data.y, data.width, data.height );\r
+                       delete instance.init;\r
+               }\r
+               this.flip = function( _updateH, _updateV ){\r
+                       if( _updateH !== true && _updateV !== true ) return;\r
+                       flipH = _updateH === true ? -flipH : flipH;\r
+                       flipV = _updateV === true ? -flipV : flipV;\r
+                       reversibleImage.resize( flipH * w, flipV * h );\r
+               }\r
+               this.flipV = function(){\r
+                       return flipV;\r
+               }\r
+               this.flipH = function(){\r
+                       return flipH;\r
+               }\r
+               this.resourcePicture = function( _resourcePicture ){\r
+                       if( _resourcePicture && _resourcePicture !== resourcePicture ){\r
+                               HISTORY_CONTROL.saveState( updateResourcePicture, resourcePicture, _resourcePicture );\r
+                               updateResourcePicture( _resourcePicture );\r
+                       }\r
+                       return resourcePicture;\r
+               }\r
+               this.getArtistID = function(){\r
+                       return resourcePicture.artist_id || resourcePicture.artist.id || -1;\r
+               }\r
+               this.actualW = function(){ return actualW;}\r
+               this.actualH = function(){ return actualH;}\r
+               this.keepSize = false;\r
+               this.resize = function( _x, _y, _w, _h, animate ){\r
                        instance.x = x = _x !== undefined ? _x : x;\r
                        instance.y = y = _y !== undefined ? _y : y;\r
                        instance.w = w = _w !== undefined ? _w : w;\r
                        instance.h = h = _h !== undefined ? _h : h;\r
-                       JQ_WRAPPER[ animate === true ? 'animate' : 'css']( { \r
+                       JQ_WRAPPER[ animate === true ? 'animate' : 'css' ]( { \r
                                left:   x,\r
                                top:    y,\r
                                width:  w,\r
                                height: h\r
-                       }, 250, onAnimeComplete);\r
+                       }, 250, onAnimeComplete );\r
                        animate !== true && onAnimeComplete();\r
                }\r
-               function onAnimeComplete(){\r
-                       reversibleImage.resize( flipH * w, flipV * h);\r
+               this.animate = function ( _x, _y, _w, _h, _flipH, _flipV ){\r
+                       flipH = _flipH !== undefined ? _flipH : flipH;\r
+                       flipV = _flipV !== undefined ? _flipV : flipV;\r
+                       instance.resize( _x, _y, _w, _h, true );\r
                }\r
-               \r
-               function updateUrl( _url){\r
-                       if( url === _url) return;\r
-                       url = _url || url;\r
-                       var _reversibleImage = pettanr.image.createReversibleImage( url, flipH * w, flipV * h, function( _url, _actualW, _actualH){\r
-                               actualW = _actualW;\r
-                               actualH = _actualH;\r
-                       });\r
-                       if( reversibleImage !== null){\r
-                               JQ_WRAPPER.children( reversibleImage.elm).replaceWith( _reversibleImage.elm);\r
-                               reversibleImage.destroy();\r
-                       } else {\r
-                               JQ_WRAPPER.append( _reversibleImage.elm);\r
-                       }\r
-                       reversibleImage = _reversibleImage;\r
+               this.destroy = function(){\r
+                       delete instance.destroy;\r
+                       \r
+                       reversibleImage.destroy();\r
+                       JQ_WRAPPER.stop().remove();\r
+                       JQ_WRAPPER = reversibleImage = resourcePicture = data = instance = null;\r
                }\r
-               return pettanr.util.extend(\r
-                       new AbstractComicElement( JQ_WRAPPER, COMIC_ELEMENT_TYPE_IMAGE, update, x, y, w, h, z, timing),\r
-                       {\r
-                               init: function(){\r
-                                       instance = this;\r
-                                       updateUrl();\r
-                                       update();\r
-                                       delete this.init;\r
-                               },\r
-                               flip: function( _flipH, _flipV){\r
-                                       if( _flipH !== true && _flipV !== true) return;\r
-                                       flipH = _flipH === true ? -flipH : flipH;\r
-                                       flipV = _flipV === true ? -flipV : flipV;\r
-                                       reversibleImage.resize( flipH * w, flipV * h);\r
-                               },\r
-                               flipV: function(){\r
-                                       return flipV;\r
-                               },\r
-                               flipH: function(){\r
-                                       return flipH;\r
-                               },\r
-                               url: function( _url, _actualW, _actualH){\r
-                                       if( _url && _url !== url){\r
-                                               SAVE( updateUrl, url, _url);\r
-                                               actualW = _actualW;\r
-                                               actualH = _actualH;\r
-                                               updateUrl( _url);\r
-                                       }\r
-                                       return url;\r
-                               },\r
-                               actualW: function(){ return actualW;},\r
-                               actualH: function(){ return actualH;},\r
-                               keepSize: false,\r
-                               resize: update,\r
-                               animate: function ( _x, _y, _w, _h, _flipH, _flipV){\r
-                                       flipH = _flipH !== undefined ? _flipH : flipH;\r
-                                       flipV = _flipV !== undefined ? _flipV : flipV;\r
-                                       update( _x, _y, _w, _h, true);\r
-                               },\r
-                               getAsHTML: function( isAbsoluteUrl, isXHTML){\r
-                                       return [\r
-                                               '<img ',\r
-                                                       'src="', isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url), '" ',\r
-                                                       'width="', w, '" ',\r
-                                                       'height="', h, '" ',\r
-                                                       'style="',                                                                      \r
-                                                               'left:', x, 'px;',\r
-                                                               'top:', y, 'px;',\r
-                                                               'z-index:', this.z, ';',\r
-                                                       '"',\r
-                                               isXHTML !== true ? '>' : ' \/>'\r
-                                       ].join( '');\r
-                               },\r
-                               getAsJsonString: function(){\r
-                                       var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
-                                       return [\r
-                                               '"new', this.timing, '": {', cr,\r
-                                                       '"resource_picture_id": 1,', cr,\r
-                                                       '"x": ', x, ',', cr,\r
-                                                       '"y": ', y, ',', cr,\r
-                                                       '"z": ', this.z, ',', cr,\r
-                                                       '"width": ', w, ',', cr,\r
-                                                       '"height": ', h, ',', cr,\r
-                                                       '"flipv": ', flipV === true ? 1 : 0, ',', cr,\r
-                                                       '"fliph": ', flipH === true ? 1 : 0, ',', cr,\r
-                                                       '"t": ', this.timing, cr,\r
-                                               '}'\r
-                                       ].join( '');\r
-                               },\r
-                               destroy: function(){\r
-                                       reversibleImage.destroy();\r
-                                       JQ_WRAPPER.remove();\r
-                                       JQ_WRAPPER = reversibleImage = OPERATOR = null;\r
-                                       delete this.destroy;\r
-                               }\r
-                       }\r
-               );\r
        }\r
+       ImageElementClass.prototype = new AbstractComicElement( PANEL_ELEMENT_TYPE_IMAGE );\r
 /*\r
  * / ImageElementClass\r
  * --------------------------------------------------------------------------------------------\r
@@ -2859,24 +2333,77 @@ pettanr.editor = ( function(){
  * \r
  */\r
        var jqTextElementOrigin;\r
-       var TextElementClass = function( type, a, text, x, y, z, w, h, timing){\r
+       var TextElementClass = function( data ){\r
                jqTextElementOrigin = jqTextElementOrigin || ( function(){\r
                        var _OLD_IE = $( $( '#textElementTempleteForOldIE').remove().html()),\r
                                _MODERN = $( $( '#textElementTemplete').remove().html());\r
                        return pettanr.ua.isIE === true && pettanr.ua.ieRenderingVersion < 8 ? _OLD_IE : _MODERN;\r
                })();\r
                \r
-               var JQ_WRAPPER = jqTextElementOrigin.clone( true),\r
-                       XBROWSER_BALLOON = pettanr.balloon.createBalloon( w, h, a, type),\r
-                       TEXT_ELM = JQ_WRAPPER.find( 'td,.speach-inner').eq( 0),\r
-                       OPERATOR = COMIC_ELEMENT_OPERATION_MANAGER,\r
-                       HIT_AREA = MOUSE_HIT_AREA,\r
-                       SAVE = HISTORY_CONTROL.saveState,\r
-                       instance;\r
-                       \r
-               JQ_WRAPPER.find( 'img').eq( 0).replaceWith( XBROWSER_BALLOON.elm);\r
+               var JQ_WRAPPER = jqTextElementOrigin.clone( true ),\r
+                       elmText = JQ_WRAPPER.find( 'td,.speach-inner' ).get( 0 ),\r
+                       type     = data.balloon_template_id,\r
+                       text     = ( function(){\r
+                               var _speachs = data.speaches_attributes;\r
+                               for( var k in _speachs ){\r
+                                       return _speachs[ k ].content || '';\r
+                               }\r
+                               return '';\r
+                       })(),\r
+                       balloon = pettanr.balloon.createBalloon( data.width, data.height, data.tail, type ),\r
+                       x, y, w, h, a,\r
+                       instance = this;\r
+               \r
+               JQ_WRAPPER.find( 'img' ).eq( 0 ).replaceWith( balloon.elm );\r
+               \r
+               function updateType( _type ){\r
+                       if( type !== _type ){\r
+                               type = _type || type;\r
+                               balloon.type( type );\r
+                       }\r
+               }\r
+               function updateAngle( _a ){\r
+                       if( _a !== undefined && a !== _a ){\r
+                               a = _a !== undefined ? _a : a;\r
+                               balloon.angle( a );\r
+                       }\r
+               }\r
+               function updateText( _text ){\r
+                       text = _text || text || '';\r
+                       elmText.firstChild.data = text;\r
+               }\r
+               function resizeBalloon(){\r
+                       balloon && balloon.resize( a, w, h );\r
+               }\r
                \r
-               function update( _x, _y, _w, _h, _a, animate){\r
+               /* global methods */\r
+               this.$ = JQ_WRAPPER;\r
+               //this.x = x;\r
+               //this.y = y;\r
+               //this.w = w;\r
+               //this.h = h;\r
+               this.z = data.z;\r
+               this.timing = data.t;\r
+               this.init = function(){\r
+                       updateText();\r
+                       instance.resize( data.x, data.y, data.width, data.height, data.tail );\r
+                       delete instance.init;\r
+               }\r
+               this.angle = function( _a ){\r
+                       _a !== undefined && instance.resize( x, y, w, h, _a );\r
+                       return a;\r
+               }\r
+               this.text = function( _text ){\r
+                       if( _text && text !== _text) {\r
+                               HISTORY_CONTROL.saveState( updateText, text || '', _text );\r
+                               updateText( _text );\r
+                       }\r
+                       return text;\r
+               }\r
+               this.getBalloonURL = function(){\r
+                       return balloon.getURL();\r
+               }\r
+               this.resize = function( _x, _y, _w, _h, _a, animate ){\r
                        instance.x = x = _x !== undefined ? _x : x;\r
                        instance.y = y = _y !== undefined ? _y : y;\r
                        instance.w = w = _w !== undefined ? _w : w;\r
@@ -2888,119 +2415,22 @@ pettanr.editor = ( function(){
                                        top:            y,\r
                                        width:          w,\r
                                        height:         h\r
-                               }, 250,\r
-                               function(){\r
-                                       XBROWSER_BALLOON.resize( a, w, h);\r
-                               }\r
+                               }, 250, resizeBalloon\r
                        );              \r
-                       animate !== true && XBROWSER_BALLOON.resize( a, w, h);\r
-               }\r
-               \r
-               function updateType( _type){\r
-                       if( type !== _type){\r
-                               type = _type || type;\r
-                               XBROWSER_BALLOON.type( type);\r
-                       }\r
+                       animate !== true && resizeBalloon();\r
                }\r
-               function updateAngle( _a){\r
-                       if( _a !== undefined && a !== _a){\r
-                               a = _a !== undefined ? _a : a;\r
-                               XBROWSER_BALLOON.angle( a);\r
-                       }\r
+               this.animate = function ( _x, _y, _w, _h, _a ){\r
+                       instance.resize( _x, _y, _w, _h, _a, true );\r
                }\r
-               function updateText( _text){\r
-                       text = _text || text || '';\r
-                       TEXT_ELM.html( text);\r
+               this.destroy = function(){\r
+                       delete instance.destroy;\r
+                       \r
+                       JQ_WRAPPER.stop().remove();\r
+                       balloon.destroy();\r
+                       JQ_WRAPPER = elmText = data = balloon = instance = null;\r
                }\r
-               \r
-               return pettanr.util.extend(\r
-                       new AbstractComicElement( JQ_WRAPPER, COMIC_ELEMENT_TYPE_TEXT, update, x, y, w, h, z, timing),\r
-                       {\r
-                               init: function(){\r
-                                       instance = this;\r
-                                       updateText();\r
-                                       update();\r
-                                       delete this.init;\r
-                               },\r
-                               angle: function( _a){\r
-                                       _a !== undefined && update( undefined, undefined, undefined, undefined, _a);\r
-                                       return a;\r
-                               },\r
-                               text: function( _text){\r
-                                       if( _text && text !== _text) {\r
-                                               SAVE( updateText, text || '', _text);\r
-                                               updateText( _text);\r
-                                       }\r
-                                       return text;\r
-                               },\r
-                               resize: update,\r
-                               animate: function ( _x, _y, _w, _h, _a){\r
-                                       update( _x, _y, _w, _h, _a, true);\r
-                               },\r
-                               destroy: function(){\r
-                                       JQ_WRAPPER.remove();\r
-                                       XBROWSER_BALLOON.destroy();\r
-                                       OPERATOR = null;\r
-                                       delete this.destroy;\r
-                               },\r
-                               getAsJSON: function(){\r
-                                       \r
-                               },\r
-                               getAsJsonString: function(){\r
-                                       var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
-                                       return [\r
-                                               '"new', this.timing, '": {', cr,\r
-                                                       '"balloon_template_id": ', 1, ',', cr,\r
-                                                       '"system_picture_id": ', 1, ',', cr,\r
-                                                       '"size": ', 1, ',', cr,\r
-                                                       '"tail": ', a, ',', cr,\r
-                                                       '"x": ', x, ',', cr,\r
-                                                       '"y": ', y, ',', cr,\r
-                                                       '"z": ', this.z, ',', cr,\r
-                                                       '"t": ', this.timing, ',', cr,\r
-                                                       '"width": ', w, ',', cr,\r
-                                                       '"height": ', h, ',', cr,\r
-                                                       '"speaches_attributes": {', cr,\r
-                                                       '"newf', this.timing, '": {', cr,\r
-                                                       '"content": "', text, '",', cr,\r
-                                                                       '"x": ', x, ',', cr,\r
-                                                                       '"y": ', y, ',', cr,\r
-                                                                       '"t": ', 0, ',', cr,\r
-                                                                       '"width": ', w, ',', cr,\r
-                                                                       '"height": ', h, cr,\r
-                                                               '}', cr,\r
-                                                       '}', cr,\r
-                                               '}'\r
-                                       ].join( '');\r
-                               },\r
-                               getAsHTML: function( isAbsoluteUrl, isXHTML){\r
-                                       var url = XBROWSER_BALLOON.getURL();\r
-                                       return [\r
-                                               '<img ',\r
-                                                       'src="', isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url), '" ',\r
-                                                       'width="', w, '" ',\r
-                                                       'height="', h, '" ',\r
-                                                       'style="',                                                                      \r
-                                                               'left:', x, 'px;',\r
-                                                               'top:', y, 'px;',\r
-                                                               'z-index:', this.z, ';',\r
-                                                       '"',\r
-                                               isXHTML !== true ? '>' : ' \/>',\r
-                                               pettanr.LINE_FEED_CODE_TEXTAREA,\r
-                                               '<div class="balloon" style="',\r
-                                                       'left:', x, 'px;',\r
-                                                       'top:', y, 'px;',\r
-                                                       'width:', w, 'px;',\r
-                                                       'height:', h, 'px;',\r
-                                                       'z-index:', this.z,\r
-                                               '"><span>', text, '<\/span>', '<\/div>'\r
-                                                       \r
-                                       ].join( '');\r
-                               },\r
-                               getAsXML: function(){}\r
-                       }\r
-               );\r
        }\r
+       TextElementClass.prototype = new AbstractComicElement( PANEL_ELEMENT_TYPE_TEXT );\r
 \r
 /* --------------------------------------------------------------------------------------------\r
  * COMIC_ELEMENT_CONTROL\r
@@ -3026,96 +2456,99 @@ pettanr.editor = ( function(){
         * \r
         * append comicElement\r
         * 1. 新しい comicElement の z-position を得る\r
-        * 2. z の同じ comicElementを見つけ、その前に加える。または一番先頭へ。(COMIC_ELEMENT_ARRAY)\r
-        *    zが大きいほど、COMIC_ELEMENT_ARRAYの先頭へ。\r
-        * 3. dom位置は、COMIC_ELEMENT_ARRAY とは反対に、前のものほど後ろへ。\r
+        * 2. z の同じ comicElementを見つけ、その前に加える。または一番先頭へ。(PANEL_ELEMENT_ARRAY)\r
+        *    zが大きいほど、PANEL_ELEMENT_ARRAYの先頭へ。\r
+        * 3. dom位置は、PANEL_ELEMENT_ARRAY とは反対に、前のものほど後ろへ。\r
         * \r
         * \r
         * remove comicElement\r
         * 1. remove\r
         * 2. renumber z\r
         */\r
-               function appendComicElement( _comicElement) {\r
-                       _comicElement.init && _comicElement.init();\r
-                       var z = _comicElement.z,\r
-                               l = COMIC_ELEMENT_ARRAY.length,\r
-                               _jqElm = _comicElement.$.stop().css( {\r
+               function appendComicElement( _panelElement ) {\r
+                       var z = _panelElement.z,\r
+                               l = PANEL_ELEMENT_ARRAY.length,\r
+                               _jqElm = _panelElement.$.stop().css( {\r
                                        filter:         '',\r
                                        opacity:        ''\r
                                });\r
-                       if( typeof z !== 'number' || z < 0 || z >= l){\r
-                               COMIC_ELEMENT_ARRAY.unshift( _comicElement);\r
-                               ELM_CONTAINER.appendChild( _jqElm.get( 0));\r
+                       if( typeof z !== 'number' || z < 0 || z >= l ){\r
+                               PANEL_ELEMENT_ARRAY.unshift( _panelElement );\r
+                               ELM_CONTAINER.appendChild( _jqElm.get( 0 ));\r
                                _jqElm.fadeIn();\r
+                       } else\r
+                       if( l === 0 ){\r
+                               PANEL_ELEMENT_ARRAY.push( _panelElement );\r
+                               ELM_CONTAINER.appendChild( _jqElm.get( 0 ));\r
                        } else {\r
                                var insertIndex = 0;\r
-                               for( var i = 0; i < l; ++i){\r
-                                       if( COMIC_ELEMENT_ARRAY[ i].z <= z){\r
+                               for( var i = 0; i < l; ++i ){\r
+                                       if( PANEL_ELEMENT_ARRAY[ i ].z <= z ){\r
                                                insertIndex = i;\r
                                                break;\r
                                        }\r
                                }\r
-                               COMIC_ELEMENT_ARRAY[ insertIndex].$.before( _jqElm.fadeIn());\r
-                               COMIC_ELEMENT_ARRAY.splice( insertIndex, 0, _comicElement);\r
+                               PANEL_ELEMENT_ARRAY[ insertIndex ].$.before( _jqElm.fadeIn() );\r
+                               PANEL_ELEMENT_ARRAY.splice( insertIndex, 0, _panelElement );\r
                        }\r
                        renumber();\r
                }\r
-               function removeComicElement( _comicElement) {\r
-                       var l = COMIC_ELEMENT_ARRAY.length;\r
+               function removeComicElement( _panelElement ) {\r
+                       var l = PANEL_ELEMENT_ARRAY.length;\r
                        for( var i=0; i<l; ++i){\r
-                               if( COMIC_ELEMENT_ARRAY[ i] === _comicElement){\r
-                                       COMIC_ELEMENT_ARRAY.splice( i, 1);\r
+                               if( PANEL_ELEMENT_ARRAY[ i ] === _panelElement ){\r
+                                       PANEL_ELEMENT_ARRAY.splice( i, 1 );\r
                                        renumber();\r
-                                       _comicElement.$.stop().css( {\r
+                                       _panelElement.$.stop().css( {\r
                                                filter:         '',\r
                                                opacity:        ''\r
-                                       }).fadeOut( onFadeOut);\r
-                                       currentElement = currentElement === _comicElement ? null : currentElement;\r
+                                       }).fadeOut( onFadeOut );\r
+                                       currentElement = currentElement === _panelElement ? null : currentElement;\r
                                        return;\r
                                }\r
                        }\r
                        function onFadeOut(){\r
-                               this.parentNode.removeChild( this);\r
+                               this.parentNode.removeChild( this );\r
                        }\r
                }\r
-               function restoreComicElement( arg){\r
-                       var isAppend = arg[ 0],\r
-                               comicElement = arg[ 1];\r
-                       isAppend === true ? appendComicElement( comicElement) : removeComicElement( comicElement);\r
+               function restoreComicElement( arg ){\r
+                       var isAppend = arg[ 0 ],\r
+                               comicElement = arg[ 1 ];\r
+                       isAppend === true ? appendComicElement( comicElement ) : removeComicElement( comicElement );\r
                }\r
                /*\r
-                * COMIC_ELEMENT_ARRAY の順番を基準に、zの再計算\r
+                * PANEL_ELEMENT_ARRAY の順番を基準に、zの再計算\r
                 * jqElmの並び替え。\r
                 */\r
                function renumber(){\r
-                       var l = COMIC_ELEMENT_ARRAY.length,\r
-                               _comicElement, jqElm, jqNext;\r
+                       var l = PANEL_ELEMENT_ARRAY.length,\r
+                               _panelElement, jqElm, jqNext;\r
                        for( var i=0; i < l; ++i){\r
-                               _comicElement = COMIC_ELEMENT_ARRAY[ i];\r
-                               jqElm = _comicElement.$;\r
-                               jqNext && jqNext.before( jqElm);\r
-                               _comicElement.z = l -i -1;\r
+                               _panelElement = PANEL_ELEMENT_ARRAY[ i ];\r
+                               jqElm = _panelElement.$;\r
+                               jqNext && jqNext.before( jqElm );\r
+                               _panelElement.z = l -i -1;\r
                                jqNext = jqElm;\r
                        }\r
                }\r
-               function replaceComicElement( _comicElement, goForward){\r
-                       // COMIC_ELEMENT_ARRAYの再構築\r
-                       var l = COMIC_ELEMENT_ARRAY.length,\r
+               function replaceComicElement( _panelElement, goForward ){\r
+                       // PANEL_ELEMENT_ARRAYの再構築\r
+                       var l = PANEL_ELEMENT_ARRAY.length,\r
                                i = ( function(){\r
-                                       for( var ret = 0; ret < l; ++ret){\r
-                                               if( COMIC_ELEMENT_ARRAY[ ret] === _comicElement) return ret;\r
+                                       for( var ret = 0; ret < l; ++ret ){\r
+                                               if( PANEL_ELEMENT_ARRAY[ ret] === _panelElement ) return ret;\r
                                        }\r
                                        return -1;\r
                                })();\r
                        if( i === -1) return false;\r
                        if( goForward === true){\r
                                if( i === 0) return false;\r
-                               COMIC_ELEMENT_ARRAY.splice( i, 1);\r
-                               COMIC_ELEMENT_ARRAY.splice( i -1, 0, _comicElement);\r
+                               PANEL_ELEMENT_ARRAY.splice( i, 1);\r
+                               PANEL_ELEMENT_ARRAY.splice( i -1, 0, _panelElement);\r
                        } else {\r
                                if( i === l -1) return false;\r
-                               COMIC_ELEMENT_ARRAY.splice( i, 1);\r
-                               COMIC_ELEMENT_ARRAY.splice( i +1, 0, _comicElement);\r
+                               PANEL_ELEMENT_ARRAY.splice( i, 1);\r
+                               PANEL_ELEMENT_ARRAY.splice( i +1, 0, _panelElement);\r
                        }\r
                        renumber();\r
                        return true;\r
@@ -3123,15 +2556,32 @@ pettanr.editor = ( function(){
                function restoreReplaceElement( arg){\r
                        replaceComicElement( arg[ 0], arg[ 1]);\r
                }\r
-               \r
+\r
+               function onImageSelect( data, isPanelPictureData ){\r
+                       if( isPanelPictureData !== true ){\r
+                               data = {\r
+                                       resource_picture:data,\r
+                                       x:               Math.floor( panelW /2 - data.width /2 ),\r
+                                       y:               Math.floor( panelH /2 - data.height /2 ),\r
+                                       z:               -1,\r
+                                       t:               PANEL_ELEMENT_ARRAY.length,\r
+                                       width:           data.width,\r
+                                       height:          data.height\r
+                               }\r
+                       }\r
+                       var _panelElement = new ImageElementClass( data );\r
+                       _panelElement.init && _panelElement.init();\r
+                       appendComicElement( _panelElement );\r
+                       _panelElement.animate( undefined, undefined, data.width, data.height );\r
+                       SAVE( restoreComicElement, [ false, _panelElement], [ true, _panelElement], true );\r
+               }\r
+               function onTextInput( _panelElement ){\r
+                       appendComicElement( _panelElement );\r
+                       SAVE( restoreComicElement, [ false, _panelElement ], [ true, _panelElement ], true );\r
+               }\r
+       \r
                return {\r
                        init: function(){\r
-                               \r
-                               appendComicElement( ImageElementClass.apply( {}, [ 'resource_pictures/13.gif', 'penchan', 10, 10, 0, 100, 140, 0]));\r
-                               appendComicElement( TextElementClass.apply( {}, [ 0, 270, 'Hello', 50, 70, 1, 200, 160, 1]));\r
-                       /*\r
-                        * \r
-                        */\r
                                log = $( '#operation-catcher-log');\r
                                \r
                                delete COMIC_ELEMENT_CONTROL.init;\r
@@ -3140,24 +2590,26 @@ pettanr.editor = ( function(){
                                COMIC_ELEMENT_CONTROL.init && COMIC_ELEMENT_CONTROL.init();\r
                        },\r
                        close: function(){\r
-                               while( COMIC_ELEMENT_ARRAY.length > 0){\r
-                                       COMIC_ELEMENT_ARRAY.shift().destroy();\r
+                               var _comicElm;\r
+                               while( PANEL_ELEMENT_ARRAY.length > 0){\r
+                                       _comicElm = PANEL_ELEMENT_ARRAY.shift();\r
+                                       _comicElm.destroy && _comicElm.destroy();\r
                                }\r
                        },\r
                        remove: removeComicElement,\r
                        restore: restoreComicElement,\r
                        replace: replaceComicElement,\r
                        restoreReplace: restoreReplaceElement,\r
-                       onPanelResize : function ( _panelX, _panelY, _panelW, _panelH, isResizerTopAction){\r
+                       onPanelResize : function ( _panelX, _panelY, _panelW, _panelH, isResizerTopAction ){\r
                        /*\r
                         * リサイズが、ResizerTopによって行われた場合、comicElementのyを動かして見かけ上動かないようにする。\r
                         */                                     \r
                                if( isResizerTopAction === true){\r
                                        var     _shiftX = _panelW -panelW,\r
                                                _shiftY = _panelH -panelH,\r
-                                               l = COMIC_ELEMENT_ARRAY.length;\r
+                                               l = PANEL_ELEMENT_ARRAY.length;\r
                                        for( var i = 0; i < l; i++){\r
-                                               COMIC_ELEMENT_ARRAY[ i].shift( _shiftX, _shiftY);\r
+                                               PANEL_ELEMENT_ARRAY[ i].shift( _shiftX, _shiftY);\r
                                        }\r
                                }\r
                                panelX = _panelX;\r
@@ -3170,20 +2622,20 @@ pettanr.editor = ( function(){
                                ELM_CONTAINER.style.left        = _panelX +'px';\r
                                ELM_CONTAINER.style.top         = _panelY +'px';\r
                        },\r
-                       onMouseMove: function( _mouseX, _mouseY){\r
-                               var l = COMIC_ELEMENT_ARRAY.length,\r
+                       onMouseMove: function( _mouseX, _mouseY ){\r
+                               var l = PANEL_ELEMENT_ARRAY.length,\r
                                        _x = _mouseX -panelX,\r
                                        _y = _mouseY -panelY,\r
                                        _elm = currentElement;\r
                                        \r
                                if( _elm !== null){\r
                                        currentLockTest = currentLockTest === true && _x === 0 && _y === 0;\r
-                                       if( _elm.busy() === true){\r
+                                       if( _elm.busy() === true ){\r
                                                _elm.onMouseMove( _x, _y);\r
                                                return true;\r
                                        }\r
-                                       if( _elm.hitTest( _x, _y) === true){\r
-                                               _elm.onMouseMove( _x, _y); // cursor\r
+                                       if( _elm.hitTest( _x, _y) === true ){\r
+                                               _elm.onMouseMove( _x, _y ); // cursor\r
                                                return true;\r
                                        }\r
                                        if( currentLock === true){\r
@@ -3192,18 +2644,19 @@ pettanr.editor = ( function(){
                                        }\r
                                }\r
                                for( var i=0; i<l; i++){\r
-                                       _elm = COMIC_ELEMENT_ARRAY[ i];\r
+                                       _elm = PANEL_ELEMENT_ARRAY[ i ];\r
                                        // hitTest\r
-                                       if( _elm.hitTest( _x, _y) === true){\r
-                                               _elm.onMouseMove( _x, _y); // cursor\r
+                                       if( _elm.hitTest( _x, _y ) === true ){\r
+                                               _elm.onMouseMove( _x, _y ); // cursor\r
                                                log.html( [ _x, _y, i].join( ','));\r
                                                currentElement = _elm;\r
                                                return true;\r
+                                       } else {\r
+                                               log.html( [ _elm.x, _elm.y, i].join( ','));\r
                                        }\r
                                }\r
                                currentElement = null;                                                  \r
                                COMIC_ELEMENT_OPERATION_MANAGER.hide();\r
-                               log.html( [ _x, _y].join( ','));\r
                                return false;\r
                        },\r
                        onMouseUp: function( _mouseX, _mouseY){\r
@@ -3225,123 +2678,44 @@ pettanr.editor = ( function(){
                        busy: function(){\r
                                return currentElement !== null;\r
                        },\r
-                       createImageElement: function( url, imagesetID, x, y, z, w, h){\r
-                               w = w || 200; //ActualWidth\r
-                               h = h || 150; //ActualHeight\r
-                               x = x || Math.floor( panelW /2 -w /2);\r
-                               y = y || Math.floor( panelH /2 -h /2);\r
-                               function onImageSelect( _url, _w, _h){\r
-                                       var _comicElement = new ImageElementClass( _url, imagesetID, x, y, z || -1, _w, _h, COMIC_ELEMENT_ARRAY.length);\r
-                                       appendComicElement( _comicElement);\r
-                                       _comicElement.animate( undefined, undefined, _w, _h);\r
-                                       SAVE( restoreComicElement, [ false, _comicElement], [ true, _comicElement], true);                                      \r
-                               }\r
-                               IMAGE_GROUP_EXPROLER.show( onImageSelect);\r
-                       },\r
-                       createTextElement: function( type, angle, text, x, y, z, w, h){\r
-                               type = type || 0;\r
-                               angle = angle || 0;\r
-                               text = text || '';\r
-                               w = w || 200;\r
-                               h = h || 150;\r
-                               x = x || Math.floor( panelW /2 -w /2 +Math.random() *10);\r
-                               y = y || Math.floor( panelH /2 -h /2 +Math.random() *10);\r
-                               var _comicElement = TextElementClass.apply( {}, [ type, angle, text, x, y, z || -1, w, h, COMIC_ELEMENT_ARRAY.length]);\r
-                               TEXT_EDITOR_CONTROL.show( _comicElement, function( _comicElement){\r
-                                       appendComicElement( _comicElement);\r
-                                       SAVE( restoreComicElement, [ false, _comicElement], [ true, _comicElement], true);\r
-                               });\r
-                       },\r
-                       getAsHTML: function( isAbsoluteUrl, isXHTML){\r
-                               var HTML_ARRAY = [],\r
-                                       l = COMIC_ELEMENT_ARRAY.length,\r
-                                       _timing = 0,\r
-                                       _comicElement;\r
-\r
-                               while( HTML_ARRAY.length < l){\r
-                                       _comicElement = getComicElementByTiming();\r
-                                       if( _comicElement === null) break;\r
-                                       HTML_ARRAY.push( _comicElement.getAsHTML( isAbsoluteUrl, isXHTML));\r
-                               }\r
-                               function getComicElementByTiming(){\r
-                                       while( _timing < l *2){\r
-                                               for(var i=0; i<l; ++i){\r
-                                                       if( _timing === COMIC_ELEMENT_ARRAY[ i].timing){\r
-                                                               ++_timing;\r
-                                                               return COMIC_ELEMENT_ARRAY[ i];\r
-                                                       }\r
-                                               }\r
-                                               ++_timing;\r
-                                       }\r
-                                       return null;\r
-                               }\r
-                               HTML_ARRAY.unshift(\r
-                                       [\r
-                                               '<div class="panel" ',\r
-                                                       'style="',\r
-                                                               'height:', panelH, 'px;',\r
-                                                               'background-color:', ';',\r
-                                                       '"',\r
-                                               '>'\r
-                                       ].join( '')\r
-                               );              \r
-                               HTML_ARRAY.push( '</div>');\r
-                               \r
-                               return HTML_ARRAY.join( pettanr.LINE_FEED_CODE_TEXTAREA);\r
-                       },\r
-                       getAsJsonString: function(){\r
-                               var JSON_STRING_ARRAY = [],\r
-                                       IMAGE_ARRAY = [],\r
-                                       BALLOON_ARRAY = [],\r
-                                       l = COMIC_ELEMENT_ARRAY.length,\r
-                                       _timing = 0,\r
-                                       _comicElement,\r
-                                       cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
-                                       \r
-                               while( IMAGE_ARRAY.length + BALLOON_ARRAY.length < l){\r
-                                       _comicElement = getComicElementByTiming();\r
-                                       if( _comicElement === null) break;\r
-                                       _comicElement.type === COMIC_ELEMENT_TYPE_IMAGE ? \r
-                                               IMAGE_ARRAY.push( _comicElement.getAsJsonString()) :\r
-                                               BALLOON_ARRAY.push( _comicElement.getAsJsonString());\r
-                               }\r
-                               function getComicElementByTiming(){\r
-                                       while( _timing < l *2){\r
-                                               for(var i=0; i<l; ++i){\r
-                                                       if( _timing === COMIC_ELEMENT_ARRAY[ i].timing){\r
-                                                               ++_timing;\r
-                                                               return COMIC_ELEMENT_ARRAY[ i];\r
+                       createImageElement: function( data ){\r
+                               if( Type.isObject( data ) === false ){\r
+                                       pettanr.premiumSatge.bootInOverlay( 1, onImageSelect );\r
+                               } else {\r
+                                       onImageSelect( data, true );\r
+                               }\r
+                       },\r
+                       createTextElement: function( data ){\r
+                               var _panelElement;\r
+                               if( Type.isObject( data ) === false ){\r
+                                       data = {\r
+                                               balloon_template_id:1,\r
+                                               size:               1,\r
+                                               tail:               0,\r
+                                               x:                                      Math.floor( panelW /2 - 100 +Math.random() *10 ),\r
+                                               y:                  Math.floor( panelH /2 - 100 +Math.random() *10 ),\r
+                                               z:                  -1,\r
+                                               t:                  PANEL_ELEMENT_ARRAY.length,\r
+                                               width:              200,\r
+                                               height:             200,\r
+                                               speaches_attributes: {\r
+                                                       text1: {\r
+                                                               content:    'Hello'\r
                                                        }\r
                                                }\r
-                                               ++_timing;\r
                                        }\r
-                                       return null;\r
+                                       _panelElement = new TextElementClass( data );\r
+                                       _panelElement.init();\r
+                                       pettanr.textEditor.bootInOverlay( PANEL_CONTROL.x(), PANEL_CONTROL.y(), _panelElement, onTextInput );\r
+                               } else {\r
+                                       _panelElement = new TextElementClass( data );\r
+                                       _panelElement.init();\r
+                                       onTextInput( _panelElement );\r
                                }\r
-                               return [\r
-                                       '{', cr,\r
-                                               '"panel": {', cr,\r
-                                                   '"border": 1,', cr,\r
-                                                   '"comic_id": 5,', cr,\r
-                                                   '"resource_picture_id": 1,', cr,\r
-                                                       '"x": ', 0, ',', cr,\r
-                                                       '"y": ', 0, ',', cr,\r
-                                                       '"z": ', 0, ',', cr,\r
-                                                       '"t": ', 0, ',', cr,\r
-                                                   '"width": ', panelW, ',', cr,\r
-                                                   '"height": ', panelH, ',', cr,\r
-                                                   '"panel_pictures_attributes": {', cr,\r
-                                                       IMAGE_ARRAY.join( ',' +cr), cr,\r
-                                                   '},', cr,\r
-                                                   '"balloons_attributes": {', cr,\r
-                                                       BALLOON_ARRAY.join( ',' +cr), cr,\r
-                                                   '}', cr,\r
-                                               '}', cr,\r
-                                       '}'\r
-                               ].join( '');\r
                        }\r
                }\r
        })();\r
-       \r
+\r
        /*\r
         * end of COMIC_ELEMENT_CONTROL\r
         */\r
@@ -3358,7 +2732,7 @@ pettanr.editor = ( function(){
                }\r
        }\r
        function centering(){\r
-               pettanr.editor.onWindowResize( windowW, windowH);\r
+               instance.onPaneResize( windowW, windowH);\r
        }       \r
        function mouseEventRellay( e){\r
                var _mouseX = e.pageX,\r
@@ -3386,876 +2760,1015 @@ pettanr.editor = ( function(){
                return false;\r
        }\r
 \r
-       return {\r
-               init: function( _option){\r
-                       option = _option;\r
-                       \r
-               },\r
-               firstOpen: function(){\r
-               /*\r
-                * MOUSE_LISTENER_ARRAY は、表示順に格納.手前の要素が最初\r
-                * MENU_BAR_CONTROL,\r
-                * WINDOW_CONTROL,\r
-                * COMIC_ELEMENT_CONTROL,\r
-                * PANEL_CONTROL\r
-                * .busy() === true なら、そのままonMouseMove()にイベントを流す.\r
-                * onMouseMove()に流してみて、false が帰れば、次にリスナーにも流す.\r
-                */\r
-                       MOUSE_LISTENER_ARRAY.push( MENU_BAR_CONTROL, WINDOWS_CONTROL, PANEL_RESIZER_TOP, PANEL_RESIZER_BOTTOM, COMIC_ELEMENT_CONTROL, PANEL_CONTROL);\r
-                       \r
-                       CONSOLE_CONTROLER.init();\r
-                       \r
-                       OUTPUT_CONSOLE.init();\r
-                       TEXT_EDITOR_CONTROL.init();\r
-                       IMAGE_GROUP_EXPROLER.init();\r
-\r
-               /*\r
-                * centering\r
-                */\r
-                       pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 96, false, true, centering);  // ctrl + 0\r
-                       pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 48, false, true, centering);  // ctrl + 0\r
-                       MENU_BAR_CONTROL.EDIT.createSelection( 'centering', 'ctrl + 0', centering, true, true, true);\r
-               /*\r
-                * jqMouseEventChacher は透明な要素で、\r
-                * マウスイベントをcurrentElement(currentElement)に伝えるのが仕事\r
-                * このような実装になるのは、ここの表示オブジェクトにイベントを設定した場合、表示が追いつかずマウスカーソルが外れたタイミングでイベントが終わってしまうため。\r
-                */                     \r
-                       jqMouseEventChacher = $( ELM_MOUSE_EVENT_CHATCHER)\r
-                               .mousemove( mouseEventRellay)\r
-                               .mousedown( mouseEventRellay)\r
-                               .mouseup( mouseEventRellay)\r
-                               .mouseout( mouseEventRellay);\r
-                       \r
-                       delete pettanr.editor.firstOpen;\r
-               },\r
-               onOpen: function( _w, _h, _file){\r
-                       if( pettanr.file.isFileInstance( _file) === true){\r
-                               // pettanr.file.isPettanFileInstance( _file) === true\r
-                               // \r
-                       }\r
-                       jqEditor = jqEditor || $( '#editor');\r
-                       \r
-                       HISTORY_CONTROL.open();\r
-                       \r
-                       WINDOWS_CONTROL.open();\r
-                       \r
-                       GRID_CONTROL.open();\r
-                       PANEL_CONTROL.open();\r
-                       \r
-                       COMIC_ELEMENT_OPERATION_MANAGER.open();\r
-                       COMIC_ELEMENT_CONTROL.open();\r
-                       \r
-                       // last\r
-                       MENU_BAR_CONTROL.open();\r
-                       \r
-                       pettanr.editor.firstOpen !== undefined && pettanr.editor.firstOpen();\r
-                       \r
-                       windowW = _w;\r
-                       windowH = _h;\r
-                       pettanr.editor.onWindowResize( _w, _h );\r
-               },\r
-               onClose: function(){\r
-                       HISTORY_CONTROL.close();\r
-                       \r
-                       WINDOWS_CONTROL.close();\r
-                       \r
-                       GRID_CONTROL.close();\r
-                       PANEL_CONTROL.close();\r
-                       \r
-                       COMIC_ELEMENT_OPERATION_MANAGER.close();\r
-                       COMIC_ELEMENT_CONTROL.close();\r
-                       \r
-                       // last\r
-                       MENU_BAR_CONTROL.open();\r
-               },\r
-               onWindowResize: function( _windowW, _windowH){\r
-                       windowW = _windowW || windowW;\r
-                       windowH = _windowH || windowH;\r
-                       if( pettanr.editor.firstOpen) return;\r
-                       /*\r
-                        * ieは +'px'が不要みたい\r
-                        */\r
-                       jqEditor.get( 0).style.height = _windowH +'px';\r
-                       ELM_MOUSE_EVENT_CHATCHER.style.height = _windowH +'px';\r
-                       \r
-                       WINDOWS_CONTROL.onWindowResize( _windowW, _windowH);\r
-                       MENU_BAR_CONTROL.onWindowResize( _windowW, _windowH);\r
-                       PANEL_CONTROL.onWindowResize( _windowW, _windowH);\r
-               },\r
-               MIN_WIDTH:      320,\r
-               MIN_HEIGHT:     320\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'editor' );\r
+       this.displayName = pettanr.view.EDITOR;\r
+       this.ID          = pettanr.view.EDITOR;\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.firstOpen = function(){\r
+       /*\r
+        * MOUSE_LISTENER_ARRAY は、表示順に格納.手前の要素が最初\r
+        * MENU_BAR_CONTROL,\r
+        * WINDOW_CONTROL,\r
+        * COMIC_ELEMENT_CONTROL,\r
+        * PANEL_CONTROL\r
+        * .busy() === true なら、そのままonMouseMove()にイベントを流す.\r
+        * onMouseMove()に流してみて、false が帰れば、次にリスナーにも流す.\r
+        */\r
+               MOUSE_LISTENER_ARRAY.push( MENU_BAR_CONTROL, WINDOWS_CONTROL, PANEL_RESIZER_TOP, PANEL_RESIZER_BOTTOM, COMIC_ELEMENT_CONTROL, PANEL_CONTROL);\r
+       /*\r
+        * centering\r
+        */\r
+               pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 96, false, true, centering);  // ctrl + 0\r
+               pettanr.key.addKeyDownEvent( pettanr.view.EDITOR, 48, false, true, centering);  // ctrl + 0\r
+               MENU_BAR_CONTROL.EDIT.createSelection( 'centering', 'ctrl + 0', centering, true, true, true);\r
+       /*\r
+        * jqMouseEventChacher は透明な要素で、\r
+        * マウスイベントをcurrentElement(currentElement)に伝えるのが仕事\r
+        * このような実装になるのは、ここの表示オブジェクトにイベントを設定した場合、表示が追いつかずマウスカーソルが外れたタイミングでイベントが終わってしまうため。\r
+        */                     \r
+               jqMouseEventChacher = $( ELM_MOUSE_EVENT_CHATCHER)\r
+                       .mousemove( mouseEventRellay)\r
+                       .mousedown( mouseEventRellay)\r
+                       .mouseup( mouseEventRellay)\r
+                       .mouseout( mouseEventRellay);\r
+               \r
+               delete instance.firstOpen;\r
        }\r
-})();\r
-\r
-// create hidden iframe\r
-// write script\r
-// setInterval\r
-pettanr.proxy = ( function(){\r
-       \r
-       function FormProxy( formJsUrl, callback){\r
-               var timer = null,\r
-                       iWin, idoc;\r
-\r
-               pettanr.util.createIframe( 'id00000', onCreateIframe);\r
+       this.onOpen = function( _w, _h, _file ){\r
+               comicID = -1;\r
+               panelID = -1;\r
+               panelTimming = -1;\r
                \r
-               function onCreateIframe( _iframe){\r
-                       iWin = _iframe.contentWindow;\r
-                       idoc = _iframe.contentWindow.document;\r
-\r
-                       idoc.open();\r
-                       idoc.write( '<body>');\r
-                       idoc.writeln( '<script type="text\/javascript" src="' + pettanr.CONST.JQUERY_URL+ '"><\/script>');\r
-                       idoc.close();\r
-\r
-                       timer = window.setInterval( detect, 250 );\r
-               }\r
-               function detect(){\r
-                       if( iWin.jQuery){\r
-                               window.clearInterval( timer );\r
-                               //callback( idoc);\r
-                               iWin.jQuery( iWin).ready( onJQueryReady );\r
+               var panelW, panelH,\r
+                       borderSize,\r
+                       fileData, panelElements, panelElm;\r
+               \r
+               if( pettanr.file.isFileInstance( _file ) === true ){\r
+                       if( pettanr.driver.isPettanrFileInstance( _file ) === true ){\r
+                               if( _file.getType() === pettanr.driver.FILE_TYPE.COMIC ){\r
+                                       fileData = _file.read();\r
+                                       panelW = fileData.width;\r
+                                       panelH = fileData.height;\r
+                                       comicID = fileData.id || -1;\r
+                               } else\r
+                               if( _file.getType() === pettanr.driver.FILE_TYPE.PANEL ){\r
+                                       fileData = _file.read();\r
+                                       panelW = fileData.width;\r
+                                       panelH = fileData.height;\r
+                                       borderSize = fileData.border;\r
+                                       panelElements = fileData.panel_elements;\r
+                                       comicID = fileData.comic ? fileData.comic.id || -1 : -1;\r
+                                       panelID = fileData.id || -1;\r
+                                       panelTimming = fileData.t || -1;\r
+                                       if( Type.isArray( panelElements ) === true ){\r
+                                               for( var i=0; i<panelElements.length; ++i){\r
+                                                       panelElm = panelElements[ i ];\r
+                                                       if( panelElm.resource_picture ){\r
+                                                               COMIC_ELEMENT_CONTROL.createImageElement( panelElm );\r
+                                                       } else\r
+                                                       if( panelElm.balloon_template_id ){\r
+                                                               COMIC_ELEMENT_CONTROL.createTextElement( panelElm );\r
+                                                       }\r
+                                               }                                               \r
+                                       }\r
+                               }\r
+                       } else {\r
+                               \r
                        }\r
                }\r
-               function onJQueryReady(){\r
-                       callback( idoc);\r
-               }\r
+               jqEditor = jqEditor || $( '#editor');\r
+               \r
+               HISTORY_CONTROL.open();\r
+               \r
+               WINDOWS_CONTROL.open();\r
+               \r
+               GRID_CONTROL.open();\r
+               PANEL_CONTROL.open( panelW, panelH, borderSize );\r
+               \r
+               COMIC_ELEMENT_OPERATION_MANAGER.open();\r
+               COMIC_ELEMENT_CONTROL.open();\r
+               \r
+               instance.firstOpen !== undefined && instance.firstOpen();\r
+               \r
+               // last\r
+               MENU_BAR_CONTROL.open();\r
+               \r
+               windowW = _w;\r
+               windowH = _h;\r
+               instance.onPaneResize( _w, _h );\r
        }\r
-       \r
-       return {\r
-               createFormProxy: function( _formJsUrl, _callback){\r
-                       new FormProxy( _formJsUrl, _callback);\r
-               }\r
+       this.onClose = function(){\r
+               HISTORY_CONTROL.close();\r
+               \r
+               WINDOWS_CONTROL.close();\r
+               \r
+               GRID_CONTROL.close();\r
+               PANEL_CONTROL.close();\r
+               \r
+               COMIC_ELEMENT_OPERATION_MANAGER.close();\r
+               COMIC_ELEMENT_CONTROL.close();\r
+               \r
+               // last\r
+               MENU_BAR_CONTROL.open();\r
        }\r
-       \r
-})();\r
-\r
-\r
-pettanr.comicConsole = ( function(){\r
-       var COMIC_CONSOLE = ( function(){\r
-               var jqWrap,\r
-                       ID = 'comicConsole',\r
-                       elmWrap = document.getElementById( 'comic-console-wrapper' ),\r
-                       elmHeader = document.getElementById( 'comic-console-header' ),\r
-                       elmProgress = document.getElementById( 'comic-console-progress' ),\r
-                       inputTitle, inputW, inputH, inputVisible, inputEditable,\r
-                       elmUploader = null,\r
-                       elmScript = null\r
-                       elmIframe = null,\r
-                       elmForm = null,\r
-                       timer = null,\r
-                       isUploading = false;\r
-               //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
+       this.onPaneResize = function( _windowW, _windowH){\r
+               windowW = _windowW || windowW;\r
+               windowH = _windowH || windowH;\r
+               /*\r
+                * ieは +'px'が不要みたい\r
+                */\r
+               jqEditor.get( 0).style.height = _windowH +'px';\r
+               ELM_MOUSE_EVENT_CHATCHER.style.height = _windowH +'px';\r
                \r
-               function clickOK(){\r
-                       if( !elmForm || !elmIframe || isUploading === true ) return false;\r
-                       // validate\r
-                       isUploading = true;\r
-                       elmProgress.innerHTML = '■';\r
-                       copyAndSubmit();\r
-               }\r
+               WINDOWS_CONTROL.onWindowResize( _windowW, _windowH);\r
+               MENU_BAR_CONTROL.onWindowResize( _windowW, _windowH);\r
+               PANEL_CONTROL.onWindowResize( _windowW, _windowH);\r
+       }\r
+});\r
+\r
+\r
+pettanr.comicConsole = pettanr.view.registerApplication( function(){\r
+       var jqWrap,\r
+               ID = 'comicConsole',\r
+               elmWrap = document.getElementById( 'comic-console-wrapper' ),\r
+               elmHeader = document.getElementById( 'comic-console-header' ),\r
+               elmProgress = document.getElementById( 'comic-console-progress' ),\r
+               inputTitle, inputW, inputH,\r
+               comboboxVisible, comboboxEditable,\r
+               buttonSubmit, buttonCancel,\r
+               elmUploader = null,\r
+               elmScript = null,\r
+               elmIframe = null,\r
+               elmForm = null,\r
+               timer = null,\r
+               isUploading = false,\r
+               instance = this;\r
+       //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
+       \r
+       function clickOK(){\r
+               if( !elmForm || !elmIframe || isUploading === true ) return false;\r
+               // validate\r
+               isUploading = true;\r
+               elmProgress.innerHTML = '■';\r
+               copyAndSubmit();\r
+       }\r
 \r
-                       function copyAndSubmit(){\r
-                               var _inputList = elmForm.getElementsByTagName( 'input' ),\r
-                                       _input, _name;\r
-                               for( var i=0, l= _inputList.length; i<l; ++i){\r
-                                       _input = _inputList[ i ];\r
-                                       _name = _input.name;\r
-                                       if( _name === 'comic[title]'){\r
-                                               _input.value = inputTitle.value();\r
-                                       } else\r
-                                       if( _name === 'comic[width]'){\r
-                                               _input.value = inputW.value();\r
-                                       } else\r
-                                       if( _name === 'comic[height]'){\r
-                                               _input.value = inputH.value();\r
-                                       }\r
-                               }\r
-                               var _selectList = elmForm.getElementsByTagName( 'select' ),\r
-                                       _select, _name, _optionList;\r
-                               for( i=0, l= _selectList.length; i<l; ++i){\r
-                                       _select = _selectList[ i ];\r
-                                       _name = _select.name;\r
-                                       _optionList = _select.getElementsByTagName( 'option' )\r
-                                       if( _name === 'comic[visible]'){\r
-                                               _select.selectedIndex = 1;\r
-                                       } else\r
-                                       if( _name === 'comic[editable]'){\r
-                                               _select.selectedIndex = 0;\r
-                                       }\r
-                               }\r
-                               try {\r
-                                       elmForm.submit();\r
-                               } catch( e){\r
-                                       elmProgress.innerHTML = 'submit() err..';\r
-                                       isUploading = false;\r
-                                       setTimeout( clickCancel , 3000);\r
-                                       return;\r
-                               }\r
-                               if( pettanr.ua.isIE){\r
-                                       elmIframe.onreadystatechange = detectIframe;\r
-                               } else {\r
-                                       elmIframe.onload = onIframeUpdate;\r
+               function copyAndSubmit(){\r
+                       var _inputList = elmForm.getElementsByTagName( 'input' ),\r
+                               _input, _name;\r
+                       for( var i=0, l= _inputList.length; i<l; ++i){\r
+                               _input = _inputList[ i ];\r
+                               _name = _input.name;\r
+                               if( _name === 'comic[title]'){\r
+                                       _input.value = inputTitle.value();\r
+                               } else\r
+                               if( _name === 'comic[width]'){\r
+                                       _input.value = inputW.value();\r
+                               } else\r
+                               if( _name === 'comic[height]'){\r
+                                       _input.value = inputH.value();\r
                                }\r
-                               elmProgress.innerHTML = 'uploading..';\r
                        }\r
-               /*\r
-                * ie の 場合、readyState をチェック.\r
-                */\r
-                               function detectIframe(){\r
-                           if ( elmIframe.readyState === 'complete') {\r
-                               elmIframe.onreadystatechange = new Function();\r
-                               elmIframe.onreadystatechange = null;\r
-                               onIframeUpdate();\r
-                           }\r
+                       var _selectList = elmForm.getElementsByTagName( 'select' ),\r
+                               _select, _optionList;\r
+                       for( i=0, l= _selectList.length; i<l; ++i){\r
+                               _select = _selectList[ i ];\r
+                               _name = _select.name;\r
+                               _optionList = _select.getElementsByTagName( 'option' )\r
+                               if( _name === 'comic[visible]'){\r
+                                       _select.selectedIndex = comboboxVisible.selectIndex();\r
+                               } else\r
+                               if( _name === 'comic[editable]'){\r
+                                       _select.selectedIndex = comboboxEditable.selectIndex();\r
                                }\r
-                                       function onIframeUpdate(){\r
-                                               elmIframe.onload = null;\r
-                                               ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
-                                               elmIframe = null;\r
-                                               elmProgress.innerHTML = 'success!';\r
-                                               setTimeout( clickCancel , 1000);\r
-                                               isUploading = false;\r
-                                       }\r
-                               \r
-               function clickCancel(){\r
-                       if( isUploading === true) return false;\r
-                       pettanr.overlay.hide();\r
-                       COMIC_CONSOLE.onClose();\r
-               }\r
-               function detectForm(){\r
-                       elmForm = elmUploader.getElementsByTagName( 'form' )[ 0 ];\r
-                       if( elmForm){\r
-                               window.clearInterval( timer);\r
-                               timer = null;\r
-                               pettanr.util.createIframe( 'targetFrameCreateComic', onCreateIframe );\r
-                               elmProgress.innerHTML = 'create iframe';\r
                        }\r
+                       try {\r
+                               elmForm.submit();\r
+                       } catch( e){\r
+                               elmProgress.innerHTML = 'submit() err..';\r
+                               isUploading = false;\r
+                               setTimeout( clickCancel , 3000);\r
+                               return;\r
+                       }\r
+                       if( pettanr.ua.isIE){\r
+                               elmIframe.onreadystatechange = detectIframe;\r
+                       } else {\r
+                               elmIframe.onload = onIframeUpdate;\r
+                       }\r
+                       elmProgress.innerHTML = 'uploading..';\r
                }\r
-               function onCreateIframe( _iframe ){\r
-                       elmUploader.appendChild( _iframe );\r
-                       elmIframe = _iframe;\r
-                       elmForm.target = _iframe.name;\r
-                       elmProgress.innerHTML = '';\r
-               }\r
-               \r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#comic-console-wrapper').hide();\r
-                               $( '#comic-console-post-button').click( clickOK );\r
-                               $( '#comic-console-cancel-button').click( clickCancel );\r
-                               \r
-                               var CREATER = pettanr.form.createInputText;//pettanr.key.createEditableText;\r
-                               inputTitle    = CREATER( document.getElementById( 'comic-console-title'), null, ID);\r
-                               inputW        = CREATER( document.getElementById( 'comic-console-width'), null, ID);\r
-                               inputH        = CREATER( document.getElementById( 'comic-console-height'), null, ID);\r
-                               inputVisible  = CREATER( document.getElementById( 'comic-console-visible'), null, ID);\r
-                               inputEditable = CREATER( document.getElementById( 'comic-console-editable'), null, ID);\r
-                               \r
-                               delete COMIC_CONSOLE.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( w, h){\r
-                               jqWrap.show();\r
-\r
-                               pettanr.overlay.show( COMIC_CONSOLE );\r
-                               \r
-                               inputTitle.start();\r
-                               \r
-                               elmUploader = document.createElement( 'div');\r
-                               elmUploader.id = "newcomic";\r
-                               elmUploader.style.cssText = 'height:1px;line-height:1px;visibility:hidden;overflow:hidden;';\r
-                               elmWrap.appendChild( elmUploader);\r
-                               \r
-                               var elmScript = document.createElement( 'script');\r
-                               elmScript.type = 'text\/javascript';\r
-                               elmScript.src = pettanr.CONST.CREATE_COMIC_JS;\r
-                               elmWrap.appendChild( elmScript);\r
-                               \r
-                               elmProgress.innerHTML = 'loading form.';\r
-                               \r
-                               if( timer === null){\r
-                                       timer = window.setInterval( detectForm, 250);\r
+       /*\r
+        * ie の 場合、readyState をチェック.\r
+        */\r
+                       function detectIframe(){\r
+                   if ( elmIframe.readyState === 'complete') {\r
+                       elmIframe.onreadystatechange = new Function();\r
+                       elmIframe.onreadystatechange = null;\r
+                       onIframeUpdate();\r
+                   }\r
+                       }\r
+                               function onIframeUpdate(){\r
+                                       elmIframe.onload = null;\r
+                                       ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
+                                       elmIframe = null;\r
+                                       elmProgress.innerHTML = 'success!';\r
+                                       setTimeout( clickCancel , 1000);\r
+                                       isUploading = false;\r
                                }\r
-                               \r
-                               COMIC_CONSOLE.onWindowResize( w, h);\r
-                       },\r
-                       onWindowResize: function( _windowW, _windowH){\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
+                       \r
+       function clickCancel(){\r
+               if( isUploading === true) return false;\r
+               pettanr.comicConsole.shutdown();\r
+       }\r
+       function detectForm(){\r
+               elmForm = elmUploader.getElementsByTagName( 'form' )[ 0 ];\r
+               if( elmForm ){\r
+                       var selectList = elmForm.getElementsByTagName( 'select' ),\r
+                               select,\r
+                               j, m,\r
+                               optionList, option;\r
+                       for( var i=0, l=selectList.length; i<l; ++i ){\r
+                               select = selectList[ i ];\r
+                               optionList = select.getElementsByTagName( 'option' );\r
+                               for( j=0, m=optionList.length; j<m; ++j ){\r
+                                       option = optionList[ j ];\r
+                                       if( select.name === 'comic[visible]' ){\r
+                                               comboboxVisible.createOption( option.innerHTML, option.value, option.selected );\r
+                                       } else\r
+                                       if( select.name === 'comic[editable]' ){\r
+                                               comboboxEditable.createOption( option.innerHTML, option.value, option.selected );\r
                                        }\r
-                               );\r
-                       },\r
-                       onClose: function(){\r
-                               elmForm !== null && $( elmUploader ).remove();\r
-                               elmForm  = null;\r
-                               isUploading = false;\r
-                               \r
-                               if( elmScript !== null ){\r
-                                       document.body.removeChild( elmScript);\r
-                                       elmScript = null;                                       \r
-                               }\r
-                               if( timer !== null){\r
-                                       window.clearInterval( timer);\r
-                                       timer = null;\r
                                }\r
-                               \r
-                               jqWrap.hide();\r
-                       },\r
-                       ID: ID\r
-               }\r
-       })();\r
-       \r
-       return {\r
-               init: function(){\r
-                       COMIC_CONSOLE.init();\r
-                       delete pettanr.comicConsole.init;\r
-               },\r
-               onOpen: function( _w, _h, _file){\r
-                       if( pettanr.driver.isPettanrFileInstance( _file ) === true && _file.getType() === pettanr.driver.FILE_TYPE.COMIC){\r
-                               // _data = _file.read();\r
                        }\r
-               },\r
-               onClose: function(){\r
                        \r
-               },\r
-               onWindowResize: function( _windowW, _windowH){\r
-               },\r
-               _quickAccessShow: function(){\r
-                       jqWindow = pettanr.jqWindow();\r
-                       var w = jqWindow.width(),\r
-                               h = jqWindow.height();\r
-                       COMIC_CONSOLE.show( w, h);\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
+                       pettanr.util.createIframe( 'targetFrameCreateComic', onCreateIframe );\r
+                       elmProgress.innerHTML = 'create iframe';\r
                }\r
        }\r
-})();\r
+       function onCreateIframe( _iframe ){\r
+               elmUploader.appendChild( _iframe );\r
+               elmIframe = _iframe;\r
+               elmForm.target = _iframe.name;\r
+               elmProgress.innerHTML = '';\r
+       }\r
 \r
-pettanr.uploadConsole = ( function(){\r
-       var UPLOAD_CONSOLE = ( function(){\r
-               var jqWrap, windowW, windowH,\r
-                       ID = 'uploadConsole',\r
-                       TARGET_FRAME_NAME = 'targetFrame',\r
-                       elmContainer = document.getElementById( 'uploader'),\r
-                       elmProgress = document.getElementById( 'upload-console-progress'),\r
-                       timer = null,\r
-                       elmScript = null,\r
-                       elmForm = null,\r
-                       elmFile = null,\r
-                       elmIframe = null,\r
-                       isUploading = false;\r
-               /*\r
-                * upload ボタンが押されたらまず iframe をつくる.
-                */\r
-               function clickOK(){\r
-                       if( !elmForm || !elmIframe || isUploading === true ) return false;\r
-                       if( elmFile.value.length === 0) return false;\r
-                       elmProgress.innerHTML = 'uploading.';\r
-                       isUploading = true;\r
-                       submit();\r
-                       return false;\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'comic-console-wrapper' );\r
+       this.displayName = ID;\r
+       this.ID          = ID;\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.init = function(){\r
+               jqWrap = $( '#comic-console-wrapper').hide();\r
+               \r
+               inputTitle    = pettanr.form.createInputText( document.getElementById( 'comic-console-title'), null, ID);\r
+               inputW        = pettanr.form.createInputText( document.getElementById( 'comic-console-width'), null, ID);\r
+               inputH        = pettanr.form.createInputText( document.getElementById( 'comic-console-height'), null, ID);\r
+               comboboxVisible  = pettanr.form.createCombobox( document.getElementById( 'comic-console-visible'), null, ID);\r
+               comboboxEditable = pettanr.form.createCombobox( document.getElementById( 'comic-console-editable'), null, ID);\r
+               buttonSubmit  = pettanr.form.createButton( document.getElementById( 'comic-console-post-button'), clickOK, ID);\r
+               buttonCancel  = pettanr.form.createButton( document.getElementById( 'comic-console-cancel-button'), clickCancel, ID);\r
+               \r
+               delete instance.init;\r
+       }\r
+       this.onOpen = function( w, h ){\r
+               instance.init && instance.init();\r
+               \r
+               jqWrap.show();\r
+               \r
+               inputTitle.focus();\r
+               \r
+               elmUploader = document.createElement( 'div' );\r
+               elmUploader.id = 'newcomic';\r
+               elmUploader.style.cssText = 'height:1px;line-height:1px;visibility:hidden;overflow:hidden;';\r
+               elmWrap.appendChild( elmUploader);\r
+               \r
+               var elmScript = document.createElement( 'script');\r
+               elmScript.type = 'text\/javascript';\r
+               elmScript.src = pettanr.CONST.CREATE_COMIC_JS;\r
+               elmWrap.appendChild( elmScript );\r
+               \r
+               elmProgress.innerHTML = 'loading form.';\r
+               \r
+               if( timer === null){\r
+                       timer = window.setInterval( detectForm, 250);\r
                }\r
-               /*\r
-                * form の target に iframe を指定したのち submit();
-                */\r
-                       function submit(){\r
-                               try {\r
-                                       elmForm.submit();\r
-                               } catch( e){\r
-                                       elmProgress.innerHTML = 'submit() err..';\r
-                                       isUploading = false;\r
-                                       setTimeout( clickCancel , 3000);\r
-                                       return;\r
-                               }\r
-                               \r
-                               if( pettanr.ua.isIE){\r
-                                       elmIframe.onreadystatechange = detectIframe;\r
-                               } else {\r
-                                       elmIframe.onload = onLoad;\r
-                               }\r
-                               elmProgress.innerHTML = 'uploading..';\r
-                       }\r
-               /*\r
-                * ie の 場合、readyState をチェック.
-                */\r
-                               function detectIframe(){\r
-                           if ( elmIframe.readyState === 'complete') {\r
-                               elmIframe.onreadystatechange = new Function();\r
-                               elmIframe.onreadystatechange = null;\r
-                               onLoad();\r
-                           }\r
-                               }\r
-                                       function onLoad(){\r
-                                               elmIframe.onload = null;\r
-                                               ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
-                                               elmProgress.innerHTML = 'success!';\r
-                                               setTimeout( clickCancel , 1000);\r
-                                               isUploading = false;\r
-                                       }\r
                \r
-               function detectForm(){\r
-                       elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
-                       if( elmForm){\r
-                               var _inputList = elmForm.getElementsByTagName( 'input' ),\r
-                                       _input;\r
-                               for( var i=0, l= _inputList.length; i<l; ++i){\r
-                                       _input = _inputList[ i ];\r
-                                       if( _input.type === 'file'){\r
-                                               elmFile = _input;\r
-                                       }\r
-                                       if( _input.type === 'submit'){\r
-                                               _input.style.display = 'none';\r
-                                       }\r
-                               }\r
-                               window.clearInterval( timer);\r
-                               timer = null;\r
-                               pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
-                               elmProgress.innerHTML = 'create iframe';\r
+               instance.onPaneResize( w, h );\r
+       }\r
+       this.onPaneResize = function( _windowW, _windowH){\r
+               jqWrap.css(\r
+                       {\r
+                               left:   Math.floor( ( _windowW - jqWrap.width()) /2),\r
+                               top:    Math.floor( ( _windowH - jqWrap.height()) /2)\r
                        }\r
+               );\r
+       }\r
+       this.onClose = function(){\r
+               elmForm !== null && $( elmUploader ).remove();\r
+               elmForm  = null;\r
+               isUploading = false;\r
+               \r
+               if( elmScript !== null ){\r
+                       document.body.removeChild( elmScript);\r
+                       elmScript = null;                                       \r
                }\r
-               function onCreateIframe( _iframe ){\r
-                       elmContainer.appendChild( _iframe );\r
-                       elmIframe = _iframe;\r
-                       elmForm.target = _iframe.name;\r
-                       elmProgress.innerHTML = '';\r
-                       UPLOAD_CONSOLE.onWindowResize( windowW, windowH );\r
-               }\r
-               /*\r
-                * 
-                */\r
-               function clickCancel(){\r
-                       if( isUploading === true) return false;\r
-                       pettanr.overlay.hide();\r
-                       UPLOAD_CONSOLE.onClose();\r
-                       return false;\r
+               if( timer !== null){\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
                }\r
                \r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#upload-console-wrapper').hide();\r
-                               $( '#upload-console-post-button').click( clickOK );\r
-                               $( '#upload-console-cancel-button').click( clickCancel );\r
-\r
-                               delete UPLOAD_CONSOLE.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( w, h){\r
-                               /*\r
-                                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.
-                                */                             \r
-                               elmScript = document.createElement( 'script');\r
-                               elmScript.type = 'text\/javascript';\r
-                               elmScript.src = pettanr.CONST.UPLOAD_PICTURE_JS;\r
-                               document.body.appendChild( elmScript);\r
-                               \r
-                               jqWrap.show();\r
-                               pettanr.overlay.show( UPLOAD_CONSOLE );\r
-\r
-                               if( timer === null){\r
-                                       timer = window.setInterval( detectForm, 250);\r
-                               }\r
-                               \r
-                               elmProgress.innerHTML = 'loading form.';\r
-                               \r
-                               UPLOAD_CONSOLE.onWindowResize( w, h);\r
-                       },\r
-                       onWindowResize: function( _windowW, _windowH){\r
-                               windowW = _windowW;\r
-                               windowH = _windowH;\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
-                                       }\r
-                               );\r
-                       },\r
-                       onClose: function(){\r
-                               elmForm !== null && $( elmContainer.children ).remove();\r
-                               elmForm = elmFile = elmIframe = null;\r
+               jqWrap.hide();\r
+       }\r
+});\r
+\r
+pettanr.uploadConsole = pettanr.view.registerApplication( function(){\r
+       var jqWrap, windowW, windowH,\r
+               ID = 'uploadConsole',\r
+               TARGET_FRAME_NAME = 'targetFrame',\r
+               elmContainer = document.getElementById( 'uploader'),\r
+               elmProgress = document.getElementById( 'upload-console-progress'),\r
+               timer = null,\r
+               elmScript = null,\r
+               elmForm = null,\r
+               elmFile = null,\r
+               elmIframe = null,\r
+               isUploading = false,\r
+               instance = this;\r
+       /*\r
+        * upload ボタンが押されたらまず iframe をつくる.\r
+        */\r
+       function clickOK(){\r
+               if( !elmForm || !elmIframe || isUploading === true ) return false;\r
+               if( elmFile.value.length === 0) return false;\r
+               elmProgress.innerHTML = 'uploading.';\r
+               isUploading = true;\r
+               submit();\r
+               return false;\r
+       }\r
+       /*\r
+        * form の target に iframe を指定したのち submit();\r
+        */\r
+               function submit(){\r
+                       try {\r
+                               elmForm.submit();\r
+                       } catch( e){\r
+                               elmProgress.innerHTML = 'submit() err..';\r
                                isUploading = false;\r
-                               \r
-                               if( elmScript !== null ){\r
-                                       document.body.removeChild( elmScript);\r
-                                       elmScript = null;                                       \r
-                               }\r
-                               if( timer !== null){\r
-                                       window.clearInterval( timer);\r
-                                       timer = null;\r
-                               }\r
-                               jqWrap.hide();\r
-                       },\r
-                       ID: ID\r
-               }\r
-       })();\r
-       \r
-       return {\r
-               init: function(){\r
-                       UPLOAD_CONSOLE.init();\r
-                       delete pettanr.comicConsole.init;\r
-               },\r
-               onOpen: function( _w, _h, _file){\r
-                       if( pettanr.driver.isPettanrFileInstance( _file ) === true && _file.getType() === pettanr.driver.FILE_TYPE.COMIC){\r
-                               // _data = _file.read();\r
+                               setTimeout( clickCancel , 3000);\r
+                               return;\r
                        }\r
-               },\r
-               onClose: function(){\r
                        \r
-               },\r
-               onWindowResize: function( _windowW, _windowH){\r
-               },\r
-               _quickAccessShow: function(){\r
-                       jqWindow = pettanr.jqWindow();\r
-                       var w = jqWindow.width(),\r
-                               h = jqWindow.height();\r
-                       UPLOAD_CONSOLE.show( w, h);\r
-               }\r
-       }\r
-})();\r
-\r
-pettanr.panelConsole = ( function(){\r
-       var PANEL_CONSOLE = ( function(){\r
-               var jqWrap, windowW, windowH,\r
-                       ID = 'panelConsole',\r
-                       TARGET_FRAME_NAME = 'targetFrameCreateNewPanel',\r
-                       elmContainer = document.getElementById( 'newpanel'),\r
-                       elmProgress = document.getElementById( 'panel-console-progress'),\r
-                       timer = null,\r
-                       elmScript = null,\r
-                       elmForm = null,\r
-                       elmIframe = null,\r
-                       isUploading = false;\r
-               /*\r
-                * upload ボタンが押されたらまず iframe をつくる.\r
-                */\r
-               function clickOK(){\r
-                       if( !elmForm || !elmIframe || isUploading === true ) return false;\r
-                       elmProgress.innerHTML = 'uploading.';\r
-                       isUploading = true;\r
-                       submit();\r
-                       return false;\r
+                       if( pettanr.ua.isIE){\r
+                               elmIframe.onreadystatechange = detectIframe;\r
+                       } else {\r
+                               elmIframe.onload = onLoad;\r
+                       }\r
+                       elmProgress.innerHTML = 'uploading..';\r
                }\r
-               /*\r
-                * form の target に iframe を指定したのち submit();\r
-                */\r
-                       function submit(){\r
-                               try {\r
-                                       elmForm.submit();\r
-                               } catch( e){\r
-                                       elmProgress.innerHTML = 'submit() err..';\r
+       /*\r
+        * ie の 場合、readyState をチェック.\r
+        */\r
+                       function detectIframe(){\r
+                   if ( elmIframe.readyState === 'complete') {\r
+                       elmIframe.onreadystatechange = new Function();\r
+                       elmIframe.onreadystatechange = null;\r
+                       onLoad();\r
+                   }\r
+                       }\r
+                               function onLoad(){\r
+                                       elmIframe.onload = null;\r
+                                       ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
+                                       elmProgress.innerHTML = 'success!';\r
+                                       setTimeout( clickCancel , 1000);\r
                                        isUploading = false;\r
-                                       setTimeout( clickCancel , 3000);\r
-                                       return;\r
                                }\r
-                               \r
-                               if( pettanr.ua.isIE){\r
-                                       elmIframe.onreadystatechange = detectIframe;\r
-                               } else {\r
-                                       elmIframe.onload = onLoad;\r
+       \r
+       function detectForm(){\r
+               elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
+               if( elmForm){\r
+                       var _inputList = elmForm.getElementsByTagName( 'input' ),\r
+                               _input;\r
+                       for( var i=0, l= _inputList.length; i<l; ++i){\r
+                               _input = _inputList[ i ];\r
+                               if( _input.type === 'file'){\r
+                                       elmFile = _input;\r
+                               }\r
+                               if( _input.type === 'submit'){\r
+                                       _input.style.display = 'none';\r
                                }\r
-                               elmProgress.innerHTML = 'uploading..';\r
                        }\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
+                       pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
+                       elmProgress.innerHTML = 'create iframe';\r
+               }\r
+       }\r
+       function onCreateIframe( _iframe ){\r
+               elmContainer.appendChild( _iframe );\r
+               elmIframe = _iframe;\r
+               elmForm.target = _iframe.name;\r
+               elmProgress.innerHTML = '';\r
+               instance.onPaneResize( windowW, windowH );\r
+       }\r
+       /*\r
+        * \r
+        */\r
+       function clickCancel(){\r
+               if( isUploading === true) return false;\r
+               pettanr.uploadConsole.shutdown();\r
+               return false;\r
+       }\r
+\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'upload-console-wrapper' );\r
+       this.displayName = ID;\r
+       this.ID          = ID;\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.init = function(){\r
+               jqWrap = $( '#upload-console-wrapper').hide();\r
+               $( '#upload-console-post-button').click( clickOK );\r
+               $( '#upload-console-cancel-button').click( clickCancel );\r
+\r
+               delete instance.init;\r
+       }\r
+       this.onOpen = function( w, h){\r
+               instance.init && instance.init();\r
                /*\r
-                * ie の 場合、readyState をチェック.\r
-                */\r
-                               function detectIframe(){\r
-                           if ( elmIframe.readyState === 'complete') {\r
-                               elmIframe.onreadystatechange = new Function();\r
-                               elmIframe.onreadystatechange = null;\r
-                               onLoad();\r
-                           }\r
-                               }\r
-                                       function onLoad(){\r
-                                               elmIframe.onload = null;\r
-                                               ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
-                                               elmProgress.innerHTML = 'success!';\r
-                                               setTimeout( clickCancel , 1000);\r
-                                               isUploading = false;\r
-                                       }\r
+                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
+                */                             \r
+               elmScript = document.createElement( 'script');\r
+               elmScript.type = 'text\/javascript';\r
+               elmScript.src = pettanr.CONST.UPLOAD_PICTURE_JS;\r
+               document.body.appendChild( elmScript);\r
                \r
-               function detectForm(){\r
-                       elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
-                       if( elmForm){\r
-                               var _inputList = elmForm.getElementsByTagName( 'input' ),\r
-                                       _input;\r
-                               for( var i=0, l= _inputList.length; i<l; ++i){\r
-                                       _input = _inputList[ i ];\r
-                                       if( _input.type === 'submit'){\r
-                                               _input.style.display = 'none';\r
-                                       }\r
-                               }\r
-                               window.clearInterval( timer);\r
-                               timer = null;\r
-                               pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
-                               elmProgress.innerHTML = 'create iframe';\r
-                       }\r
+               jqWrap.show();\r
+\r
+               if( timer === null){\r
+                       timer = window.setInterval( detectForm, 250);\r
                }\r
-               function onCreateIframe( _iframe ){\r
-                       elmContainer.appendChild( _iframe );\r
-                       elmIframe = _iframe;\r
-                       elmForm.target = _iframe.name;\r
-                       elmProgress.innerHTML = '';\r
-                       PANEL_CONSOLE.onWindowResize( windowW, windowH );\r
+               \r
+               elmProgress.innerHTML = 'loading form.';\r
+               \r
+               instance.onPaneResize( w, h);\r
+       }\r
+       this.onPaneResize = function( _windowW, _windowH){\r
+               windowW = _windowW;\r
+               windowH = _windowH;\r
+               jqWrap.css(\r
+                       {\r
+                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
+                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
+                       }\r
+               );\r
+       }\r
+       this.onClose = function(){\r
+               elmForm !== null && $( elmContainer.children ).remove();\r
+               elmForm = elmFile = elmIframe = null;\r
+               isUploading = false;\r
+               \r
+               if( elmScript !== null ){\r
+                       document.body.removeChild( elmScript);\r
+                       elmScript = null;                                       \r
                }\r
-               /*\r
-                * \r
-                */\r
-               function clickCancel(){\r
-                       if( isUploading === true) return false;\r
-                       pettanr.overlay.hide();\r
-                       PANEL_CONSOLE.onClose();\r
-                       return false;\r
+               if( timer !== null){\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
                }\r
-               \r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#panel-console-wrapper').hide();\r
-                               $( '#panel-console-post-button').click( clickOK );\r
-                               $( '#panel-console-cancel-button').click( clickCancel );\r
-\r
-                               delete PANEL_CONSOLE.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( w, h){\r
-                               /*\r
-                                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
-                                */                             \r
-                               elmScript = document.createElement( 'script');\r
-                               elmScript.type = 'text\/javascript';\r
-                               elmScript.src = pettanr.CONST.CREATE_PANEL_JS;\r
-                               document.body.appendChild( elmScript);\r
-                               \r
-                               jqWrap.show();\r
-                               pettanr.overlay.show( PANEL_CONSOLE );\r
-\r
-                               if( timer === null){\r
-                                       timer = window.setInterval( detectForm, 250 );\r
-                               }\r
-                               \r
-                               elmProgress.innerHTML = 'loading form.';\r
-                               \r
-                               PANEL_CONSOLE.onWindowResize( w, h );\r
-                       },\r
-                       onWindowResize: function( _windowW, _windowH){\r
-                               windowW = _windowW;\r
-                               windowH = _windowH;\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
-                                       }\r
-                               );\r
-                       },\r
-                       onClose: function(){\r
-                               elmForm !== null && $( elmContainer.children ).remove();\r
-                               elmForm = elmIframe = null;\r
+               jqWrap.hide();\r
+       }\r
+});\r
+\r
+pettanr.panelConsole = pettanr.view.registerApplication( function(){\r
+       var jqWrap, windowW, windowH,\r
+               ID = 'panelConsole',\r
+               TARGET_FRAME_NAME = 'targetFrameCreateNewPanel',\r
+               elmContainer = document.getElementById( 'newpanel'),\r
+               elmProgress = document.getElementById( 'panel-console-progress'),\r
+               timer = null,\r
+               elmScript = null,\r
+               elmForm = null,\r
+               elmIframe = null,\r
+               isUploading = false,\r
+               instance = this;\r
+       /*\r
+        * upload ボタンが押されたらまず iframe をつくる.\r
+        */\r
+       function clickOK(){\r
+               if( !elmForm || !elmIframe || isUploading === true ) return false;\r
+               elmProgress.innerHTML = 'uploading.';\r
+               isUploading = true;\r
+               submit();\r
+               return false;\r
+       }\r
+       /*\r
+        * form の target に iframe を指定したのち submit();\r
+        */\r
+               function submit(){\r
+                       try {\r
+                               elmForm.submit();\r
+                       } catch( e){\r
+                               elmProgress.innerHTML = 'submit() err..';\r
                                isUploading = false;\r
-                               \r
-                               if( elmScript !== null ){\r
-                                       document.body.removeChild( elmScript);\r
-                                       elmScript = null;                                       \r
-                               }\r
-                               if( timer !== null){\r
-                                       window.clearInterval( timer);\r
-                                       timer = null;\r
-                               }\r
-                               jqWrap.hide();\r
-                       },\r
-                       ID: ID\r
+                               setTimeout( clickCancel , 3000);\r
+                               return;\r
+                       }\r
+                       \r
+                       if( pettanr.ua.isIE){\r
+                               elmIframe.onreadystatechange = detectIframe;\r
+                       } else {\r
+                               elmIframe.onload = onLoad;\r
+                       }\r
+                       elmProgress.innerHTML = 'uploading..';\r
                }\r
-       })();\r
+       /*\r
+        * ie の 場合、readyState をチェック.\r
+        */\r
+                       function detectIframe(){\r
+                   if ( elmIframe.readyState === 'complete') {\r
+                       elmIframe.onreadystatechange = new Function();\r
+                       elmIframe.onreadystatechange = null;\r
+                       onLoad();\r
+                   }\r
+                       }\r
+                               function onLoad(){\r
+                                       elmIframe.onload = null;\r
+                                       ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
+                                       elmProgress.innerHTML = 'success!';\r
+                                       setTimeout( clickCancel , 1000);\r
+                                       isUploading = false;\r
+                               }\r
        \r
-       return {\r
-               init: function(){\r
-                       PANEL_CONSOLE.init();\r
-                       delete pettanr.comicConsole.init;\r
-               },\r
-               onOpen: function( _w, _h, _file ){\r
-                       \r
-               },\r
-               onClose: function(){\r
-                       \r
-               },\r
-               onWindowResize: function( _windowW, _windowH){\r
-               },\r
-               _quickAccessShow: function(){\r
-                       jqWindow = pettanr.jqWindow();\r
-                       var w = jqWindow.width(),\r
-                               h = jqWindow.height();\r
-                       PANEL_CONSOLE.show( w, h);\r
+       function detectForm(){\r
+               elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
+               if( elmForm){\r
+                       var _inputList = elmForm.getElementsByTagName( 'input' ),\r
+                               _input;\r
+                       for( var i=0, l= _inputList.length; i<l; ++i){\r
+                               _input = _inputList[ i ];\r
+                               if( _input.type === 'submit'){\r
+                                       _input.style.display = 'none';\r
+                               }\r
+                       }\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
+                       pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
+                       elmProgress.innerHTML = 'create iframe';\r
                }\r
        }\r
-})();\r
+       function onCreateIframe( _iframe ){\r
+               elmContainer.appendChild( _iframe );\r
+               elmIframe = _iframe;\r
+               elmForm.target = _iframe.name;\r
+               elmProgress.innerHTML = '';\r
+               instance.onPaneResize( windowW, windowH );\r
+       }\r
+       /*\r
+        * \r
+        */\r
+       function clickCancel(){\r
+               if( isUploading === true) return false;\r
+               pettanr.panelConsole.shutdown();\r
+               return false;\r
+       }\r
 \r
-pettanr.artistConsole = ( function(){\r
-       var ARTIST_CONSOLE = ( function(){\r
-               var jqWrap, windowW, windowH,\r
-                       ID = 'artistConsole',\r
-                       TARGET_FRAME_NAME = 'targetFrameRegisterArtist',\r
-                       elmContainer = document.getElementById( 'register'),\r
-                       elmProgress = document.getElementById( 'artist-console-progress'),\r
-                       timer = null,\r
-                       elmScript = null,\r
-                       elmForm = null,\r
-                       elmIframe = null,\r
-                       isUploading = false;\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'panel-console-wrapper' );\r
+       this.displayName = ID;\r
+       this.ID          = ID;\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.init = function(){\r
+               jqWrap = $( '#panel-console-wrapper').hide();\r
+               $( '#panel-console-post-button').click( clickOK );\r
+               $( '#panel-console-cancel-button').click( clickCancel );\r
+\r
+               delete instance.init;\r
+       }\r
+       this.onOpen = function( w, h ){\r
+               instance.init && instance.init();\r
                /*\r
-                * upload ボタンが押されたらまず iframe をつくる.\r
-                */\r
-               function clickOK(){\r
-                       if( !elmForm || !elmIframe || isUploading === true ) return false;\r
-                       elmProgress.innerHTML = 'uploading.';\r
-                       isUploading = true;\r
-                       submit();\r
-                       return false;\r
+                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
+                */                             \r
+               elmScript = document.createElement( 'script');\r
+               elmScript.type = 'text\/javascript';\r
+               elmScript.src = pettanr.CONST.CREATE_PANEL_JS;\r
+               document.body.appendChild( elmScript);\r
+               \r
+               jqWrap.show();\r
+\r
+               if( timer === null){\r
+                       timer = window.setInterval( detectForm, 250 );\r
                }\r
-               /*\r
-                * form の target に iframe を指定したのち submit();\r
-                */\r
-                       function submit(){\r
-                               try {\r
-                                       elmForm.submit();\r
-                               } catch( e){\r
-                                       elmProgress.innerHTML = 'submit() err..';\r
+               \r
+               elmProgress.innerHTML = 'loading form.';\r
+               \r
+               instance.onPaneResize( w, h );\r
+       }\r
+       this.onPaneResize = function( _windowW, _windowH ){\r
+               windowW = _windowW;\r
+               windowH = _windowH;\r
+               jqWrap.css(\r
+                       {\r
+                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
+                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
+                       }\r
+               );\r
+       }\r
+       this.onClose = function(){\r
+               elmForm !== null && $( elmContainer.children ).remove();\r
+               elmForm = elmIframe = null;\r
+               isUploading = false;\r
+               \r
+               if( elmScript !== null ){\r
+                       document.body.removeChild( elmScript);\r
+                       elmScript = null;                                       \r
+               }\r
+               if( timer !== null){\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
+               }\r
+               jqWrap.hide();\r
+       }\r
+});\r
+\r
+pettanr.artistConsole = pettanr.view.registerApplication( function(){\r
+       var jqWrap, windowW, windowH,\r
+               ID = 'artistConsole',\r
+               TARGET_FRAME_NAME = 'targetFrameRegisterArtist',\r
+               elmContainer = document.getElementById( 'register'),\r
+               elmProgress = document.getElementById( 'artist-console-progress'),\r
+               timer = null,\r
+               elmScript = null,\r
+               elmForm = null,\r
+               elmIframe = null,\r
+               isUploading = false,\r
+               instance = this;\r
+       /*\r
+        * upload ボタンが押されたらまず iframe をつくる.\r
+        */\r
+       function clickOK(){\r
+               if( !elmForm || !elmIframe || isUploading === true ) return false;\r
+               elmProgress.innerHTML = 'uploading.';\r
+               isUploading = true;\r
+               submit();\r
+               return false;\r
+       }\r
+       /*\r
+        * form の target に iframe を指定したのち submit();\r
+        */\r
+               function submit(){\r
+                       try {\r
+                               elmForm.submit();\r
+                       } catch( e){\r
+                               elmProgress.innerHTML = 'submit() err..';\r
+                               isUploading = false;\r
+                               setTimeout( clickCancel , 3000);\r
+                               return;\r
+                       }\r
+                       \r
+                       if( pettanr.ua.isIE){\r
+                               elmIframe.onreadystatechange = detectIframe;\r
+                       } else {\r
+                               elmIframe.onload = onLoad;\r
+                       }\r
+                       elmProgress.innerHTML = 'uploading..';\r
+               }\r
+       /*\r
+        * ie の 場合、readyState をチェック.\r
+        */\r
+                       function detectIframe(){\r
+                   if ( elmIframe.readyState === 'complete') {\r
+                       elmIframe.onreadystatechange = new Function();\r
+                       elmIframe.onreadystatechange = null;\r
+                       onLoad();\r
+                   }\r
+                       }\r
+                               function onLoad(){\r
+                                       elmIframe.onload = null;\r
+                                       ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
+                                       elmProgress.innerHTML = 'success!';\r
+                                       setTimeout( clickCancel , 1000);\r
                                        isUploading = false;\r
-                                       setTimeout( clickCancel , 3000);\r
-                                       return;\r
                                }\r
-                               \r
-                               if( pettanr.ua.isIE){\r
-                                       elmIframe.onreadystatechange = detectIframe;\r
-                               } else {\r
-                                       elmIframe.onload = onLoad;\r
+       \r
+       function detectForm(){\r
+               elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
+               if( elmForm){\r
+                       var _inputList = elmForm.getElementsByTagName( 'input' ),\r
+                               _input;\r
+                       for( var i=0, l= _inputList.length; i<l; ++i){\r
+                               _input = _inputList[ i ];\r
+                               if( _input.type === 'submit'){\r
+                                       _input.style.display = 'none';\r
                                }\r
-                               elmProgress.innerHTML = 'uploading..';\r
                        }\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
+                       pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
+                       elmProgress.innerHTML = 'create iframe';\r
+               }\r
+       }\r
+       function onCreateIframe( _iframe ){\r
+               elmContainer.appendChild( _iframe );\r
+               elmIframe = _iframe;\r
+               elmForm.target = _iframe.name;\r
+               elmProgress.innerHTML = '';\r
+               instance.onPaneResize( windowW, windowH );\r
+       }\r
+       /*\r
+        * \r
+        */\r
+       function clickCancel(){\r
+               if( isUploading === true) return false;\r
+               pettanr.artistConsole.shutdown();\r
+               return false;\r
+       }\r
+\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'artist-console-wrapper' );\r
+       this.displayName = ID;\r
+       this.ID          = ID;\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.init = function(){\r
+               jqWrap = $( '#artist-console-wrapper').hide();\r
+               $( '#artist-console-post-button').click( clickOK );\r
+               $( '#artist-console-cancel-button').click( clickCancel );\r
+\r
+               delete instance.init;\r
+       }\r
+       this.onOpen = function( w, h ){\r
+               instance.init && instance.init();\r
                /*\r
-                * ie の 場合、readyState をチェック.\r
-                */\r
-                               function detectIframe(){\r
-                           if ( elmIframe.readyState === 'complete') {\r
-                               elmIframe.onreadystatechange = new Function();\r
-                               elmIframe.onreadystatechange = null;\r
-                               onLoad();\r
-                           }\r
-                               }\r
-                                       function onLoad(){\r
-                                               elmIframe.onload = null;\r
-                                               ( elmIframe.contentWindow || elmIframe.contentDocument.parentWindow ).close();\r
-                                               elmProgress.innerHTML = 'success!';\r
-                                               setTimeout( clickCancel , 1000);\r
-                                               isUploading = false;\r
-                                       }\r
+                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
+                */                             \r
+               elmScript = document.createElement( 'script' );\r
+               elmScript.type = 'text\/javascript';\r
+               elmScript.src = pettanr.CONST.REGISTER_ARTIST_JS;\r
+               document.body.appendChild( elmScript );\r
                \r
-               function detectForm(){\r
-                       elmForm = elmContainer.getElementsByTagName( 'form' )[ 0 ];\r
-                       if( elmForm){\r
-                               var _inputList = elmForm.getElementsByTagName( 'input' ),\r
-                                       _input;\r
-                               for( var i=0, l= _inputList.length; i<l; ++i){\r
-                                       _input = _inputList[ i ];\r
-                                       if( _input.type === 'submit'){\r
-                                               _input.style.display = 'none';\r
-                                       }\r
-                               }\r
-                               window.clearInterval( timer);\r
-                               timer = null;\r
-                               pettanr.util.createIframe( TARGET_FRAME_NAME, onCreateIframe);\r
-                               elmProgress.innerHTML = 'create iframe';\r
+               jqWrap.show();\r
+\r
+               if( timer === null){\r
+                       timer = window.setInterval( detectForm, 250 );\r
+               }\r
+               \r
+               elmProgress.innerHTML = 'loading form.';\r
+               \r
+               instance.onPaneResize( w, h );\r
+       }\r
+       this.onPaneResize = function( _windowW, _windowH ){\r
+               windowW = _windowW;\r
+               windowH = _windowH;\r
+               jqWrap.css(\r
+                       {\r
+                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
+                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
                        }\r
+               );\r
+       }\r
+       this.onClose = function(){\r
+               elmForm !== null && $( elmContainer.children ).remove();\r
+               elmForm = elmIframe = null;\r
+               isUploading = false;\r
+               \r
+               if( elmScript !== null ){\r
+                       document.body.removeChild( elmScript);\r
+                       elmScript = null;                                       \r
                }\r
-               function onCreateIframe( _iframe ){\r
-                       elmContainer.appendChild( _iframe );\r
-                       elmIframe = _iframe;\r
-                       elmForm.target = _iframe.name;\r
-                       elmProgress.innerHTML = '';\r
-                       ARTIST_CONSOLE.onWindowResize( windowW, windowH );\r
+               if( timer !== null){\r
+                       window.clearInterval( timer);\r
+                       timer = null;\r
                }\r
-               /*\r
-                * \r
-                */\r
-               function clickCancel(){\r
-                       if( isUploading === true) return false;\r
-                       pettanr.overlay.hide();\r
-                       ARTIST_CONSOLE.onClose();\r
-                       return false;\r
+               jqWrap.hide();\r
+       }\r
+});\r
+\r
+pettanr.outputConsole = pettanr.view.registerApplication( function(){\r
+       var jqWrap, jqOutputArea,\r
+               ID = 'outputConsole',\r
+               timing = 0,\r
+               instance = this;\r
+       //pettanr.key.addKeyDownEvent( ID, 69, false, false, clickOK);\r
+       \r
+       function clickOK(){\r
+               pettanr.outputConsole.shutdown();\r
+       }\r
+\r
+       function getPanelElementByTiming( PANEL_ELEMENT_ARRAY, l ){\r
+               while( timing < l * 2){\r
+                       for(var i=0; i<l; ++i){\r
+                               if( timing === PANEL_ELEMENT_ARRAY[ i ].timing ){\r
+                                       ++timing;\r
+                                       return PANEL_ELEMENT_ARRAY[ i ];\r
+                               }\r
+                       }\r
+                       ++timing;\r
                }\r
+               return null;\r
+       }\r
+\r
+       function getAsHtmlString( isAbsoluteUrl, isXHTML, panelW, panelH, border, PANEL_ELEMENT_ARRAY ){\r
+               timing = 0;\r
                \r
-               return {\r
-                       init: function(){\r
-                               this.jqWrap = jqWrap = $( '#artist-console-wrapper').hide();\r
-                               $( '#artist-console-post-button').click( clickOK );\r
-                               $( '#artist-console-cancel-button').click( clickCancel );\r
+               var HTML_ARRAY = [],\r
+                       l = PANEL_ELEMENT_ARRAY.length,\r
+                       _panelElement;\r
+\r
+               while( HTML_ARRAY.length < l ){\r
+                       _panelElement = getPanelElementByTiming( PANEL_ELEMENT_ARRAY, l );\r
+                       if( _panelElement === null) break;\r
+                       HTML_ARRAY.push( panelElementToHtml( _panelElement, isAbsoluteUrl, isXHTML ));\r
+               }\r
+\r
+               HTML_ARRAY.unshift(\r
+                       [\r
+                               '<div class="panel" ',\r
+                                       'style="',\r
+                                               'height:', panelH, 'px;',\r
+                                               'background-color:', ';',\r
+                                       '"',\r
+                               '>'\r
+                       ].join( '')\r
+               );              \r
+               HTML_ARRAY.push( '</div>');\r
+               \r
+               return HTML_ARRAY.join( pettanr.LINE_FEED_CODE_TEXTAREA);\r
+       }\r
 \r
-                               delete ARTIST_CONSOLE.init;\r
-                       },\r
-                       jqWrap: null,\r
-                       show: function( w, h){\r
-                               /*\r
-                                * ie 6, 7 で fadeIn 中の要素に appendChild すると クラッシュするので、document.body に追加.\r
-                                */                             \r
-                               elmScript = document.createElement( 'script');\r
-                               elmScript.type = 'text\/javascript';\r
-                               elmScript.src = pettanr.CONST.REGISTER_ARTIST_JS;\r
-                               document.body.appendChild( elmScript);\r
-                               \r
-                               jqWrap.show();\r
-                               pettanr.overlay.show( ARTIST_CONSOLE );\r
+               function panelElementToHtml( _panelElement, isAbsoluteUrl, isXHTML ){\r
+                       var url;\r
+                       if( _panelElement.type === 0 ){\r
+                               url = [ pettanr.CONST.RESOURCE_PICTURE_PATH, _panelElement.resourcePicture().id, '.', _panelElement.resourcePicture().ext ].join( '' );\r
+                               return [\r
+                                       '<img ',\r
+                                               'src="',        isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url ), '" ',\r
+                                               'width="',      _panelElement.w, '" ',\r
+                                               'height="',     _panelElement.h, '" ',\r
+                                               'style="',\r
+                                                       'left:',    _panelElement.x, 'px;',\r
+                                                       'top:',     _panelElement.y, 'px;',\r
+                                                       'z-index:', _panelElement.z, ';',\r
+                                               '"',\r
+                                       isXHTML !== true ? '>' : ' \/>'\r
+                               ].join( '');                            \r
+                       } else {\r
+                               url = _panelElement.getBalloonURL();\r
+                               return [\r
+                                       '<img ',\r
+                                               'src="',        isAbsoluteUrl !== true ? url : pettanr.util.getAbsolutePath( url ), '" ',\r
+                                               'width="',      _panelElement.w, '" ',\r
+                                               'height="',     _panelElement.h, '" ',\r
+                                               'style="',                                                                      \r
+                                                       'left:',    _panelElement.x, 'px;',\r
+                                                       'top:',     _panelElement.y, 'px;',\r
+                                                       'z-index:', _panelElement.z, ';',\r
+                                               '"',\r
+                                       isXHTML !== true ? '>' : ' \/>',\r
+                                       pettanr.LINE_FEED_CODE_TEXTAREA,\r
+                                       '<div class="balloon" style="',\r
+                                               'left:',        _panelElement.x, 'px;',\r
+                                               'top:',         _panelElement.y, 'px;',\r
+                                               'width:',       _panelElement.w, 'px;',\r
+                                               'height:',      _panelElement.h, 'px;',\r
+                                               'z-index:',     _panelElement.z,\r
+                                       '"><span>', _panelElement.text(), '<\/span>', '<\/div>'\r
+                                               \r
+                               ].join( '');                            \r
+                       }\r
+               }\r
 \r
-                               if( timer === null){\r
-                                       timer = window.setInterval( detectForm, 250 );\r
-                               }\r
-                               \r
-                               elmProgress.innerHTML = 'loading form.';\r
-                               \r
-                               ARTIST_CONSOLE.onWindowResize( w, h );\r
-                       },\r
-                       onWindowResize: function( _windowW, _windowH ){\r
-                               windowW = _windowW;\r
-                               windowH = _windowH;\r
-                               jqWrap.css(\r
-                                       {\r
-                                               left:   Math.floor( ( _windowW -jqWrap.width()) /2),\r
-                                               top:    Math.floor( ( _windowH -jqWrap.height()) /2)\r
-                                       }\r
-                               );\r
-                       },\r
-                       onClose: function(){\r
-                               elmForm !== null && $( elmContainer.children ).remove();\r
-                               elmForm = elmIframe = null;\r
-                               isUploading = false;\r
-                               \r
-                               if( elmScript !== null ){\r
-                                       document.body.removeChild( elmScript);\r
-                                       elmScript = null;                                       \r
-                               }\r
-                               if( timer !== null){\r
-                                       window.clearInterval( timer);\r
-                                       timer = null;\r
-                               }\r
-                               jqWrap.hide();\r
-                       },\r
-                       ID: ID\r
+       function getAsJsonString( comicID, panelID, panelTimming, panelW, panelH, border, PANEL_ELEMENT_ARRAY ){\r
+               timing = 0;\r
+               \r
+               var JSON_STRING_ARRAY = [],\r
+                       IMAGE_ARRAY = [],\r
+                       BALLOON_ARRAY = [],\r
+                       l = PANEL_ELEMENT_ARRAY.length,\r
+                       _panelElement,\r
+                       cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
+\r
+               while( IMAGE_ARRAY.length + BALLOON_ARRAY.length <= l){\r
+                       _panelElement = getPanelElementByTiming( PANEL_ELEMENT_ARRAY, l );\r
+                       if( _panelElement === null) break;\r
+                       _panelElement.type === 0 ? \r
+                               IMAGE_ARRAY.push( imageToJson( _panelElement )) :\r
+                               BALLOON_ARRAY.push( balloonToJson( _panelElement ) );\r
+               }\r
+               return [\r
+                       '{', cr,\r
+                               '"panel": {', cr,\r
+                                       '"id": ',               panelID, ',', cr,\r
+                                   '"border": ',           border, ',', cr,\r
+                                   '"comic_id": ',         comicID, ',', cr,\r
+                                   '"resource_picture_id": 1,', cr,\r
+                                       '"x": ',                0, ',', cr,\r
+                                       '"y": ',                0, ',', cr,\r
+                                       '"z": ',                0, ',', cr,\r
+                                       panelTimming !== -1 ? ( '"t": ' + panelTimming + ',' + cr ) : '',\r
+                                   '"width": ',            panelW, ',', cr,\r
+                                   '"height": ',           panelH, ',', cr,\r
+                                   '"panel_pictures_attributes": {', cr,\r
+                                       IMAGE_ARRAY.join( ',' + cr ), cr,\r
+                                   '},', cr,\r
+                                   '"balloons_attributes": {', cr,\r
+                                       BALLOON_ARRAY.join( ',' + cr ), cr,\r
+                                   '}', cr,\r
+                               '}', cr,\r
+                       '}'\r
+               ].join( '' );\r
+       }\r
+               function imageToJson( _imageElement ){\r
+                       var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
+                       return [\r
+                               '"new', timing, '": {', cr,\r
+                                       '"resource_picture_id": ', _imageElement.resourcePicture().id, ',', cr,\r
+                                       '"x": ',                   _imageElement.x, ',', cr,\r
+                                       '"y": ',                   _imageElement.y, ',', cr,\r
+                                       '"z": ',                   _imageElement.z, ',', cr,\r
+                                       '"width": ',               _imageElement.flipH() * _imageElement.w, ',', cr,\r
+                                       '"height": ',              _imageElement.flipV() * _imageElement.h, ',', cr,\r
+                                       '"t": ',                   timing, cr,\r
+                               '}'\r
+                       ].join( '');\r
+               }\r
+\r
+               function balloonToJson( _textElement ){\r
+                       var cr = pettanr.LINE_FEED_CODE_TEXTAREA;\r
+                       return [\r
+                               '"new', timing, '": {', cr,\r
+                                       '"balloon_template_id": ', 1, ',', cr,\r
+                                       '"system_picture_id": ',   1, ',', cr,\r
+                                       '"size": ',                1, ',', cr,\r
+                                       '"tail": ',                _textElement.angle(), ',', cr,\r
+                                       '"x": ',                   _textElement.x, ',', cr,\r
+                                       '"y": ',                   _textElement.y, ',', cr,\r
+                                       '"z": ',                   _textElement.z, ',', cr,\r
+                                       '"t": ',                   timing, ',', cr,\r
+                                       '"width": ',               _textElement.w, ',', cr,\r
+                                       '"height": ',              _textElement.h, ',', cr,\r
+                                       '"speaches_attributes": {', cr,\r
+                                               '"newf', timing, '": {', cr,\r
+                                               '"content": "', _textElement.text(), '",', cr,\r
+                                                       '"x": ',        _textElement.x, ',', cr,\r
+                                                       '"y": ',        _textElement.y, ',', cr,\r
+                                                       '"t": ',        timing, ',', cr,\r
+                                                       '"width": ',    _textElement.w, ',', cr,\r
+                                                       '"height": ',   _textElement.h, cr,\r
+                                               '}', cr,\r
+                                       '}', cr,\r
+                               '}'\r
+                       ].join( '');\r
                }\r
-       })();\r
+\r
+\r
+       /* grobal method */\r
+       this.rootElement = document.getElementById( 'output-console-wrapper' );\r
+       this.displayName = ID;\r
+       this.ID          = ID;\r
        \r
-       return {\r
-               init: function(){\r
-                       ARTIST_CONSOLE.init();\r
-                       delete pettanr.comicConsole.init;\r
-               },\r
-               onOpen: function( _w, _h, _option ){\r
-                       \r
-               },\r
-               onClose: function(){\r
-                       \r
-               },\r
-               onWindowResize: function( _windowW, _windowH){\r
-               },\r
-               _quickAccessShow: function(){\r
-                       jqWindow = pettanr.jqWindow();\r
-                       var w = jqWindow.width(),\r
-                               h = jqWindow.height();\r
-                       ARTIST_CONSOLE.show( w, h);\r
+       this.MIN_WIDTH   = 320;\r
+       this.MIN_HEIGHT  = 320;\r
+       this.init = function(){\r
+               jqWrap = $( '#output-console-wrapper').hide();\r
+               jqOutputArea = $( '#output-area');\r
+               delete instance.init;\r
+       }\r
+       this.onOpen = function( _w, _h, _dataType, _comicID, _panelID, _panelTimming, _panelW, _panelH, _borderSize, _panelElements ){\r
+               instance.init && instance.init();\r
+               \r
+               jqWrap.show();\r
+               instance.onPaneResize( _w, _h );\r
+               var text;\r
+               if( _dataType === pettanr.outputConsole.JSON ){\r
+                       text = getAsJsonString( _comicID, _panelID, _panelTimming, _panelW, _panelH, _borderSize, _panelElements );\r
+               } else {\r
+                       text = getAsHtmlString( false, false, _panelW, _panelH, _borderSize, _panelElements );\r
                }\r
+               jqOutputArea.val( text ).focus();\r
+       }\r
+       this.onPaneResize = function( _w, _h){\r
+               jqWrap.css(\r
+                       {\r
+                               left:   Math.floor( ( _w -jqWrap.width()) /2),\r
+                               top:    Math.floor( ( _h -jqWrap.height()) /2)\r
+                       }\r
+               );\r
+       }\r
+       this.onClose = function(){\r
+               jqWrap.hide();\r
+               jqOutputArea.val('');\r
        }\r
-})();
\ No newline at end of file
+});\r
+pettanr.outputConsole.JSON          = 0;\r
+pettanr.outputConsole.HTML          = 1;\r
+pettanr.outputConsole.XML           = 2;\r
+pettanr.outputConsole.SHORT_URL     = 3;\r
+pettanr.outputConsole.MOVERBLE_TYPE = 4;\r
+pettanr.outputConsole.BLOGGER       = 5;\r
index 24ddecb..db89220 100644 (file)
@@ -1 +1 @@
-$("#newcomic").html("<form accept-charset=\"UTF-8\" action=\"/comics\" class=\"new_comic\" id=\"new_comic\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input name=\"authenticity_token\" type=\"hidden\" value=\"4SZnMe0yBUXVlpJ6MZ/2jKZns64P6XtmJ1KUeuNQcY0=\" /><\/div>\n\n  <div class=\"field\">\n    <label for=\"comic_title\">Title<\/label><br />\n    <input id=\"comic_title\" name=\"comic[title]\" size=\"30\" type=\"text\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_width\">Width<\/label><br />\n    <input id=\"comic_width\" name=\"comic[width]\" size=\"30\" type=\"number\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_height\">Height<\/label><br />\n    <input id=\"comic_height\" name=\"comic[height]\" size=\"30\" type=\"number\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_visible\">Visible<\/label><br />\n    <select id=\"comic_visible\" name=\"comic[visible]\"><option value=\"0\" selected=\"selected\">only me<\/option>\n<option value=\"3\">everyone<\/option><\/select>\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_editable\">Editable<\/label><br />\n    <select id=\"comic_editable\" name=\"comic[editable]\"><option value=\"0\" selected=\"selected\">only me<\/option>\n<option value=\"3\">everyone<\/option><\/select>\n  <\/div>\n\n  <div class=\"actions\">\n    <input name=\"commit\" type=\"submit\" value=\"Create Comic\" />\n  <\/div>\n<\/form>");\r
+$("#newcomic").html("<form accept-charset=\"UTF-8\" action=\"/comics\" class=\"new_comic\" id=\"new_comic\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input name=\"authenticity_token\" type=\"hidden\" value=\"ZzG8yZTOuJw403o7g1M33i8EnWvg+fSBXdTTagvsUtg=\" /><\/div>\n\n  <div class=\"field\">\n    <label for=\"comic_title\">Title<\/label><br />\n    <input id=\"comic_title\" name=\"comic[title]\" size=\"30\" type=\"text\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_width\">Width<\/label><br />\n    <input id=\"comic_width\" name=\"comic[width]\" size=\"30\" type=\"number\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_height\">Height<\/label><br />\n    <input id=\"comic_height\" name=\"comic[height]\" size=\"30\" type=\"number\" />\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_visible\">Visible<\/label><br />\n    <select id=\"comic_visible\" name=\"comic[visible]\"><option value=\"0\" selected=\"selected\">only me<\/option>\n<option value=\"3\">everyone<\/option><\/select>\n  <\/div>\n  <div class=\"field\">\n    <label for=\"comic_editable\">Editable<\/label><br />\n    <select id=\"comic_editable\" name=\"comic[editable]\"><option value=\"0\" selected=\"selected\">only me<\/option>\n<option value=\"3\">everyone<\/option><\/select>\n  <\/div>\n\n  <div class=\"actions\">\n    <input name=\"commit\" type=\"submit\" value=\"Create Comic\" />\n  <\/div>\n<\/form>");\r
index 515fcbc..f8c3be9 100644 (file)
@@ -3,7 +3,7 @@
  * \r
  *   common.css\r
  * \r
- *   version 0.4.1\r
+ *   version 0.4.23\r
  *\r
  */\r
 \r
 \r
 /*  Reset\r
 --------------------------------------------------------------------------------------*/\r
-       html, body {\r
-               margin:                         0;\r
-               padding:                        0;\r
-       }\r
-\r
-/*  Reset\r
---------------------------------------------------------------------------------------*/\r
 /*\r
 Copyright (c) 2009, Yahoo! Inc. All rights reserved.\r
 Code licensed under the BSD License:\r
@@ -73,7 +66,8 @@ version: 2.7.0
 \r
        /* http://e2designer.seesaa.net/article/152168876.html */\r
        /* http://perishablepress.com/press/2010/06/01/wrapping-content/ */\r
-       pre {\r
+       pre,\r
+       .break-word {\r
                white-space: pre;           /* CSS 2.0 */\r
                white-space: pre-wrap;      /* CSS 2.1 */\r
                white-space: pre-line;      /* CSS 3.0 */\r
@@ -146,6 +140,8 @@ version: 2.7.0
                line-height:            1.4em;\r
                margin:                         0 2px 1em;\r
                text-shadow:            1px 1px 3px rgba(0, 0, 0, 0.6);\r
+               -moz-text-shadow:       1px 1px 3px rgba(0, 0, 0, 0.6);\r
+               -webkit-text-shadow:1px 1px 3px rgba(0, 0, 0, 0.6);\r
     }\r
 \r
        h3 {\r
@@ -234,6 +230,9 @@ version: 2.7.0
                -moz-border-radius:             3px;\r
                -webkit-border-radius:  3px;\r
        }\r
+       .button-has-focus {\r
+               border-color:                   #4D90FE;\r
+       }\r
 \r
 /*  Loading\r
 --------------------------------------------------------------------------------------*/\r
@@ -344,6 +343,8 @@ version: 2.7.0
                font-size:                              1.4em;\r
                font-weight:                    normal;\r
                text-shadow:                    1px 1px 3px rgba(0, 0, 0, 0.6);\r
+               -moz-text-shadow:               1px 1px 3px rgba(0, 0, 0, 0.6);\r
+               -webkit-text-shadow:    1px 1px 3px rgba(0, 0, 0, 0.6);\r
        }       \r
 \r
 /*  base-content-width\r
@@ -353,6 +354,15 @@ version: 2.7.0
                margin:                                 0 auto;\r
        }\r
        \r
+/*  breadcrumb\r
+--------------------------------------------------------------------------------------*/\r
+       #breadcrumb {\r
+               font-size:                              12px;\r
+               color:                                  #666;\r
+               margin:                                 0 0 10px 20px;\r
+               line-height:                    1.2em;\r
+               text-align:                             right;\r
+       }\r
 /*  main\r
 --------------------------------------------------------------------------------------*/\r
        #main {\r
@@ -552,6 +562,11 @@ version: 2.7.0
                    left:                               0;\r
                    top:                                0;\r
                }\r
+               .pettanr-comic-panel img {\r
+                       position:                       absolute;\r
+                   left:                               0;\r
+                   top:                                0;\r
+               }\r
                .pettanr-comic-balloon .pettanr-comic-speach {\r
                        position:                               absolute;\r
                        top:                                    0;\r
@@ -569,6 +584,9 @@ version: 2.7.0
                                text-align:                     center;\r
                                vertical-align:         middle;\r
                        }\r
+                       .pettanr-comic-speach td {\r
+                               padding:                        16.66%;\r
+                       }\r
                        .pettanr-comic-speach {\r
                                table-layout:           fixed; /* ie6で上下中央にテキストがならない対処。固定レイアウトアルゴリズムになるので負荷を下げるらしい */\r
                        }
\ No newline at end of file
index 3f2f596..29ee7e2 100644 (file)
@@ -3,7 +3,7 @@
  * \r
  *   work.css\r
  * \r
- *   version 0.4.1\r
+ *   version 0.4.23\r
  *\r
  */\r
        html, body {\r
        \r
        /*  View Container\r
        --------------------------------------------------------------------------------------*/        \r
-               #editor {\r
-                       display:                        none;\r
-                       position:                       absolute;\r
-                       left:                           0;\r
-                       top:                            0;\r
-                       width:                          100%;\r
-                       height:                         100%;\r
-               }\r
                .console-page {\r
-                       display:                        none;\r
+\r
                }\r
        \r
+       \r
+\r
 /*--------------------------------------------------------------------------------------\r
  * \r
  *  overlay\r
                                                #comic-console-title-value { width: 180px; text-align:left;}\r
                                                #comic-console-height-value {}\r
                                                #comic-console-width-value {}\r
-                                               #comic-console-editable-value {}\r
-                                               #comic-console-visible-value {}\r
+                                               #comic-console-editable-value,\r
+                                               #comic-console-visible-value {\r
+                                                       width:                  180px;\r
+                                                       text-align:             center;\r
+                                               }\r
                                        \r
                                        #comic-console-button-container {\r
                                                margin-top:                     20px;\r
  *  \r
  -------------------------------------------------------------------------------------*/\r
                #editor {\r
+                       position:                       absolute;\r
+                       left:                           0;\r
+                       top:                            0;\r
+                       width:                          100%;\r
+                       height:                         100%;\r
                        overflow:                       hidden;\r
                        background-color:       #f5f5f5;\r
                }\r
        \r
                /*  Image Group\r
                --------------------------------------------------------------------------------------*/\r
-                       #image-gruop-wrapper {\r
+                       #image-group-wrapper {\r
                                position:                       absolute;\r
                                top:                            0;\r
                                left:                           0;\r
                        }\r
-                               #image-icon-container {\r
+                               #image-group-icon-container {\r
                                        position:                       absolute;\r
                                        top:                            0;\r
                                        left:                           0;\r
                                        border:                         #fff solid;\r
                                        border-width:           0;                              \r
                                }\r
-                               #image-gruop-button {\r
-                                       width:                  200px;\r
-                                       position:               absolute;\r
-                                       left:                   0;\r
-                                       bottom:                 -40px;\r
-                                       _bottom:                0;\r
+                               #image-group-name {\r
+                                       padding:                        20px 0 10px 20px;\r
+                                       border-bottom:          1px solid #eee;\r
+                                       color:                          #eee;\r
+                                       font-size:                      20px;\r
+                                       line-height:            20px;\r
+                                       font-weight:            bold;\r
+                                       text-shadow:            1px 1px 3px #ccc;\r
+                                       -moz-text-shadow:       1px 1px 3px #ccc;\r
+                                       -webkit-text-shadow:1px 1px 3px #ccc;\r
+                                       box-shadow:                     0 4px 9px #333;\r
+                                       -moz-box-shadow:        0 4px 9px #333;\r
+                                       -webkit-box-shadow:     0 4px 9px #333;\r
                                }\r
-                               .image-gruop-item {\r
-                                       width:                  150px;\r
-                                       height:                 200px;\r
-                                       position:               absolute;\r
-                                       top:                    0;\r
-                                       left:                   0;\r
-                                       text-align:             center;\r
+                               #image-group-button {\r
+                                       width:                          200px;\r
+                                       position:                       absolute;\r
+                                       left:                           0;\r
+                                       bottom:                         -40px;\r
+                                       _bottom:                        0;\r
                                }\r
-                               .image-gruop-item .reversible-image-container {\r
-                                       width:                  150px;\r
-                                       height:                 200px;\r
+                               .image-group-item {\r
+                                       width:                          150px;\r
+                                       height:                         200px;\r
+                                       position:                       absolute;\r
+                                       top:                            0;\r
+                                       left:                           0;\r
+                                       text-align:                     center;\r
                                }\r
-                               .image-gruop-item .reversible-image-container img {\r
-                                       width:                  100%;\r
-                                       height:                 100%;\r
+                               .image-group-item .reversible-image-container {\r
+                                       width:                          150px;\r
+                                       height:                         200px;\r
                                }\r
-                               .image-gruop-item-title {\r
-                                       position:               absolute;\r
-                                       bottom:                 0;\r
-                                       left:                   0;\r
-                                       text-align:             center;\r
-                                       width:                  100%;\r
-                                       height:                 30px;\r
+                               .image-group-item .reversible-image-container img {\r
+                                       width:                          100%;\r
+                                       height:                         100%;\r
+                               }\r
+                               .image-group-item-title {\r
+                                       position:                       absolute;\r
+                                       bottom:                         0;\r
+                                       left:                           0;\r
+                                       text-align:                     center;\r
+                                       width:                          100%;\r
+                                       height:                         30px;\r
                                }\r
        \r
 \r
                                color:                          #333;\r
                                text-decoration:        none;\r
                                display:                        block;\r
+                               zoom:                           1;\r
                                outline:                        0;\r
                                background-color:       #fff;\r
                        }\r
                                margin:                         0;\r
                                outline:                        0;\r
                        }\r
-       \r
+                       \r
+       /*  combobox\r
+       --------------------------------------------------------------------------------------*/        \r
+               .combobox {\r
+                       display:                        inline-block;\r
+                       color:                          #333;\r
+               }\r
+                       .combobox a,\r
+                       .combobox a:link,\r
+               .combobox a:visited,\r
+               .combobox a:hover,\r
+               .combobox a:active {\r
+                       border:                         1px solid #ccc;\r
+                               font-size:                      14px;\r
+                               line-height:            16px;                   \r
+                               padding:                        3px;\r
+                               color:                          #333;\r
+                               text-decoration:        none;\r
+                               display:                        block;\r
+                               zoom:                           1;\r
+                               outline:                        0;\r
+                               background-color:       #fff;\r
+                               position:                       relative;\r
+                       }\r
+                       .combobox a:hover {\r
+                               background-color:       #ccf;\r
+                       }\r
+                       .combobox a:active {\r
+                               outline:                        0;\r
+                       }\r
+                               .combobox-toggle {\r
+                                       position:                       absolute;\r
+                                       right:                          5px;\r
+                                       top:                            0;\r
+                                       display:                        block;\r
+                                       font-family:            Arial,Helvetica,sans-serif;\r
+                                       font-size:                      12px;\r
+                                       line-height:            20px;\r
+                                       color:                          #999;\r
+                               }\r
+                               .combobox  a.combobox-has-focus .combobox-toggle {\r
+                                       color:                          #4D90FE;\r
+                               }                               \r
+                               \r
+                               \r
+       .option-container {\r
+               position:                       absolute;\r
+               list-style:                     none;\r
+               top:                            30px;\r
+               width:                          200px;\r
+               margin:                         0;\r
+               padding:                        0;\r
+               background-color:       #fff;\r
+               opacity:                        0.9;\r
+               -moz-opacity:           0.9;\r
+               -khtml-opacity:         0.9;\r
+               color:                          #666;\r
+               border:                         1px solid #ccc;\r
+               box-shadow:                     1px 4px 9px #333;\r
+               -moz-box-shadow:        1px 4px 9px #333;\r
+               -webkit-box-shadow:     1px 4px 9px #333;\r
+               filter:                         alpha(opacity=90) progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9);\r
+               -ms-filter:                     alpha(opacity=90) progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9);\r
+       }\r
+               .option-container li {\r
+                       display:                block;\r
+                       cursor:                 pointer;\r
+                       height:                 30px;\r
+                       line-height:    30px;\r
+               }\r
+                       .option-container a,\r
+                       .option-container a:link,\r
+                       .option-container a:visited {\r
+                               color:                  #666;\r
+                               position:               relative;\r
+                               display:                block;\r
+                               padding:                0 10px;\r
+                               height:                 30px;\r
+                               line-height:    30px;\r
+                               *cursor:                pointer;\r
+                       }\r
+                       .current-option a,\r
+                       .current-option a:link,\r
+                       .current-option a:visited {\r
+                               color:                          #e6e6ef;\r
+                               background-color:       #66f;\r
+                               text-decoration:        none;\r
+                       }\r
+                       .option-container a:hover {\r
+                               color:                          #333;\r
+                               background-color:       #ccf;\r
+                               text-decoration:        none;\r
+                               *cursor:                        pointer;\r
+                       }\r
        \r
        /*  Information Window\r
        --------------------------------------------------------------------------------------*/\r
        /*  Finder Icon\r
        --------------------------------------------------------------------------------------*/\r
        .finder-icon {\r
-               position:                                       absolute;\r
-               top:                                            0;\r
-               left:                                           0;\r
+               position:                                       relative;\r
                height:                                         74px;\r
-               width:                                          100%;\r
                border-bottom:                          1px solid #ccc;\r
                clear:                                          both;\r
+               overflow:                                       hidden; /* for webkit */\r
+       }\r
+       .finder-icon:hover {\r
+               background-color:                       #eee;\r
+               cursor:                                         pointer;\r
        }\r
-               .finder-icon a,\r
-               .finder-icon a:link,\r
-               .finder-icon a:visited,\r
-               .finder-icon a:active {\r
-                       display:                                        block;\r
+               .fnder-icon-modern .finder-icon-handle,\r
+               .fnder-icon-modern .finder-icon-thumbnail,\r
+               .fnder-icon-modern .finder-icon-filename,\r
+               .fnder-icon-modern .finder-icon-summary {\r
+                       display:                                        table-cell;\r
+               vertical-align:                         middle;\r
+               line-height:                            1.3em;\r
+           }\r
+               \r
+               .finder-icon-handle {\r
+                       width:                                          20px;\r
+                       height:                                         74px;\r
+               }\r
+               \r
+               .finder-icon-thumbnail {\r
+                       width:                                          64px;\r
                        height:                                         74px;\r
-                       text-decoration:                        none;\r
-                       *background:                            #fff;\r
+                       cursor:                                         pointer;\r
+                       background-repeat:                      no-repeat;\r
+                       background-position:            50% 50%;\r
+                       background-image:                       url('../images/sprite.gif');\r
                }\r
-               .finder-icon a:hover {\r
-                       background-color:                       #eee;\r
+               \r
+               .finder-icon .file-type-folder {\r
+                       background-position:            0 -75px;\r
                }\r
-                       .finder-icon-handle,\r
-                       .finder-icon-thumbnail,\r
-                       .finder-icon-filename,\r
-                       .finder-icon-summary {\r
-                               display:                                        table-cell;\r
-                       vertical-align:                         middle;\r
-                       height:                                         74px;\r
-                       *height:                                        64px;\r
-                       line-height:                            1.3em;\r
-                       }\r
-                   /* IE 6 */\r
-                       .finder-icon-handle,\r
-                       .finder-icon-thumbnail,\r
-                       .finder-icon-filename,\r
-                       .finder-icon-summary {\r
-                       *display:                                       inline;\r
-                       zoom:                                           1;\r
-                   }\r
-                   /*\*//*/\r
-                   * html .finder-icon span {\r
-                       display: inline-block;\r
-                   }\r
-                   /**/\r
-                       \r
-                       .finder-icon-handle {\r
-                               width:                                          20px;\r
-                       }\r
-                       \r
-                       .finder-icon-thumbnail {\r
-                               width:                                          64px;\r
-                               cursor:                                         pointer;\r
-                               background-repeat:                      no-repeat;\r
-                       }\r
-                       .finder-icon-thumbnail {\r
-                               background-image:                       url('../images/sprite.gif');\r
+               .finder-icon .file-type-album {\r
+               }\r
+               .finder-icon .file-type-author {\r
+                       background-position:            -70px -75px;\r
+               }               \r
+               .finder-icon .file-type-comic {\r
+                       background-position:            0 -145px;\r
+               }\r
+               .finder-icon .file-type-cabinet {\r
+                       background-position:            -70px -145px;\r
+               }\r
+               .finder-icon .file-type-panel {\r
+                       background-position:            0 -215px;\r
+               }\r
+               .finder-icon .file-type-artist {\r
+                       background-position:            -70px -215px;\r
+               }\r
+               .finder-icon .file-type-balloon {\r
+                       background-position:            0 -285px;\r
+               }\r
+               .finder-icon .file-type-charactor {\r
+                       background-position:            -70px -285px;\r
+               }               \r
+               .has-thumbnail {\r
+               }\r
+               .fnder-icon-modern .finder-icon-filename {\r
+                       width:                                          200px;\r
+                       padding:                                        5px 10px;\r
+                       height:                                         64px;\r
+                       font-weight:                            bold;\r
+                       color:                                          #333;\r
+               }\r
+               .fnder-icon-modern .finder-icon-summary {\r
+                       width:                                          300px;\r
+                       padding:                                        5px 10px;\r
+                       height:                                         64px;\r
+                       color:                                          #666;\r
+               }\r
+\r
+       /*  Finder Icon ie7-\r
+       --------------------------------------------------------------------------------------*/\r
+       .finder-icon a,\r
+       .finder-icon a:link,\r
+       .finder-icon a:visited,\r
+       .finder-icon a:active {\r
+               display:                                block;\r
+               height:                                 74px;\r
+               text-decoration:                none;\r
+               zoom:                                   1;\r
+               cursor:                                 pointer;\r
+       }\r
+       .finder-icon a:hover {\r
+               _background-color:              #eee;\r
+               color:                                  #333;\r
+       }\r
+               .fnder-icon-ie7 .finder-icon-handle,\r
+               .fnder-icon-ie7 .finder-icon-thumbnail {\r
+               zoom:                                   1;\r
+               line-height:                    1.3em;\r
+           }\r
+               .finder-icon-cell {\r
+                       display:                                inline;\r
+                       zoom:                                   1;\r
+               }\r
+                       .finder-icon-vertical-middle-outer {\r
+                               display:                                block;\r
+                               height:                                 74px;\r
+                               position:                               relative;\r
                        }\r
-                       \r
-                       .finder-icon .file-type-folder {\r
-                               background-position:            0 -75px;\r
-                       }\r
-                       .finder-icon .file-type-album {\r
-                       }\r
-                       .finder-icon .file-type-author {\r
-                               background-position:            -70px -75px;\r
-                       }               \r
-                       .finder-icon .file-type-comic {\r
-                               background-position:            0 -145px;\r
-                       }\r
-                       .finder-icon .file-type-cabinet {\r
-                               background-position:            -70px -145px;\r
-                       }\r
-                       .finder-icon .file-type-panel {\r
-                               background-position:            0 -215px;\r
-                       }\r
-                       .finder-icon .file-type-artist {\r
-                               background-position:            -70px -215px;\r
-                       }\r
-                       .finder-icon .file-type-balloon {\r
-                               background-position:            0 -285px;\r
-                       }\r
-                       .finder-icon .file-type-charactor {\r
-                               background-position:            -70px -285px;\r
-                       }               \r
-                       .has-thumbnail {\r
-                       }\r
-                       /*\r
-                        * http://www.iconfinder.com/icondetails/18336/64/folder_image_photo_icon\r
-                        * http://www.iconfinder.com/icondetails/27849/48/folder_yellow_icon\r
-                        * http://www.iconfinder.com/icondetails/45347/64/cabinet_icon\r
-                        * http://www.iconfinder.com/icondetails/3659/64/broken_file_icon\r
-                        * http://www.iconfinder.com/icondetails/44733/64/address_book_icon
-                        */\r
-                       .finder-icon-filename {\r
+                       .finder-icon-ie-filename .finder-icon-vertical-middle-outer {\r
                                width:                                          200px;\r
-                               padding:                                        5px;\r
                                font-weight:                            bold;\r
                                color:                                          #333;\r
                        }\r
-                       a:hover .finder-icon-filename {\r
-                               color:                                          #000;\r
-                       }\r
-                       .finder-icon-summary {\r
+                       .finder-icon-ie-summary .finder-icon-vertical-middle-outer {\r
                                width:                                          300px;\r
-                               padding:                                        5px;\r
                                color:                                          #666;\r
                        }\r
+                               .finder-icon-vertical-middle-inner {\r
+                                       display:                                        block;\r
+                                       position:                                       absolute;\r
+                                       top:                                            50%;\r
+                                       margin:                                         0 5px;\r
+                               }\r
+                                       .fnder-icon-ie7 .finder-icon-filename,\r
+                                       .fnder-icon-ie7 .finder-icon-summary {\r
+                                                       position:               relative;\r
+                                                       top:                    -50%;\r
+                                       }\r
+                                       \r
+       /*  Finder Icon Console\r
+       --------------------------------------------------------------------------------------*/                \r
                .finder-icon-console {\r
                        position:                                       absolute;\r
                        top:                                            0;\r
                        right:                                          0;\r
                }\r
-                       .finder-icon-console div {\r
+                       .finder-icon-console a {\r
+                               display:                                        block;\r
                                width:                                          74px;\r
                                height:                                         74px;\r
                                border-left:                            1px solid #ccc;\r
                                float:                                          right;\r
-                               cursor:                                         pointer;\r
-                               background-position:            50% 50%;\r
+                               background-image:                       url('../images/sprite.gif') !important;\r
                                background-repeat:                      no-repeat;\r
                        }\r
+                       .finder-icon-console a:hover {\r
+                               background-color:                       #ccc !important;\r
+                       }\r
                        .finder-icon-console-action {\r
-\r
+                               background-position:            0px -355px;\r
                        }\r
                        .finder-icon-console-editor-apps {\r
-\r
+                               background-position:            -70px -355px;\r
                        }\r
                        .finder-icon-console-viewer-apps {\r
+                               background-position:            0px -425px;\r
+                       }\r
+\r
+\r
 \r
-                       }
\ No newline at end of file
+                                       
\ No newline at end of file
index cf46f2f..24b5c9c 100644 (file)
             <div id="inner-wrapper" class="base-content-width">\r
                                <!-- InstanceBeginEditable name="main_content" -->\r
                                <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; ActiveX</div>\r
                                        <h2>ActiveX が有効か? を js から調べる</h2>\r
                                        <p>このページは ie8 以下用の テストページです.</p>\r
                                        <p>\r
-                                               ActiveX が有効か? 調べるために以下のような script を使用していましたが、<strong>ie の設定によっては警告が出てしまうためよろしくないみたいです.</strong>(ie7 で遭遇)\r
+                                               ActiveX が有効か? 調べるために以下のような script を使用していましたが、<code>new ActiveXObject</code> の辺りで <strong>ie の設定によっては警告が出てしまうためよろしくないみたいです.</strong>(ie7 で遭遇)\r
                                        </p>\r
                                        <p>ActiveX が使えなくても他の手段でユーザーのサポートは行える(はずな)ので、警告を表示しない方法で ActiveX が有効か? 取得したいところです.</p>\r
                                        <pre><code>\r
index 83d28f9..c25ca57 100644 (file)
        <title>Comic 用 html構造テスト | pettanR</title>\r
        <!-- InstanceEndEditable -->\r
        <!-- InstanceBeginEditable name="head" -->\r
+       <style type="text/css">\r
+/*  PettanR Comic\r
+--------------------------------------------------------------------------------------*/\r
+.test1-pettanr-comic-wrapper {\r
+       margin:                                 1em auto;\r
+}\r
+       .test1-pettanr-comic-panel {\r
+               border-style:                   solid;\r
+               border-color:                   #111;\r
+               position:                               relative;\r
+               margin:                                 1em 0;\r
+               overflow:                               hidden;\r
+       }\r
+               .test1-pettanr-comic-panel img,\r
+               .test1-pettanr-comic-balloon {\r
+                       position:                               absolute;\r
+               }\r
+               .test1-pettanr-comic-balloon img {\r
+                       width:                                  100%;\r
+                       height:                                 100%;\r
+               }       \r
+               .test1-pettanr-comic-balloon .test1-pettanr-comic-speach {\r
+                       position:                               absolute;\r
+                       table-layout:                   fixed;\r
+                       top:                                    0;\r
+                       left:                                   16.6%;\r
+                       width:                                  66.6%;\r
+                       height:                                 100%;\r
+                       border:                                 0;\r
+                       padding:                                0;\r
+                       margin:                                 0 !important;\r
+               }\r
+                       .test1-pettanr-comic-speach tbody,\r
+                       .test1-pettanr-comic-speach tr,\r
+                       .test1-pettanr-comic-speach td {\r
+                               width:                          100%;\r
+                               height:                         100%;\r
+                               border:                         0;\r
+                               padding:                        0;\r
+                               margin:                         0 !important;\r
+                               vertical-align:         middle;\r
+                               text-align:                     center;\r
+                       }\r
+                       \r
+                       \r
+/*  PettanR Comic\r
+--------------------------------------------------------------------------------------*/\r
+.test2-pettanr-comic-wrapper {\r
+       margin:                                 1em auto;\r
+}\r
+       .test2-pettanr-comic-panel {\r
+               border-style:                   solid;\r
+               border-color:                   #111;\r
+               position:                               relative;\r
+               margin:                                 1em 0;\r
+               overflow:                               hidden;\r
+       }\r
+               .test2-pettanr-comic-panel img {\r
+                       position:                               absolute;\r
+               }\r
+               .test2-pettanr-comic-balloon {\r
+                       position:                               absolute;\r
+               }\r
+                       .test2-pettanr-comic-balloon img {\r
+                               position:                               absolute;\r
+                               width:                                  100%;\r
+                               height:                                 100%;\r
+                       }\r
+                       .test2-pettanr-comic-balloon div {\r
+                               position:                               relative;\r
+                               display:                                table;\r
+                               padding:                                0 16.6%;\r
+                               width:                                  66.6%;\r
+                               height:                                 100%;\r
+                       }       \r
+                               .test2-pettanr-comic-balloon div p {\r
+                                       display:                                table-cell;\r
+                                       vertical-align:                 middle;\r
+                                       text-align:                             center;\r
+                                       margin:                                 0 !important;\r
+                                       padding:                                0 !important;\r
+                                       *position:                              absolute;\r
+                                       *top:                                   50%;\r
+                               }\r
+                                       .test2-pettanr-comic-balloon div p span {\r
+                                               *display:                               block;\r
+                                               zoom:                                   1;\r
+                                               *position:                              relative;\r
+                                               *top:                                   -50%;\r
+                                       }               \r
+/*  PettanR Comic\r
+--------------------------------------------------------------------------------------*/\r
+.test3-pettanr-comic-wrapper {\r
+       margin:                                 1em auto;\r
+}\r
+       .test3-pettanr-comic-panel {\r
+               border-style:                   solid;\r
+               border-color:                   #111;\r
+               position:                               relative;\r
+               margin:                                 1em 0;\r
+               overflow:                               hidden;\r
+       }\r
+               .test3-pettanr-comic-panel img {\r
+                       position:                               absolute;\r
+\r
+               }\r
+               .test3-pettanr-comic-balloon {\r
+                       position:                               absolute;\r
+               }\r
+                       .test3-pettanr-comic-balloon img {\r
+                               position:                               absolute;\r
+                               width:                                  100%;\r
+                               height:                                 100%;                           \r
+                       }\r
+                       .test3-pettanr-comic-balloon p {\r
+                               margin:                                 0 !important;\r
+                               padding:                                0 !important;                           \r
+                               display:                                table;\r
+                               position:                               absolute;\r
+                               top:                                    0;\r
+                               left:                                   16.6%;\r
+                               width:                                  66.6%;\r
+                               height:                                 100%;\r
+                               *height:                                auto;\r
+                               *top:                                   50% !important;                         \r
+                       }       \r
+                               .test3-pettanr-comic-balloon p span {\r
+                                       display:                                table-cell;\r
+                                       vertical-align:                 middle;\r
+                                       text-align:                             center;\r
+                                       *display:                               block;\r
+                                       zoom:                                   1;\r
+                                       *position:                              relative;\r
+                                       *top:                                   -50%;                                   \r
+                               }       \r
+       </style>\r
        <!-- InstanceEndEditable -->\r
 </head>\r
 \r
             <div id="inner-wrapper" class="base-content-width">\r
                                <!-- InstanceBeginEditable name="main_content" -->\r
                                <div id="main">\r
-                                       <h2>コミック用 html 構造のテスト</h2>\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; コミック用 html 構造のテスト</div>\r
+                                       <h2>マンガ状コンテンツを表示するための html + css の調査</h2>\r
                                        <p>html 4.01 + css 2.1 で pettanR コミックを表示するための html 構造のテストページです.</p>\r
-                                       <p>html は js で動的に描画されるため、js の関連部分のテストも兼ねます.</p>\r
-                                       <p>js による 動的な html の書き出しは、ブログ等への外部サイト表示 script と ログイン後のユーザーのコミック・パネル閲覧に使われます.</p>\r
-                                       \r
-                                       <h3>動的書き出しテスト</h3>\r
-                                       <p>以下のテキストエリアに パネルの json データを入力することで、動的書き出しのテストを行えます.</p>\r
-                                       <form name="htmlTest" class="block-element-item">\r
-                                               <textarea name="jsonString" style="width:100%" rows="20" cols="100">\r
-{\r
-       "border":                       1,\r
-       "comic_id":                     5,\r
-       "resource_picture_id":          1,\r
-       "x":                            0,\r
-       "y":                            0,\r
-       "z":                            0,\r
-       "t":                            0,\r
-       "width":                        400,\r
-       "height":                       235,\r
-       "panel_elements":               [\r
-               {\r
-                       "resource_picture":     {"id":1,"ext":'png'},\r
-                       "x":                    178,\r
-                       "y":                    -2,\r
-                       "z":                    0,\r
-                       "width":                166,\r
-                       "height":               252\r
-               },\r
-               {\r
-                       "balloon_template_id":  1,\r
-                       "system_picture_id":    1,\r
-                       "size":                 1,\r
-                       "tail":                 -14,\r
-                       "x":                    -29,\r
-                       "y":                    39,\r
-                       "z":                    1,\r
-                       "width":                200,\r
-                       "height":               160,\r
-                       "speaches_attributes":  {\r
-                               "newf1":        {\r
-                                       "content":      "Hello",\r
-                                       "x":            -29,\r
-                                       "y":            39,\r
-                                       "width":        200,\r
-                                       "height":       160\r
-                               }\r
-                       }\r
-               }\r
-       ]\r
-}\r
-                                               </textarea>\r
-                                               <input type="button" value="print" name="bindButton" class="button">\r
-                                       </form>\r
-                                       <p id="invalidJsonAlert" style="color:red;display:none;font-weight:bold;">json is invalid !</p>\r
-                                       <div id="outputHere"></div>\r
+                                       <p>ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどれか?このページを表示させつつ判断します.</p>\r
+                                       <p>このページでは js を使用していないため ベクター画像の置き換えは行われず、反転画像はサーバのものが読み込まれます.</p>\r
                                        \r
+                                       <h2>&lt;table&gt;  を使ったテキストの上下中央配置</h2>\r
+                                       <p>&lt;table&gt; タグを使ったレイアウトは多くのブラウザで意図した表示が期待できるが、html 文書としてはよろしくない.</p>\r
+                                       <div class="test1-pettanr-comic-wrapper" style="width: 400px;">\r
+                                               <div class="test1-pettanr-comic-panel" style="border-width: 2px; height: 235px;">\r
+                                                       <img src="../resource_pictures/1.png" width="166" height="252" style="left: 178px; top: -2px; z-index: 0;">\r
+                                                       <div class="test1-pettanr-comic-balloon" style="width: 200px; height: 160px; left: -29px; top: 39px; z-index: 1;">\r
+                                                               <img src="../system_pictures/_w5.gif">\r
+                                                               <table class="test1-pettanr-comic-speach"><tr><td>ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどの範囲か?</td></tr></table>\r
+                                                       </div>\r
+                                                       <div class="test1-pettanr-comic-balloon" style="width: 100px; height: 80px; left: 300px; top: 80px; z-index: 2;">\r
+                                                               <img src="../system_pictures/_w19.gif">\r
+                                                               <table class="test1-pettanr-comic-speach"><tr><td>さて?</td></tr></table>\r
+                                                       </div>\r
+                                               </div>\r
+                                       </div>\r
+                                       <h3>対応ブラウザ</h3>\r
+                                       <p>NN9, firefox 3.6, ie5.5, ie6, ie7, Iron5, Opera10, opera8</p>\r
                                        <h3>source</h3>\r
-                                       <p>pettanr.bind は pettanR コミック用の html エレメントを制作するときに使用する.外部サイト張り出し用  script や ユーザーコンソールの コミックビューワーから使われる.</p>\r
-                                       <p>pettanr.bind.createBindWorker で BindWorker インスタンスを作って使用する.bind の意味は 製本 .jQuery.bind とは関係ないので注意.</p>\r
+                                       <h4>html 部分</h4>\r
+                                       <p>パネルピクチャはひとつの &lt;img&gt; タグで表示されます.</p>\r
+                                       <p>バルーンは、位置とサイズを決めるための &lt;div&gt; の中に吹きだし画像のための &lt;img&gt; と テキストを上下中央配置するための &lt;table&gt; からなる.</p>\r
                                        <pre><code>\r
-var jsonArea = document.htmlTest.jsonString,\r
-       button = document.htmlTest.bindButton,\r
-       bindWorker = pettanr.bind.createBindWorker( document.getElementById( 'outputHere')),\r
-       elmAlertStyle = document.getElementById( 'invalidJsonAlert').style,\r
-       json = null;\r
-button.onclick = function(){\r
-       try {\r
-               eval( 'json = ' + jsonArea.value);\r
-               elmAlertStyle.display = 'none';\r
-       } catch(e){\r
-               elmAlertStyle.display = 'block';\r
+&lt;div class=&quot;test1-pettanr-comic-wrapper&quot; style=&quot;width: 400px;&quot;&gt;\r
+       &lt;div class=&quot;test1-pettanr-comic-panel&quot; style=&quot;border-width: 2px; height: 235px;&quot;&gt;\r
+               &lt;img src=&quot;../resource_pictures/1.png&quot; width=&quot;166&quot; height=&quot;252&quot; style=&quot;left: 178px; top: -2px; z-index: 0;&quot;&gt;\r
+               &lt;div class=&quot;test1-pettanr-comic-balloon&quot; style=&quot;width: 200px; height: 160px; left: -29px; top: 39px; z-index: 1;&quot;&gt;\r
+                       &lt;img src=&quot;../system_pictures/_w5.gif&quot;&gt;\r
+                       &lt;table class=&quot;test1-pettanr-comic-speach&quot;&gt;&lt;tr&gt;&lt;td&gt;ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどの範囲か?&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;\r
+               &lt;/div&gt;\r
+               &lt;div class=&quot;test1-pettanr-comic-balloon&quot; style=&quot;width: 100px; height: 80px; left: 300px; top: 80px; z-index: 2;&quot;&gt;\r
+                       &lt;img src=&quot;../system_pictures/_w19.gif&quot;&gt;\r
+                       &lt;table class=&quot;test1-pettanr-comic-speach&quot;&gt;&lt;tr&gt;&lt;td&gt;さて?&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;\r
+               &lt;/div&gt;\r
+       &lt;/div&gt;\r
+&lt;/div&gt;\r
+                                       </code></pre>\r
+                                       <h4>css 部分</h4>\r
+                                       <pre><code>\r
+.test1-pettanr-comic-wrapper {\r
+       margin:                                 1em auto;\r
+}\r
+       .test1-pettanr-comic-panel {\r
+               border-style:                   solid;\r
+               border-color:                   #111;\r
+               position:                               relative;\r
+               margin:                                 1em 0;\r
+               overflow:                               hidden;\r
        }\r
-       json !== null && bindWorker.json( json);\r
-       json = null;\r
+               .test1-pettanr-comic-panel img,\r
+               .test1-pettanr-comic-balloon {\r
+                       position:                               absolute;\r
+               }               \r
+               .test1-pettanr-comic-balloon .test1-pettanr-comic-speach {\r
+                       position:                               absolute;\r
+                       table-layout:                   fixed;\r
+                       top:                                    16.6%;\r
+                       left:                                   16.6%;\r
+                       width:                                  66.6%;\r
+                       height:                                 66.6%;\r
+                       border:                                 0;\r
+                       padding:                                0;\r
+                       margin:                                 0 !important;\r
+               }\r
+                       .test1-pettanr-comic-speach tbody,\r
+                       .test1-pettanr-comic-speach tr,\r
+                       .test1-pettanr-comic-speach td {\r
+                               width:                          100%;\r
+                               height:                         100%;\r
+                               border:                         0;\r
+                               padding:                        0;\r
+                               margin:                         0 !important;\r
+                               vertical-align:         middle;\r
+                       }\r
+                                       </code></pre>\r
+\r
+\r
+                                       <h2>css:table-cell を使ったテキストの上下中央配置 及びクロスブラウザ対応 タグの少ないバージョン</h2>\r
+                                       <p>html タグ構造は 先の &lt;table&gt; レイアウトに比べて自然.しかし <code>display:table-cell</code> などを使うため、より広範なブラウザに対応する、という点で不安が残る.</p>\r
+                                       <div class="test3-pettanr-comic-wrapper" style="width: 400px;">\r
+                                               <div class="test3-pettanr-comic-panel" style="border-width: 2px; height: 235px;">\r
+                                                       <img src="../resource_pictures/1.png" width="166" height="252" style="left: 178px; top: -2px; z-index: 0;">\r
+                                                       <div class="test3-pettanr-comic-balloon" style="width: 200px; height: 160px; left: -29px; top: 39px; z-index: 1;">\r
+                                                               <img src="../system_pictures/_w5.gif">\r
+                                                               <p><span>ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどの範囲か?</span></p>\r
+                                                       </div>\r
+                                                       <div class="test3-pettanr-comic-balloon" style="width: 100px; height: 80px; left: 300px; top: 80px; z-index: 2;">\r
+                                                               <img src="../system_pictures/_w19.gif">\r
+                                                               <p><span>さて?</span></p>\r
+                                                       </div>\r
+                                               </div>\r
+                                       </div>                                  \r
+                                       <h3>対応ブラウザ</h3>\r
+                                       <p>NN9, firefox 3.6, ie5.5, ie6, ie7, Iron5, Opera10, opera8</p>\r
+                                       <h3>source</h3>\r
+                                       <h4>html 部分</h4>\r
+                                       <p>パネルピクチャはひとつの &lt;img&gt; タグで表示されます.</p>\r
+                                       <p>バルーンは、位置とサイズを決めるための &lt;div&gt; の中に吹きだし画像のための &lt;img&gt; と テキストを上下中央配置するための &lt;p&gt; と &lt;span&gt; からなる.</p>\r
+                                       <pre><code>\r
+&lt;div class=&quot;test3-pettanr-comic-wrapper&quot; style=&quot;width: 400px;&quot;&gt;\r
+       &lt;div class=&quot;test3-pettanr-comic-panel&quot; style=&quot;border-width: 2px; height: 235px;&quot;&gt;\r
+               &lt;img src=&quot;../resource_pictures/1.png&quot; width=&quot;166&quot; height=&quot;252&quot; style=&quot;left: 178px; top: -2px; z-index: 0;&quot;&gt;\r
+               &lt;div class=&quot;test3-pettanr-comic-balloon&quot; style=&quot;width: 200px; height: 160px; left: -29px; top: 39px; z-index: 1;&quot;&gt;\r
+                       &lt;img src=&quot;../system_pictures/_w5.gif&quot;&gt;\r
+                       &lt;p&gt;&lt;span&gt;ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどの範囲か?&lt;/span&gt;&lt;/p&gt;\r
+               &lt;/div&gt;\r
+               &lt;div class=&quot;test3-pettanr-comic-balloon&quot; style=&quot;width: 100px; height: 80px; left: 300px; top: 80px; z-index: 2;&quot;&gt;\r
+                       &lt;img src=&quot;../system_pictures/_w19.gif&quot;&gt;\r
+                       &lt;p&gt;&lt;span&gt;さて?&lt;/span&gt;&lt;/p&gt;\r
+               &lt;/div&gt;\r
+       &lt;/div&gt;\r
+&lt;/div&gt;\r
+                                       </code></pre>\r
+                                       <h4>css 部分</h4>\r
+                                       <pre><code>\r
+.test3-pettanr-comic-wrapper {\r
+       margin:                                 1em auto;\r
 }\r
+       .test3-pettanr-comic-panel {\r
+               border-style:                   solid;\r
+               border-color:                   #111;\r
+               position:                               relative;\r
+               margin:                                 1em 0;\r
+               overflow:                               hidden;\r
+       }\r
+               .test3-pettanr-comic-panel img {\r
+                       position:                               absolute;\r
+\r
+               }\r
+               .test3-pettanr-comic-balloon {\r
+                       position:                               absolute;\r
+               }\r
+                       .test3-pettanr-comic-balloon img {\r
+                               position:                               absolute;\r
+                               width:                                  100%;\r
+                               height:                                 100%;                           \r
+                       }\r
+                       .test3-pettanr-comic-balloon p {\r
+                               margin:                                 0 !important;\r
+                               padding:                                0 !important;                           \r
+                               display:                                table;\r
+                               position:                               absolute;\r
+                               top:                                    0;\r
+                               left:                                   16.6%;\r
+                               width:                                  66.6%;\r
+                               height:                                 100%;\r
+                               *height:                                auto;\r
+                               *top:                                   50% !important;                         \r
+                       }       \r
+                               .test3-pettanr-comic-balloon p span {\r
+                                       display:                                table-cell;\r
+                                       vertical-align:                 middle;\r
+                                       text-align:                             center;\r
+                                       *display:                               block;\r
+                                       zoom:                                   1;\r
+                                       *position:                              relative;\r
+                                       *top:                                   -50%;                                   \r
+                               }       \r
                                        </code></pre>\r
-                                       <h3>js による動的な書き出しの利点</h3>\r
-                                       <p>js による動的な書き出しには以下にあげる利点がある.最後のもの以外はサーバへの画像リクエストを抑えるものになります.</p>\r
-                                       <ul>\r
-                                               <li>吹き出しをベジェ曲線で書き出すことで美しい描画ができ、吹き出し画像へのリクエストを抑止できる</li>\r
-                                               <li>反転画像をブラウザ側で用意することで、flipH, flipV, flipVH といった反転画像へのリクエストを抑止できる.</li>\r
-                                               <li>ブラウザの表示エリアに入らない画像について、表示エリアに入るまでリクエストを行わないようにできる</li>\r
-                                               <li>コマのズーム機能が利用できる.ただしリサイズを禁止された画像を含むコマに対してはできない.</li>\r
-                                       </ul>\r
+                                       \r
+                                       \r
+                                       <h2>css:table-cell を使ったテキストの上下中央配置 及びクロスブラウザ対応</h2>\r
+                                       <p>table-cell 及び クロスブラウザ対応</p>\r
+                                       <div class="test2-pettanr-comic-wrapper" style="width: 400px;">\r
+                                               <div class="test2-pettanr-comic-panel" style="border-width: 2px; height: 235px;">\r
+                                                       <img src="../resource_pictures/1.png" width="166" height="252" style="left: 178px; top: -2px; z-index: 0;">\r
+                                                       <div class="test2-pettanr-comic-balloon" style="width: 200px; height: 160px; left: -29px; top: 39px; z-index: 1;">\r
+                                                               <img src="../system_pictures/_w5.gif">\r
+                                                               <div><p><span>ぺったんR 仕様の html によるコミック状表示が可能なブラウザはどの範囲か?</span></p></div>\r
+                                                       </div>\r
+                                                       <div class="test2-pettanr-comic-balloon" style="width: 100px; height: 80px; left: 300px; top: 80px; z-index: 2;">\r
+                                                               <img src="../system_pictures/_w19.gif">\r
+                                                               <div><p><span>さて?</span></p></div>\r
+                                                       </div>\r
+                                               </div>\r
+                                       </div>\r
+                                       <h3>対応ブラウザ</h3>\r
+                                       <p>NN9, firefox 3.6, ie6</p>\r
+                                       \r
                                </div>\r
                                <!-- InstanceEndEditable -->\r
             </div>\r
@@ -183,23 +419,6 @@ button.onclick = function(){
        </div>\r
        <script type="text/javascript" src="../javascripts/common.js"></script>\r
 <!-- InstanceBeginEditable name="script" -->\r
-       <script type="text/javascript">\r
-               var jsonArea = document.htmlTest.jsonString,\r
-                       button = document.htmlTest.bindButton,\r
-                       bindWorker = pettanr.bind.createBindWorker( document.getElementById( 'outputHere')),\r
-                       elmAlertStyle = document.getElementById( 'invalidJsonAlert').style,\r
-                       json = null;\r
-               button.onclick = function(){\r
-                       try {\r
-                               eval( 'json = ' + jsonArea.value);\r
-                               elmAlertStyle.display = 'none';\r
-                       } catch(e){\r
-                               elmAlertStyle.display = 'block';\r
-                       }\r
-                       json !== null && bindWorker.json( json);\r
-                       json = null;\r
-               }\r
-       </script>\r
 <!-- InstanceEndEditable -->\r
 </body>\r
 <!-- InstanceEnd --></html>\r
diff --git a/0.4.x/test/dynamic-comic-html.html b/0.4.x/test/dynamic-comic-html.html
new file mode 100644 (file)
index 0000000..e53df8f
--- /dev/null
@@ -0,0 +1,206 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r
+<html xmlns:v="urn:schemas-microsoft-com:vml"><!-- InstanceBegin template="/Templates/base.dwt" codeOutsideHTMLIsLocked="false" -->\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+       <meta http-equiv="Content-Language" content="ja">\r
+       <meta http-equiv="Content-Script-Type" content="text/javascript">\r
+       <meta http-equiv="Content-Style-Type" content="text/css">\r
+       <meta http-equiv="imagetoolbar" content="no">\r
+       <link rel="stylesheet" type="text/css" href="../stylesheets/common.css">\r
+       <!-- InstanceBeginEditable name="doctitle" -->\r
+       <title>Comic 用 html構造テスト | pettanR</title>\r
+       <!-- InstanceEndEditable -->\r
+       <!-- InstanceBeginEditable name="head" -->\r
+       <!-- InstanceEndEditable -->\r
+</head>\r
+\r
+<body>\r
+    <div id="general-content">\r
+        <div id="outer-wrapper">\r
+            \r
+            <div id="header">\r
+                <div class="base-content-width" style="position:relative;">\r
+                    <h1><a href="../index.html">pettanR</a></h1>\r
+                <!-- global navi -->\r
+                    <div id="global-navi">\r
+                        <noscript id="noscript-alert">You need to have JavaScript enabled.</noscript>\r
+                    </div>\r
+                </div>\r
+            </div>\r
+            \r
+            <div id="inner-wrapper" class="base-content-width">\r
+                               <!-- InstanceBeginEditable name="main_content" -->\r
+                               <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; コミック用 html 構造のテスト</div>\r
+                                       <h2>コミック用 html 構造のテスト</h2>\r
+                                       <p>html 4.01 + css 2.1 で pettanR コミックを表示するための html 構造のテストページです.</p>\r
+                                       <p>html は js で動的に描画されるため、js の関連部分のテストも兼ねます.</p>\r
+                                       <p>js による 動的な html の書き出しは、ブログ等への外部サイト表示 script と ログイン後のユーザーのコミック・パネル閲覧に使われます.</p>\r
+                                       \r
+                                       <h3>動的書き出しテスト</h3>\r
+                                       <p>以下のテキストエリアに パネルの json データを入力することで、動的書き出しのテストを行えます.</p>\r
+                                       <form name="htmlTest" class="block-element-item">\r
+                                               <textarea name="jsonString" style="width:100%" rows="20" cols="100">\r
+{\r
+       "border":                       1,\r
+       "comic_id":                     5,\r
+       "resource_picture_id":          1,\r
+       "x":                            0,\r
+       "y":                            0,\r
+       "z":                            0,\r
+       "t":                            0,\r
+       "width":                        400,\r
+       "height":                       235,\r
+       "panel_elements":               [\r
+               {\r
+                       "resource_picture":     {"id":1,"ext":'png'},\r
+                       "x":                    178,\r
+                       "y":                    -2,\r
+                       "z":                    0,\r
+                       "width":                166,\r
+                       "height":               252\r
+               },\r
+               {\r
+                       "balloon_template_id":  1,\r
+                       "system_picture_id":    1,\r
+                       "size":                 1,\r
+                       "tail":                 -14,\r
+                       "x":                    -29,\r
+                       "y":                    39,\r
+                       "z":                    1,\r
+                       "width":                200,\r
+                       "height":               160,\r
+                       "speaches_attributes":  {\r
+                               "newf1":        {\r
+                                       "content":      "Hello",\r
+                                       "x":            -29,\r
+                                       "y":            39,\r
+                                       "width":        200,\r
+                                       "height":       160\r
+                               }\r
+                       }\r
+               }\r
+       ]\r
+}\r
+                                               </textarea>\r
+                                               <input type="button" value="print" name="bindButton" class="button">\r
+                                       </form>\r
+                                       <p id="invalidJsonAlert" style="color:red;display:none;font-weight:bold;">json is invalid !</p>\r
+                                       <div id="outputHere"></div>\r
+                                       \r
+                                       <h3>source</h3>\r
+                                       <p>pettanr.bind は pettanR コミック用の html エレメントを制作するときに使用する.外部サイト張り出し用  script や ユーザーコンソールの コミックビューワーから使われる.</p>\r
+                                       <p>pettanr.bind.createBindWorker で BindWorker インスタンスを作って使用する.bind の意味は 製本 .jQuery.bind とは関係ないので注意.</p>\r
+                                       <pre><code>\r
+var jsonArea = document.htmlTest.jsonString,\r
+       button = document.htmlTest.bindButton,\r
+       bindWorker = pettanr.bind.createBindWorker( document.getElementById( 'outputHere')),\r
+       elmAlertStyle = document.getElementById( 'invalidJsonAlert').style,\r
+       json = null;\r
+button.onclick = function(){\r
+       try {\r
+               eval( 'json = ' + jsonArea.value);\r
+               elmAlertStyle.display = 'none';\r
+       } catch(e){\r
+               elmAlertStyle.display = 'block';\r
+       }\r
+       json !== null && bindWorker.json( json);\r
+       json = null;\r
+}\r
+                                       </code></pre>\r
+                                       <h3>js による動的な書き出しの利点</h3>\r
+                                       <p>js による動的な書き出しには以下にあげる利点がある.最後のもの以外はサーバへの画像リクエストを抑えるものになります.</p>\r
+                                       <ul>\r
+                                               <li>吹き出しをベジェ曲線で書き出すことで美しい描画ができ、吹き出し画像へのリクエストを抑止できる</li>\r
+                                               <li>反転画像をブラウザ側で用意することで、flipH, flipV, flipVH といった反転画像へのリクエストを抑止できる.</li>\r
+                                               <li>ブラウザの表示エリアに入らない画像について、表示エリアに入るまでリクエストを行わないようにできる</li>\r
+                                               <li>コマのズーム機能が利用できる.ただしリサイズを禁止された画像を含むコマに対してはできない.</li>\r
+                                       </ul>\r
+                               </div>\r
+                               <!-- InstanceEndEditable -->\r
+            </div>\r
+        </div>\r
+    </div>\r
+    \r
+    <div id="footer-content"><!-- #BeginLibraryItem "/Library/footer.lbi" -->\r
+\r
+        <div id="footer">\r
+            <div id="footer-item-container" class="base-content-width clearfix">\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>ぺったんR にようこそ</h2>\r
+                        <ul>\r
+                            <li>サンプル</li>\r
+                            <li>ぺったんRの特徴</li>\r
+                            <li>沿革</li>\r
+                        </ul>\r
+                        <h2>Test</h2>\r
+                        <ul>\r
+                            <li><a href="index.html">Test Index</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>ドキュメント</h2>\r
+                        <ul>\r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForAuthors" rel="me" target="_blank">作家向けドキュメント</a></li>\r
+                            <li>絵師向けドキュメント</li>                                                    \r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForDevelopers" rel="me" target="_blank">開発者向けドキュメント</a></li>\r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForWebmasters" rel="me" target="_blank">編集長向けドキュメント</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>プロトタイプ</h2>\r
+                        <ul>\r
+                            <li><a href="http://pettanr.heroku.com/" rel="me" target="_blank">pettanr.heroku.com</a></li>\r
+                            <li><a href="../work.html" rel="console">ユーザーコンソール</a></li>\r
+                        </ul>\r
+                        <h2>Ajax contents</h2>\r
+                        <ul>\r
+                            <li><a href="../help/jp.xml">help | jp</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper" style="width:170px;">\r
+                    <div class="footer-item" style="padding-right:0;">\r
+                        <h2>ぺったんRチーム</h2>\r
+                        <ul>\r
+                            <li>わたしたちについて</li>\r
+                            <li>ミッション</li>\r
+                            <li><a href="../diary/itozyun.xml">itozyun's diary</a></li>\r
+                            <li>個人情報保護方針</li>\r
+                            <li>作品の取り扱い</li>\r
+                            <li>お問い合わせ</li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+            </div>\r
+            <div id="copyright">Copyright (c) 2011-2012 pettanR team, some rights reserved.</div>\r
+        </div><!-- #EndLibraryItem -->\r
+       </div>\r
+       <script type="text/javascript" src="../javascripts/common.js"></script>\r
+<!-- InstanceBeginEditable name="script" -->\r
+       <script type="text/javascript">\r
+               var jsonArea = document.htmlTest.jsonString,\r
+                       button = document.htmlTest.bindButton,\r
+                       bindWorker = pettanr.bind.createBindWorker( document.getElementById( 'outputHere')),\r
+                       elmAlertStyle = document.getElementById( 'invalidJsonAlert').style,\r
+                       json = null;\r
+               button.onclick = function(){\r
+                       try {\r
+                               eval( 'json = ' + jsonArea.value);\r
+                               elmAlertStyle.display = 'none';\r
+                       } catch(e){\r
+                               elmAlertStyle.display = 'block';\r
+                       }\r
+                       json !== null && bindWorker.json( json);\r
+                       json = null;\r
+               }\r
+       </script>\r
+<!-- InstanceEndEditable -->\r
+</body>\r
+<!-- InstanceEnd --></html>\r
index cd6c03a..1d5f7bd 100644 (file)
@@ -1 +1 @@
-<?xml version="1.0"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><image x="0" y="0" width="200" height="200" xlink:href="http://static.sourceforge.jp/thumb/g/2/930/640x640_0.png" transform="scale(-1,1) translate(-200,0)" /></svg>
\ No newline at end of file
+<?xml version="1.0"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><image x="0" y="0" width="200" height="200" xlink:href="1.gif" transform="scale(-1,1) translate(-200,0)" /></svg>
\ No newline at end of file
index 0b119e3..bf983ad 100644 (file)
             <div id="inner-wrapper" class="base-content-width">\r
                                <!-- InstanceBeginEditable name="main_content" -->\r
                                <div id="main">\r
-                                       <h2>Tests</h2>\r
+                                       <h2>テストインデックス</h2>\r
+                                       <h3>html テスト</h3>\r
                                        <dl class="dl-table clearfix">\r
                                                <dt><a href="comic-html-structure.html">html structure</a></dt>\r
+                                               <dd>ぺったんRコミックの html 構造のテスト.</dd>\r
+                                               <dt><a href="dynamic-comic-html.html">dynamic html</a></dt>\r
                                                <dd>ぺったんRコミックの html 構造のテスト.js による動的書き出しテスト.</dd>\r
+                                               <dt><a href="vertical-center.html">vertical center</a></dt>\r
+                                               <dd>上下中央配置テスト</dd>\r
+                                               <dt><a href="pettanr.xml">xml &amp; xslt -&gt; html</a></dt>\r
+                                               <dd>pettanR コミックを xml で定義.xslt で html 化する.</dd>                                             \r
+                                       </dl>\r
+                                       <h3>反転画像テスト</h3>\r
+                                       <dl class="dl-table clearfix">\r
                                                <dt><a href="transform.html">css3 transform</a></dt>\r
                                                <dd>css3 による画像反転( ie8 以下用の filter のテストも)</dd>\r
                                                <dt><a href="svg.html">svg test</a></dt>\r
                                                <dd>svg による画像反転のテスト</dd>\r
+                                       </dl>\r
+                                       <h3>javascript テスト</h3>\r
+                                       <dl class="dl-table clearfix">\r
                                                <dt><a href="activex.html">detect activex</a></dt>\r
                                                <dd>ActiveX が有効か?を js で調べる.</dd>\r
-                                               <dt><a href="pettanr.xml">xml &amp; xslt -&gt; html</a></dt>\r
-                                               <dd>pettanR コミックを xml で定義.xslt で html 化する.</dd>\r
                                                <dt><a href="type.html">[js] Type</a></dt>\r
                                                <dd>javascript の型判定のテスト</dd>\r
                                        </dl>\r
index ec08648..c44fb3d 100644 (file)
@@ -53,6 +53,7 @@
                                        \r
                                        <div id="inner-wrapper" class="base-content-width">\r
                                                <div id="main">\r
+                                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; xml テスト</div>\r
                                                        <h2><xsl:value-of select="@title" /></h2>\r
                                                        <h3><xsl:value-of select="@episode" /></h3>\r
                                                        <p class='author'>author:<xsl:value-of select="@author" /></p>\r
index 4b6c354..3f31029 100644 (file)
@@ -33,6 +33,7 @@
                                <!-- InstanceBeginEditable name="main_content" -->\r
 \r
                                <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; svg を使った画像の反転テスト</div>\r
                                        <h2>svg を使った画像の反転テスト</h2>\r
                                        <div class="clearfix">\r
                                                <img src="1.gif" class="float-left" width="200" height="200">\r
index 64be716..cda6732 100644 (file)
@@ -32,6 +32,7 @@
             <div id="inner-wrapper" class="base-content-width">\r
                                <!-- InstanceBeginEditable name="main_content" -->\r
                                <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; css3 transform による 画像の水平・垂直反転のテストページ</div>\r
                                        <h2>css3 transform による 画像の水平・垂直反転のテストページ</h2>\r
                                        <p>このページは css3 transform による画像反転のためのテストページです.</p>\r
                                        <p>ブラウザによる画像の反転方法は、Web標準を使うもの、非Web標準な独自実装やプラグインを使うものなどいくつかあります.</p>\r
index 617a997..c783789 100644 (file)
@@ -48,6 +48,7 @@
                                <!-- InstanceBeginEditable name="main_content" -->\r
 \r
                                <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; javascript のための型判定</div>\r
                                        <h2>javascript のための型判定</h2>\r
                                        <p>以下の表は js によっ書き出されています.Array 型 と  HTMLElement 型 の判定が面倒です.また、NodeList 型が返るか?はブラウザ毎の実装差があるようです.</p>\r
                                        <dl id="output" class="dl-table clearfix"></dl>\r
diff --git a/0.4.x/test/vertical-center.html b/0.4.x/test/vertical-center.html
new file mode 100644 (file)
index 0000000..a38ecdd
--- /dev/null
@@ -0,0 +1,350 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r
+<html xmlns:v="urn:schemas-microsoft-com:vml"><!-- InstanceBegin template="/Templates/base.dwt" codeOutsideHTMLIsLocked="false" -->\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+       <meta http-equiv="Content-Language" content="ja">\r
+       <meta http-equiv="Content-Script-Type" content="text/javascript">\r
+       <meta http-equiv="Content-Style-Type" content="text/css">\r
+       <meta http-equiv="imagetoolbar" content="no">\r
+       <link rel="stylesheet" type="text/css" href="../stylesheets/common.css">\r
+       <!-- InstanceBeginEditable name="doctitle" -->\r
+       <title>上下中央配置テスト vertical-align:middle</title>\r
+       <!-- InstanceEndEditable -->\r
+       <!-- InstanceBeginEditable name="head" -->\r
+       <style type="text/css">\r
+               .test-wrapper {\r
+                       margin: 20px auto;\r
+               }\r
+       \r
+               div.outer {\r
+                       display:                        table;                  /* ① */\r
+                       height:                         100px;\r
+                       width:                          100px;                  /* ② */\r
+                       background:                     #E3F2DA;\r
+                       color:                          #5C5C5C;\r
+                       border:                         1px solid #003366;\r
+               }\r
+                       * html div.outer {\r
+                               position:                       relative;       /* ③ */\r
+                       }\r
+                       *+html div.outer {\r
+                               position:                       relative;       /* ③ */\r
+                       }\r
+               div.vertical_middle {\r
+                       display:                        table-cell;             /* ④ */\r
+                       vertical-align:         middle;                 /* ⑤ */\r
+               }\r
+                       * html div.vertical_middle {\r
+                               position:                       absolute;       /* ⑥ */\r
+                               top:                            50%;            /* ⑥ */\r
+                       }\r
+                       *+html div.vertical_middle {\r
+                               position:                       absolute;       /* ⑥ */\r
+                               top:                            50%;            /* ⑥ */\r
+                       }\r
+               div.vertical_middle p.inner {\r
+                       margin:                         0 !important;\r
+                       padding:                        0 !important;\r
+               }\r
+                       * html div.vertical_middle p.inner {\r
+                               position:                       relative;       /* ⑦ */\r
+                               top:                            -50%;           /* ⑦ */\r
+                       }\r
+                       *+html div.vertical_middle p.inner {\r
+                               position:                       relative;       /* ⑦ */\r
+                               top:                            -50%;           /* ⑦ */\r
+                       }\r
+               \r
+               div.table {\r
+                       display:                        table;\r
+                       height:                         100px;\r
+                       background:                     #E3F2DA;\r
+                       color:                          #5C5C5C;\r
+               }\r
+                       div.table-cell {\r
+                               display:                        table-cell;\r
+                               vertical-align:         middle;\r
+                               width:                          100px;\r
+                               border:                         1px solid #003366;\r
+                               padding:                        5px;\r
+                       }\r
+                               div.table-cell span.inner {\r
+                                       display:                        block;\r
+                               }\r
+               \r
+               div.table-ie {\r
+                       height:                         100px;\r
+                       background:                     #E3F2DA;\r
+                       color:                          #5C5C5C;\r
+               }\r
+                       div.table-cell-ie {\r
+                               display:                inline;\r
+                               zoom:                   1;\r
+                       }\r
+                               div.middle-outer {\r
+                                       height:                 100px;\r
+                                       width:                  100px;\r
+                                       position:               relative;\r
+                                       border:                 1px solid #003366;\r
+                               }\r
+                                       div.middle-inner {\r
+                                               position:               absolute;\r
+                                               top:                    50%;\r
+                                       }\r
+                                               div.middle-inner span.inner {\r
+                                                       display:                inline;\r
+                                                       position:               relative;\r
+                                                       top:                    -50%;                   \r
+                                               }\r
+                               \r
+                               \r
+               /* http://e2designer.seesaa.net/article/152168876.html */\r
+               /* http://perishablepress.com/press/2010/06/01/wrapping-content/ */\r
+               .word-wrap {\r
+                       white-space: pre;           /* CSS 2.0 */\r
+                       white-space: pre-wrap;      /* CSS 2.1 */\r
+                       white-space: pre-line;      /* CSS 3.0 */\r
+                       white-space: -pre-wrap;     /* Opera 4-6 */\r
+                       white-space: -o-pre-wrap;   /* Opera 7 */\r
+                       white-space: -moz-pre-wrap; /* Mozilla */\r
+                       white-space: -hp-pre-wrap;  /* HP Printers */\r
+                       word-wrap:   break-word;    /* IE 5+ */\r
+               }\r
+               div.table-cell span.word-wrap {\r
+                       width:          100px;\r
+               }\r
+               \r
+               \r
+               div.wrap {\r
+                       border: 1px solid #666666;\r
+                       width: 350px;\r
+               }\r
+               \r
+               div.wrap div {\r
+                       display: table-cell;\r
+                       width: 100px;\r
+                       vertical-align: middle; \r
+                       font-size: 0.8em;\r
+               }\r
+               div.wrap div.box1 {\r
+                       background-color: #FFDDDD;\r
+               }\r
+               div.wrap div.box2 {\r
+                       background-color: #DDFFDD;\r
+               }\r
+               \r
+               /* IE 6 */\r
+               * html div.wrap div {\r
+                       display: inline;\r
+                       zoom: 1;\r
+               }\r
+               \r
+               /* IE 7 */\r
+               *:first-child+html div.wrap div {\r
+                       display: inline;\r
+                       zoom: 1;\r
+               }\r
+               \r
+               /*\*//*/\r
+               * html div.wrap div {\r
+                       display:inline-block;\r
+               }\r
+               /**/\r
+       \r
+       </style>\r
+       <!-- InstanceEndEditable -->\r
+</head>\r
+\r
+<body>\r
+    <div id="general-content">\r
+        <div id="outer-wrapper">\r
+            \r
+            <div id="header">\r
+                <div class="base-content-width" style="position:relative;">\r
+                    <h1><a href="../index.html">pettanR</a></h1>\r
+                <!-- global navi -->\r
+                    <div id="global-navi">\r
+                        <noscript id="noscript-alert">You need to have JavaScript enabled.</noscript>\r
+                    </div>\r
+                </div>\r
+            </div>\r
+            \r
+            <div id="inner-wrapper" class="base-content-width">\r
+                               <!-- InstanceBeginEditable name="main_content" -->\r
+                               <div id="main">\r
+                                       <div id="breadcrumb"><a href="index.html">テスト インデックス</a> &gt; 上下中央配置テスト vertical-align:middle</div>\r
+                                       <h2>上下中央配置テスト vertical-align:middle</h2>\r
+                                       <p>上下中央配置をクロスブラウザで table タグ無しで行うテストhttp://scuderia-web.com/tips/xhtml_css/div_vertical_align.php</p>\r
+                                       <h3>1行で中央配置</h3>\r
+                                       <div class="test-wrapper clearfix">\r
+                                               <div class="outer">  \r
+                                                       <div class="vertical_middle">  \r
+                                                               <p class="inner">テキスト</p>  \r
+                                                       </div>  \r
+                                               </div>\r
+                                       </div>\r
+                                       <div class="test-wrapper clearfix">\r
+                                               <div class="outer">  \r
+                                                       <div class="vertical_middle">  \r
+                                                               <p class="inner">テキスト<br>テキスト</p>  \r
+                                                       </div>  \r
+                                               </div>\r
+                                       </div>\r
+                                       <div class="test-wrapper clearfix">\r
+                                               <div class="outer">  \r
+                                                       <div class="vertical_middle">  \r
+                                                               <p class="inner">テキスト<br>テキスト<br>テキスト<br>テキスト<br>テキスト<br>テキスト</p>  \r
+                                                       </div>  \r
+                                               </div>                                                                                  \r
+                                       </div>\r
+\r
+                                       <h2>上下中央配置テスト</h2>\r
+                                       \r
+                                       <h3>上下中央配置したブロックを横に並べる for modern browser</h3>\r
+                                       <p>ie8, firefox3.6, </p>\r
+                                       <div class="test-wrapper">\r
+                                               <div class="table">  \r
+                                                       <div class="table-cell">  \r
+                                                               <span class="inner">テキスト</span>  \r
+                                                       </div>\r
+                                                       <div class="table-cell">  \r
+                                                               <span class="inner">テキスト<br>テキスト</span>  \r
+                                                       </div>\r
+                                                       <div class="table-cell">  \r
+                                                               <span class="inner">テキスト<br>テキスト<br>テキスト<br>テキスト<br>テキスト</span>  \r
+                                                       </div>\r
+                                                       <div class="table-cell">  \r
+                                                               <span class="inner word-wrap">word-break, word-wrap text. 1111111111111111111111111111111111111111111111111111111111111111111111111</span>\r
+                                                       </div>\r
+                                                       <div class="table-cell">  \r
+                                                               <span class="inner">this cell will break. 11111111111111111111111111111111111</span>\r
+                                                       </div> \r
+                                               </div>\r
+                                       </div>\r
+                                       <h3>上下中央配置したブロックを横に並べる for IE</h3>\r
+                                       <p>ie5.5, ie6, ie7</p>\r
+                                       <div class="test-wrapper">\r
+                                               <div class="table-ie">\r
+                                                       <div class="table-cell-ie">\r
+                                                               <div class="middle-outer">  \r
+                                                                       <div class="middle-inner">  \r
+                                                                               <span class="inner">テキスト</span> \r
+                                                                       </div>\r
+                                                               </div>\r
+                                                       </div>\r
+                                                       <div class="table-cell-ie">\r
+                                                               <div class="middle-outer">  \r
+                                                                       <div class="middle-inner">  \r
+                                                                               <span class="inner">テキスト<br>テキスト</span> \r
+                                                                       </div>\r
+                                                               </div>\r
+                                                       </div>\r
+                                                       <div class="table-cell-ie">\r
+                                                               <div class="middle-outer">  \r
+                                                                       <div class="middle-inner">  \r
+                                                                               <span class="inner">テキスト<br>テキスト<br>テキスト<br>テキスト<br>テキスト</span>\r
+                                                                       </div>\r
+                                                               </div>\r
+                                                       </div>\r
+                                                       <div class="table-cell-ie">\r
+                                                               <div class="middle-outer">  \r
+                                                                       <div class="middle-inner">  \r
+                                                                               <span class="inner word-wrap">word-break, word-wrap text. 1111111111111111111111111111111111111111111111111111111111111111111111111</span>\r
+                                                                       </div>\r
+                                                               </div>\r
+                                                       </div>\r
+                                                       <div class="table-cell-ie">\r
+                                                               <div class="middle-outer">  \r
+                                                                       <div class="middle-inner">  \r
+                                                                               <span class="inner">this cell will break. 11111111111111111111111111111111111</span>\r
+                                                                       </div>\r
+                                                               </div>\r
+                                                       </div>\r
+                                               </div>\r
+                                       </div>\r
+                                       \r
+                                       <h2>上下中央配置テスト</h2>\r
+                                       http://www.webbibo.com/blog/htmlcss/vertical/125.html\r
+                                       <div class="wrap">\r
+                                               <div class="box1">\r
+                                                       ボックス1<br>\r
+                                                       ボックス1<br>\r
+                                                       ボックス1<br>\r
+                                                       ボックス1<br>\r
+                                                       ボックス1\r
+                                               </div>\r
+                                               <div class="box2">\r
+                                                       ボックス2<br>\r
+                                                       ボックス2\r
+                                               </div>\r
+                                       </div>\r
+\r
+                               </div>\r
+                               <!-- InstanceEndEditable -->\r
+            </div>\r
+        </div>\r
+    </div>\r
+    \r
+    <div id="footer-content"><!-- #BeginLibraryItem "/Library/footer.lbi" -->\r
+\r
+        <div id="footer">\r
+            <div id="footer-item-container" class="base-content-width clearfix">\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>ぺったんR にようこそ</h2>\r
+                        <ul>\r
+                            <li>サンプル</li>\r
+                            <li>ぺったんRの特徴</li>\r
+                            <li>沿革</li>\r
+                        </ul>\r
+                        <h2>Test</h2>\r
+                        <ul>\r
+                            <li><a href="index.html">Test Index</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>ドキュメント</h2>\r
+                        <ul>\r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForAuthors" rel="me" target="_blank">作家向けドキュメント</a></li>\r
+                            <li>絵師向けドキュメント</li>                                                    \r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForDevelopers" rel="me" target="_blank">開発者向けドキュメント</a></li>\r
+                            <li><a href="http://sourceforge.jp/projects/pettanr/wiki/ForWebmasters" rel="me" target="_blank">編集長向けドキュメント</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper">\r
+                    <div class="footer-item">\r
+                        <h2>プロトタイプ</h2>\r
+                        <ul>\r
+                            <li><a href="http://pettanr.heroku.com/" rel="me" target="_blank">pettanr.heroku.com</a></li>\r
+                            <li><a href="../work.html" rel="console">ユーザーコンソール</a></li>\r
+                        </ul>\r
+                        <h2>Ajax contents</h2>\r
+                        <ul>\r
+                            <li><a href="../help/jp.xml">help | jp</a></li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+                <div class="footer-item-wrapper" style="width:170px;">\r
+                    <div class="footer-item" style="padding-right:0;">\r
+                        <h2>ぺったんRチーム</h2>\r
+                        <ul>\r
+                            <li>わたしたちについて</li>\r
+                            <li>ミッション</li>\r
+                            <li><a href="../diary/itozyun.xml">itozyun's diary</a></li>\r
+                            <li>個人情報保護方針</li>\r
+                            <li>作品の取り扱い</li>\r
+                            <li>お問い合わせ</li>\r
+                        </ul>\r
+                    </div>\r
+                </div>\r
+            </div>\r
+            <div id="copyright">Copyright (c) 2011-2012 pettanR team, some rights reserved.</div>\r
+        </div><!-- #EndLibraryItem --></div>\r
+       <script type="text/javascript" src="../javascripts/common.js"></script>\r
+<!-- InstanceBeginEditable name="script" --><!-- InstanceEndEditable -->\r
+</body>\r
+<!-- InstanceEnd --></html>\r
index bf62b64..2bfd0b4 100644 (file)
                                <p>Hello, xxxxx.</p>\r
                                <p>This page is login user console.</p>\r
                                <h3>クイックアクセス</h3>\r
-                               <p><a href="#" onclick="pettanr.view.show('editor');return false;">新しいコマを描く(いまだけ)</a></p>\r
-                               <p><a href="#" onclick="pettanr.comicConsole._quickAccessShow();return false;">新しいコミックをつくる</a></p>\r
-                               <p><a href="#" onclick="pettanr.uploadConsole._quickAccessShow();return false;">画像のアップロード</a></p>\r
-                               <p><a href="#" onclick="pettanr.panelConsole._quickAccessShow();return false;">コマの追加(開発用)</a></p>\r
-                               <p><a href="#" onclick="pettanr.artistConsole._quickAccessShow();return false;">アーティスト登録(すでに登録している場合も操作可能)</a></p>\r
+                               <p><a href="#" onclick="pettanr.editor.boot();return false;">新しいコマを描く(開発用)</a></p>\r
+                               <p><a href="#" onclick="pettanr.comicConsole.bootInOverlay();return false;">新しいコミックをつくる</a></p>\r
+                               <p><a href="#" onclick="pettanr.uploadConsole.bootInOverlay();return false;">画像のアップロード</a></p>\r
+                               <p><a href="#" onclick="pettanr.panelConsole.bootInOverlay();return false;">コマの追加(開発用)</a></p>\r
+                               <p><a href="#" onclick="pettanr.artistConsole.bootInOverlay();return false;">アーティスト登録(今はすでに登録している場合も操作可能です、、、、)</a></p>\r
                                <h3>座長からのお知らせ</h3>\r
                                <p>メンテナンスについて</p>\r
                        </div>\r
                                <div class="comic-element-wrapper text-element">\r
                                        <img>\r
                                        <div class="speach">\r
-                                               <div class="speach-inner"></div>\r
+                                               <div class="speach-inner">&nbsp;</div>\r
                                        </div>\r
                                </div>\r
                        </script>\r
                                <div class="comic-element-wrapper text-element">\r
                                        <img>\r
                                        <div class="speach">\r
-                                               <table><tr><td></td></tr></table>\r
+                                               <table><tr><td>&nbsp;</td></tr></table>\r
                                        </div>\r
                                </div>\r
                        </script>\r
                        \r
-                       <script id="imageGruopItemTemplete" type="text/x-jquery-tmpl">\r
-                               <div class="image-gruop-item">\r
-                                       <img width="0" height="0">\r
-                                       <div class="image-gruop-item-title">img-title</div>\r
+                       <script id="imageGroupItemTemplete" type="text/x-jquery-tmpl">\r
+                               <div class="image-group-item">\r
+                                       <div class="image-group-item-title">img-title</div>\r
                                </div>                          \r
                        </script>\r
                        \r
        <!-- オーバーレイ -->\r
                <div id="overlay-container" style="display: none;">\r
                        <div id="overlay-shadow"></div>\r
+                       <div id="overlay-close-button">x</div>\r
+               </div>\r
+\r
+       <!-- アウトプットコンソール -->\r
+               <div id="output-console-wrapper">\r
+                       <textarea id="output-area" readonly></textarea>\r
+               </div>\r
                \r
-               <!-- アウトプットコンソール -->\r
-                       <div id="output-console-wrapper" style="display: none;">\r
-                               <textarea id="output-area" readonly></textarea>\r
-                       </div>\r
-                       \r
-               <!-- テキスト エディタ -->\r
-                       <div id="speach-editor-wrapper" style="display: none;">\r
-                               <textarea id="speach-editor"></textarea>\r
-                               <div id="speach-edit-complete-button" class="button">OK</div>\r
-                       </div>\r
+       <!-- テキスト エディタ -->\r
+               <div id="speach-editor-wrapper">\r
+                       <textarea id="speach-editor"></textarea>\r
+                       <div id="speach-edit-complete-button" class="button">OK</div>\r
+               </div>\r
 \r
-               <!-- 画像グループから画像を選択 -->\r
-                       <div id="image-gruop-wrapper" style="display: none;">\r
-                               <div id="image-icon-container"></div>\r
-                               <div id="gruop-name-display">Group Name</div>\r
-                               <div id="image-gruop-button" class="button">cancel</div>\r
-                       </div>\r
+       <!-- 画像グループから画像を選択 -->\r
+               <div id="image-group-wrapper">\r
+                       <div id="image-group-icon-container"></div>\r
+                       <div id="image-group-name">NO DATA...</div>\r
+                       <div id="image-group-button" class="button">close</div>\r
+               </div>\r
 \r
-               <!-- 作家登録 -->\r
-                       <div id="artist-console-wrapper" class="console-wrapper">\r
-                               <div id="artist-console-header" class="console-header">Register Artist</div>\r
-                               <div id="artist-console" class="console-inner">\r
-                                       <div id="register"></div>\r
-                                       <div class="console-button-container">\r
-                                               <div id="artist-console-post-button" class="button console-submit-button">register</div>\r
-                                               <div id="artist-console-cancel-button" class="button console-cancel-button">cancel</div>\r
-                                       </div>\r
-                                       <div id="artist-console-progress" class="console-progress">&nbsp;</div>                                 \r
+       <!-- 作家登録 -->\r
+               <div id="artist-console-wrapper" class="console-wrapper">\r
+                       <div id="artist-console-header" class="console-header">Register Artist</div>\r
+                       <div id="artist-console" class="console-inner">\r
+                               <div id="register"></div>\r
+                               <div class="console-button-container">\r
+                                       <div id="artist-console-post-button" class="button console-submit-button">register</div>\r
+                                       <div id="artist-console-cancel-button" class="button console-cancel-button">cancel</div>\r
                                </div>\r
+                               <div id="artist-console-progress" class="console-progress">&nbsp;</div>                                 \r
                        </div>\r
+               </div>\r
 \r
-               <!-- パネルのポスト(テスト) -->\r
-                       <div id="panel-console-wrapper" class="console-wrapper">\r
-                               <div id="panel-console-header" class="console-header">Create New Panel (dev)</div>\r
-                               <div id="panel-console" class="console-inner">\r
-                                       <div id="newpanel"></div>\r
-                                       <div class="console-button-container">\r
-                                               <div id="panel-console-post-button" class="button console-submit-button">post</div>\r
-                                               <div id="panel-console-cancel-button" class="button console-cancel-button">cancel</div>\r
-                                       </div>\r
-                                       <div id="panel-console-progress" class="console-progress">&nbsp;</div>                                  \r
+       <!-- パネルのポスト(テスト) -->\r
+               <div id="panel-console-wrapper" class="console-wrapper">\r
+                       <div id="panel-console-header" class="console-header">Create New Panel (dev)</div>\r
+                       <div id="panel-console" class="console-inner">\r
+                               <div id="newpanel"></div>\r
+                               <div class="console-button-container">\r
+                                       <div id="panel-console-post-button" class="button console-submit-button">post</div>\r
+                                       <div id="panel-console-cancel-button" class="button console-cancel-button">cancel</div>\r
                                </div>\r
+                               <div id="panel-console-progress" class="console-progress">&nbsp;</div>                                  \r
                        </div>\r
+               </div>\r
 \r
-               <!-- 画像のアップロード-->\r
-                       <div id="upload-console-wrapper" class="console-wrapper">\r
-                               <div id="upload-console-header" class="console-header">Upload Picture</div>\r
-                               <div id="upload-console" class="console-inner">\r
-                                       <div id="uploader"></div>\r
-                                       <div class="console-button-container">\r
-                                               <div id="upload-console-post-button" class="button console-submit-button">upload</div>\r
-                                               <div id="upload-console-cancel-button" class="button console-cancel-button">cancel</div>\r
-                                       </div>\r
-                                       <div id="upload-console-progress" class="console-progress">&nbsp;</div>                                 \r
+       <!-- 画像のアップロード-->\r
+               <div id="upload-console-wrapper" class="console-wrapper">\r
+                       <div id="upload-console-header" class="console-header">Upload Picture</div>\r
+                       <div id="upload-console" class="console-inner">\r
+                               <div id="uploader"></div>\r
+                               <div class="console-button-container">\r
+                                       <div id="upload-console-post-button" class="button console-submit-button">upload</div>\r
+                                       <div id="upload-console-cancel-button" class="button console-cancel-button">cancel</div>\r
                                </div>\r
+                               <div id="upload-console-progress" class="console-progress">&nbsp;</div>                                 \r
                        </div>\r
+               </div>\r
 \r
-               <!-- コミックの新規作成・編集・削除 -->\r
-                       <div id="comic-console-wrapper" class="console-wrapper">\r
-                               <div id="comic-console-header" class="console-header">Create New Comic</div>\r
-                               <div id="comic-console" class="console-inner">\r
-                                       <div id="comic-console-title" class="comic-console-line">\r
-                                               <span class="comic-console-label">Title:</span>\r
-                                               <span id="comic-console-title-value" class="comic-console-value editable-value">No Title</span>\r
-                                       </div>\r
-                                       <div id="comic-console-width" class="comic-console-line">\r
-                                               <span class="comic-console-label">Default Width:</span>\r
-                                               <span id="comic-console-width-value" class="comic-console-value editable-value">300</span>\r
-                                       </div>\r
-                                       <div id="comic-console-height" class="comic-console-line">\r
-                                               <span class="comic-console-label">Default Height:</span>\r
-                                               <span id="comic-console-height-value" class="comic-console-value editable-value">200</span>\r
-                                       </div>\r
-                                       <div id="comic-console-visible" class="comic-console-line">\r
-                                               <span class="comic-console-label">Visible:</span>\r
-                                               <span id="comic-console-visible-value" class="comic-console-value editable-value">1</span>\r
-                                       </div>\r
-                                       <div id="comic-console-editable" class="comic-console-line">\r
-                                               <span class="comic-console-label">Editable:</span>\r
-                                               <span id="comic-console-editable-value" class="comic-console-value editable-value">1</span>\r
-                                       </div>\r
-                                       <div class="console-button-container">\r
-                                               <div id="comic-console-post-button" class="button console-submit-button">post(update)</div>\r
-                                               <div id="comic-console-cancel-button" class="button console-cancel-button">cancel</div>\r
-                                       </div>\r
-                                       <div id="comic-console-progress" class="console-progress">&nbsp;</div>\r
+       <!-- コミックの新規作成・編集・削除 -->\r
+               <div id="comic-console-wrapper" class="console-wrapper">\r
+                       <div id="comic-console-header" class="console-header">Create New Comic</div>\r
+                       <div id="comic-console" class="console-inner">\r
+                               <div id="comic-console-title" class="comic-console-line">\r
+                                       <span class="comic-console-label">Title:</span>\r
+                                       <span id="comic-console-title-value" class="comic-console-value editable-value">No Title</span>\r
+                               </div>\r
+                               <div id="comic-console-width" class="comic-console-line">\r
+                                       <span class="comic-console-label">Default Width:</span>\r
+                                       <span id="comic-console-width-value" class="comic-console-value editable-value">300</span>\r
+                               </div>\r
+                               <div id="comic-console-height" class="comic-console-line">\r
+                                       <span class="comic-console-label">Default Height:</span>\r
+                                       <span id="comic-console-height-value" class="comic-console-value editable-value">200</span>\r
+                               </div>\r
+                               <div id="comic-console-visible" class="comic-console-line">\r
+                                       <span class="comic-console-label">Visible:</span>\r
+                                       <span id="comic-console-visible-value" class="comic-console-value combobox"></span>\r
                                </div>\r
+                               <div id="comic-console-editable" class="comic-console-line">\r
+                                       <span class="comic-console-label">Editable:</span>\r
+                                       <span id="comic-console-editable-value" class="comic-console-value combobox"></span>\r
+                               </div>\r
+                               <div class="console-button-container">\r
+                                       <div id="comic-console-post-button" class="button console-submit-button">create</div>\r
+                                       <div id="comic-console-cancel-button" class="button console-cancel-button">cancel</div>\r
+                               </div>\r
+                               <div id="comic-console-progress" class="console-progress">&nbsp;</div>\r
                        </div>\r
-                       \r
-                       <div id="overlay-close-button">x</div>\r
                </div>\r
 \r
        <!-- Templete Container -->\r
-               <div id="templete-container">\r
+               <div id="templete-container" style="display: none;">\r
                        \r
                <!-- Finder -->\r
                        <div id="templete-finder-container" class="finder-container">\r
                                \r
                                <div class="finder-body">\r
                                        <!-- Finder icon -->\r
-                                       <div id="templete-finder-icon" class="finder-icon">\r
-                                               <div class="finder-icon-handle"></div>\r
-                                               <div class="finder-icon-thumbnail"></div>\r
-                                               <div class="finder-icon-filename"></div>\r
-                                               <div class="finder-icon-summary">file descriptiion</div>\r
+                                       <div id="templete-finder-icon" class="finder-icon fnder-icon-modern">\r
+                                               <span class="finder-icon-handle"></span>\r
+                                               <span class="finder-icon-thumbnail"></span>\r
+                                               <span class="finder-icon-filename break-word">file name</span>\r
+                                               <span class="finder-icon-summary break-word">file descriptiion</span>\r
+                                               <div class="finder-icon-console">\r
+                                                       <a href="#" class="finder-icon-console-action"></a>\r
+                                                       <a href="#" class="finder-icon-console-editor-apps"></a>\r
+                                                       <a href="#" class="finder-icon-console-viewer-apps"></a>\r
+                                               </div>\r
+                                       </div>\r
+                                       \r
+                                       <div id="templete-finder-icon-ie" class="finder-icon fnder-icon-ie7">\r
+                                               <a href="#" class="finder-icon-main">\r
+                                                       <span class="finder-icon-handle"></span>\r
+                                                       <span class="finder-icon-thumbnail"></span>\r
+                                                       <span class="finder-icon-cell finder-icon-ie-filename">\r
+                                                               <span class="finder-icon-vertical-middle-outer">  \r
+                                                                       <span class="finder-icon-vertical-middle-inner">  \r
+                                                                               <span class="finder-icon-filename break-word">file name</span> \r
+                                                                       </span>\r
+                                                               </span>\r
+                                                       </span>\r
+                                                       <span class="finder-icon-cell finder-icon-ie-summary">\r
+                                                               <span class="finder-icon-vertical-middle-outer">  \r
+                                                                       <span class="finder-icon-vertical-middle-inner">  \r
+                                                                               <span class="finder-icon-summary break-word">file descriptiion</span>\r
+                                                                       </span>\r
+                                                               </span>\r
+                                                       </span>\r
+                                               </a>\r
                                                <div class="finder-icon-console">\r
-                                                       <div class="finder-icon-console-action"></div>\r
-                                                       <div class="finder-icon-console-editor-apps"></div>\r
-                                                       <div class="finder-icon-console-viwer-apps"></div>\r
+                                                       <a href="#" class="finder-icon-console-action"></a>\r
+                                                       <a href="#" class="finder-icon-console-editor-apps"></a>\r
+                                                       <a href="#" class="finder-icon-console-viewer-apps"></a>\r
                                                </div>\r
                                        </div>\r
                                        \r
                </div>\r
 \r
                <script type="text/javascript" src="javascripts/common.js"></script>\r
-               <script type="text/javascript" src="javascripts/jquery-1.6.2.min.js"></script>\r
+               <script type="text/javascript" src="javascripts/jquery-1.3.2.min.js"></script>\r
                <script type="text/javascript" src="javascripts/work.js"></script>\r
                <script type="text/javascript" src="javascripts/system.js"></script>\r
     </body>\r