OSDN Git Service

client is version0.4.12, added register Artist console (don't register...)
[pettanr/pettanr.git] / public / assets / system.js
1 /*
2  * pettanR system.js
3  *   version 0.4.11
4  *   
5  * author:
6  *   itozyun
7  * licence:
8  *   3-clause BSD
9  */
10
11
12 pettanr.log = ( function(){
13         return {
14                 init: function(){}
15         }
16 })();
17
18 pettanr.io = ( function(){
19         
20         return {
21                 init: function(){}
22         }
23 })();
24
25 /*
26  * 画像一覧は
27  *      お気に入り画像一覧 > tag:ペン次郎 > ペン次郎:笑う
28  *  最近アップロードされた画像 > images
29  *  最近使われた画像 > images
30  *  キャラクター画像庫 > アニマル系 > tag:ペン次郎 > ペン次郎:笑う
31  *  風景画像庫 >
32  *  効果画像庫 >
33  *  アイテム画像庫 >
34  *  
35  * 画像一覧を読み込むタイミング
36  */
37 pettanr.file = ( function(){
38         var FILE_TYPE_IS_FOLDER = 1,
39                 numFileType = FILE_TYPE_IS_FOLDER,
40                 FILEDATA_RESITER = [],                  // store all of fileData( json object )
41                 FILEDATA_ACCESS = [],                   // file operations for Kernel only ! hide from Out of pettanr.file
42                 FILE_OBJECT_POOL = [],
43                 EVENT_LISTENER_RESISTER = [],
44                 TREE_ARRAY = [],
45                 TREE_ACCESS_ARRAY = [];
46         
47         var REQUEST_CONTROLER = ( function(){
48                 var REQUEST_TICKET_RESISTER = [],
49                         DATA_TYPE_ARRAY = 'json,xml,html,text'.split( ','),
50                         DATA_IS_JSON = 0,
51                         DATA_IS_XML = 1,
52                         DATA_IS_HTML = 2,
53                         DATA_IS_TEXT = 3,
54                         numError = 0;
55                 
56                 var RequestTicketClass = function( _type, _data, _url, _onLoad, _onError){
57                         this.type = DATA_TYPE_ARRAY[ _type];
58                         this.data = _data;
59                         this.url = _url;
60                         this.onLoad = _onLoad;
61                         this.onError = _onError;
62                         this.state = 0;
63                 };
64                 
65                 function request(){
66                         if( REQUEST_TICKET_RESISTER.length === 0) return;
67                         var _ticket = REQUEST_TICKET_RESISTER.shift();
68                         $.ajax({
69                                 url:            _ticket.url,
70                                 dataType:       _ticket.type,
71                                 success:        function( _data){
72                                         _ticket.onLoad( _ticket.data, _data);
73                                 },
74                                 error:          function(){
75                                         ++numError;
76                                         _ticket.onError( _ticket.data);
77                                 }
78                         });
79                 }
80                 
81                 return {
82                         getNumTask: function(){
83                                 return REQUEST_TICKET_RESISTER.length;
84                         },
85                         getNumError: function(){
86                                 return numError;
87                         },
88                         getJson: function( _data, _url, _onLoad, _onError){
89                                 REQUEST_TICKET_RESISTER.push( new RequestTicketClass( DATA_IS_JSON, _data, _url, _onLoad, _onError));
90                                 request();
91                         }
92                 }
93         })();
94
95
96
97         var FILE_CONTROLER = {
98                 createTree: function( _rootFileData){
99                         var _tree = new TreeClass( _rootFileData);
100                         _tree.init();
101                         TREE_ARRAY.push( _tree);
102                         return _tree;
103                 },
104                 getFileDataAccess: function( UIDorFILEorFILEDATA){
105                         var _uid, _data, _access;
106                         
107                         if( typeof UIDorFILEorFILEDATA === 'number'){
108                                 _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
109                         } else
110                         if( UIDorFILEorFILEDATA instanceof FileClass){
111                                 _uid = UIDorFILEorFILEDATA.getUID();
112                                 _data = FILEDATA_RESITER[ _uid] || null;
113                         } else {
114                                 _data = UIDorFILEorFILEDATA || null;
115                         }
116                         
117                         if( _data === null || typeof _data !== 'object') return null;
118                         for( var i=0, l = FILEDATA_ACCESS.length; i<l; ++i){
119                                 _access = FILEDATA_ACCESS[ i];
120                                 if( _access.DATA === _data) return _access;
121                         }
122                         return null;
123                 },              
124                 getFileData: function( UIDorFILEorFILEDATA){
125                         var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
126                         return _access !== null ? _access.DATA : null;
127                 },
128                 getChildren: function( UIDorFILEorFILEDATA){
129                         var _data = FILE_CONTROLER.getFileData( UIDorFILEorFILEDATA);
130                         return _data !== null ? _data.children || null : null;
131                 },
132                 getDriver: function( _file){
133                         var _data = FILE_CONTROLER.getFileData( _file);
134                         return _data !== null && _data.driver ? _data.driver : FileDriverBase;
135                 },
136                 getUpdateFlag: function( _file, _bit){
137                         var _driver = FILE_CONTROLER.getDriver( _file ),
138                                 _policy;
139                         if( typeof _driver.getUpdatePolicy === 'function'){
140                                 _policy = _driver.getUpdatePolicy( _file );
141                                 
142                         }
143                         if( typeof _policy !== 'number') {
144                                 _policy = FileDriverBase.getUpdatePolicy( _file )
145                         }
146                         return _policy % ( _bit * 2) >= _bit;
147                 },
148                 move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
149                         var _parentData = FILE_CONTROLER.getFileDataAccess( _prentUID),
150                                 _parentType = _parentData.TYPE,
151                                 _targetData = FILE_CONTROLER.getFileDataAccess( _targetfile),
152                                 _targetType = _targetData.TYPE;
153                 },
154                 replace: function( _uid, _file, _newIndex){
155                         
156                 },
157                 addEventListener: function( FILEorNULL, _eventType, _callback){
158                         var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL;
159                         EVENT_LISTENER_RESISTER.push( new FileEventTicketClass( _uid, _eventType, _callback));
160                 },
161                 removeEventListener: function( FILEorNULL, _eventType, _callback){
162                         var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
163                                 _ticket;
164                         for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
165                                 _ticket = EVENT_LISTENER_RESISTER[i];
166                                 if( _ticket.fileUID === _uid && _ticket.eventType === _eventType && _ticket.callBack === _callback){
167                                         EVENT_LISTENER_RESISTER.splice( i, 1);
168                                         _ticket.destroy();
169                                 }
170                         }
171                 },
172                 fileEventRellay: function( _targetFile, _targetTree, _event){
173                         var _uid = _targetTree.getUID(),
174                                 _access = TREE_ACCESS_ARRAY[ _uid ],
175                                 _data = FILE_CONTROLER.getFileData( _targetFile ),
176                                 _tree;
177                         _access && _access.dispatchFileEvent( _event );
178                         for( var i=0, l = TREE_ARRAY.length; i<l; ++i){
179                                 if( i !== _uid){
180                                         _tree = TREE_ARRAY[ i ];
181                                         if( FILE_CONTROLER.getFileData( _tree.getCurrentFile() ) === _data ){
182                                                 _access = TREE_ACCESS_ARRAY[ _tree.getUID() ];
183                                                 _access && _access.dispatchFileEvent( _event);
184                                         }
185                                 }
186                         }
187                 }
188         }
189
190         var TreeClass = function( ROOTFILE_DATA){
191                 var UID = TREE_ACCESS_ARRAY.length,
192                         PARENT_FILE_RESITER = [],
193                         ACCESS = {
194                                 dispatchFileEvent:      dispatchFileEvent,
195                                 destroy:                        onDestroy
196                         },
197                         EVENT_LISTENER_ARRAY = [],
198                         rootFile,
199                         rootFileData,
200                         currentFile,
201                         currentFileData,
202                         instance;
203                         
204                 TREE_ACCESS_ARRAY.push( ACCESS);
205                 
206                 function onDestroy(){
207                         
208                 }
209                 
210                 function dispatchFileEvent( e){
211                         var _eventType = e.eventType,
212                                 _targetFile = e.targetFile,
213                                 _uid = _targetFile.getUID(),
214                                 _ticket, _type, _callback;
215                         for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
216                                 _ticket = EVENT_LISTENER_RESISTER[i],
217                                 _type = _ticket.eventType,
218                                 _callback = _ticket.callBack;
219                                 if( _eventType === _type && _uid === _ticket.fileUID){
220                                         _callback( _eventType, _targetFile, e.key, e.value);
221                                 } else
222                                 if( _type === pettanr.file.TREE_EVENT.UPDATE && _eventType === pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES){
223                                         _callback( _eventType, _targetFile);
224                                 }
225                         }
226                 }
227                 
228                 return {
229                         init: function(){
230                                 instance = this;
231                                 currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
232                                 // rootFile.init();
233                                 currentFile.getSeqentialFiles();
234                                 delete this.init;
235                         },
236                         getUID: function(){ return UID},
237                         getRootFile : function(){
238                                 return rootFile;
239                         },
240                         getCurrentFile: function(){
241                                 return currentFile;
242                         },
243                         hierarchy: function(){
244                                 return PARENT_FILE_RESITER.length;
245                         },
246                         getParentFileAt: function( _index){
247                                 var l = PARENT_FILE_RESITER.length;
248                                 if( typeof _index !== 'number' || _index < 0 || _index >= l) return null;
249                                 return PARENT_FILE_RESITER[ l -1 -_index];
250                         },
251                         down: function( _index){
252                                 if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
253                                 PARENT_FILE_RESITER.unshift( currentFile);
254                                 currentFile = currentFile.getChildFileByIndex( _index);
255                                 currentFile.getSeqentialFiles();
256                                 return currentFile;
257                         },
258                         up: function( _index){
259                                 var l = PARENT_FILE_RESITER.length;
260                                 if( l === 0) return null;
261                                 if( typeof _index === 'number'){
262                                         if( _index >= l) return null;
263                                         currentFile = this.getParentFileAt( _index);
264                                         PARENT_FILE_RESITER.splice( 0, l -_index);
265                                 } else {
266                                         currentFile = PARENT_FILE_RESITER.shift();
267                                 }
268                                 currentFile.getSeqentialFiles();
269                                 return currentFile;     
270                         },
271                         addTreeEventListener: function( _eventType, _callback){
272                                 FILE_CONTROLER.addEventListener( null, _eventType, _callback);
273                         },
274                         removeTreeEventListener: function( _eventType, _callback){
275                                 FILE_CONTROLER.removeEventListener( null, _eventType, _callback);
276                         },
277                         destroy: function(){
278                                 FILE_CONTROLER.destroyTree( UID);
279                         }
280                 }
281         };
282
283         var FileEventTicketClass = function( UID, _eventType, _callback){
284                 this.fileUID = UID;
285                 this.eventType = _eventType;
286                 this.callBack = _callback;
287                 this.destroy = function(){
288                         this.callBack = _callback = null;
289                 }
290         }
291         
292         var FileEventClass = function( eventType, file, key, value){
293                 this.eventType = eventType;
294                 this.targetFile = file;
295                 this.updatedAttribute = key;
296                 this.updatedValue = value;
297         }
298
299 /*
300  * fileのdataはobjectで保持している。
301  * pettanr.file.の外からファイルをみるときは、FileClassを通して操作する。
302  * fileの変更、それに付随して追加されたイベントは、TreeClassで管理される。
303  * treeがdestryされると、fileのイベントリスナーも全て削除される。
304  * 他の tree も data の共通する currentFile に対してのみは、file の変更イベントを受け取って流す.
305  */
306         
307         var FileClass = function( TREE, parentFile, data){
308                 var uid = pettanr.util.getIndex( FILEDATA_RESITER, data ),
309                         instance = this;
310                 
311                 if( uid === -1){
312                         uid = FILEDATA_RESITER.length;
313                         FILEDATA_RESITER.push( data );
314                 }
315                 
316                 FILEDATA_ACCESS.push(
317                         {
318                                 DATA:                           data,
319                                 updateParent:           updateParent,
320                                 dispatchFileEvent:      dispatchEvent
321                         }
322                 );
323
324                 function updateParent( _parent){
325                         parentFile = _parent;
326                 }
327                 function dispatchEvent( e){
328                         FILE_CONTROLER.fileEventRellay( instance, TREE, e);
329                 }
330                 
331                 /* grobal Methods */
332
333                 this.getUID = function(){
334                         return uid;
335                 }
336                 /*
337                  * ファイル構造は TRON のような ハイパーリンク方式 だが、文脈上の 親ファイルが存在する.その親ファイルを使う操作は.prototype に置く事ができない.
338                  * 同様に TREE を使う操作も .prototype に置く事ができない.
339                  */
340                 this.getChildFileByIndex = function( _index){
341                         var _children = FILE_CONTROLER.getChildren( instance );
342                         if( typeof _index !== 'number' || _index < 0 || typeof _children.length !== 'number' || _index >= _children.length) return null;
343                         var _file = new FileClass( TREE, this, _children[ _index]);
344                         // _file.init();
345                         return _file;
346                 }
347                 this.move = function( _newFolder, _newIndex, opt_callback){
348                         TREE.move( parentFile, UID, _newFolder, _newIndex, opt_callback);
349                 }
350                 this.replace = function( _newIndex, opt_callback){
351                         TREE.replace( parentFile, UID, _newIndex, opt_callback);
352                 }
353                 this.destroy = function(){
354                         var _access = FILE_CONTROLER.getFileDataAccess( instance );
355                                 _index = getChildIndex( FILEDATA_ACCESS, _access );
356                         if( _index === -1 || _access === null) return;
357                         FILEDATA_ACCESS.splice( _index, 1);
358                         TREE = parentFile = data = null;
359                         delete _access.DATA, _access.updateParent, _access.dispatchFileEvent;
360                 }
361         };
362         
363         FileClass.prototype = {
364                 isChildFile: function( _FILEorFILEDATA){
365                         return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
366                 },
367                 getSeqentialFiles: function(){
368                         var _driver = FILE_CONTROLER.getDriver( this );
369                         if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
370                                 _driver.getSeqentialFiles( this );
371                         }
372                 },
373                 addEventListener: function( _eventType, _callback){
374                         FILE_CONTROLER.addEventListener( this, _eventType, _callback);
375                 },
376                 removeEventListener: function( _eventType, _callback){
377                         FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
378                 },
379                 getChildFileLength: function(){
380                         var children = FILE_CONTROLER.getChildren( this);
381                         return Type.isArray( children ) === true ? children.length : -1;
382                 },
383                 getChildFileIndex: function( _FILEorFILEDATA){
384                         var children = FILE_CONTROLER.getChildren( this);
385                         if( Type.isArray( children.length ) === false ) return -1;
386                         var l = children.length,
387                                 _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA);
388                         if( _fileData === null) return -1;
389                         for(var i=0; i<l; ++i){
390                                 if( children[ i] === _fileData) return i;
391                         }
392                         return -1;
393                 },
394                 getName: function(){
395                         var driver = FILE_CONTROLER.getDriver( this );
396                         if( typeof driver.getName === 'function'){
397                                 return driver.getName( this );
398                         }
399                         return FileDriverBase.getName( this);
400                 },
401                 getThumbnail: function(){
402                         var driver = FILE_CONTROLER.getDriver( this);
403                         if( typeof driver.getThumbnail === 'function'){
404                                 return driver.getThumbnail( this);
405                         }
406                         return FileDriverBase.getThumbnail( this);
407                 },
408                 getType: function(){
409                         var _data = FILE_CONTROLER.getFileData( this);
410                         return typeof _data.type === 'number' ? _data.type : pettanr.file.FILE_TYPE.UNKNOWN;
411                 },
412                 getState: function(){
413                         var _data = FILE_CONTROLER.getFileData( this);
414                         return typeof _data.state === 'number' ? _data.state : pettanr.file.FILE_STATE.OK;
415                 },
416                 isWritable: function(){
417                         return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.WRITE);
418                 },
419                 isSortable: function(){
420                         return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.SORT);
421                 },              
422                 isCreatable: function(){
423                         return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.CREATE);
424                 },
425                 isRenamable: function(){
426                         return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.RENAME);
427                 },
428                 read: function(){
429                         // simpleDeepCopy
430                         return false;
431                 },
432                 write: function( _newName, _newData){
433                         return false;
434                 },
435                 viwerApps: function(){
436                         
437                 },
438                 editorApps: function(){
439                         
440                 },
441                 create: function(){
442                         
443                 },
444                 sort: function(){
445                         
446                 },
447                 onCopy: function(){
448                         
449                 },
450                 onDelete: function(){
451                         
452                 }
453         }
454
455         /*
456          * FileDriverBase
457          */
458         var FileDriverBase = {
459                 getSeqentialFiles: function( _file){
460                 },
461                 getName: function( _file){
462                         var _data = FILE_CONTROLER.getFileData( _file);
463                         return _data.name || 'No Name';
464                 },
465                 getThumbnail: function( _file){
466                         var _data = FILE_CONTROLER.getFileData( _file);
467                                 _type = _data.type,
468                                 _className = '';
469                         if( _type === pettanr.file.FILE_TYPE.FOLDER){
470                                 _className = 'folder';
471                         } else
472                         if( _type === pettanr.file.FILE_TYPE.IMAGE){
473                                 
474                         } else
475                         if( _type === pettanr.file.FILE_TYPE.TEXT){
476                                 
477                         } else
478                         if( _type === pettanr.file.FILE_TYPE.HTML){
479                                 
480                         } else
481                         if( _type === pettanr.file.FILE_TYPE.CSV){
482                                 
483                         } else
484                         if( _type === pettanr.file.FILE_TYPE.JSON){
485                                 
486                         } else
487                         if( _type === pettanr.file.FILE_TYPE.XML){
488                                 
489                         }
490                         return {
491                                 image:          null,
492                                 className:      ' file-type-' + _className
493                         }
494                 },
495                 getUpdatePolicy: function( _file){
496                         // debug用 全てのメニューを許可
497                         return pettanr.file.FILE_UPDATE_POLICY.SRWC;
498                 },
499                 read: function(){
500                         return false;
501                 },
502                 write: function( _newName, _newData){
503                         return false;
504                 },
505                 onCreate: function(){
506                         
507                 },
508                 onSort: function(){
509                         
510                 },
511                 onCopy: function(){
512                         
513                 },
514                 onDelete: function(){
515                         
516                 }
517         }
518
519         var ROOT_FILEDATA = {
520                         name:           'system root',
521                         type:           FILE_TYPE_IS_FOLDER,
522                         children:       []
523                 },
524                 SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
525                 ROOT_FILE = SYSTEM_TREE.getRootFile();
526         
527         function createFolderUnderRoot( _fileData){
528                 ROOT_FILEDATA.children.push( _fileData);
529                 FILE_CONTROLER.getFileDataAccess( ROOT_FILE)
530                         .dispatchFileEvent( new FileEventClass( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, ROOT_FILE, 'children', null));
531         }
532         function createFileEvent( _eventType, _file, _key, _value){
533                 return new FileEventClass( _eventType, _file, _key, _value)
534         }
535         function createFileTypeID(){
536                 return ++numFileType;
537         }
538         
539         return {
540                 init: function(){
541                         //REQUEST_CONTROLER.init();
542                         //FILE_CONTROLER.init();
543                         delete pettanr.file.init;
544                 },
545                 resisterDriver: function( _driver){
546                         _driver.prototype = FileDriverBase;
547                         /*
548                          * File API
549                          */
550                         return {
551                                 createFolderUnderRoot:  createFolderUnderRoot,
552                                 getFileDataAccess:              FILE_CONTROLER.getFileDataAccess,
553                                 getFileData:                    FILE_CONTROLER.getFileData,
554                                 getJson:                                REQUEST_CONTROLER.getJson,
555                                 createFileEvent:                createFileEvent,
556                                 createFileTypeID:               createFileTypeID
557                         }
558                 },
559                 createTree: function( _rootFile){
560                         return FILE_CONTROLER.createTree( _rootFile);
561                 },
562                 isTreeInstance: function( _tree){
563                         return _tree instanceof TreeClass;
564                 },
565                 isFileInstance: function( _file){
566                         return _file instanceof FileClass;
567                 },
568                 FILE_TYPE: {
569                         UNKNOWN:        0,
570                         FOLDER:         FILE_TYPE_IS_FOLDER,
571                         IMAGE:          createFileTypeID(),
572                         TEXT:           createFileTypeID(),
573                         HTML:           createFileTypeID(),
574                         CSV:            createFileTypeID(),
575                         JSON:           createFileTypeID(),
576                         XML:            createFileTypeID()
577                 },
578                 FILE_STATE: {
579                         UNKNOWN:        0,
580                         OK:                     1,
581                         LOADING:        2,
582                         ERROR:          3,
583                         BROKEN:         4
584                 },
585                 FILE_UPDATE_POLICY: {
586                         ____:           parseInt( '0000', 2),
587                         ___C:           parseInt( '0001', 2), // hasCreateMenu
588                         __W_:           parseInt( '0010', 2), // isWritable
589                         __WC:           parseInt( '0011', 2), // isWritable
590                         _R__:           parseInt( '0000', 2), // isRenamable
591                         _R_C:           parseInt( '0101', 2), // hasCreateMenu
592                         _RW_:           parseInt( '0110', 2), // isWritable
593                         _RWC:           parseInt( '0111', 2), // isWritable
594                         S___:           parseInt( '1000', 2), // childrenIsSortable
595                         S__C:           parseInt( '1001', 2),
596                         S_W_:           parseInt( '1010', 2),
597                         S_WC:           parseInt( '1011', 2),
598                         SR__:           parseInt( '1000', 2),
599                         SR_C:           parseInt( '1101', 2),
600                         SRW_:           parseInt( '1110', 2),
601                         SRWC:           parseInt( '1111', 2),
602                         CREATE:         1,
603                         WRAITE:         2,
604                         RENAME:         4,
605                         SORT:           8
606                 },
607                 TREE_EVENT: {
608                         UPDATE:                         'onTreeUpdate'
609                 },
610                 FILE_EVENT: {
611                         UPDATE_ATTRIVUTE:       'onFileUpdate',
612                         GET_SEQENTIAL_FILES:'gotSeqentilFiles'
613                 },
614                 FILE_DATA_PROPERTY_RESERVED: [
615                         'children', 'driver', 'state', 'type'
616                 ]
617         }
618 })();
619
620 pettanr.finder = ( function(){
621         var FINDER_ARRAY = [],
622                 ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
623                 ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
624                 ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
625                 ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
626                 ICON_CLASSNAME = ELM_ORIGIN_FINDER_ICON.getElementsByTagName( 'div')[0].className,
627                 FINDER_ICON_POOL = [],
628                 BREAD_OBJECT_POOL = [];
629         
630         var FinderIconClass = function(){
631                 var elmContainer,
632                         ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
633                         ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-thumbnail', 'div')[0],
634                         ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename', 'div')[0],
635                         file, w, index, style, instansce, callback;
636                 
637                 ELM_WRAPPER.onclick = onClick;
638                 function onClick(){
639                         callback( index);
640                 }
641
642                 function draw(){
643                         var _thumb = file.getThumbnail();
644                         if( _thumb.image){
645                                 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
646                                 ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
647                         } else {
648                                 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' +_thumb.className;
649                                 ELM_THUMBNAIL.style.backgroundImage = '';
650                         }
651                         ELM_FILENAME.innerHTML = file.getName();
652                 }
653                 function resize(){
654                         ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
655                 }
656                 function onCollect(){
657                         elmContainer.removeChild( ELM_WRAPPER);
658                         elmContainer = null;
659                         FINDER_ICON_POOL.push( instansce);
660                 }
661                 
662                 return {
663                         init: function( _file, _elmContainer, _w, _index, _style, _callback){
664                                 instansce = this;
665                                 if( elmContainer !== _elmContainer){
666                                         _elmContainer.appendChild( ELM_WRAPPER);
667                                         elmContainer = _elmContainer;
668                                 }
669                                 if( file !== _file){
670                                         file = _file;
671                                         draw();
672                                 }
673                                 if( index !== _index){
674                                         index = _index;
675                                         resize();
676                                 }
677                                 callback = _callback;
678                         },
679                         elm: ELM_WRAPPER,
680                         index: function( _index){
681                                 
682                                 return index;
683                         },
684                         style: function( _style){
685                                 
686                                 return style;
687                         },
688                         onResize: function( w){
689                                 
690                         },
691                         destroy: function(){
692                                 elmContainer.removeChild( ELM_WRAPPER);
693                                 file = elmContainer = null;
694                                 FINDER_ICON_POOL.push( instansce);
695                         }
696                 }
697         }
698         function updateIconPosition( _style, _w, _index, _elm){
699                 
700         }
701         var BreadcrumbClass = function(){
702                 var elmContainer,
703                         ELM_WRAPPER = ELM_ORIGIN_FINDER_LOCATION_ITEM.cloneNode( true),
704                         ELM_FILENAME = ELM_WRAPPER.getElementsByTagName( 'a')[0],
705                         file, w, index, instansce,
706                         callback;
707                 ELM_WRAPPER.onclick = onClick;
708                 function draw(){
709                         ELM_FILENAME.className = 'file-icon-' +file.getType();
710                         ELM_FILENAME.innerHTML = file.getName();
711                 }
712                 function resize( index){
713                         ELM_WRAPPER.style.left = (index * 90) +'px';
714                 }
715                 function onClick(){
716                         callback( index);
717                         return false;
718                 }
719
720                 return {
721                         init: function( _file, _elmContainer, _index, _callback){
722                                 instansce = this;
723                                 if( elmContainer !== _elmContainer){
724                                         _elmContainer.appendChild( ELM_WRAPPER);
725                                         elmContainer = _elmContainer;
726                                 }
727                                 if( file !== _file){
728                                         file = _file;
729                                         draw();
730                                 }
731                                 if( index !== _index){
732                                         index = _index;
733                                         resize( index);
734                                 }
735                                 callback = _callback;
736                         },
737                         elm: ELM_WRAPPER,
738                         index: function( _index){
739                                 
740                                 return index;
741                         },
742                         onResize: function( w){
743                                 
744                         },
745                         destroy: function(){
746                                 elmContainer.removeChild( ELM_WRAPPER);
747                                 file = elmContainer = null;
748                                 BREAD_OBJECT_POOL.push( this);
749                         }
750                 }
751         }
752         
753         var FinderClass = function( ELM_CONTAINER, tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
754                 var ICON_ARRAY = [],
755                         BREAD_ARRAY = [],
756                         elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
757                         elmLocation = elmContainer.getElementsByTagName( 'ul')[0],
758                         nodesDiv = elmContainer.getElementsByTagName( 'div'),
759                         elmSidebarButton = nodesDiv[1],
760                         elmStyleButton = nodesDiv[2],
761                         elmActionButton = nodesDiv[3],
762                         elmBody = nodesDiv[ nodesDiv.length -1],
763                         //tree = pettanr.file.createTree( TREE_TYPE),
764                         headX,
765                         headY,
766                         headH = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
767                         bodyY,
768                         currentFile = null,
769                         breadW = 90,
770                         size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON),
771                         iconW = size.width,
772                         iconH = size.height,
773                         style = 0;
774                         w = 800;
775
776                 tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
777                 
778                 function draw(){
779                         var     l = tree.hierarchy() +1,
780                                 m = BREAD_ARRAY.length,
781                                 _file, _bread;
782                         for(var i=0; i<l; ++i){
783                                 _file = i !== l-1 ? tree.getParentFileAt( i) : tree.getCurrentFile();
784                                 if( i < m){
785                                         BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
786                                 } else {
787                                         BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick));
788                                 }
789                         }
790                         while( l < BREAD_ARRAY.length){
791                                 BREAD_ARRAY.pop().destroy();
792                         }
793                         
794                         l = _file.getChildFileLength();
795                         m = ICON_ARRAY.length;
796
797                         for( i=0; i<l; ++i){
798                                 if( i < m){
799                                         ICON_ARRAY[ i].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick);
800                                 } else {
801                                         ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick));
802                                 }
803                         }
804                         while( l < ICON_ARRAY.length){
805                                 ICON_ARRAY.pop().destroy();
806                         }
807                 }
808                 function onHeadClick( i){
809                         var l = BREAD_ARRAY.length -1;
810                         if( i < l){
811                                 var _file = tree.getParentFileAt( i);
812                                 if( _file !== null){
813                                         tree.up( i);
814                                         draw();
815                                 }
816                         }
817                 }
818                 function onBodyClick( i){
819                         var l = ICON_ARRAY.length;
820                         if( i < l){
821                                 var _file = tree.getCurrentFile().getChildFileByIndex( i);
822                                 if( _file !== null && ( _file.getChildFileLength() !== -1 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
823                                         tree.down( i);
824                                         draw();
825                                 }
826                         }
827                 }
828                 
829                 this.init = function(){
830                         ELM_CONTAINER.appendChild( elmContainer);
831                         //$( elmLocation).click( onHeadClick);
832                         //$( elmContainer).click( onBodyClick);
833                         var position = pettanr.util.getAbsolutePosition( elmLocation);
834                         headX = position.x;
835                         headY = position.y;
836                         bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
837                         delete this.init;
838                 }
839                 this.onOpen = function(){
840                         this.init !== undefined && this.init();
841                         draw();
842                 }
843                 this.onClose = function(){
844                         
845                 }
846                 this.onWindowResize = function( _w, _h){
847                                 
848                 }
849         }
850         function getFinderIcon( _file, _elmContainer, w, index, style, callback){
851                 var _icon;
852                 if( FINDER_ICON_POOL.length > 0){
853                         _icon = FINDER_ICON_POOL.shift();
854                 } else {
855                         _icon = new FinderIconClass();
856                 }
857                 _icon.init( _file, _elmContainer, w, index, style, callback);
858                 return _icon;
859         }
860         
861         function getBreadcrumb( _file, _elmContainer, index, callback){
862                 var _bread;
863                 if( BREAD_OBJECT_POOL.length > 0){
864                         _bread = BREAD_OBJECT_POOL.shift();
865                 } else {
866                         _bread = new BreadcrumbClass();
867                 }
868                 _bread.init( _file, _elmContainer, index, callback);
869                 return _bread;
870         }
871
872         return {
873                 init: function(){
874                         
875                 },
876                 createFinder: function( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
877                         var _finder = new FinderClass( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
878                         FINDER_ARRAY.push( _finder);
879                         return _finder;
880                 },
881                 createFinderHead: function(){
882                         
883                 },
884                 resisterFinderPane: function( _finderPane){
885                         
886                 },
887                 isFinderInstance: function( _finder){
888                         return _finder instanceof FinderClass;
889                 }
890         }
891 })();
892
893
894 pettanr.driver = ( function(){
895         var MyAuthorID = 'current_author' in window ? current_author.id : 1,
896                 MyArtistID = 'current_artist' in window ? current_artist.id : 1,
897                 Driver = {
898                         getSeqentialFiles: function( _file){
899                                 var _data = FileAPI.getFileData( _file),
900                                         _json = _data !== null ? _data.json : null;
901                                 if( _json === true && _data.type === pettanr.driver.FILE_TYPE.COMIC ){
902                                         _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'comics\/', _data.id, '.json\/play\/' ].join( '' );
903                                 }
904                                 if( typeof _json === 'string'){
905                                         FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
906                                         _data.state = pettanr.file.FILE_STATE.LOADING;
907                                         _data.json = null;
908                                         return;
909                                 }
910                         },
911                         getName: function( _file){
912                                 var _data = FileAPI.getFileData( _file),
913                                         _type = _data !== null ? _data.type : null;
914                                 if( _type === pettanr.driver.FILE_TYPE.PICTURE ){
915                                         return [ _data.id, _data.ext ].join( '.');
916                                 } else
917                                 if( _type === pettanr.driver.FILE_TYPE.PANEL ){
918                                         return [ _data.t, ':', _data.comic.title ].join( '');
919                                 } else
920                                 if( _type === pettanr.driver.FILE_TYPE.COMIC ){
921                                         return _data.title;
922                                 } else
923                                 if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
924                                         return [ _data.id , ':', _data.name, '画伯' ].join( '');
925                                 } else
926                                 if( _type === pettanr.driver.FILE_TYPE.AUTHOR ){
927                                         return [ _data.id , ':', _data.name, '先生' ].join( '');
928                                 }
929                                 return _data.name;
930                         },
931                         getThumbnail: function( _file){
932                                 var _data = FileAPI.getFileData( _file);
933                                         _type = _data !== null ? _data.type : null;
934                                 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
935                                         return { image: [ pettanr.CONST.RESOURCE_PICTURE_PATH, 'thumbnail/', _data.id, '.', _data.ext ].join( '')};
936                                 }
937                                 if( _data === FILE_DATA_COMICS_ROOT){
938                                         return { className: 'file-type-cabinet'};
939                                 }
940                                 if( _type === pettanr.driver.FILE_TYPE.COMIC){
941                                         return { className: 'file-type-comic'};
942                                 }
943                                 if( _type === pettanr.driver.FILE_TYPE.PANEL){
944                                         return { className: 'file-type-panel'};
945                                 }
946                                 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
947                                         return { className: 'file-type-author'};
948                                 }
949                                 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
950                                         return { className: 'file-type-artist'};
951                                 }
952                                 if( _type === pettanr.driver.FILE_TYPE.FOLDEER){
953                                         return { className: 'file-type-folder'};
954                                 }
955                                 return { className: 'file-type-folder'};
956                         }
957                 },
958                 FileAPI = pettanr.file.resisterDriver( Driver),
959                 FILE_DATA_SERVICE_ROOT = {
960                         name:           'PettanR root',
961                         type:           pettanr.file.FILE_TYPE.FOLDER,
962                         children:       []
963                 },
964                 FILE_DATA_COMICS_ROOT = {
965                         name:           'Comics',
966                         type:           pettanr.file.FILE_TYPE.FOLDER,
967                         children:       [],
968                         driver:         Driver,
969                         json:           pettanr.CONST.URL_COMICS_JSON
970                 },
971                 FILE_DATA_PANELS_ROOT = {
972                         name:           'Panels',
973                         type:           pettanr.file.FILE_TYPE.FOLDER,
974                         children:       [],
975                         driver:         Driver,
976                         json:           pettanr.CONST.URL_PANELS_JSON
977                 },
978                 FILE_DATA_PICTURE_ROOT = {
979                         name:           'Picutures',
980                         type:           pettanr.file.FILE_TYPE.FOLDER,
981                         children:       [],
982                         driver:         Driver,
983                         json:           pettanr.CONST.URL_RESOURCE_PICTURES_JSON
984                 },
985                 FILE_DATA_MY_COMICS_ROOT = {
986                         name:           'My Comics',
987                         type:           pettanr.file.FILE_TYPE.AUTHOR,
988                         children:       [],
989                         driver:         Driver
990                 },
991                 FILE_DATA_MY_PICTURES_ROOT = {
992                         name:           'My Pictures',
993                         type:           pettanr.file.FILE_TYPE.ARTIST,
994                         children:       [],
995                         driver:         Driver,
996                         json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
997                 },
998                 FILE_DATA_AUTHOR_ROOT = {
999                         name:           'Authors',
1000                         type:           pettanr.file.FILE_TYPE.FOLDER,
1001                         children:       []
1002                 },
1003                 FILE_DATA_ARTIST_ROOT = {
1004                         name:           'Artists',
1005                         type:           pettanr.file.FILE_TYPE.FOLDER,
1006                         children:       []
1007                 },
1008                 FILE_DATA_LISENCE_ROOT = {
1009                         name:           'Original Lisences',
1010                         type:           pettanr.file.FILE_TYPE.FOLDER,
1011                         children:       []
1012                 },
1013                 FILE_DATA_BALLOON_ROOT = {
1014                         name:           'Balloon templetes',
1015                         type:           pettanr.file.FILE_TYPE.FOLDER,
1016                         children:       []
1017                 },
1018                 AUTHOR_ARRAY = [],
1019                 ARTIST_ARRAY = [],
1020                 PANEL_ARRAY = [],
1021                 COMIC_ARRAY = [],
1022                 RESOURCE_PICTURE_ARRAY = [],
1023                 BALLOON_TEMPLETE_ARRAY = [],
1024                 ORIGINAL_LICENSE_ARRAY = [],
1025                 BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
1026         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);
1027         FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_AUTHOR_ROOT);
1028         FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
1029         
1030         FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
1031
1032         function onLoadJson( _file, _json){
1033                 var _access = FileAPI.getFileDataAccess( _file),
1034                         _data = _access !== null ? _access.DATA : null,
1035                         l;
1036                 if( _data === null){
1037                         onErrorJson( _file);
1038                         return;
1039                 }
1040                 _data.state = pettanr.file.FILE_STATE.OK;
1041                 
1042                 if( Type.isArray( _json ) === true ){
1043                         var l = _json.length;
1044                         if( l === 0) return;
1045                         for( var i=0; i<l; ++i ){
1046                                 buildFileData( _json[ i], _data);
1047                         }                       
1048                 } else
1049                 if( _json.id ){
1050                         buildFileData( _json, _data );
1051                 }
1052                 _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
1053         }
1054         function onErrorJson( _file ){ 
1055                 var _data = FileAPI.getFileData( _file);
1056                 if( _data !== null){
1057                         _data.state = pettanr.file.FILE_STATE.ERROR;
1058                 }
1059         }
1060         function buildFileData( _data, _parent ){
1061                 var _array, i, l;
1062                 // Panel
1063                 if( _parent === FILE_DATA_PANELS_ROOT ){
1064                         _data.type = pettanr.driver.FILE_TYPE.PANEL;
1065                         _array = PANEL_ARRAY;
1066                 } else
1067                 // Comic
1068                 if( _parent === FILE_DATA_COMICS_ROOT ){
1069                         _data.type = pettanr.driver.FILE_TYPE.COMIC;
1070                         _array = COMIC_ARRAY;
1071                 } else
1072                 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC ){
1073                         _array = COMIC_ARRAY;
1074                 } else
1075                 // Lisence
1076                 if( _parent === FILE_DATA_LISENCE_ROOT ){
1077                         _data.type = pettanr.driver.FILE_TYPE.LICENSE;
1078                         _array = ORIGINAL_LICENSE_ARRAY;
1079                 } else
1080                 // Author
1081                 if( _parent === FILE_DATA_AUTHOR_ROOT ){
1082                         _data.type = pettanr.driver.FILE_TYPE.AUTHOR;
1083                         _array = AUTHOR_ARRAY;
1084                 } else
1085                 // Artist
1086                 if( _parent === FILE_DATA_ARTIST_ROOT ){
1087                         _data.type = pettanr.driver.FILE_TYPE.ARTIST;
1088                         _array = ARTIST_ARRAY;
1089                 } else          
1090                 // Picture
1091                 if( _parent === FILE_DATA_PICTURE_ROOT || _parent === FILE_DATA_MY_PICTURES_ROOT ){
1092                         _data.type = pettanr.driver.FILE_TYPE.PICTURE;
1093                         _array = RESOURCE_PICTURE_ARRAY;
1094                         // original_license を含まなければ、license object を削除して ビットデータ で保持
1095                         // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LISENCE_ROOT)
1096                         var _license = _data.license,
1097                                 _Math_pow = Math.pow,
1098                                 _bits = 0;
1099                         if( typeof _license === 'object'){
1100                                 for( i=0, l=BASIC_LICENSES.length; i<l; ++i){
1101                                         if( typeof _license[ BASIC_LICENSES[ i]] === 'number'){
1102                                                 _bits += _Math_pow( 2, i);
1103                                         }
1104                                 }
1105                                 _data.license = _bits;
1106                         }
1107                 } else {
1108                         alert( 'error' );
1109                 }
1110                 
1111                 _data.driver = Driver;
1112                 
1113                 // _array に _data を格納 または 上書き
1114                 if( typeof _data.id === 'number' && _data.id > 0 ){
1115                         var _id = _data.id - 1,
1116                                 __data = _array[ _id ],
1117                                 _reserved = pettanr.file.FILE_DATA_PROPERTY_RESERVED.join( ', ' );
1118                         if( __data ){
1119                                 for( var key in _data){
1120                                         if( _reserved.indexOf( key ) === -1 ){
1121                                                 __data[ key ] = _data[ key ];
1122                                         }
1123                                 }
1124                                 _data = __data; // このタイミングで参照が切れるので注意!!
1125                         } else {
1126                                 _array[ _id ] = _data;
1127                         }
1128                 } else {
1129                         alert( 'error' );
1130                 }
1131
1132                 // Author
1133                 // Artist
1134                 if( _parent === FILE_DATA_AUTHOR_ROOT || _parent === FILE_DATA_ARTIST_ROOT ){
1135                         addChildData( _parent, _data );
1136                 } else
1137                 // Comic + Panels
1138                 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC || _parent === FILE_DATA_COMICS_ROOT ){
1139                         var _panels = _data.panels,
1140                                 _panel;
1141                         if( _panels && Type.isArray( _panels ) === true ){
1142                                 
1143                                 for( i=0, l=_panels.length; i<l; ++i){
1144                                         _panel = buildFileData( _panels[ i ], FILE_DATA_PANELS_ROOT );
1145                                         /*
1146                                          * 間違い! t 順に格納
1147                                          */
1148                                         addChildData( _data, _panel );
1149                                 }
1150                                 delete _data.panels;
1151                         } else {
1152                                 if( _data.json !== null ){
1153                                         _data.json = true;
1154                                 }
1155                                 if( Type.isArray( _data.children ) === false ){
1156                                         _data.children = [];
1157                                 }                               
1158                         }
1159                         var _author = _data.author || getResource( AUTHOR_ARRAY, _data.author_id );
1160                         if( _author ){
1161                                 _data.author = _author = buildFileData( _author, FILE_DATA_AUTHOR_ROOT );
1162                                 addChildData( _author, _data );
1163                                 _author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, _data );
1164                         }
1165                 } else
1166                 // Panel
1167                 if( _parent === FILE_DATA_PANELS_ROOT ){
1168                         _data.comic = getResource( COMIC_ARRAY, _data.comic_id ),
1169                         _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
1170
1171                         // picture data をファイルに取り出し
1172                         if( Type.isArray( _data.panel_elements ) === true ){
1173                                 var _elements,
1174                                         _elm, _rpic;
1175                                 for( i=0, l=_elements.length; i<l; ++i){
1176                                         _elm = _elements[ i];
1177                                         if( _elm.resource_picture ){
1178                                                 _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT); // 上記参照切れに備えてここで上書き
1179                                         } else {
1180                                                 _elm.resource_picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.resource_picture_id );
1181                                         }
1182                                 }                               
1183                         }
1184                 } else
1185                 // Picture
1186                 if( _data.type = pettanr.driver.FILE_TYPE.PICTURE ){
1187                         var _artist = _data.artist || getResource( ARTIST_ARRAY, _data.artist_id );
1188                         if( _artist){
1189                                 _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
1190                                 addChildData( _artist, _data );
1191                                 _artist.id === MyArtistID && addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
1192                         }
1193                 }
1194                 return _data;
1195         }
1196         function addChildData( _parent, _child ){
1197                 if( Type.isArray( _parent.children ) === false){
1198                         _parent.children = [];
1199                 }
1200                 pettanr.util.getIndex( _parent.children, _child ) === -1 && _parent.children.push( _child );
1201         }
1202         function getResource( _array, _id ){
1203                 if( Type.isArray( _array ) === false || Type.isNumber( _id ) === false || _id < 1 ) return null;
1204                 var _data = _array[ _id - 1 ];
1205                 if( !_data ){
1206                         _data = _array[ _id - 1 ] = {};
1207                 }
1208                 return _data;
1209         }
1210
1211         return {
1212                 createComicTree: function(){
1213                         return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMICS_ROOT);
1214                 },
1215                 createPictureTree: function(){
1216                         return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
1217                 },
1218                 createServiceTree: function(){
1219                         return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
1220                 },
1221                 isPettanrFileInstance: function( _file){
1222                         if( pettanr.file.isPettanFileInstance( _file) === true){
1223                                 var _data = FileAPI.getFileData( _file);
1224                                 return _data !== null && _data.driver === Driver;
1225                         }
1226                         return false;
1227                 },
1228                 FILE_TYPE: {
1229                         COMIC:                          FileAPI.createFileTypeID(),
1230                         PANEL:                          FileAPI.createFileTypeID(),
1231                         PICTURE:                        FileAPI.createFileTypeID(),
1232                         PANEL_PICTURE:          FileAPI.createFileTypeID(),
1233                         BALLOON:                        FileAPI.createFileTypeID(),
1234                         AUTHOR:                         FileAPI.createFileTypeID(),
1235                         ARTIST:                         FileAPI.createFileTypeID(),
1236                         LICENSE:                        FileAPI.createFileTypeID()
1237                 }
1238         }
1239 })();
1240
1241
1242 pettanr.gallery = ( function(){
1243         var finder,
1244                 elmContainer = document.getElementById( 'gallery'),
1245                 option;
1246                 
1247         return {
1248                 init: function( _option){
1249                         option = _option;
1250                         delete pettanr.gallery.init;
1251                 },
1252                 firstOpen: function(){
1253                         finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
1254                         delete pettanr.gallery.firstOpen;
1255                 },
1256                 onOpen: function(){
1257                         pettanr.gallery.firstOpen !== undefined && pettanr.gallery.firstOpen();
1258                         finder.onOpen();
1259                         
1260                 },
1261                 onClose: function(){
1262                         finder.onClose();
1263                 },
1264                 onWindowResize: function( _w, _h){
1265                         finder.onWindowResize( _w, _h);
1266                 }
1267         }
1268 })();
1269
1270 pettanr.cabinet = ( function(){
1271         var finder,
1272                 elmContainer = document.getElementById( 'cabinet'),
1273                 option;
1274                 
1275         return {
1276                 init: function( _option){
1277                         option = _option;
1278                         delete pettanr.cabinet.init;
1279                 },
1280                 firstOpen: function(){
1281                         finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
1282                         delete pettanr.cabinet.firstOpen;
1283                 },
1284                 onOpen: function(){
1285                         pettanr.cabinet.firstOpen !== undefined && pettanr.cabinet.firstOpen();
1286                         finder.onOpen();
1287                         
1288                 },
1289                 onClose: function(){
1290                         finder.onClose();
1291                 },
1292                 onWindowResize: function( _w, _h){
1293                         finder.onWindowResize( _w, _h);
1294                 }
1295         }
1296 })();
1297
1298 // i18n
1299 // login
1300 // lib
1301
1302 pettanr.fn( pettanr.view);
1303 pettanr.fn( pettanr.overlay);
1304 pettanr.fn( pettanr.key);
1305 pettanr.fn( pettanr.balloon);
1306
1307 pettanr.fn( pettanr.editor);
1308 pettanr.fn( pettanr.comicConsole);
1309 pettanr.fn( pettanr.uploadConsole);
1310 pettanr.fn( pettanr.panelConsole);
1311 pettanr.fn( pettanr.artistConsole);
1312
1313 pettanr.fn( pettanr.file);
1314 pettanr.fn( pettanr.finder);
1315 pettanr.fn( pettanr.gallery);
1316 pettanr.fn( pettanr.cabinet);
1317
1318 $(window).ready( pettanr.init);