12 pettanr.log = ( function(){
18 pettanr.io = ( function(){
27 * お気に入り画像一覧 > tag:ペン次郎 > ペン次郎:笑う
28 * 最近アップロードされた画像 > images
30 * キャラクター画像庫 > アニマル系 > tag:ペン次郎 > ペン次郎:笑う
37 pettanr.file = ( function(){
38 var TREE_TYPE_IS_COMIC = 1,
39 TREE_TYPE_IS_IMAGE = 2,
40 FILE_TYPE_IS_FOLDER = 1,
41 FILE_TYPE_IS_COMIC = 10,
42 FILE_TYPE_IS_PANEL = 11,
43 FILE_TYPE_IS_IMAGE = 20,
44 FILE_TYPE_IS_HTML = 30,
45 FILE_TYPE_IS_SETTING = 40,
46 FOLDER_TYPE_IS_COMIC = 1,
47 FILE_STATE_IS_UNKNOWN = 0,
49 FILE_STATE_IS_LOADING = 2,
50 FILE_STATE_IS_ERROR = 3,
51 FILE_STATE_IS_BROKEN = 4,
52 TREE_EVENT_UPDATE = 'onTreeUpdate',
53 FILE_EVENT_UPDATE_ATTRIVUTE = 'onFileUpdate',
54 FILE_EVENT_GET_SEQENTIAL_FILES = 'gotSeqentilFiles',
55 ROLE_IS_SUPER_USER = 2^4,
57 ROLE_IS_CREATOR = 2^2,
59 ROLE_IS_VISITOR = 2^0,
60 ROLE_IS_UNKROWN = 2^-1,
61 UPDATE_POLICY_SOCAV = parseInt( '11111', 2),// s: super user
62 UPDATE_POLICY_SOCA_ = parseInt( '11110', 2),// o: owner( comic || panel || picture )
63 UPDATE_POLICY_SOC__ = parseInt( '11100', 2),// c: creator
64 UPDATE_POLICY_SO_A_ = parseInt( '11010', 2),// a: artist
65 UPDATE_POLICY_SO___ = parseInt( '11000', 2),// v: visitor
66 UPDATE_POLICY__O___ = parseInt( '01000', 2),// l: lisence manager
67 UPDATE_POLICY_S____ = parseInt( '10000', 2),
68 UPDATE_POLICY______ = parseInt( '00000', 2),
69 FILEDATA_RESITER = [], // store all of fileData( json object )
70 FILEDATA_HAS_domainID_RESISTER = {},
71 FILEDATA_ACCESS = [], // file operations for Kernel only ! hide from Out of pettanr.file
72 FILE_OBJECT_POOL = [];
74 var REQUEST_CONTROLER = ( function(){
75 var REQUEST_TICKET_RESISTER = [],
76 DATA_TYPE_ARRAY = 'json,xml,html,text'.split( ','),
83 var RequestTicketClass = function( _type, _data, _url, _onLoad, _onError){
84 this.type = DATA_TYPE_ARRAY[ _type];
87 this.onLoad = _onLoad;
88 this.onError = _onError;
93 if( REQUEST_TICKET_RESISTER.length === 0) return;
94 var _ticket = REQUEST_TICKET_RESISTER.shift();
97 dataType: _ticket.type,
98 success: function( _data){
99 _ticket.onLoad( _ticket.data, _data);
103 _ticket.onError( _ticket.data);
110 delete REQUEST_CONTROLER.init;
112 getNumTask: function(){
113 return REQUEST_TICKET_RESISTER.length;
115 getNumError: function(){
118 getJson: function( _data, _url, _onLoad, _onError){
119 REQUEST_TICKET_RESISTER.push( new RequestTicketClass( DATA_IS_JSON, _data, _url, _onLoad, _onError));
127 var FILE_CONTROLER = ( function(){
128 var EVENT_LISTENER_RESISTER = [],
130 TREE_ACCESS_ARRAY = [],
133 var TreeClass = function( ROOTFILE_DATA){
134 var UID = TREE_ACCESS_ARRAY.length,
135 PARENT_FILE_RESITER = [],
137 fileEventChatcher: dispatchFileEvent,
140 EVENT_LISTENER_ARRAY = [],
147 TREE_ACCESS_ARRAY.push( ACCESS);
149 function onDestroy(){
153 function dispatchFileEvent( e){
154 var _eventType = e.eventType,
155 _targetFile = e.targetFile,
156 _ticket, _type, _file, _callback,
157 l = EVENT_LISTENER_RESISTER.length;
158 for(var i=0; i<l; ++i){
159 _ticket = EVENT_LISTENER_RESISTER[i],
160 _type = _ticket.eventType,
161 _file = _ticket.targetFile,
162 _callback = _ticket.callBack;
163 if( _eventType === _type && _file.getUID() === _targetFile.getUID()){
164 _callback( _type, _targetFile, e.key, e.value);
165 } else if( _type === TREE_EVENT_UPDATE && _eventType === FILE_EVENT_GET_SEQENTIAL_FILES){
166 _callback( TREE_EVENT_UPDATE, _targetFile);
174 currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
176 FILE_CONTROLER.getSeqentialFiles( currentFile);
179 getUID: function(){ return UID},
180 getRootFile : function(){
183 getCurrentFile: function(){
186 hierarchy: function(){
187 return PARENT_FILE_RESITER.length;
189 getParentFileAt: function( _index){
190 var l = PARENT_FILE_RESITER.length;
191 if( typeof _index !== 'number' || _index < 0 || _index >= l) return null;
192 return PARENT_FILE_RESITER[ l -1 -_index];
194 down: function( _index){
195 if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
196 PARENT_FILE_RESITER.unshift( currentFile);
197 currentFile = currentFile.getChildFileByIndex( _index);
198 FILE_CONTROLER.getSeqentialFiles( currentFile);
201 up: function( _index){
202 var l = PARENT_FILE_RESITER.length;
203 if( l === 0) return null;
204 if( typeof _index === 'number'){
205 if( _index >= l) return null;
206 currentFile = this.getParentFileAt( _index);
207 PARENT_FILE_RESITER.splice( 0, l -_index);
209 currentFile = PARENT_FILE_RESITER.shift();
211 FILE_CONTROLER.getSeqentialFiles( currentFile);
214 addTreeEventListener: function( _eventType, _callback){
215 EVENT_LISTENER_RESISTER.push( new FileEventTicketClass( null, _eventType, _callback));
217 removeTreeEventListener: function( _eventType, _callback){
220 createSearchResultFolder: function( _searchParam){
223 destroySearchResultFolder: function( _searchParam){
232 * _access.DATA === FILEDATA_RESITER[uid]
234 function getFileDataAccess( UIDorFILEorFILEDATA){
235 var l = FILEDATA_ACCESS.length,
240 if( typeof UIDorFILEorFILEDATA === 'number'){
241 _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
243 if( UIDorFILEorFILEDATA instanceof FileClass){
244 _uid = UIDorFILEorFILEDATA.getUID();
245 _data = FILEDATA_RESITER[ _uid] || null;
247 _data = UIDorFILEorFILEDATA || null;
250 if( _data === null || !_data) return null;
251 for(var i=0; i<l; ++i){
252 _access = FILEDATA_ACCESS[ i];
253 if( _access.DATA === _data) return _access;
257 function getChildren( UIDorFILE){
258 var _access = getFileDataAccess( UIDorFILE);
259 return _access !== null ? _access.DATA.CHILDREN : null
261 function onLoadJson( _file, _json){
262 var _access = getFileDataAccess( _file),
263 _data = _access !== null ? _access.DATA : null,
271 if( !_data.children){
274 var _children = _data.children,
275 _childType = _data.childType,
278 _artistFolderData, _artistFolder,
279 _comicFolderData, _comicFolder,
280 _authorFolderData, _authorFolder,
281 _reaourceID = buildDomainID( _data.json, _childType);
283 for(var i=0; i<l; ++i){
284 _newData = buildFileData( _json[ i], _data.json, _data, _childType);
286 if( _reaourceID !== null){
287 _rFolderData = getDomainFolder( _reaourceID, _childType, _file);
288 _rFolderData.children.push( _newData);
290 if( _newData.artist){
291 _artistFolderData = _artistFolderData || getDomainFolder( buildDomainID( _data.json, 'artist'), 'Artists', _file);
292 _artistFolder = _artistFolder || new FileClass( SYSTEM_TREE, _file, _artistFolderData);
293 _rFolderData = getDomainFolder( buildDomainID( _artistFolderData.rID, '' +_newData.artist.id), _newData.artist.name, _artistFolder);
294 _rFolderData.children.push( _newData);
297 _comicFolderData = _comicFolderData || getDomainFolder( buildDomainID( _data.json, 'comic'), 'Comics', _file);
298 _comicFolder = _comicFolder || new FileClass( SYSTEM_TREE, _file, _comicFolderData);
299 _rFolderData = getDomainFolder( buildDomainID( _comicFolderData.rID, '' +_newData.comic.id), _newData.comic.title, _comicFolder);
300 _rFolderData.children.push( _newData);
302 if( _newData.author){
303 _authorFolderData = _authorFolderData || getDomainFolder( buildDomainID( _data.json, 'author'), 'Author', _file);
304 _authorFolder = _authorFolder || new FileClass( SYSTEM_TREE, _file, _authorFolderData);
305 _rFolderData = getDomainFolder( buildDomainID( _authorFolderData.rID, '' +_newData.author.id), _newData.author.name, _authorFolder);
306 _rFolderData.children.push( _newData);
310 _artistFolder && _artistFolder.collect();
311 _comicFolder && _comicFolder.collect();
312 _authorFolder && _authorFolder.collect();
313 _access.fileEventChatcher( new FileEventClass( FILE_EVENT_GET_SEQENTIAL_FILES, _file, 'children', null));
315 function onErrorJson( _file){
316 var _access = getFileDataAccess( _file),
317 _data = _access !== null ? _access.DATA : null;
319 _data.state = FILE_STATE_IS_ERROR;
322 function buildFileData( _data, _url, _parent, _type){
325 if( _type === FILE_TYPE_IS_PANEL){
326 _data.comicFileData = _parent;
329 FILEDATA_RESITER.push( _data);
333 function buildDomainID( _url, _type){
334 if( !_url) return null;
337 if( typeof _type !== 'number'){
340 if( _type === FILE_TYPE_IS_IMAGE){
343 if( _type === FILE_TYPE_IS_COMIC){
346 if( _type === FILE_TYPE_IS_PANEL){
349 if( _typeStr === null) return null;
351 return [ _url.replace(/https?:\/\/([^\/]*).*/, '$1'), _typeStr].join('_');
354 * getFileByResourceID( _domainID, opt_name, opt_folder)
356 * rID を持つ Object は {} にも格納.
358 function getDomainFolder( _domainID, opt_name, opt_folder){
359 if( FILEDATA_HAS_domainID_RESISTER[ _domainID]){
360 return FILEDATA_HAS_domainID_RESISTER[ _domainID];
362 if( !opt_name && !opt_folder) return;
366 if( typeof opt_name === 'string'){
367 _fileName = opt_name;
369 if( opt_name === FILE_TYPE_IS_IMAGE){
370 _fileName = 'Pictures';
372 if( opt_name === FILE_TYPE_IS_COMIC){
373 _fileName = 'Comics';
375 if( opt_name === FILE_TYPE_IS_PANEL){
376 _fileName = 'Panels';
378 _fileName = typeof opt_name;
383 type: FILE_TYPE_IS_FOLDER,
387 FILEDATA_RESITER.push( _newData);
388 FILEDATA_HAS_domainID_RESISTER[ _domainID] = _newData;
390 if( opt_folder && opt_folder.isChildFile( _newData) === false){
391 var _access = getFileDataAccess( opt_folder),
392 _data = _access !== null ? _access.DATA : null;
393 _access === null && alert( _domainID)
395 _data.children.push( _newData);
402 function destroyTree(){
409 delete FILE_CONTROLER.init;
411 createTree: function( _rootFileData){
412 var _tree = new TreeClass( _rootFileData);
414 TREE_ARRAY.push( _tree);
417 getFileData: function( _file){
418 var _access = getFileDataAccess( _file);
419 return _access !== null ? _access.DATA : null;
421 getUID: function ( _filedata){
422 var l = FILEDATA_RESITER.length;
423 for( var i=0; i<l; ++i){
424 if( FILEDATA_RESITER[ i] === _filedata) return i;
428 getSeqentialFiles: function( _file){
429 var _data = this.getFileData( _file),
430 _json = _data ? _data.json : null;
432 REQUEST_CONTROLER.getJson( _file, _json, onLoadJson, onErrorJson);
435 updateFileAttribute: function( _uid, key, _value, _opt_callback){
436 var _data = getFileDataAccess( _uid),
440 getFileAttribute: function( _uid, KEYorKEYARRAY){
441 var _fileData = getFileDataAccess( _uid),
442 _type = _fileData.TYPE;
444 move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
445 var _parentData = getFileDataAccess( _prentUID),
446 _parentType = _parentData.TYPE,
447 _targetData = getFileDataAccess( _targetfile),
448 _targetType = _targetData.TYPE;
450 replace: function( _uid, _file, _newIndex){
453 fileEventRellay: function( _targetFile, _targetTree, _event){
454 var _uid = _targetTree.getUID(),
455 _access = TREE_ACCESS_ARRAY[ _uid],
456 l = TREE_ARRAY.length,
458 _access !== undefined && _access.fileEventChatcher( _event);
459 for(var i=0; i<l; ++i){
461 _tree = TREE_ARRAY[i];
462 _currentFile = _tree.getCurrentFile();
463 if( FILE_CONTROLER.getFileData( _currentFile) === _access.DATA){
464 _tree.fileEventChatcher( _event);
472 var FileEventTicketClass = function( UID, _eventType, _callback){
475 eventType: _eventType,
478 this.callBack = _callback = null;
483 var FileEventClass = function( eventType, file, key, value){
485 eventType: eventType,
487 updatedAttribute: key,
493 * fileのdataはobjectで保持している。
494 * pettanr.file.の外からファイルをみるときは、FileClassを通して操作する。
495 * fileの変更、それに付随して追加されたイベントは、TreeClassで管理される。
496 * treeがdestryされると、fileのイベントリスナーも全て削除される。
497 * 他の tree も data の共通する currentFile に対してのみは、file の変更イベントを受け取って流す.
500 var FileClass = function( TREE, parentFile, data){
504 var TYPE = data.type,
505 name = data.name || null,
507 uid = FILE_CONTROLER.getUID( data),
508 CHILDREN = data.children,
512 //alert( 'invalid uid');
513 uid = FILEDATA_RESITER.length;
514 FILEDATA_RESITER.push( data);
517 FILEDATA_ACCESS.push(
522 updateParent: updateParent,
523 fileEventChatcher: dispatchEvent
527 name = thumbnail = parentFile = data = CHILDREN = null;
530 function updateParent( _parent){
531 parentFile = _parent;
533 function dispatchEvent( e){
534 FILE_CONTROLER.fileEventRellay( instance, TREE, e);
538 this.init = function(){
542 this.TYPE = function(){
545 this.getName = function(){
546 if( name !== null) return name;
550 if( TYPE === FILE_TYPE_IS_IMAGE){
551 name = [ data.id, data.ext].join( '.');
553 if( TYPE === FILE_TYPE_IS_PANEL){
554 name = data.comic.title + ' | ' +data.t;
556 return name || 'no_name';
558 this.getThumbnail = function(){
559 if( thumbnail !== null) return thumbnail;
560 if( TYPE === FILE_TYPE_IS_IMAGE){
561 thumbnail = [ 'thumbnail/', data.id, '.', data.ext].join( '');
563 return thumbnail || null;
565 this.getUID = function(){
568 this.getState = function(){
569 return data.state !== undefined ? data.state : FILE_STATE_IS_OK;
571 this.getChildFileLength = function(){
572 return CHILDREN && typeof CHILDREN.length === 'number' ? CHILDREN.length : 0;
574 this.getChildFileByIndex = function( _index){
575 if( typeof _index !== 'number' || _index < 0 || typeof CHILDREN.length !== 'number' || _index >= CHILDREN.length) return null;
576 _file = new FileClass( TREE, this, CHILDREN[ _index]);
580 this.getChildFileIndex = function( _FILEorFILEDATA){
581 if( !CHILDREN || typeof CHILDREN.length !== 'number') return -1;
582 var l = CHILDREN.length,
583 _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA);
584 if( _fileData === null) return -1;
585 for(var i=0; i<l; ++i){
586 if( CHILDREN[ i] === _fileData) return i;
590 this.isChildFile = function( _FILEorFILEDATA){
591 return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
593 this.getAttribute = function( KEYorKEYARRAY){
594 return FILE_CONTROLER.getFileAttribute( UID, KEYorKEYARRAY);
596 this.getSeqentialFiles = function(){
597 FILE_CONTROLER.getSeqentialFiles( this);
599 this.updateAttribute = function( key, value, opt_callback){
600 TREE.updateFileAttribute( UID, key, value, opt_callback);
602 this.move = function( _newFolder, _newIndex, opt_callback){
603 TREE.move( parentFile, UID, _newFolder, _newIndex, opt_callback);
605 this.replace = function( _newIndex, opt_callback){
606 TREE.replace( parentFile, UID, _newIndex, opt_callback);
608 this.addEventListener = function( _eventType, _callback){
609 FILE_CONTROLER.addEventListener( UID, _eventType, _callback);
611 this.removeEventListener = function( _eventType, _callback){
612 FILE_CONTROLER.removeEventListener( UID, _eventType, _callback);
614 this.collect = function(){
618 function getFileObject( TREE, parentFile, data){
620 if( FILE_OBJECT_POOL.length > 0){
621 _file = FILE_OBJECT_POOL.shift();
623 _file = new FileClass();
625 _file.init( TREE, parentFile, data);
629 var ROOT_FILEDATA = {
631 type: FILE_TYPE_IS_FOLDER,
636 type: FILE_TYPE_IS_FOLDER,
637 json: pettanr.CONST.URL_ORIGINAL_PICTURES_JSON,
641 type: FILE_TYPE_IS_FOLDER,
643 childType: FILE_TYPE_IS_IMAGE
646 childType: FILE_TYPE_IS_IMAGE
650 type: FILE_TYPE_IS_FOLDER,
651 json: pettanr.CONST.URL_PANELS_JSON,
655 type: FILE_TYPE_IS_FOLDER,
657 childType: FILE_TYPE_IS_COMIC
660 childType: FILE_TYPE_IS_PANEL
662 //FILEDATA_RESITER.push( ROOT_FILEDATA, IMAGE_FILEDATA, IMAGE_FILEDATA.children[0], COMIC_FILEDATA);
663 ROOT_FILEDATA.children.push( COMIC_FILEDATA, IMAGE_FILEDATA);
665 var SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
666 ROOT_FILE = SYSTEM_TREE.getRootFile(),
667 COMIC_ROOT_INDEX = ROOT_FILE.getChildFileIndex( COMIC_FILEDATA),
668 IMAGE_ROOT_INDEX = ROOT_FILE.getChildFileIndex( IMAGE_FILEDATA);
672 REQUEST_CONTROLER.init();
673 FILE_CONTROLER.init();
674 delete pettanr.file.init;
676 createTree: function( _treeType){
678 if( _treeType === TREE_TYPE_IS_COMIC) _rootFile = COMIC_FILEDATA;
679 if( _treeType === TREE_TYPE_IS_IMAGE) _rootFile = IMAGE_FILEDATA;
680 if( !_rootFile) return null;
681 return FILE_CONTROLER.createTree( _rootFile);
683 TREE_TYPE_IS_COMIC: 1,
684 TREE_TYPE_IS_IMAGE: 2,
685 TREE_TYPE_IS_SETTING: 3,
686 FILE_TYPE_IS_FOLDER: FILE_TYPE_IS_FOLDER,
687 FILE_TYPE_IS_IMAGE: FILE_TYPE_IS_IMAGE,
688 FILE_TYPE_IS_PANEL: FILE_TYPE_IS_PANEL,
689 FILE_TYPE_IS_SETTING: FILE_TYPE_IS_SETTING
693 pettanr.finder = ( function(){
694 var FINDER_ARRAY = [],
695 ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
696 ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
697 ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
698 ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
699 ICON_CLASSNAME = ELM_ORIGIN_FINDER_ICON.getElementsByTagName( 'div')[0].className,
700 FINDER_ICON_POOL = [],
701 BREAD_OBJECT_POOL = [];
703 var FinderIconClass = function(){
705 ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
706 ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-thumbnail', 'div')[0],
707 ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename', 'div')[0],
708 file, w, index, style, instansce, callback;
710 ELM_WRAPPER.onclick = onClick;
716 var _thumb = file.getThumbnail();
717 if( _thumb !== null){
718 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
719 ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb, ')'].join( '');
721 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' file-type-' +file.TYPE();
722 ELM_THUMBNAIL.style.backgroundImage = '';
724 ELM_FILENAME.innerHTML = file.getName();
727 ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
729 function onCollect(){
730 elmContainer.removeChild( ELM_WRAPPER);
732 FINDER_ICON_POOL.push( instansce);
736 init: function( _file, _elmContainer, _w, _index, _style, _callback){
738 if( elmContainer !== _elmContainer){
739 _elmContainer.appendChild( ELM_WRAPPER);
740 elmContainer = _elmContainer;
746 if( index !== _index){
750 callback = _callback;
753 index: function( _index){
757 style: function( _style){
761 onResize: function( w){
765 elmContainer.removeChild( ELM_WRAPPER);
766 file = elmContainer = null;
767 FINDER_ICON_POOL.push( instansce);
771 function updateIconPosition( _style, _w, _index, _elm){
774 var BreadcrumbClass = function(){
776 ELM_WRAPPER = ELM_ORIGIN_FINDER_LOCATION_ITEM.cloneNode( true),
777 ELM_FILENAME = ELM_WRAPPER.getElementsByTagName( 'a')[0],
778 file, w, index, instansce,
780 ELM_WRAPPER.onclick = onClick;
782 ELM_FILENAME.className = 'file-icon-' +file.TYPE();
783 ELM_FILENAME.innerHTML = file.getName();
785 function resize( index){
786 ELM_WRAPPER.style.left = (index * 90) +'px';
793 init: function( _file, _elmContainer, _index, _callback){
795 if( elmContainer !== _elmContainer){
796 _elmContainer.appendChild( ELM_WRAPPER);
797 elmContainer = _elmContainer;
803 if( index !== _index){
807 callback = _callback;
810 index: function( _index){
814 onResize: function( w){
818 elmContainer.removeChild( ELM_WRAPPER);
819 file = elmContainer = null;
820 BREAD_OBJECT_POOL.push( this);
825 var FinderClass = function( ELM_CONTAINER, TREE_TYPE, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
828 elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
829 elmLocation = elmContainer.getElementsByTagName( 'ul')[0],
830 nodesDiv = elmContainer.getElementsByTagName( 'div'),
831 elmSidebarButton = nodesDiv[1],
832 elmStyleButton = nodesDiv[2],
833 elmActionButton = nodesDiv[3],
834 elmBody = nodesDiv[ nodesDiv.length -1],
835 tree = pettanr.file.createTree( TREE_TYPE),
838 headH = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
842 size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON),
848 tree.addTreeEventListener( 'onTreeUpdate', draw);
851 var l = tree.hierarchy() +1,
852 m = BREAD_ARRAY.length,
854 for(var i=0; i<l; ++i){
855 _file = i !== l-1 ? tree.getParentFileAt( i) : tree.getCurrentFile();
857 BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
859 BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick));
862 while( l < BREAD_ARRAY.length){
863 BREAD_ARRAY.pop().collect();
866 l = _file.getChildFileLength();
867 m = ICON_ARRAY.length;
871 ICON_ARRAY[ i].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick);
873 ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick));
876 while( l < ICON_ARRAY.length){
877 ICON_ARRAY.pop().collect();
880 function onHeadClick( i){
881 var l = BREAD_ARRAY.length -1;
883 var _file = tree.getParentFileAt( i);
890 function onBodyClick( i){
891 var l = ICON_ARRAY.length;
893 var _file = tree.getCurrentFile().getChildFileByIndex( i);
894 if( _file !== null && _file.TYPE() === pettanr.file.FILE_TYPE_IS_FOLDER){
903 ELM_CONTAINER.appendChild( elmContainer);
904 //$( elmLocation).click( onHeadClick);
905 //$( elmContainer).click( onBodyClick);
906 var position = pettanr.util.getAbsolutePosition( elmLocation);
909 bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
913 this.init !== undefined && this.init();
919 onWindowResize: function( _w, _h){
924 function getFinderIcon( _file, _elmContainer, w, index, style, callback){
926 if( FINDER_ICON_POOL.length > 0){
927 _icon = FINDER_ICON_POOL.shift();
929 _icon = new FinderIconClass();
931 _icon.init( _file, _elmContainer, w, index, style, callback);
935 function getBreadcrumb( _file, _elmContainer, index, callback){
937 if( BREAD_OBJECT_POOL.length > 0){
938 _bread = BREAD_OBJECT_POOL.shift();
940 _bread = new BreadcrumbClass();
942 _bread.init( _file, _elmContainer, index, callback);
950 createFinder: function( _elmTarget, _treeType, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
951 var _finder = new FinderClass( _elmTarget, _treeType, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
952 FINDER_ARRAY.push( _finder);
958 pettanr.gallery = ( function(){
960 elmContainer = document.getElementById( 'gallery'),
964 init: function( _option){
966 delete pettanr.gallery.init;
968 firstOpen: function(){
969 finder = pettanr.finder.createFinder( elmContainer, pettanr.file.TREE_TYPE_IS_IMAGE);
970 delete pettanr.gallery.firstOpen;
973 pettanr.gallery.firstOpen !== undefined && pettanr.gallery.firstOpen();
980 onWindowResize: function( _w, _h){
981 finder.onWindowResize( _w, _h);
986 pettanr.cabinet = ( function(){
988 elmContainer = document.getElementById( 'cabinet'),
992 init: function( _option){
994 delete pettanr.cabinet.init;
996 firstOpen: function(){
997 finder = pettanr.finder.createFinder( elmContainer, pettanr.file.TREE_TYPE_IS_COMIC);
998 delete pettanr.cabinet.firstOpen;
1001 pettanr.cabinet.firstOpen !== undefined && pettanr.cabinet.firstOpen();
1005 onClose: function(){
1008 onWindowResize: function( _w, _h){
1009 finder.onWindowResize( _w, _h);
1018 pettanr.fn( pettanr.view);
1019 pettanr.fn( pettanr.overlay);
1020 pettanr.fn( pettanr.key);
1021 pettanr.fn( pettanr.balloon);
1022 pettanr.fn( pettanr.editor);
1023 pettanr.fn( pettanr.file);
1024 pettanr.fn( pettanr.finder);
1025 pettanr.fn( pettanr.gallery);
1026 pettanr.fn( pettanr.cabinet);
1028 $(window).ready( pettanr.init);