OSDN Git Service

pettanR version0.4.15
[pettanr/clientJs.git] / 0.4.x / javascripts / system.js
index ac96c53..5941d01 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR system.js
- *   version 0.4.4
+ *   version 0.4.15
  *   
  * author:
  *   itozyun
@@ -40,7 +40,7 @@ pettanr.file = ( function(){
                FILEDATA_RESITER = [],                  // store all of fileData( json object )
                FILEDATA_ACCESS = [],                   // file operations for Kernel only ! hide from Out of pettanr.file
                FILE_OBJECT_POOL = [],
-               EVENT_LISTENER_RESISTER = [],
+               EVENT_LISTENER_REGISTER = [],
                TREE_ARRAY = [],
                TREE_ACCESS_ARRAY = [];
        
@@ -94,111 +94,98 @@ pettanr.file = ( function(){
 
 
 
-       var FILE_CONTROLER = ( function(){
-               
-               return {
-                       createTree: function( _rootFileData){
-                               var _tree = new TreeClass( _rootFileData);
-                               _tree.init();
-                               TREE_ARRAY.push( _tree);
-                               return _tree;
-                       },
-                       getFileData: function( UIDorFILEorFILEDATA){
-                               var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
-                               return _access !== null ? _access.DATA : null;
-                       },
-                       getChildren: function( UIDorFILEorFILEDATA){
-                               var _data = FILE_CONTROLER.getFileData( UIDorFILEorFILEDATA);
-                               return _data !== null ? _data.children || null : null;
-                       },
-                       getFileDataAccess: function( UIDorFILEorFILEDATA){
-                               var _uid, _data, _access;
-                               
-                               if( typeof UIDorFILEorFILEDATA === 'number'){
-                                       _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
-                               } else
-                               if( UIDorFILEorFILEDATA instanceof FileClass){
-                                       _uid = UIDorFILEorFILEDATA.getUID();
-                                       _data = FILEDATA_RESITER[ _uid] || null;
-                               } else {
-                                       _data = UIDorFILEorFILEDATA || null;
-                               }
-                               
-                               if( _data === null || !_data) return null;
-                               for( var i=0, l = FILEDATA_ACCESS.length; i<l; ++i){
-                                       _access = FILEDATA_ACCESS[ i];
-                                       if( _access.DATA === _data) return _access;
-                               }
-                               return null;
-                       },
-                       getDriver: function( _file){
-                               var _data = FILE_CONTROLER.getFileData( _file);
-                               return _data !== null && _data.driver ? ( _data.driver || FileDriverBase) : null;
-                       },
-                       getUID: function ( _filedata){
-                               var l = FILEDATA_RESITER.length;
-                               for( var i=0; i<l; ++i){
-                                       if( FILEDATA_RESITER[ i] === _filedata) return i;
-                               }
-                               return -1;
-                       },
-                       getSeqentialFiles: function( _file){
-                               var _driver = FILE_CONTROLER.getDriver( _file);
-                               if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
-                                       _driver.getSeqentialFiles( _file);
-                               }
-                       },
-                       updateFileAttribute: function( _uid, key, _value, _opt_callback){
-                               var _data = FILE_CONTROLER.getFileDataAccess( _uid),
-                                       _type = _data.TYPE;
-                               
-                       },                      
-                       getFileAttribute: function( _uid, KEYorKEYARRAY){
-                               var _fileData = FILE_CONTROLER.getFileDataAccess( _uid),
-                                       _type = _fileData.TYPE;
-                       },
-                       move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
-                               var _parentData = FILE_CONTROLER.getFileDataAccess( _prentUID),
-                                       _parentType = _parentData.TYPE,
-                                       _targetData = FILE_CONTROLER.getFileDataAccess( _targetfile),
-                                       _targetType = _targetData.TYPE;
-                       },
-                       replace: function( _uid, _file, _newIndex){
+       var FILE_CONTROLER = {
+               createTree: function( _rootFileData){
+                       var _tree = new TreeClass( _rootFileData);
+                       _tree.init();
+                       TREE_ARRAY.push( _tree);
+                       return _tree;
+               },
+               getFileDataAccess: function( UIDorFILEorFILEDATA){
+                       var _uid, _data, _access;
+                       
+                       if( typeof UIDorFILEorFILEDATA === 'number'){
+                               _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
+                       } else
+                       if( UIDorFILEorFILEDATA instanceof FileClass){
+                               _uid = UIDorFILEorFILEDATA.getUID();
+                               _data = FILEDATA_RESITER[ _uid] || null;
+                       } else {
+                               _data = UIDorFILEorFILEDATA || null;
+                       }
+                       
+                       if( _data === null || typeof _data !== 'object') return null;
+                       for( var i=0, l = FILEDATA_ACCESS.length; i<l; ++i){
+                               _access = FILEDATA_ACCESS[ i];
+                               if( _access.DATA === _data) return _access;
+                       }
+                       return null;
+               },              
+               getFileData: function( UIDorFILEorFILEDATA){
+                       var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
+                       return _access !== null ? _access.DATA : null;
+               },
+               getChildren: function( UIDorFILEorFILEDATA){
+                       var _data = FILE_CONTROLER.getFileData( UIDorFILEorFILEDATA);
+                       return _data !== null ? _data.children || null : null;
+               },
+               getDriver: function( _file){
+                       var _data = FILE_CONTROLER.getFileData( _file);
+                       return _data !== null && _data.driver ? _data.driver : FileDriverBase;
+               },
+               getUpdateFlag: function( _file, _bit){
+                       var _driver = FILE_CONTROLER.getDriver( _file ),
+                               _policy;
+                       if( typeof _driver.getUpdatePolicy === 'function'){
+                               _policy = _driver.getUpdatePolicy( _file );
                                
-                       },
-                       addEventListener: function( FILEorNULL, _eventType, _callback){
-                               var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL;
-                               EVENT_LISTENER_RESISTER.push( new FileEventTicketClass( _uid, _eventType, _callback));
-                       },
-                       removeEventListener: function( FILEorNULL, _eventType, _callback){
-                               var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
-                                       _ticket;
-                               for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
-                                       _ticket = EVENT_LISTENER_RESISTER[i];
-                                       if( _ticket.fileUID === _uid && _ticket.eventType === _eventType && _ticket.callBack === _callback){
-                                               EVENT_LISTENER_RESISTER.splice( i, 1);
-                                               _ticket.destroy();
-                                       }
+                       }
+                       if( typeof _policy !== 'number') {
+                               _policy = FileDriverBase.getUpdatePolicy( _file )
+                       }
+                       return _policy % ( _bit * 2) >= _bit;
+               },
+               move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
+                       var _parentData = FILE_CONTROLER.getFileDataAccess( _prentUID),
+                               _parentType = _parentData.TYPE,
+                               _targetData = FILE_CONTROLER.getFileDataAccess( _targetfile),
+                               _targetType = _targetData.TYPE;
+               },
+               replace: function( _uid, _file, _newIndex){
+                       
+               },
+               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){
+                       var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
+                               _ticket;
+                       for(var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i){
+                               _ticket = EVENT_LISTENER_REGISTER[i];
+                               if( _ticket.fileUID === _uid && _ticket.eventType === _eventType && _ticket.callBack === _callback){
+                                       EVENT_LISTENER_REGISTER.splice( i, 1);
+                                       _ticket.destroy();
                                }
-                       },
-                       fileEventRellay: function( _targetFile, _targetTree, _event){
-                               var _uid = _targetTree.getUID(),
-                                       _access = TREE_ACCESS_ARRAY[ _uid],
-                                       l = TREE_ARRAY.length,
-                                       _tree, _currentFile;
-                               _access !== undefined && _access.dispatchFileEvent( _event);
-                               for(var i=0; i<l; ++i){
-                                       if( i !== _uid){
-                                               _tree = TREE_ARRAY[i];
-                                               _currentFile = _tree.getCurrentFile();
-                                               if( FILE_CONTROLER.getFileData( _currentFile) === _access.DATA){
-                                                       TREE_ACCESS_ARRAY[ _tree.getUID()].dispatchFileEvent( _event);
-                                               }
+                       }
+               },
+               fileEventRellay: function( _targetFile, _targetTree, _event){
+                       var _uid = _targetTree.getUID(),
+                               _access = TREE_ACCESS_ARRAY[ _uid ],
+                               _data = FILE_CONTROLER.getFileData( _targetFile ),
+                               _tree;
+                       _access && _access.dispatchFileEvent( _event );
+                       for( var i=0, l = TREE_ARRAY.length; i<l; ++i){
+                               if( i !== _uid){
+                                       _tree = TREE_ARRAY[ i ];
+                                       if( FILE_CONTROLER.getFileData( _tree.getCurrentFile() ) === _data ){
+                                               _access = TREE_ACCESS_ARRAY[ _tree.getUID() ];
+                                               _access && _access.dispatchFileEvent( _event);
                                        }
                                }
                        }
                }
-       })();
+       }
 
        var TreeClass = function( ROOTFILE_DATA){
                var UID = TREE_ACCESS_ARRAY.length,
@@ -225,9 +212,9 @@ pettanr.file = ( function(){
                                _targetFile = e.targetFile,
                                _uid = _targetFile.getUID(),
                                _ticket, _type, _callback;
-                       for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
-                               _ticket = EVENT_LISTENER_RESISTER[i],
-                               _type = _ticket.eventType,
+                       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);
@@ -242,8 +229,8 @@ pettanr.file = ( function(){
                        init: function(){
                                instance = this;
                                currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
-                               rootFile.init();
-                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               // rootFile.init();
+                               currentFile.getSeqentialFiles();
                                delete this.init;
                        },
                        getUID: function(){ return UID},
@@ -265,7 +252,7 @@ pettanr.file = ( function(){
                                if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
                                PARENT_FILE_RESITER.unshift( currentFile);
                                currentFile = currentFile.getChildFileByIndex( _index);
-                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               currentFile.getSeqentialFiles();
                                return currentFile;
                        },
                        up: function( _index){
@@ -278,7 +265,7 @@ pettanr.file = ( function(){
                                } else {
                                        currentFile = PARENT_FILE_RESITER.shift();
                                }
-                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               currentFile.getSeqentialFiles();
                                return currentFile;     
                        },
                        addTreeEventListener: function( _eventType, _callback){
@@ -318,35 +305,22 @@ pettanr.file = ( function(){
  */
        
        var FileClass = function( TREE, parentFile, data){
-               if( !data.children){
-                       data.children = [];
-               }
-               var TYPE = data.type,
-                       name = null,
-                       driver = data.driver || FileDriverBase,
-                       thumbnail = null,
-                       uid = FILE_CONTROLER.getUID( data),
-                       CHILDREN = data.children,
+               var uid = pettanr.util.getIndex( FILEDATA_RESITER, data ),
                        instance = this;
                
                if( uid === -1){
                        uid = FILEDATA_RESITER.length;
-                       FILEDATA_RESITER.push( data);
+                       FILEDATA_RESITER.push( data );
                }
                
                FILEDATA_ACCESS.push(
                        {
-                               TYPE:                           TYPE,
                                DATA:                           data,
-                               destroy:                        destroy,
                                updateParent:           updateParent,
                                dispatchFileEvent:      dispatchEvent
                        }
                );
-               function destroy(){
-                       name = thumbnail = parentFile = data = CHILDREN = driver = null;
-                       
-               }
+
                function updateParent( _parent){
                        parentFile = _parent;
                }
@@ -355,34 +329,19 @@ pettanr.file = ( function(){
                }
                
                /* grobal Methods */
-               this.init = function(){
-                       //instance = this;
-                       delete this.init;
-               }
-               this.getType = function(){
-                       return TYPE;
-               }
-               this.getName = function(){
-                       if( name !== null) return name;
-                       if( typeof driver.getName === 'function'){
-                               name = driver.getName( instance);
-                       }
-                       return name;
-               }
-               this.getThumbnail = function(){
-                       if( thumbnail !== null) return thumbnail;
-                       if( typeof driver.getThumbnail === 'function'){
-                               thumbnail = driver.getThumbnail( instance);
-                       }
-                       return thumbnail || null;
-               }
+
                this.getUID = function(){
                        return uid;
                }
+               /*
+                * ファイル構造は TRON のような ハイパーリンク方式 だが、文脈上の 親ファイルが存在する.その親ファイルを使う操作は.prototype に置く事ができない.
+                * 同様に TREE を使う操作も .prototype に置く事ができない.
+                */
                this.getChildFileByIndex = function( _index){
-                       if( typeof _index !== 'number' || _index < 0 || typeof CHILDREN.length !== 'number' || _index >= CHILDREN.length) return null;
-                       _file = new FileClass( TREE, this, CHILDREN[ _index]);
-                       _file.init();
+                       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){
@@ -392,15 +351,26 @@ pettanr.file = ( function(){
                        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 = {
                isChildFile: function( _FILEorFILEDATA){
                        return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
                },
                getSeqentialFiles: function(){
-                       FILE_CONTROLER.getSeqentialFiles( this);
+                       var _driver = FILE_CONTROLER.getDriver( this );
+                       if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
+                               _driver.getSeqentialFiles( this );
+                       }
                },
                addEventListener: function( _eventType, _callback){
                        FILE_CONTROLER.addEventListener( this, _eventType, _callback);
@@ -409,24 +379,93 @@ pettanr.file = ( function(){
                        FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
                },
                getChildFileLength: function(){
-                       var CHILDREN = FILE_CONTROLER.getChildren( this);
-                       return CHILDREN && typeof CHILDREN.length === 'number' ? CHILDREN.length : 0;
+                       var children = FILE_CONTROLER.getChildren( this);
+                       return Type.isArray( children ) === true ? children.length : -1;
                },
                getChildFileIndex: function( _FILEorFILEDATA){
-                       var CHILDREN = FILE_CONTROLER.getChildren( this);
-                       
-                       if( !CHILDREN || typeof CHILDREN.length !== 'number') return -1;
-                       var l = CHILDREN.length,
+                       var children = FILE_CONTROLER.getChildren( this);
+                       if( Type.isArray( children.length ) === 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;
+                               if( children[ i] === _fileData) return i;
                        }
                        return -1;
                },
+               getName: function(){
+                       var driver = FILE_CONTROLER.getDriver( this );
+                       if( typeof driver.getName === 'function'){
+                               return driver.getName( this );
+                       }
+                       return FileDriverBase.getName( this);
+               },
+               getThumbnail: function(){
+                       var driver = FILE_CONTROLER.getDriver( this);
+                       if( typeof driver.getThumbnail === 'function'){
+                               return driver.getThumbnail( this);
+                       }
+                       return FileDriverBase.getThumbnail( this);
+               },
+               getType: function(){
+                       var _data = FILE_CONTROLER.getFileData( this);
+                       return typeof _data.type === 'number' ? _data.type : pettanr.file.FILE_TYPE.UNKNOWN;
+               },
                getState: function(){
                        var _data = FILE_CONTROLER.getFileData( this);
-                       return _data.state !== undefined ? _data.state : pettanr.file.FILE_STATE.OK;
+                       return typeof _data.state === 'number' ? _data.state : pettanr.file.FILE_STATE.OK;
+               },
+               getSummary: function(){
+                       var driver = FILE_CONTROLER.getDriver( this );
+                       if( typeof driver.getSummary === 'function'){
+                               return driver.getSummary( this );
+                       }
+                       return FileDriverBase.getSummary( this);
+               },
+               isWritable: function(){
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.WRITE);
+               },
+               isSortable: function(){
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.SORT);
+               },              
+               isCreatable: function(){
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.CREATE);
+               },
+               isRenamable: function(){
+                       return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.RENAME);
+               },
+               read: function(){
+                       // simpleDeepCopy
+                       return false;
+               },
+               write: function( _newName, _newData){
+                       return false;
+               },
+               viwerApplicationList: function(){
+                       var driver = FILE_CONTROLER.getDriver( this );
+                       if( typeof driver.viwerApplicationList === 'function'){
+                               return driver.viwerApplicationList( this );
+                       }
+                       return FileDriverBase.viwerApplicationList( this );
+               },
+               editorApplicationList: function(){
+                       var driver = FILE_CONTROLER.editorApplicationList( this );
+                       if( typeof driver.editorApplicationList === 'function'){
+                               return driver.editorApplicationList( this );
+                       }
+                       return FileDriverBase.viwerApps( this );
+               },
+               create: function(){
+                       
+               },
+               sort: function(){
+                       
+               },
+               onCopy: function(){
+                       
+               },
+               onDelete: function(){
+                       
                }
        }
 
@@ -441,7 +480,7 @@ pettanr.file = ( function(){
                        return _data.name || 'No Name';
                },
                getThumbnail: function( _file){
-                       var _data = FILE_CONTROLER.getFileData( _file);
+                       var _data = FILE_CONTROLER.getFileData( _file),
                                _type = _data.type,
                                _className = '';
                        if( _type === pettanr.file.FILE_TYPE.FOLDER){
@@ -470,14 +509,35 @@ pettanr.file = ( function(){
                                className:      ' file-type-' + _className
                        }
                },
-               isWritable: function( _file){
-                       return false;
+               getSummary: function( _file ){
+                       var _data = FILE_CONTROLER.getFileData( _file ),
+                               _type = _data.type;
+                       if( _type === pettanr.file.FILE_TYPE.FOLDER){
+                               return 'folder';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.IMAGE){
+                               return 'image file';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.TEXT){
+                               return 'text file';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.HTML){
+                               return 'html document file';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.CSV){
+                               return 'csv daat file';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.JSON){
+                               return 'json data file';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.XML){
+                               return 'xml data file';
+                       }
+                       return '';
                },
-               isSortable: function( _file){
-                       return false;
-               },              
-               isCreatable: function( _file){
-                       return false;
+               getUpdatePolicy: function( _file){
+                       // debug用 全てのメニューを許可
+                       return pettanr.file.FILE_UPDATE_POLICY.SRWC;
                },
                read: function(){
                        return false;
@@ -485,6 +545,12 @@ pettanr.file = ( function(){
                write: function( _newName, _newData){
                        return false;
                },
+               viwerApplicationList: function(){
+                       return [];
+               },
+               editorApplicationList: function(){
+                       return [];
+               },
                onCreate: function(){
                        
                },
@@ -499,12 +565,6 @@ pettanr.file = ( function(){
                }
        }
 
-       function getFileObject( TREE, parentFile, data){
-               var _file = FILE_OBJECT_POOL.length > 0 ? FILE_OBJECT_POOL.shift() : new FileClass();
-               _file.init( TREE, parentFile, data);
-               return _file;
-       }
-
        var ROOT_FILEDATA = {
                        name:           'system root',
                        type:           FILE_TYPE_IS_FOLDER,
@@ -519,7 +579,7 @@ pettanr.file = ( function(){
                        .dispatchFileEvent( new FileEventClass( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, ROOT_FILE, 'children', null));
        }
        function createFileEvent( _eventType, _file, _key, _value){
-               return new FileEventClass( _eventType, _file, _key, _value)
+               return new FileEventClass( _eventType, _file, _key, _value);
        }
        function createFileTypeID(){
                return ++numFileType;
@@ -531,7 +591,7 @@ pettanr.file = ( function(){
                        //FILE_CONTROLER.init();
                        delete pettanr.file.init;
                },
-               resisterDriver: function( _driver){
+               registerDriver: function( _driver){
                        _driver.prototype = FileDriverBase;
                        /*
                         * File API
@@ -555,6 +615,7 @@ pettanr.file = ( function(){
                        return _file instanceof FileClass;
                },
                FILE_TYPE: {
+                       UNKNOWN:        0,
                        FOLDER:         FILE_TYPE_IS_FOLDER,
                        IMAGE:          createFileTypeID(),
                        TEXT:           createFileTypeID(),
@@ -570,6 +631,28 @@ pettanr.file = ( function(){
                        ERROR:          3,
                        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),
+                       CREATE:         1,
+                       WRAITE:         2,
+                       RENAME:         4,
+                       SORT:           8
+               },
                TREE_EVENT: {
                        UPDATE:                         'onTreeUpdate'
                },
@@ -578,7 +661,7 @@ pettanr.file = ( function(){
                        GET_SEQENTIAL_FILES:'gotSeqentilFiles'
                },
                FILE_DATA_PROPERTY_RESERVED: [
-                       'children', 'driver', 'state', 'type', 'name'
+                       'children', 'driver', 'state', 'type'
                ]
        }
 })();
@@ -589,15 +672,16 @@ pettanr.finder = ( function(){
                ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
                ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
                ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
-               ICON_CLASSNAME = ELM_ORIGIN_FINDER_ICON.getElementsByTagName( 'div')[0].className,
+               ICON_CLASSNAME = 'finder-icon-thumbnail',
                FINDER_ICON_POOL = [],
                BREAD_OBJECT_POOL = [];
        
        var FinderIconClass = function(){
                var elmContainer,
                        ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
-                       ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-thumbnail', 'div')[0],
-                       ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename', 'div')[0],
+                       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_WRAPPER.onclick = onClick;
@@ -615,6 +699,7 @@ pettanr.finder = ( function(){
                                ELM_THUMBNAIL.style.backgroundImage = '';
                        }
                        ELM_FILENAME.innerHTML = file.getName();
+                       ELM_DESCRIPTION.innerHTML = file.getSummary();
                }
                function resize(){
                        ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
@@ -716,7 +801,7 @@ pettanr.finder = ( function(){
                }
        }
        
-       var FinderClass = function( ELM_CONTAINER, tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
+       var FinderClass = function( ELM_CONTAINER, tree, header, footer ){
                var ICON_ARRAY = [],
                        BREAD_ARRAY = [],
                        elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
@@ -725,23 +810,26 @@ pettanr.finder = ( function(){
                        elmSidebarButton = nodesDiv[1],
                        elmStyleButton = nodesDiv[2],
                        elmActionButton = nodesDiv[3],
-                       elmBody = nodesDiv[ nodesDiv.length -1],
+                       elmBody = nodesDiv[ nodesDiv.length -1 ],
                        //tree = pettanr.file.createTree( TREE_TYPE),
                        headX,
                        headY,
-                       headH = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
+                       headH = pettanr.util.getElementSize( nodesDiv[0] ).height,
                        bodyY,
                        currentFile = null,
                        breadW = 90,
-                       size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON),
+                       size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON ),
                        iconW = size.width,
                        iconH = size.height,
-                       style = 0;
-                       w = 800;
-
+                       style = 0,
+                       w, h, bodyH;
+                       
                tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
                
-               function draw(){
+               function draw( _w, _h ){
+                       w = Type.isFinite( _w ) === true ? _w : w;
+                       h = Type.isFinite( _h ) === true ? _h : h;
+                       bodyH = _h - headH;
                        var     l = tree.hierarchy() +1,
                                m = BREAD_ARRAY.length,
                                _file, _bread;
@@ -764,20 +852,28 @@ pettanr.finder = ( function(){
                                if( i < m){
                                        ICON_ARRAY[ i].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick);
                                } else {
-                                       ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick));
+                                       ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, _w, i, style, onBodyClick));
                                }
                        }
+                       if( _file.getState() === pettanr.file.FILE_STATE.LOADING ){
+                               elmBody.className = 'finder-body loading';
+                       } else {
+                               elmBody.className = 'finder-body';
+                       }
+                       elmBody.style.height = bodyH + 'px';
+                       
                        while( l < ICON_ARRAY.length){
                                ICON_ARRAY.pop().destroy();
                        }
                }
+               
                function onHeadClick( i){
                        var l = BREAD_ARRAY.length -1;
                        if( i < l){
                                var _file = tree.getParentFileAt( i);
                                if( _file !== null){
                                        tree.up( i);
-                                       draw();
+                                       draw( w, h );
                                }
                        }
                }
@@ -785,9 +881,9 @@ pettanr.finder = ( function(){
                        var l = ICON_ARRAY.length;
                        if( i < l){
                                var _file = tree.getCurrentFile().getChildFileByIndex( i);
-                               if( _file !== null && ( _file.getChildFileLength() > 0 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
+                               if( _file !== null && ( _file.getChildFileLength() !== -1 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
                                        tree.down( i);
-                                       draw();
+                                       draw( w, h );
                                }
                        }
                }
@@ -802,17 +898,28 @@ pettanr.finder = ( function(){
                        bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
                        delete this.init;
                }
-               this.onOpen = function(){
+               this.onOpen = function( _w, _h, _option ){
                        this.init !== undefined && this.init();
-                       draw();
+                       draw( _w, _h );
                }
                this.onClose = function(){
-                       
+                       return true;
                }
-               this.onWindowResize = function( _w, _h){
-                               
+               this.onPaneResize = function( _w, _h){
+                       w = _w;
+                       h = _h;
+                       elmBody.style.height = ( _h - headH ) + 'px';
+                       
+                       for(var i=0, l=ICON_ARRAY.length; i<l; ++i){
+                               ICON_ARRAY[ i].onResize( _w );
+                       }
                }
+               this.MIN_WIDTH = 240;
+               this.MIN_HEIGHT = 240;
        }
+       
+       pettanr.view.registerAsBasicPane( FinderClass );
+       
        function getFinderIcon( _file, _elmContainer, w, index, style, callback){
                var _icon;
                if( FINDER_ICON_POOL.length > 0){
@@ -839,61 +946,73 @@ pettanr.finder = ( function(){
                init: function(){
                        
                },
-               createFinder: function( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
-                       var _finder = new FinderClass( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
+               createFinder: function( _elmTarget, _tree, _header, _footer ){
+                       var _finder = new FinderClass( _elmTarget, _tree, _header, _footer );
                        FINDER_ARRAY.push( _finder);
                        return _finder;
                },
-               createFinderHead: function(){
+               registerFinderHead: function(){
                        
                },
-               resisterFinderPane: function( _finderPane){
+               registerFinderPane: function( _finderPane){
                        
                },
                isFinderInstance: function( _finder){
                        return _finder instanceof FinderClass;
+               },
+               isFinderPaneInstance: function(){
+                       
+               },
+               isFinderHeadInstance: function(){
                }
        }
 })();
 
 
 pettanr.driver = ( function(){
-       var MyAuthorID = 'current_author' in window ? current_author.id : 1,
-               MyArtistID = 'current_artist' in window ? current_artist.id : 1,
+       var MyAuthorID = 'current_author' in window ? current_author.id : ( pettanr.DEBUG ? 1 : -1 ),
+               MyArtistID = 'current_artist' in window ? current_artist.id : ( pettanr.DEBUG ? 1 : -1 ),
                Driver = {
                        getSeqentialFiles: function( _file){
                                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( typeof _json === 'string'){
                                        FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
                                        _data.state = pettanr.file.FILE_STATE.LOADING;
-                                       delete _data.json;
+                                       _data.json = null;
+                                       return;
                                }
                        },
                        getName: function( _file){
                                var _data = FileAPI.getFileData( _file),
                                        _type = _data !== null ? _data.type : null;
-                               if( _type === pettanr.driver.FILE_TYPE.PICTURE){
+                               if( _type === pettanr.driver.FILE_TYPE.PICTURE ){
                                        return [ _data.id, _data.ext ].join( '.');
                                } else
-                               if( _type === pettanr.driver.FILE_TYPE.PANEL){
-                                       return [ _data.t, ':', _data.comic.name || _data.comic.title ].join( '');
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL ){
+                                       return [ _data.t, ':', _data.comic.title ].join( '');
                                } else
-                               if( _type === pettanr.driver.FILE_TYPE.ARTIST){
-                                       return _data.name + '先生';
+                               if( _type === pettanr.driver.FILE_TYPE.COMIC ){
+                                       return _data.title;
                                } else
-                               if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
-                                       return _data.name + '先生';
+                               if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
+                                       return [ _data.id , ':', _data.name, '画伯' ].join( '');
+                               } else
+                               if( _type === pettanr.driver.FILE_TYPE.AUTHOR ){
+                                       return [ _data.id , ':', _data.name, '先生' ].join( '');
                                }
-                               return _data.name || _data.title;
+                               return _data.name;
                        },
                        getThumbnail: function( _file){
-                               var _data = FileAPI.getFileData( _file);
+                               var _data = FileAPI.getFileData( _file),
                                        _type = _data !== null ? _data.type : null;
                                if( _type === pettanr.driver.FILE_TYPE.PICTURE){
                                        return { image: [ pettanr.CONST.RESOURCE_PICTURE_PATH, 'thumbnail/', _data.id, '.', _data.ext ].join( '')};
                                }
-                               if( _data === FILE_DATA_COMIC_ROOT){
+                               if( _data === FILE_DATA_COMICS_ROOT){
                                        return { className: 'file-type-cabinet'};
                                }
                                if( _type === pettanr.driver.FILE_TYPE.COMIC){
@@ -908,23 +1027,66 @@ pettanr.driver = ( function(){
                                if( _type === pettanr.driver.FILE_TYPE.ARTIST){
                                        return { className: 'file-type-artist'};
                                }
-                               if( _type === pettanr.driver.FILE_TYPE.FOLDEER){
+                               if( _type === pettanr.file.FILE_TYPE.FOLDER){
                                        return { className: 'file-type-folder'};
                                }
-                               return { className: 'file-type-folder'};
+                               return { className: 'file-type-broken'};
+                       },
+                       getSummary: function( _file ){
+                               var _data = FileAPI.getFileData( _file),
+                                       _type = _data !== null ? _data.type : null;
+                               if( _type === pettanr.driver.FILE_TYPE.PICTURE){
+                                       return [ _data.width, 'x', _data.height, ', filesize:', _data.filesize, ', lisence:', _data.license ].join( '' );
+                               }
+                               if( _data === FILE_DATA_COMICS_ROOT){
+                                       return 'cabinet file';
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.COMIC){
+                                       return 'comic file';
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL){
+                                       return [ _data.width, 'x', _data.height ].join( '' );
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
+                                       return 'author file';
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.ARTIST){
+                                       return [ '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 ){
+                               var _data = FileAPI.getFileData( _file ),
+                                       _type = _data !== null ? _data.type : null;
+                               return [];
+                       },
+                       editorApplicationList: function( _file ){
+                               var _data = FileAPI.getFileData( _file ),
+                                       _type = _data !== null ? _data.type : null;
+                               return [];
                        }
                },
-               FileAPI = pettanr.file.resisterDriver( Driver),
+               FileAPI = pettanr.file.registerDriver( Driver),
                FILE_DATA_SERVICE_ROOT = {
                        name:           'PettanR root',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       []
                },
-               FILE_DATA_COMIC_ROOT = {
+               FILE_DATA_COMICS_ROOT = {
                        name:           'Comics',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       [],
                        driver:         Driver,
+                       json:           pettanr.CONST.URL_COMICS_JSON
+               },
+               FILE_DATA_PANELS_ROOT = {
+                       name:           'Panels',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver,
                        json:           pettanr.CONST.URL_PANELS_JSON
                },
                FILE_DATA_PICTURE_ROOT = {
@@ -932,17 +1094,25 @@ pettanr.driver = ( function(){
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       [],
                        driver:         Driver,
-                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
+                       json:           pettanr.CONST.URL_RESOURCE_PICTURES_JSON
                },
                FILE_DATA_MY_COMICS_ROOT = {
                        name:           'My Comics',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver
+               },
+               FILE_DATA_LATEST_COMICS = {
+                       name:           'Latest Comics',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       []
                },
                FILE_DATA_MY_PICTURES_ROOT = {
                        name:           'My Pictures',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
-                       children:       []
+                       children:       [],
+                       driver:         Driver,
+                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
                },
                FILE_DATA_AUTHOR_ROOT = {
                        name:           'Authors',
@@ -954,8 +1124,8 @@ pettanr.driver = ( function(){
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       []
                },
-               FILE_DATA_LICENSE_ROOT = {
-                       name:           'Original Licenses',
+               FILE_DATA_LISENCE_ROOT = {
+                       name:           'Original Lisences',
                        type:           pettanr.file.FILE_TYPE.FOLDER,
                        children:       []
                },
@@ -972,158 +1142,199 @@ pettanr.driver = ( function(){
                BALLOON_TEMPLETE_ARRAY = [],
                ORIGINAL_LICENSE_ARRAY = [],
                BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
-       FILE_DATA_SERVICE_ROOT.children.push( FILE_DATA_COMIC_ROOT, FILE_DATA_PICTURE_ROOT, FILE_DATA_LICENSE_ROOT, FILE_DATA_BALLOON_ROOT);
-       FILE_DATA_COMIC_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_AUTHOR_ROOT);
+       FILE_DATA_SERVICE_ROOT.children.push( FILE_DATA_COMICS_ROOT, FILE_DATA_PICTURE_ROOT, FILE_DATA_PANELS_ROOT, FILE_DATA_LISENCE_ROOT, FILE_DATA_BALLOON_ROOT);
+       FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_LATEST_COMICS, FILE_DATA_AUTHOR_ROOT);
        FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
        
        FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
-       
-       function onLoadJson( _file, _json){
+
+       function onLoadJson( _file, _json ){
                var _access = FileAPI.getFileDataAccess( _file),
                        _data = _access !== null ? _access.DATA : null,
-                       l = _json.length;
+                       l;
                if( _data === null){
                        onErrorJson( _file);
                        return;
                }
                _data.state = pettanr.file.FILE_STATE.OK;
-               if( l === 0) return;
-               for(var i=0; i<l; ++i){
-                       buildFileData( _json[ i], _data);
+               
+               if( Type.isArray( _json ) === true ){
+                       l = _json.length;
+                       if( l === 0) return;
+                       for( var i=0; i<l; ++i ){
+                               buildFileData( _json[ i], _data);
+                       }                       
+               } else
+               if( _json.id ){
+                       buildFileData( _json, _data );
                }
                _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
        }
-       function onErrorJson( _file){ 
+       function onErrorJson( _file ){ 
                var _data = FileAPI.getFileData( _file);
                if( _data !== null){
                        _data.state = pettanr.file.FILE_STATE.ERROR;
                }
        }
-       function buildFileData( _data, _parent){
-               var _type, _array,
-                       _id = _data.id,
-                       i, l;
-               if( _parent === FILE_DATA_COMIC_ROOT){
+       function buildFileData( _data, _parent ){
+               var _array, i, l;
+               // Panel
+               if( _parent === FILE_DATA_PANELS_ROOT ){
                        _data.type = pettanr.driver.FILE_TYPE.PANEL;
                        _array = PANEL_ARRAY;
                } else
-               if( _parent === FILE_DATA_PICTURE_ROOT){
+               // Comic
+               if( _parent === FILE_DATA_COMICS_ROOT ){
+                       _data.type = pettanr.driver.FILE_TYPE.COMIC;
+                       _array = COMIC_ARRAY;
+               } else
+               if( _parent.type === pettanr.driver.FILE_TYPE.COMIC ){
+                       _array = COMIC_ARRAY;
+               } else
+               // Lisence
+               if( _parent === FILE_DATA_LISENCE_ROOT ){
+                       _data.type = pettanr.driver.FILE_TYPE.LICENSE;
+                       _array = ORIGINAL_LICENSE_ARRAY;
+               } else
+               // Author
+               if( _parent === FILE_DATA_AUTHOR_ROOT ){
+                       _data.type = pettanr.driver.FILE_TYPE.AUTHOR;
+                       _array = AUTHOR_ARRAY;
+               } else
+               // Artist
+               if( _parent === FILE_DATA_ARTIST_ROOT ){
+                       _data.type = pettanr.driver.FILE_TYPE.ARTIST;
+                       _array = ARTIST_ARRAY;
+               } else          
+               // Picture
+               if( _parent === FILE_DATA_PICTURE_ROOT || _parent === FILE_DATA_MY_PICTURES_ROOT ){
                        _data.type = pettanr.driver.FILE_TYPE.PICTURE;
                        _array = RESOURCE_PICTURE_ARRAY;
-                       
                        // original_license を含まなければ、license object を削除して ビットデータ で保持
-                       // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LICENSE_ROOT)
+                       // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LISENCE_ROOT)
                        var _license = _data.license,
+                               _rule,
                                _Math_pow = Math.pow,
                                _bits = 0;
                        if( typeof _license === 'object'){
                                for( i=0, l=BASIC_LICENSES.length; i<l; ++i){
-                                       if( typeof _license[ BASIC_LICENSES[ i]] === 'number'){
+                                       _rule = _license[ BASIC_LICENSES[ i]]
+                                       if( typeof _rule === 'number' && _rule === 1 ){
                                                _bits += _Math_pow( 2, i);
                                        }
                                }
                                _data.license = _bits;
                        }
-               } else
-               if( _parent === FILE_DATA_LICENSE_ROOT){
-                       _data.type = pettanr.driver.FILE_TYPE.LICENSE;
-                       _array = ORIGINAL_LICENSE_ARRAY;
+               } else {
+                       alert( 'error' );
                }
                
                _data.driver = Driver;
                
                // _array に _data を格納 または 上書き
-               if( typeof _id === 'number'){
-                       var __data = _array[ _id];
-                       if( __data){
+               if( typeof _data.id === 'number' && _data.id > 0 ){
+                       var _id = _data.id - 1,
+                               __data = _array[ _id ],
+                               _reserved = pettanr.file.FILE_DATA_PROPERTY_RESERVED.join( ', ' );
+                       if( __data ){
                                for( var key in _data){
-                                       __data[ key ] = _data[ key ];
+                                       if( _reserved.indexOf( key ) === -1 ){
+                                               __data[ key ] = _data[ key ];
+                                       }
                                }
                                _data = __data; // このタイミングで参照が切れるので注意!!
                        } else {
-                               _array[ _id] = _data;
+                               _array[ _id ] = _data;
                        }
+               } else {
+                       alert( 'error' );
                }
-               
-               if( _parent === FILE_DATA_COMIC_ROOT){
-                       if( _data.comic && _data.author){
-                               var _comic = getFolderData( _data, 'comic', FILE_DATA_COMIC_ROOT),
-                                       _comics = getFolderData( _data, 'author', FILE_DATA_AUTHOR_ROOT).children;
-                               _comic.children.push( _data);
-                               pettanr.util.getIndex( _comics, _comic) === -1 && _comics.push( _comic);
-                       }
-                       // picture data をファイルに取り出し
-                       var _elements = _data.panel_elements || [],
-                               _elm;
-                       for(var 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); // 上記参照切れに備えてここで上書き
+
+               // Author
+               // Artist
+               if( _parent === FILE_DATA_AUTHOR_ROOT || _parent === FILE_DATA_ARTIST_ROOT ){
+                       addChildData( _parent, _data );
+               } else
+               // Comic + Panels
+               if( _parent.type === pettanr.driver.FILE_TYPE.COMIC || _parent === FILE_DATA_COMICS_ROOT ){
+                       var _panels = _data.panels,
+                               _panel;
+                       if( _panels && Type.isArray( _panels ) === true ){
+                               
+                               for( i=0, l=_panels.length; i<l; ++i){
+                                       _panel = buildFileData( _panels[ i ], FILE_DATA_PANELS_ROOT );
+                                       /*
+                                        * 間違い! t 順に格納
+                                        */
+                                       addChildData( _data, _panel );
                                }
-                               if( _elm.resource_picture_id && RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id]){
-                                       _elm.resource_picture = RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id];
+                               delete _data.panels;
+                       } else {
+                               if( _data.json !== null ){
+                                       _data.json = true;
                                }
+                               if( Type.isArray( _data.children ) === false ){
+                                       _data.children = [];
+                               }                               
+                       }
+                       var _author = _data.author || getResource( AUTHOR_ARRAY, _data.author_id );
+                       if( _author ){
+                               _data.author = _author = buildFileData( _author, FILE_DATA_AUTHOR_ROOT );
+                               addChildData( _author, _data );
+                               _author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, _data );
+                       }
+                       if( _parent === FILE_DATA_COMICS_ROOT ){
+                               addChildData( FILE_DATA_LATEST_COMICS, _data);
                        }
                } else
-               if( _parent === FILE_DATA_PICTURE_ROOT){
-                       _data.artist && getFolderData( _data, 'artist', FILE_DATA_ARTIST_ROOT).children.push( _data);
-               }
-               
-               return _data;
-       }
-       /**
-        * folder には Artist, Author, Comic, 
-        */
-       function getFolderData( _data, _key, _parentData){
-               if( typeof _data[ _key ] !== 'object') return {children:[]};
-               var _ret,
-                       _id = _data[ _key ].id,
-                       _array;
-               if( typeof _id !== 'number') return {children:[]};
-               
-               _array =        _parentData === FILE_DATA_ARTIST_ROOT ? ARTIST_ARRAY :
-                                       _parentData === FILE_DATA_AUTHOR_ROOT ? AUTHOR_ARRAY :
-                                       _parentData === FILE_DATA_COMIC_ROOT ? COMIC_ARRAY : []
+               // Panel
+               if( _parent === FILE_DATA_PANELS_ROOT ){
+                       _data.comic = getResource( COMIC_ARRAY, _data.comic_id );
+                       _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
 
-               if( typeof _array[ _id] === 'object'){
-                       var __data = _array[ _id];
-                       for( var i in _data[ _key ]){
-                               __data[ i ] = _data[ _key ][ i ];
+                       // picture data をファイルに取り出し
+                       if( Type.isArray( _data.panel_elements ) === true ){
+                               var _elements,
+                                       _elm, _rpic;
+                               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); // 上記参照切れに備えてここで上書き
+                                       } else {
+                                               _elm.resource_picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.resource_picture_id );
+                                       }
+                               }                               
+                       }
+               } else
+               // Picture
+               if( _data.type == pettanr.driver.FILE_TYPE.PICTURE ){
+                       var _artist = _data.artist || getResource( ARTIST_ARRAY, _data.artist_id );
+                       if( _artist){
+                               _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
+                               addChildData( _artist, _data );
+                               _artist.id === MyArtistID && addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
                        }
-                       return _data[ _key ] = __data;// このタイミングで参照が切れるので注意!!
                }
-               
-               _ret = _array[ _id ] = _data[ _key ];
-               if( _ret.title){
-                       _ret.name = _ret.title;
-                       delete _ret.title;
+               return _data;
+       }
+       function addChildData( _parent, _child ){
+               if( Type.isArray( _parent.children ) === false){
+                       _parent.children = [];
                }
-               _ret.children = [];
-               _ret.driver = Driver;
-               
-               if( _parentData === FILE_DATA_AUTHOR_ROOT){
-                       _ret.type = pettanr.driver.FILE_TYPE.AUTHOR;
-                       _id === MyAuthorID && FILE_DATA_MY_COMICS_ROOT.children.push( _ret);
-               } else
-               if( _parentData === FILE_DATA_ARTIST_ROOT){
-                       _ret.type = pettanr.driver.FILE_TYPE.ARTIST;
-                       _id === MyArtistID && FILE_DATA_MY_PICTURES_ROOT.children.push( _ret);
-               } else
-               if( _parentData === FILE_DATA_COMIC_ROOT){
-                       _ret.type = pettanr.driver.FILE_TYPE.COMIC;
-                       return _ret;
-               } else {
-                       _ret.type = pettanr.file.FILE_TYPE.FOLDER;
+               pettanr.util.getIndex( _parent.children, _child ) === -1 && _parent.children.push( _child );
+       }
+       function getResource( _array, _id ){
+               if( Type.isArray( _array ) === false || Type.isNumber( _id ) === false || _id < 1 ) return null;
+               var _data = _array[ _id - 1 ];
+               if( !_data ){
+                       _data = _array[ _id - 1 ] = {};
                }
-               
-               _parentData.children.push( _ret);
-               
-               return _ret;
+               return _data;
        }
 
        return {
                createComicTree: function(){
-                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMIC_ROOT);
+                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMICS_ROOT);
                },
                createPictureTree: function(){
                        return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
@@ -1131,8 +1342,12 @@ pettanr.driver = ( function(){
                createServiceTree: function(){
                        return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
                },
-               isPettanrFile: function( _file){
-                       
+               isPettanrFileInstance: function( _file){
+                       if( pettanr.file.isPettanFileInstance( _file) === true){
+                               var _data = FileAPI.getFileData( _file);
+                               return _data !== null && _data.driver === Driver;
+                       }
+                       return false;
                },
                FILE_TYPE: {
                        COMIC:                          FileAPI.createFileTypeID(),
@@ -1147,12 +1362,44 @@ 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.backyard = {
+               onOpen: function( _w, _h, _option ){
+               },
+               onClose: function(){
+               },
+               onWindowResize: function( _w, _h){
+               }
+       }
+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 );
+               }
+       }
 
 pettanr.gallery = ( function(){
        var finder,
                elmContainer = document.getElementById( 'gallery'),
-               option;
-               
+               option,
+               pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
        return {
                init: function( _option){
                        option = _option;
@@ -1162,16 +1409,16 @@ pettanr.gallery = ( function(){
                        finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
                        delete pettanr.gallery.firstOpen;
                },
-               onOpen: function(){
+               onOpen: function( _w, _h, _option ){
                        pettanr.gallery.firstOpen !== undefined && pettanr.gallery.firstOpen();
-                       finder.onOpen();
+                       finder.onOpen( _w, _h - pageHeaderH, _option );
                        
                },
                onClose: function(){
                        finder.onClose();
                },
                onWindowResize: function( _w, _h){
-                       finder.onWindowResize( _w, _h);
+                       finder.resize( _w, _h - pageHeaderH );
                }
        }
 })();
@@ -1179,7 +1426,8 @@ pettanr.gallery = ( function(){
 pettanr.cabinet = ( function(){
        var finder,
                elmContainer = document.getElementById( 'cabinet'),
-               option;
+               option,
+               pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
                
        return {
                init: function( _option){
@@ -1190,16 +1438,16 @@ pettanr.cabinet = ( function(){
                        finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
                        delete pettanr.cabinet.firstOpen;
                },
-               onOpen: function(){
+               onOpen: function( _w, _h, _option ){
                        pettanr.cabinet.firstOpen !== undefined && pettanr.cabinet.firstOpen();
-                       finder.onOpen();
+                       finder.onOpen( _w, _h - pageHeaderH, _option );
                        
                },
                onClose: function(){
                        finder.onClose();
                },
                onWindowResize: function( _w, _h){
-                       finder.onWindowResize( _w, _h);
+                       finder.resize( _w, _h - pageHeaderH);
                }
        }
 })();
@@ -1212,7 +1460,13 @@ pettanr.fn( pettanr.view);
 pettanr.fn( pettanr.overlay);
 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);
 pettanr.fn( pettanr.gallery);