OSDN Git Service

client is version0.4.14, display file-loading
[pettanr/pettanr.git] / app / assets / javascripts / system.js
index 88a4ac3..05df86c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR system.js
- *   version 0.4.2
+ *   version 0.4.5
  *   
  * author:
  *   itozyun
@@ -35,41 +35,14 @@ pettanr.io = ( function(){
  * 画像一覧を読み込むタイミング
  */
 pettanr.file = ( function(){
-       var TREE_TYPE_IS_COMIC = 1,
-               TREE_TYPE_IS_IMAGE = 2,
-               FILE_TYPE_IS_FOLDER = 1,
-               FILE_TYPE_IS_COMIC = 10,
-               FILE_TYPE_IS_PANEL = 11,
-               FILE_TYPE_IS_IMAGE = 20,
-               FILE_TYPE_IS_HTML = 30,
-               FILE_TYPE_IS_SETTING = 40,
-               FOLDER_TYPE_IS_COMIC = 1,
-               FILE_STATE_IS_UNKNOWN = 0,
-               FILE_STATE_IS_OK = 1,
-               FILE_STATE_IS_LOADING = 2,
-               FILE_STATE_IS_ERROR = 3,
-               FILE_STATE_IS_BROKEN = 4,
-               TREE_EVENT_UPDATE = 'onTreeUpdate',
-               FILE_EVENT_UPDATE_ATTRIVUTE = 'onFileUpdate',
-               FILE_EVENT_GET_SEQENTIAL_FILES = 'gotSeqentilFiles',
-               ROLE_IS_SUPER_USER = 2^4,
-               ROLE_IS_OWNER = 2^3,
-               ROLE_IS_CREATOR = 2^2,
-               ROLE_IS_ARTIST = 2^1,
-               ROLE_IS_VISITOR = 2^0,
-               ROLE_IS_UNKROWN = 2^-1,
-               UPDATE_POLICY_SOCAV = parseInt( '11111', 2),// s: super user
-               UPDATE_POLICY_SOCA_ = parseInt( '11110', 2),// o: owner( comic || panel || picture )
-               UPDATE_POLICY_SOC__ = parseInt( '11100', 2),// c: creator
-               UPDATE_POLICY_SO_A_ = parseInt( '11010', 2),// a: artist
-               UPDATE_POLICY_SO___ = parseInt( '11000', 2),// v: visitor
-               UPDATE_POLICY__O___ = parseInt( '01000', 2),// l: lisence manager
-               UPDATE_POLICY_S____ = parseInt( '10000', 2),
-               UPDATE_POLICY______ = parseInt( '00000', 2),
+       var FILE_TYPE_IS_FOLDER = 1,
+               numFileType = FILE_TYPE_IS_FOLDER,
                FILEDATA_RESITER = [],                  // store all of fileData( json object )
-               FILEDATA_HAS_domainID_RESISTER = {},
                FILEDATA_ACCESS = [],                   // file operations for Kernel only ! hide from Out of pettanr.file
-               FILE_OBJECT_POOL = [];
+               FILE_OBJECT_POOL = [],
+               EVENT_LISTENER_RESISTER = [],
+               TREE_ARRAY = [],
+               TREE_ACCESS_ARRAY = [];
        
        var REQUEST_CONTROLER = ( function(){
                var REQUEST_TICKET_RESISTER = [],
@@ -106,9 +79,6 @@ pettanr.file = ( function(){
                }
                
                return {
-                       init: function(){
-                               delete REQUEST_CONTROLER.init;
-                       },
                        getNumTask: function(){
                                return REQUEST_TICKET_RESISTER.length;
                        },
@@ -124,118 +94,23 @@ pettanr.file = ( function(){
 
 
 
-       var FILE_CONTROLER = ( function(){
-               var EVENT_LISTENER_RESISTER = [],
-                       TREE_ARRAY = [],
-                       TREE_ACCESS_ARRAY = [],
-                       instance;
-
-               var TreeClass = function( ROOTFILE_DATA){
-                       var UID = TREE_ACCESS_ARRAY.length,
-                               PARENT_FILE_RESITER = [],
-                               ACCESS = {
-                                       fileEventChatcher:      dispatchFileEvent,
-                                       destroy:                        onDestroy
-                               },
-                               EVENT_LISTENER_ARRAY = [],
-                               rootFile,
-                               rootFileData,
-                               currentFile,
-                               currentFileData,
-                               instance;
-                               
-                       TREE_ACCESS_ARRAY.push( ACCESS);
-                       
-                       function onDestroy(){
-                               
-                       }
-                       
-                       function dispatchFileEvent( e){
-                               var _eventType = e.eventType,
-                                       _targetFile = e.targetFile,
-                                       _ticket, _type, _file, _callback,
-                                       l = EVENT_LISTENER_RESISTER.length;
-                               for(var i=0; i<l; ++i){
-                                       _ticket = EVENT_LISTENER_RESISTER[i],
-                                       _type = _ticket.eventType,
-                                       _file = _ticket.targetFile,
-                                       _callback = _ticket.callBack;
-                                       if( _eventType === _type && _file.getUID() === _targetFile.getUID()){
-                                               _callback( _type, _targetFile, e.key, e.value);
-                                       } else if( _type === TREE_EVENT_UPDATE && _eventType === FILE_EVENT_GET_SEQENTIAL_FILES){
-                                               _callback( TREE_EVENT_UPDATE, _targetFile);
-                                       }
-                               }
-                       }
-                       
-                       return {
-                               init: function(){
-                                       instance = this;
-                                       currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
-                                       rootFile.init();
-                                       FILE_CONTROLER.getSeqentialFiles( currentFile);
-                                       delete this.init;
-                               },
-                               getUID: function(){ return UID},
-                               getRootFile : function(){
-                                       return rootFile;
-                               },
-                               getCurrentFile: function(){
-                                       return currentFile;
-                               },
-                               hierarchy: function(){
-                                       return PARENT_FILE_RESITER.length;
-                               },
-                               getParentFileAt: function( _index){
-                                       var l = PARENT_FILE_RESITER.length;
-                                       if( typeof _index !== 'number' || _index < 0 || _index >= l) return null;
-                                       return PARENT_FILE_RESITER[ l -1 -_index];
-                               },
-                               down: function( _index){
-                                       if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
-                                       PARENT_FILE_RESITER.unshift( currentFile);
-                                       currentFile = currentFile.getChildFileByIndex( _index);
-                                       FILE_CONTROLER.getSeqentialFiles( currentFile);
-                                       return currentFile;
-                               },
-                               up: function( _index){
-                                       var l = PARENT_FILE_RESITER.length;
-                                       if( l === 0) return null;
-                                       if( typeof _index === 'number'){
-                                               if( _index >= l) return null;
-                                               currentFile = this.getParentFileAt( _index);
-                                               PARENT_FILE_RESITER.splice( 0, l -_index);
-                                       } else {
-                                               currentFile = PARENT_FILE_RESITER.shift();
-                                       }
-                                       FILE_CONTROLER.getSeqentialFiles( currentFile);
-                                       return currentFile;     
-                               },
-                               addTreeEventListener: function( _eventType, _callback){
-                                       EVENT_LISTENER_RESISTER.push( new FileEventTicketClass( null, _eventType, _callback));
-                               },
-                               removeTreeEventListener: function( _eventType, _callback){
-                                       
-                               },
-                               createSearchResultFolder: function( _searchParam){
-                                       
-                               },
-                               destroySearchResultFolder: function( _searchParam){
-                                       
-                               },
-                               destroy: function(){
-                                       destroyTree( UID);
-                               }
-                       }
-               };
-               /**
-                * _access.DATA === FILEDATA_RESITER[uid]
-                */
-               function getFileDataAccess( UIDorFILEorFILEDATA){
-                       var l = FILEDATA_ACCESS.length,
-                               _uid,
-                               _data,
-                               _access;
+       var FILE_CONTROLER = {
+               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;
@@ -247,246 +122,200 @@ pettanr.file = ( function(){
                                _data = UIDorFILEorFILEDATA || null;
                        }
                        
-                       if( _data === null || !_data) return null;
-                       for(var i=0; i<l; ++i){
+                       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;
-               }
-               function getChildren( UIDorFILE){
-                       var _access = getFileDataAccess( UIDorFILE);
-                       return  _access !== null ? _access.DATA.CHILDREN : null
-               }
-               function onLoadJson( _file, _json){
-                       var _access = getFileDataAccess( _file),
-                               _data = _access !== null ? _access.DATA : null,
-                               l = _json.length,
-                               _fileData;
-                       if( _data == null){
-                               onErrorJson( _file);
-                               return;
-                       }
-                       if( l === 0) return;
-                       if( !_data.children){
-                               _data.children = [];
+               },
+               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.getFileData( _file),
+                               _policy;
+                       if( typeof _driver.getUpdatePolicy === 'function'){
+                               _policy = _driver.getUpdatePolicy( _file );
+                               
                        }
-                       var _children = _data.children,
-                               _childType = _data.childType,
-                               _newData,
-                               _rFolderData,
-                               _artistFolderData, _artistFolder,
-                               _comicFolderData, _comicFolder,
-                               _authorFolderData, _authorFolder,
-                               _reaourceID = buildDomainID( _data.json, _childType);
-
-                       for(var i=0; i<l; ++i){
-                               _newData = buildFileData( _json[ i], _data.json, _data, _childType);
-
-                               if( _reaourceID !== null){
-                                       _rFolderData = getDomainFolder( _reaourceID, _childType, _file);
-                                       _rFolderData.children.push( _newData);
-                               }
-                               if( _newData.artist){
-                                       _artistFolderData = _artistFolderData || getDomainFolder( buildDomainID( _data.json, 'artist'), 'Artists', _file);
-                                       _artistFolder = _artistFolder || new FileClass( SYSTEM_TREE, _file, _artistFolderData);
-                                       _rFolderData = getDomainFolder( buildDomainID( _artistFolderData.rID, '' +_newData.artist.id), _newData.artist.name, _artistFolder);
-                                       _rFolderData.children.push( _newData);
-                               }
-                               if( _newData.comic){
-                                       _comicFolderData = _comicFolderData || getDomainFolder( buildDomainID( _data.json, 'comic'), 'Comics', _file);
-                                       _comicFolder = _comicFolder || new FileClass( SYSTEM_TREE, _file, _comicFolderData);
-                                       _rFolderData = getDomainFolder( buildDomainID( _comicFolderData.rID, '' +_newData.comic.id), _newData.comic.title, _comicFolder);
-                                       _rFolderData.children.push( _newData);
-                               }       
-                               if( _newData.author){
-                                       _authorFolderData = _authorFolderData || getDomainFolder( buildDomainID( _data.json, 'author'), 'Author', _file);
-                                       _authorFolder = _authorFolder || new FileClass( SYSTEM_TREE, _file, _authorFolderData);
-                                       _rFolderData = getDomainFolder( buildDomainID( _authorFolderData.rID, '' +_newData.author.id), _newData.author.name, _authorFolder);
-                                       _rFolderData.children.push( _newData);
-                               }
+                       if( typeof _policy !== 'number') {
+                               _policy = FileDriverBase.getUpdatePolicy( _file )
                        }
-                       delete _data.json;
-                       _artistFolder && _artistFolder.collect();
-                       _comicFolder && _comicFolder.collect();
-                       _authorFolder && _authorFolder.collect();
-                       _access.fileEventChatcher( new FileEventClass( FILE_EVENT_GET_SEQENTIAL_FILES, _file, 'children', null));
-               }
-               function onErrorJson( _file){
-                       var _access = getFileDataAccess( _file),
-                               _data = _access !== null ? _access.DATA : null;
-                       if( _data !== null){
-                               _data.state = FILE_STATE_IS_ERROR;
+                       return _policy % ( _bit * 2) >= _bit;
+               },
+               getUID: function ( _filedata){
+                       var l = FILEDATA_RESITER.length;
+                       for( var i=0; i<l; ++i){
+                               if( FILEDATA_RESITER[ i] === _filedata) return i;
                        }
-               }
-               function buildFileData( _data, _url, _parent, _type){
-                       _data.type = _type;
-
-                       if( _type === FILE_TYPE_IS_PANEL){
-                               _data.comicFileData = _parent;
+                       return -1;
+               },
+               getSeqentialFiles: function( _file){
+                       var _driver = FILE_CONTROLER.getDriver( _file);
+                       if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
+                               _driver.getSeqentialFiles( _file);
                        }
-
-                       FILEDATA_RESITER.push( _data);
+               },
+               updateFileAttribute: function( _uid, key, _value, _opt_callback){
+                       var _data = FILE_CONTROLER.getFileDataAccess( _uid),
+                               _type = _data.TYPE;
                        
-                       return _data;
-               }
-               function buildDomainID( _url, _type){
-                       if( !_url) return null;
-                       var _typeStr = null;
+               },                      
+               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){
                        
-                       if( typeof _type !== 'number'){
-                               _typeStr = _type
-                       } else
-                       if( _type === FILE_TYPE_IS_IMAGE){
-                               _typeStr = 'image';
-                       } else
-                       if( _type === FILE_TYPE_IS_COMIC){
-                               _typeStr = 'comic';
+               },
+               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( _type === FILE_TYPE_IS_PANEL){
-                               _typeStr = 'panel';
+               },
+               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);
+                                       }
+                               }
                        }
-                       if( _typeStr === null) return null;
-                       
-                       return [ _url.replace(/https?:\/\/([^\/]*).*/, '$1'), _typeStr].join('_');
                }
-       /**
-        * getFileByResourceID( _domainID, opt_name, opt_folder)
-        * opt 指定で 新しいフォルダの作成
-        * rID を持つ Object は {} にも格納.
-        */
-               function getDomainFolder( _domainID, opt_name, opt_folder){
-                       if( FILEDATA_HAS_domainID_RESISTER[ _domainID]){
-                               return FILEDATA_HAS_domainID_RESISTER[ _domainID];
-                       }
-                       if( !opt_name && !opt_folder) return;
-                       
-                       var _fileName;
-                       
-                       if( typeof opt_name === 'string'){
-                               _fileName = opt_name;
-                       } else
-                       if( opt_name === FILE_TYPE_IS_IMAGE){
-                               _fileName = 'Pictures';
-                       } else
-                       if( opt_name === FILE_TYPE_IS_COMIC){
-                               _fileName = 'Comics';
-                       } else
-                       if( opt_name === FILE_TYPE_IS_PANEL){
-                               _fileName = 'Panels';
-                       } else {
-                               _fileName = typeof opt_name;
-                       }
-                       
-                       var _newData = {
-                               name:           _fileName,
-                               type:           FILE_TYPE_IS_FOLDER,
-                               rID:            _domainID,
-                               children:       []
-                       };
-                       FILEDATA_RESITER.push( _newData);
-                       FILEDATA_HAS_domainID_RESISTER[ _domainID] = _newData;
+       }
+
+       var TreeClass = function( ROOTFILE_DATA){
+               var UID = TREE_ACCESS_ARRAY.length,
+                       PARENT_FILE_RESITER = [],
+                       ACCESS = {
+                               dispatchFileEvent:      dispatchFileEvent,
+                               destroy:                        onDestroy
+                       },
+                       EVENT_LISTENER_ARRAY = [],
+                       rootFile,
+                       rootFileData,
+                       currentFile,
+                       currentFileData,
+                       instance;
                        
-                       if( opt_folder && opt_folder.isChildFile( _newData) === false){
-                               var _access = getFileDataAccess( opt_folder),
-                                       _data = _access !== null ? _access.DATA : null;
-                               _access === null && alert( _domainID)
-                               if( _data !== null){
-                                       _data.children.push( _newData);
-                               }
-                       }
+               TREE_ACCESS_ARRAY.push( ACCESS);
+               
+               function onDestroy(){
                        
-                       return _newData;
                }
                
-               function destroyTree(){
-                       
+               function dispatchFileEvent( e){
+                       var _eventType = e.eventType,
+                               _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,
+                               _callback = _ticket.callBack;
+                               if( _eventType === _type && _uid === _ticket.fileUID){
+                                       _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);
+                               }
+                       }
                }
                
                return {
                        init: function(){
                                instance = this;
-                               delete FILE_CONTROLER.init;
+                               currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
+                               rootFile.init();
+                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               delete this.init;
                        },
-                       createTree: function( _rootFileData){
-                               var _tree = new TreeClass( _rootFileData);
-                               _tree.init();
-                               TREE_ARRAY.push( _tree);
-                               return _tree;
+                       getUID: function(){ return UID},
+                       getRootFile : function(){
+                               return rootFile;
                        },
-                       getFileData: function( _file){
-                               var _access = getFileDataAccess( _file);
-                               return _access !== null ? _access.DATA : null;
+                       getCurrentFile: function(){
+                               return currentFile;
                        },
-                       getUID: function ( _filedata){
-                               var l = FILEDATA_RESITER.length;
-                               for( var i=0; i<l; ++i){
-                                       if( FILEDATA_RESITER[ i] === _filedata) return i;
-                               }
-                               return -1;
+                       hierarchy: function(){
+                               return PARENT_FILE_RESITER.length;
                        },
-                       getSeqentialFiles: function( _file){
-                               var _data = this.getFileData( _file),
-                                       _json = _data ? _data.json : null;
-                               if( _json !== null){
-                                       REQUEST_CONTROLER.getJson( _file, _json, onLoadJson, onErrorJson);
-                               }
+                       getParentFileAt: function( _index){
+                               var l = PARENT_FILE_RESITER.length;
+                               if( typeof _index !== 'number' || _index < 0 || _index >= l) return null;
+                               return PARENT_FILE_RESITER[ l -1 -_index];
                        },
-                       updateFileAttribute: function( _uid, key, _value, _opt_callback){
-                               var _data = getFileDataAccess( _uid),
-                                       _type = _data.TYPE;
-                               
-                       },                      
-                       getFileAttribute: function( _uid, KEYorKEYARRAY){
-                               var _fileData = getFileDataAccess( _uid),
-                                       _type = _fileData.TYPE;
+                       down: function( _index){
+                               if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
+                               PARENT_FILE_RESITER.unshift( currentFile);
+                               currentFile = currentFile.getChildFileByIndex( _index);
+                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               return currentFile;
                        },
-                       move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
-                               var _parentData = getFileDataAccess( _prentUID),
-                                       _parentType = _parentData.TYPE,
-                                       _targetData = getFileDataAccess( _targetfile),
-                                       _targetType = _targetData.TYPE;
+                       up: function( _index){
+                               var l = PARENT_FILE_RESITER.length;
+                               if( l === 0) return null;
+                               if( typeof _index === 'number'){
+                                       if( _index >= l) return null;
+                                       currentFile = this.getParentFileAt( _index);
+                                       PARENT_FILE_RESITER.splice( 0, l -_index);
+                               } else {
+                                       currentFile = PARENT_FILE_RESITER.shift();
+                               }
+                               FILE_CONTROLER.getSeqentialFiles( currentFile);
+                               return currentFile;     
                        },
-                       replace: function( _uid, _file, _newIndex){
-                               
+                       addTreeEventListener: function( _eventType, _callback){
+                               FILE_CONTROLER.addEventListener( null, _eventType, _callback);
                        },
-                       fileEventRellay: function( _targetFile, _targetTree, _event){
-                               var _uid = _targetTree.getUID(),
-                                       _access = TREE_ACCESS_ARRAY[ _uid],
-                                       l = TREE_ARRAY.length,
-                                       _tree, _currentFile;
-                               _access !== undefined && _access.fileEventChatcher( _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.fileEventChatcher( _event);
-                                               }
-                                       }
-                               }
+                       removeTreeEventListener: function( _eventType, _callback){
+                               FILE_CONTROLER.removeEventListener( null, _eventType, _callback);
+                       },
+                       destroy: function(){
+                               FILE_CONTROLER.destroyTree( UID);
                        }
                }
-       })();
+       };
 
        var FileEventTicketClass = function( UID, _eventType, _callback){
-               return {
-                       fileUID:        UID,
-                       eventType:      _eventType,
-                       callBack:       _callback,
-                       destroy: function(){
-                               this.callBack = _callback = null;
-                       }
+               this.fileUID = UID;
+               this.eventType = _eventType;
+               this.callBack = _callback;
+               this.destroy = function(){
+                       this.callBack = _callback = null;
                }
        }
        
        var FileEventClass = function( eventType, file, key, value){
-               return {
-                       eventType:                      eventType,
-                       targetFile:                     file,
-                       updatedAttribute:       key,
-                       updatedValue:           value
-               }
+               this.eventType = eventType;
+               this.targetFile = file;
+               this.updatedAttribute = key;
+               this.updatedValue = value;
        }
 
 /*
@@ -501,32 +330,22 @@ pettanr.file = ( function(){
                if( !data.children){
                        data.children = [];
                }
-               var TYPE = data.type,
-                       name = data.name || null,
-                       thumbnail = null,
-                       uid = FILE_CONTROLER.getUID( data),
-                       CHILDREN = data.children,
-                       instance;
+               var uid = FILE_CONTROLER.getUID( data),
+                       instance = this;
                
                if( uid === -1){
-                       //alert( 'invalid uid');
                        uid = FILEDATA_RESITER.length;
                        FILEDATA_RESITER.push( data);
                }
                
                FILEDATA_ACCESS.push(
                        {
-                               TYPE:                           TYPE,
                                DATA:                           data,
-                               destroy:                        destroy,
                                updateParent:           updateParent,
-                               fileEventChatcher:      dispatchEvent
+                               dispatchFileEvent:      dispatchEvent
                        }
                );
-               function destroy(){
-                       name = thumbnail = parentFile = data = CHILDREN = null;
-                       
-               }
+
                function updateParent( _parent){
                        parentFile = _parent;
                }
@@ -536,157 +355,288 @@ pettanr.file = ( function(){
                
                /* grobal Methods */
                this.init = function(){
-                       instance = this;
                        delete this.init;
                }
-               this.TYPE = function(){
-                       return TYPE;
-               }
-               this.getName = function(){
-                       if( name !== null) return name;
-                       if( data.name){
-                               return data.name;
-                       }
-                       if( TYPE === FILE_TYPE_IS_IMAGE){
-                               name = [ data.id, data.ext].join( '.');
-                       } else
-                       if( TYPE === FILE_TYPE_IS_PANEL){
-                               name = data.comic.title + ' | ' +data.t;
-                       }
-                       return name || 'no_name';
-               }
-               this.getThumbnail = function(){
-                       if( thumbnail !== null) return thumbnail;
-                       if( TYPE === FILE_TYPE_IS_IMAGE){
-                               thumbnail = [ 'thumbnail/', data.id, '.', data.ext].join( '');
-                       }
-                       return thumbnail || null;
-               }
                this.getUID = function(){
                        return uid;
                }
-               this.getState = function(){
-                       return data.state !== undefined ? data.state : FILE_STATE_IS_OK;
-               }
-               this.getChildFileLength = function(){
-                       return CHILDREN && typeof CHILDREN.length === 'number' ? CHILDREN.length : 0;
-               }
+               /*
+                * ファイル構造は TRON のような ハイパーリンク方式 だが、文脈上の 親ファイルが存在する場合がある.
+                */
                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]);
+                       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.getChildFileIndex = function( _FILEorFILEDATA){
-                       if( !CHILDREN || typeof CHILDREN.length !== 'number') 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;
-                       }
-                       return -1;
-               }
-               this.isChildFile = function( _FILEorFILEDATA){
-                       return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
-               }
-               this.getAttribute = function( KEYorKEYARRAY){
-                       return FILE_CONTROLER.getFileAttribute( UID, KEYorKEYARRAY);
-               }
-               this.getSeqentialFiles = function(){
-                       FILE_CONTROLER.getSeqentialFiles( this);
-               }
-               this.updateAttribute = function( key, value, opt_callback){
-                       TREE.updateFileAttribute( UID, key, value, opt_callback);
-               }
                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.addEventListener = function( _eventType, _callback){
-                       FILE_CONTROLER.addEventListener( UID, _eventType, _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, _access.updateParent, _access.dispatchFileEvent;
                }
-               this.removeEventListener = function( _eventType, _callback){
-                       FILE_CONTROLER.removeEventListener( UID, _eventType, _callback);
+       };
+       FileClass.prototype = {
+               isChildFile: function( _FILEorFILEDATA){
+                       return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
+               },
+               getSeqentialFiles: function(){
+                       FILE_CONTROLER.getSeqentialFiles( this);
+               },
+               addEventListener: function( _eventType, _callback){
+                       FILE_CONTROLER.addEventListener( this, _eventType, _callback);
+               },
+               removeEventListener: function( _eventType, _callback){
+                       FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
+               },
+               getChildFileLength: function(){
+                       var children = FILE_CONTROLER.getChildren( this);
+                       return children !== null && typeof children.length === 'number' ? children.length : 0;
+               },
+               getChildFileIndex: function( _FILEorFILEDATA){
+                       var children = FILE_CONTROLER.getChildren( this);
+                       
+                       if( children === null || typeof children.length !== 'number') 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;
+                       }
+                       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 typeof _data.state === 'number' ? _data.state : pettanr.file.FILE_STATE.OK;
+               },
+               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;
+               },
+               create: function(){
+                       
+               },
+               sort: function(){
+                       
+               },
+               onCopy: function(){
+                       
+               },
+               onDelete: function(){
+                       
                }
-               this.collect = function(){
+       }
+
+       /*
+        * FileDriverBase
+        */
+       var FileDriverBase = {
+               getSeqentialFiles: function( _file){
+               },
+               getName: function( _file){
+                       var _data = FILE_CONTROLER.getFileData( _file);
+                       return _data.name || 'No Name';
+               },
+               getThumbnail: function( _file){
+                       var _data = FILE_CONTROLER.getFileData( _file);
+                               _type = _data.type,
+                               _className = '';
+                       if( _type === pettanr.file.FILE_TYPE.FOLDER){
+                               _className = 'folder';
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.IMAGE){
+                               
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.TEXT){
+                               
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.HTML){
+                               
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.CSV){
+                               
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.JSON){
+                               
+                       } else
+                       if( _type === pettanr.file.FILE_TYPE.XML){
+                               
+                       }
+                       return {
+                               image:          null,
+                               className:      ' file-type-' + _className
+                       }
+               },
+               getUpdatePolicy: function( _file){
+                       // debug用 全てのメニューを許可
+                       return pettanr.file.FILE_UPDATE_POLICY.SRWC;
+               },
+               read: function(){
+                       return false;
+               },
+               write: function( _newName, _newData){
+                       return false;
+               },
+               onCreate: function(){
+                       
+               },
+               onSort: function(){
+                       
+               },
+               onCopy: function(){
+                       
+               },
+               onDelete: function(){
                        
                }
-       };
+       }
+
        function getFileObject( TREE, parentFile, data){
-               var _file;
-               if( FILE_OBJECT_POOL.length > 0){
-                       _file = FILE_OBJECT_POOL.shift();
-               } else {
-                       _file = new FileClass();
-               }
+               var _file = FILE_OBJECT_POOL.length > 0 ? FILE_OBJECT_POOL.shift() : new FileClass();
                _file.init( TREE, parentFile, data);
                return _file;
        }
 
        var ROOT_FILEDATA = {
-                       name:           'root',
+                       name:           'system root',
                        type:           FILE_TYPE_IS_FOLDER,
                        children:       []
                },
-               IMAGE_FILEDATA = {
-                       name:           'image root',
-                       type:           FILE_TYPE_IS_FOLDER,
-                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON,
-                       children:       [
-                               {
-                                       name:           'My Pictures',
-                                       type:           FILE_TYPE_IS_FOLDER,
-                                       children:       [],
-                                       childType:      FILE_TYPE_IS_IMAGE
-                               }
-                       ],
-                       childType:      FILE_TYPE_IS_IMAGE
-               },
-               COMIC_FILEDATA = {
-                       name:           'comic root',
-                       type:           FILE_TYPE_IS_FOLDER,
-                       json:           pettanr.CONST.URL_PANELS_JSON,
-                       children:       [
-                               {
-                                       name:           'My Comics',
-                                       type:           FILE_TYPE_IS_FOLDER,
-                                       children:       [],
-                                       childType:      FILE_TYPE_IS_COMIC
-                               }
-                       ],
-                       childType:      FILE_TYPE_IS_PANEL
-               };
-       //FILEDATA_RESITER.push( ROOT_FILEDATA, IMAGE_FILEDATA, IMAGE_FILEDATA.children[0], COMIC_FILEDATA);
-       ROOT_FILEDATA.children.push( COMIC_FILEDATA, IMAGE_FILEDATA);
-
-       var SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
-               ROOT_FILE = SYSTEM_TREE.getRootFile(),
-               COMIC_ROOT_INDEX = ROOT_FILE.getChildFileIndex( COMIC_FILEDATA),
-               IMAGE_ROOT_INDEX = ROOT_FILE.getChildFileIndex( IMAGE_FILEDATA);
-
+               SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
+               ROOT_FILE = SYSTEM_TREE.getRootFile();
+       
+       function createFolderUnderRoot( _fileData){
+               ROOT_FILEDATA.children.push( _fileData);
+               FILE_CONTROLER.getFileDataAccess( ROOT_FILE)
+                       .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)
+       }
+       function createFileTypeID(){
+               return ++numFileType;
+       }
+       
        return {
                init: function(){
-                       REQUEST_CONTROLER.init();
-                       FILE_CONTROLER.init();
+                       //REQUEST_CONTROLER.init();
+                       //FILE_CONTROLER.init();
                        delete pettanr.file.init;
                },
-               createTree: function( _treeType){
-                       var _rootFile;
-                       if( _treeType === TREE_TYPE_IS_COMIC) _rootFile = COMIC_FILEDATA;
-                       if( _treeType === TREE_TYPE_IS_IMAGE) _rootFile = IMAGE_FILEDATA;
-                       if( !_rootFile) return null;
+               resisterDriver: function( _driver){
+                       _driver.prototype = FileDriverBase;
+                       /*
+                        * File API
+                        */
+                       return {
+                               createFolderUnderRoot:  createFolderUnderRoot,
+                               getFileDataAccess:              FILE_CONTROLER.getFileDataAccess,
+                               getFileData:                    FILE_CONTROLER.getFileData,
+                               getJson:                                REQUEST_CONTROLER.getJson,
+                               createFileEvent:                createFileEvent,
+                               createFileTypeID:               createFileTypeID
+                       }
+               },
+               createTree: function( _rootFile){
                        return FILE_CONTROLER.createTree( _rootFile);
                },
-               TREE_TYPE_IS_COMIC:             1,
-               TREE_TYPE_IS_IMAGE:             2,
-               TREE_TYPE_IS_SETTING:   3,
-               FILE_TYPE_IS_FOLDER:    FILE_TYPE_IS_FOLDER,
-               FILE_TYPE_IS_IMAGE:             FILE_TYPE_IS_IMAGE,
-               FILE_TYPE_IS_PANEL:             FILE_TYPE_IS_PANEL,
-               FILE_TYPE_IS_SETTING:   FILE_TYPE_IS_SETTING
+               isTreeInstance: function( _tree){
+                       return _tree instanceof TreeClass;
+               },
+               isFileInstance: function( _file){
+                       return _file instanceof FileClass;
+               },
+               FILE_TYPE: {
+                       UNKNOWN:        0,
+                       FOLDER:         FILE_TYPE_IS_FOLDER,
+                       IMAGE:          createFileTypeID(),
+                       TEXT:           createFileTypeID(),
+                       HTML:           createFileTypeID(),
+                       CSV:            createFileTypeID(),
+                       JSON:           createFileTypeID(),
+                       XML:            createFileTypeID()
+               },
+               FILE_STATE: {
+                       UNKNOWN:        0,
+                       OK:                     1,
+                       LOADING:        2,
+                       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'
+               },
+               FILE_EVENT: {
+                       UPDATE_ATTRIVUTE:       'onFileUpdate',
+                       GET_SEQENTIAL_FILES:'gotSeqentilFiles'
+               },
+               FILE_DATA_PROPERTY_RESERVED: [
+                       'children', 'driver', 'state', 'type', 'name'
+               ]
        }
 })();
 
@@ -714,11 +664,11 @@ pettanr.finder = ( function(){
 
                function draw(){
                        var _thumb = file.getThumbnail();
-                       if( _thumb !== null){
+                       if( _thumb.image){
                                ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
-                               ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb, ')'].join( '');
+                               ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
                        } else {
-                               ELM_THUMBNAIL.className = ICON_CLASSNAME + ' file-type-' +file.TYPE();
+                               ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' +_thumb.className;
                                ELM_THUMBNAIL.style.backgroundImage = '';
                        }
                        ELM_FILENAME.innerHTML = file.getName();
@@ -761,7 +711,7 @@ pettanr.finder = ( function(){
                        onResize: function( w){
                                
                        },
-                       collect: function(){
+                       destroy: function(){
                                elmContainer.removeChild( ELM_WRAPPER);
                                file = elmContainer = null;
                                FINDER_ICON_POOL.push( instansce);
@@ -779,7 +729,7 @@ pettanr.finder = ( function(){
                        callback;
                ELM_WRAPPER.onclick = onClick;
                function draw(){
-                       ELM_FILENAME.className = 'file-icon-' +file.TYPE();
+                       ELM_FILENAME.className = 'file-icon-' +file.getType();
                        ELM_FILENAME.innerHTML = file.getName();
                }
                function resize( index){
@@ -787,6 +737,7 @@ pettanr.finder = ( function(){
                }
                function onClick(){
                        callback( index);
+                       return false;
                }
 
                return {
@@ -814,7 +765,7 @@ pettanr.finder = ( function(){
                        onResize: function( w){
                                
                        },
-                       collect: function(){
+                       destroy: function(){
                                elmContainer.removeChild( ELM_WRAPPER);
                                file = elmContainer = null;
                                BREAD_OBJECT_POOL.push( this);
@@ -822,7 +773,7 @@ pettanr.finder = ( function(){
                }
        }
        
-       var FinderClass = function( ELM_CONTAINER, TREE_TYPE, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
+       var FinderClass = function( ELM_CONTAINER, tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
                var ICON_ARRAY = [],
                        BREAD_ARRAY = [],
                        elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
@@ -832,7 +783,7 @@ pettanr.finder = ( function(){
                        elmStyleButton = nodesDiv[2],
                        elmActionButton = nodesDiv[3],
                        elmBody = nodesDiv[ nodesDiv.length -1],
-                       tree = pettanr.file.createTree( TREE_TYPE),
+                       //tree = pettanr.file.createTree( TREE_TYPE),
                        headX,
                        headY,
                        headH = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
@@ -845,7 +796,7 @@ pettanr.finder = ( function(){
                        style = 0;
                        w = 800;
 
-               tree.addTreeEventListener( 'onTreeUpdate', draw);
+               tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
                
                function draw(){
                        var     l = tree.hierarchy() +1,
@@ -860,7 +811,7 @@ pettanr.finder = ( function(){
                                }
                        }
                        while( l < BREAD_ARRAY.length){
-                               BREAD_ARRAY.pop().collect();
+                               BREAD_ARRAY.pop().destroy();
                        }
                        
                        l = _file.getChildFileLength();
@@ -874,7 +825,7 @@ pettanr.finder = ( function(){
                                }
                        }
                        while( l < ICON_ARRAY.length){
-                               ICON_ARRAY.pop().collect();
+                               ICON_ARRAY.pop().destroy();
                        }
                }
                function onHeadClick( i){
@@ -891,34 +842,32 @@ pettanr.finder = ( function(){
                        var l = ICON_ARRAY.length;
                        if( i < l){
                                var _file = tree.getCurrentFile().getChildFileByIndex( i);
-                               if( _file !== null && _file.TYPE() === pettanr.file.FILE_TYPE_IS_FOLDER){
+                               if( _file !== null && ( _file.getChildFileLength() > 0 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
                                        tree.down( i);
                                        draw();
                                }
                        }
                }
                
-               return {
-                       init: function(){
-                               ELM_CONTAINER.appendChild( elmContainer);
-                               //$( elmLocation).click( onHeadClick);
-                               //$( elmContainer).click( onBodyClick);
-                               var position = pettanr.util.getAbsolutePosition( elmLocation);
-                               headX = position.x;
-                               headY = position.y;
-                               bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
-                               delete this.init;
-                       },
-                       onOpen: function(){
-                               this.init !== undefined && this.init();
-                               draw();
-                       },
-                       onClose: function(){
-                               
-                       },
-                       onWindowResize: function( _w, _h){
+               this.init = function(){
+                       ELM_CONTAINER.appendChild( elmContainer);
+                       //$( elmLocation).click( onHeadClick);
+                       //$( elmContainer).click( onBodyClick);
+                       var position = pettanr.util.getAbsolutePosition( elmLocation);
+                       headX = position.x;
+                       headY = position.y;
+                       bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
+                       delete this.init;
+               }
+               this.onOpen = function(){
+                       this.init !== undefined && this.init();
+                       draw();
+               }
+               this.onClose = function(){
+                       
+               }
+               this.onWindowResize = function( _w, _h){
                                
-                       }
                }
        }
        function getFinderIcon( _file, _elmContainer, w, index, style, callback){
@@ -947,14 +896,322 @@ pettanr.finder = ( function(){
                init: function(){
                        
                },
-               createFinder: function( _elmTarget, _treeType, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
-                       var _finder = new FinderClass( _elmTarget, _treeType, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
+               createFinder: function( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
+                       var _finder = new FinderClass( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
                        FINDER_ARRAY.push( _finder);
                        return _finder;
+               },
+               createFinderHead: function(){
+                       
+               },
+               resisterFinderPane: function( _finderPane){
+                       
+               },
+               isFinderInstance: function( _finder){
+                       return _finder instanceof FinderClass;
+               }
+       }
+})();
+
+
+pettanr.driver = ( function(){
+       var MyAuthorID = 'current_author' in window ? current_author.id : 1,
+               MyArtistID = 'current_artist' in window ? current_artist.id : 1,
+               Driver = {
+                       getSeqentialFiles: function( _file){
+                               var _data = FileAPI.getFileData( _file),
+                                       _json = _data !== null ? _data.json : null;
+                               if( typeof _json === 'string'){
+                                       FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
+                                       _data.state = pettanr.file.FILE_STATE.LOADING;
+                                       delete _data.json;
+                               }
+                       },
+                       getName: function( _file){
+                               var _data = FileAPI.getFileData( _file),
+                                       _type = _data !== null ? _data.type : null;
+                               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( '');
+                               } else
+                               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;
+                       },
+                       getThumbnail: function( _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){
+                                       return { className: 'file-type-cabinet'};
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.COMIC){
+                                       return { className: 'file-type-comic'};
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.PANEL){
+                                       return { className: 'file-type-panel'};
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
+                                       return { className: 'file-type-author'};
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.ARTIST){
+                                       return { className: 'file-type-artist'};
+                               }
+                               if( _type === pettanr.driver.FILE_TYPE.FOLDEER){
+                                       return { className: 'file-type-folder'};
+                               }
+                               return { className: 'file-type-folder'};
+                       }
+               },
+               FileAPI = pettanr.file.resisterDriver( Driver),
+               FILE_DATA_SERVICE_ROOT = {
+                       name:           'PettanR root',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_COMIC_ROOT = {
+                       name:           'Comics',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver,
+                       json:           pettanr.CONST.URL_PANELS_JSON
+               },
+               FILE_DATA_PICTURE_ROOT = {
+                       name:           'Picutures',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver,
+                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
+               },
+               FILE_DATA_MY_COMICS_ROOT = {
+                       name:           'My Comics',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_MY_PICTURES_ROOT = {
+                       name:           'My Pictures',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_AUTHOR_ROOT = {
+                       name:           'Authors',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_ARTIST_ROOT = {
+                       name:           'Artists',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_LICENSE_ROOT = {
+                       name:           'Original Licenses',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_BALLOON_ROOT = {
+                       name:           'Balloon templetes',
+                       type:           pettanr.file.FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               AUTHOR_ARRAY = [],
+               ARTIST_ARRAY = [],
+               PANEL_ARRAY = [],
+               COMIC_ARRAY = [],
+               RESOURCE_PICTURE_ARRAY = [],
+               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_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
+       
+       FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
+       
+       function onLoadJson( _file, _json){
+               var _access = FileAPI.getFileDataAccess( _file),
+                       _data = _access !== null ? _access.DATA : null,
+                       l = _json.length;
+               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);
+               }
+               _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
+       }
+       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){
+                       _data.type = pettanr.driver.FILE_TYPE.PANEL;
+                       _array = PANEL_ARRAY;
+               } else
+               if( _parent === FILE_DATA_PICTURE_ROOT){
+                       _data.type = pettanr.driver.FILE_TYPE.PICTURE;
+                       _array = RESOURCE_PICTURE_ARRAY;
+                       
+                       // original_license を含まなければ、license object を削除して ビットデータ で保持
+                       // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LICENSE_ROOT)
+                       var _license = _data.license,
+                               _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'){
+                                               _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;
+               }
+               
+               _data.driver = Driver;
+               
+               // _array に _data を格納 または 上書き
+               if( typeof _id === 'number'){
+                       var __data = _array[ _id];
+                       if( __data){
+                               for( var key in _data){
+                                       __data[ key ] = _data[ key ];
+                               }
+                               _data = __data; // このタイミングで参照が切れるので注意!!
+                       } else {
+                               _array[ _id] = _data;
+                       }
+               }
+               
+               if( _parent === FILE_DATA_COMIC_ROOT){
+                       if( _data.comic && _data.author){
+                               var _comic = getFolderData( _data, 'comic', FILE_DATA_COMIC_ROOT),
+                                       _comicList = getFolderData( _data, 'author', FILE_DATA_AUTHOR_ROOT);
+                               _comic.children.push( _data);
+                               pettanr.util.getIndex( _comicList.children, _comic) === -1 && _comicList.children.push( _comic);
+                               _comicList.id === MyAuthorID && pettanr.util.getIndex( FILE_DATA_MY_COMICS_ROOT.children, _comic) === -1 && FILE_DATA_MY_COMICS_ROOT.children.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); // 上記参照切れに備えてここで上書き
+                               }
+                               if( _elm.resource_picture_id && RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id]){
+                                       _elm.resource_picture = RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id];
+                               }
+                       }
+               } else
+               if( _parent === FILE_DATA_PICTURE_ROOT){
+                       if( _data.artist){
+                               var _pictureList = getFolderData( _data, 'artist', FILE_DATA_ARTIST_ROOT);
+                               pettanr.util.getIndex( _pictureList.children, _data) === -1 && _pictureList.children.push( _data);
+                               _pictureList.id === MyArtistID && pettanr.util.getIndex( FILE_DATA_MY_PICTURES_ROOT.children, _data) === -1 && FILE_DATA_MY_PICTURES_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 : []
+
+               if( typeof _array[ _id] === 'object'){
+                       var __data = _array[ _id];
+                       for( var i in _data[ _key ]){
+                               __data[ i ] = _data[ _key ][ i ];
+                       }
+                       return _data[ _key ] = __data;// このタイミングで参照が切れるので注意!!
+               }
+               // 以下は folder がなく 新規に作られる場合.
+               _ret = _array[ _id ] = _data[ _key ];
+               if( _ret.title){
+                       _ret.name = _ret.title;
+                       delete _ret.title;
+               }
+               _ret.children = [];
+               _ret.driver = Driver;
+               
+               if( _parentData === FILE_DATA_AUTHOR_ROOT){
+                       _ret.type = pettanr.driver.FILE_TYPE.AUTHOR;
+               } else
+               if( _parentData === FILE_DATA_ARTIST_ROOT){
+                       _ret.type = pettanr.driver.FILE_TYPE.ARTIST;
+               } else
+               if( _parentData === FILE_DATA_COMIC_ROOT){
+                       _ret.type = pettanr.driver.FILE_TYPE.COMIC;
+                       return _ret;
+               } else {
+                       _ret.type = pettanr.file.FILE_TYPE.FOLDER;
+               }
+               
+               _parentData.children.push( _ret);
+               
+               return _ret;
+       }
+
+       return {
+               createComicTree: function(){
+                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMIC_ROOT);
+               },
+               createPictureTree: function(){
+                       return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
+               },
+               createServiceTree: function(){
+                       return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
+               },
+               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(),
+                       PANEL:                          FileAPI.createFileTypeID(),
+                       PICTURE:                        FileAPI.createFileTypeID(),
+                       PANEL_PICTURE:          FileAPI.createFileTypeID(),
+                       BALLOON:                        FileAPI.createFileTypeID(),
+                       AUTHOR:                         FileAPI.createFileTypeID(),
+                       ARTIST:                         FileAPI.createFileTypeID(),
+                       LICENSE:                        FileAPI.createFileTypeID()
                }
        }
 })();
 
+
 pettanr.gallery = ( function(){
        var finder,
                elmContainer = document.getElementById( 'gallery'),
@@ -966,7 +1223,7 @@ pettanr.gallery = ( function(){
                        delete pettanr.gallery.init;
                },
                firstOpen: function(){
-                       finder = pettanr.finder.createFinder( elmContainer, pettanr.file.TREE_TYPE_IS_IMAGE);
+                       finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
                        delete pettanr.gallery.firstOpen;
                },
                onOpen: function(){
@@ -994,7 +1251,7 @@ pettanr.cabinet = ( function(){
                        delete pettanr.cabinet.init;
                },
                firstOpen: function(){
-                       finder = pettanr.finder.createFinder( elmContainer, pettanr.file.TREE_TYPE_IS_COMIC);
+                       finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
                        delete pettanr.cabinet.firstOpen;
                },
                onOpen: function(){
@@ -1019,7 +1276,11 @@ 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.file);
 pettanr.fn( pettanr.finder);
 pettanr.fn( pettanr.gallery);