12 pettanr.log = ( function(){
18 pettanr.io = ( function(){
27 * お気に入り画像一覧 > tag:ペン次郎 > ペン次郎:笑う
28 * 最近アップロードされた画像 > images
30 * キャラクター画像庫 > アニマル系 > tag:ペン次郎 > ペン次郎:笑う
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 = [],
45 TREE_ACCESS_ARRAY = [];
47 var REQUEST_CONTROLER = ( function(){
48 var REQUEST_TICKET_RESISTER = [],
49 DATA_TYPE_ARRAY = 'json,xml,html,text'.split( ','),
56 var RequestTicketClass = function( _type, _data, _url, _onLoad, _onError){
57 this.type = DATA_TYPE_ARRAY[ _type];
60 this.onLoad = _onLoad;
61 this.onError = _onError;
66 if( REQUEST_TICKET_RESISTER.length === 0) return;
67 var _ticket = REQUEST_TICKET_RESISTER.shift();
70 dataType: _ticket.type,
71 success: function( _data){
72 _ticket.onLoad( _ticket.data, _data);
76 _ticket.onError( _ticket.data);
82 getNumTask: function(){
83 return REQUEST_TICKET_RESISTER.length;
85 getNumError: function(){
88 getJson: function( _data, _url, _onLoad, _onError){
89 REQUEST_TICKET_RESISTER.push( new RequestTicketClass( DATA_IS_JSON, _data, _url, _onLoad, _onError));
97 var FILE_CONTROLER = ( function(){
100 createTree: function( _rootFileData){
101 var _tree = new TreeClass( _rootFileData);
103 TREE_ARRAY.push( _tree);
106 getFileData: function( UIDorFILEorFILEDATA){
107 var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
108 return _access !== null ? _access.DATA : null;
110 getChildren: function( UIDorFILEorFILEDATA){
111 var _data = FILE_CONTROLER.getFileData( UIDorFILEorFILEDATA);
112 return _data !== null ? _data.children || null : null;
114 getFileDataAccess: function( UIDorFILEorFILEDATA){
115 var _uid, _data, _access;
117 if( typeof UIDorFILEorFILEDATA === 'number'){
118 _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
120 if( UIDorFILEorFILEDATA instanceof FileClass){
121 _uid = UIDorFILEorFILEDATA.getUID();
122 _data = FILEDATA_RESITER[ _uid] || null;
124 _data = UIDorFILEorFILEDATA || null;
127 if( _data === null || !_data) return null;
128 for( var i=0, l = FILEDATA_ACCESS.length; i<l; ++i){
129 _access = FILEDATA_ACCESS[ i];
130 if( _access.DATA === _data) return _access;
134 getDriver: function( _file){
135 var _data = FILE_CONTROLER.getFileData( _file);
136 return _data !== null && _data.driver ? ( _data.driver || FileDriverBase) : null;
138 getUID: function ( _filedata){
139 var l = FILEDATA_RESITER.length;
140 for( var i=0; i<l; ++i){
141 if( FILEDATA_RESITER[ i] === _filedata) return i;
145 getSeqentialFiles: function( _file){
146 var _driver = FILE_CONTROLER.getDriver( _file);
147 if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
148 _driver.getSeqentialFiles( _file);
151 updateFileAttribute: function( _uid, key, _value, _opt_callback){
152 var _data = FILE_CONTROLER.getFileDataAccess( _uid),
156 getFileAttribute: function( _uid, KEYorKEYARRAY){
157 var _fileData = FILE_CONTROLER.getFileDataAccess( _uid),
158 _type = _fileData.TYPE;
160 move: function( _prentUID, _targetfile, _newFolder, _newIndex, _opt_callback){
161 var _parentData = FILE_CONTROLER.getFileDataAccess( _prentUID),
162 _parentType = _parentData.TYPE,
163 _targetData = FILE_CONTROLER.getFileDataAccess( _targetfile),
164 _targetType = _targetData.TYPE;
166 replace: function( _uid, _file, _newIndex){
169 addEventListener: function( FILEorNULL, _eventType, _callback){
170 var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL;
171 EVENT_LISTENER_RESISTER.push( new FileEventTicketClass( _uid, _eventType, _callback));
173 removeEventListener: function( FILEorNULL, _eventType, _callback){
174 var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
176 for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
177 _ticket = EVENT_LISTENER_RESISTER[i];
178 if( _ticket.fileUID === _uid && _ticket.eventType === _eventType && _ticket.callBack === _callback){
179 EVENT_LISTENER_RESISTER.splice( i, 1);
184 fileEventRellay: function( _targetFile, _targetTree, _event){
185 var _uid = _targetTree.getUID(),
186 _access = TREE_ACCESS_ARRAY[ _uid],
187 l = TREE_ARRAY.length,
189 _access !== undefined && _access.dispatchFileEvent( _event);
190 for(var i=0; i<l; ++i){
192 _tree = TREE_ARRAY[i];
193 _currentFile = _tree.getCurrentFile();
194 if( FILE_CONTROLER.getFileData( _currentFile) === _access.DATA){
195 TREE_ACCESS_ARRAY[ _tree.getUID()].dispatchFileEvent( _event);
203 var TreeClass = function( ROOTFILE_DATA){
204 var UID = TREE_ACCESS_ARRAY.length,
205 PARENT_FILE_RESITER = [],
207 dispatchFileEvent: dispatchFileEvent,
210 EVENT_LISTENER_ARRAY = [],
217 TREE_ACCESS_ARRAY.push( ACCESS);
219 function onDestroy(){
223 function dispatchFileEvent( e){
224 var _eventType = e.eventType,
225 _targetFile = e.targetFile,
226 _uid = _targetFile.getUID(),
227 _ticket, _type, _callback;
228 for(var i=0, l = EVENT_LISTENER_RESISTER.length; i<l; ++i){
229 _ticket = EVENT_LISTENER_RESISTER[i],
230 _type = _ticket.eventType,
231 _callback = _ticket.callBack;
232 if( _eventType === _type && _uid === _ticket.fileUID){
233 _callback( _eventType, _targetFile, e.key, e.value);
235 if( _type === pettanr.file.TREE_EVENT.UPDATE && _eventType === pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES){
236 _callback( _eventType, _targetFile);
244 currentFile = rootFile = new FileClass( this, null, ROOTFILE_DATA);
246 FILE_CONTROLER.getSeqentialFiles( currentFile);
249 getUID: function(){ return UID},
250 getRootFile : function(){
253 getCurrentFile: function(){
256 hierarchy: function(){
257 return PARENT_FILE_RESITER.length;
259 getParentFileAt: function( _index){
260 var l = PARENT_FILE_RESITER.length;
261 if( typeof _index !== 'number' || _index < 0 || _index >= l) return null;
262 return PARENT_FILE_RESITER[ l -1 -_index];
264 down: function( _index){
265 if( typeof _index !== 'number' || _index < 0 || _index >= currentFile.getChildFileLength()) return;
266 PARENT_FILE_RESITER.unshift( currentFile);
267 currentFile = currentFile.getChildFileByIndex( _index);
268 FILE_CONTROLER.getSeqentialFiles( currentFile);
271 up: function( _index){
272 var l = PARENT_FILE_RESITER.length;
273 if( l === 0) return null;
274 if( typeof _index === 'number'){
275 if( _index >= l) return null;
276 currentFile = this.getParentFileAt( _index);
277 PARENT_FILE_RESITER.splice( 0, l -_index);
279 currentFile = PARENT_FILE_RESITER.shift();
281 FILE_CONTROLER.getSeqentialFiles( currentFile);
284 addTreeEventListener: function( _eventType, _callback){
285 FILE_CONTROLER.addEventListener( null, _eventType, _callback);
287 removeTreeEventListener: function( _eventType, _callback){
288 FILE_CONTROLER.removeEventListener( null, _eventType, _callback);
291 FILE_CONTROLER.destroyTree( UID);
296 var FileEventTicketClass = function( UID, _eventType, _callback){
298 this.eventType = _eventType;
299 this.callBack = _callback;
300 this.destroy = function(){
301 this.callBack = _callback = null;
305 var FileEventClass = function( eventType, file, key, value){
306 this.eventType = eventType;
307 this.targetFile = file;
308 this.updatedAttribute = key;
309 this.updatedValue = value;
313 * fileのdataはobjectで保持している。
314 * pettanr.file.の外からファイルをみるときは、FileClassを通して操作する。
315 * fileの変更、それに付随して追加されたイベントは、TreeClassで管理される。
316 * treeがdestryされると、fileのイベントリスナーも全て削除される。
317 * 他の tree も data の共通する currentFile に対してのみは、file の変更イベントを受け取って流す.
320 var FileClass = function( TREE, parentFile, data){
324 var TYPE = data.type,
326 driver = data.driver || FileDriverBase,
328 uid = FILE_CONTROLER.getUID( data),
329 CHILDREN = data.children,
333 uid = FILEDATA_RESITER.length;
334 FILEDATA_RESITER.push( data);
337 FILEDATA_ACCESS.push(
342 updateParent: updateParent,
343 dispatchFileEvent: dispatchEvent
347 name = thumbnail = parentFile = data = CHILDREN = driver = null;
350 function updateParent( _parent){
351 parentFile = _parent;
353 function dispatchEvent( e){
354 FILE_CONTROLER.fileEventRellay( instance, TREE, e);
358 this.init = function(){
362 this.getType = function(){
365 this.getName = function(){
366 if( name !== null) return name;
367 if( typeof driver.getName === 'function'){
368 name = driver.getName( instance);
372 this.getThumbnail = function(){
373 if( thumbnail !== null) return thumbnail;
374 if( typeof driver.getThumbnail === 'function'){
375 thumbnail = driver.getThumbnail( instance);
377 return thumbnail || null;
379 this.getUID = function(){
382 this.getChildFileByIndex = function( _index){
383 if( typeof _index !== 'number' || _index < 0 || typeof CHILDREN.length !== 'number' || _index >= CHILDREN.length) return null;
384 _file = new FileClass( TREE, this, CHILDREN[ _index]);
388 this.move = function( _newFolder, _newIndex, opt_callback){
389 TREE.move( parentFile, UID, _newFolder, _newIndex, opt_callback);
391 this.replace = function( _newIndex, opt_callback){
392 TREE.replace( parentFile, UID, _newIndex, opt_callback);
394 this.destroy = function(){
398 FileClass.prototype = {
399 isChildFile: function( _FILEorFILEDATA){
400 return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
402 getSeqentialFiles: function(){
403 FILE_CONTROLER.getSeqentialFiles( this);
405 addEventListener: function( _eventType, _callback){
406 FILE_CONTROLER.addEventListener( this, _eventType, _callback);
408 removeEventListener: function( _eventType, _callback){
409 FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
411 getChildFileLength: function(){
412 var CHILDREN = FILE_CONTROLER.getChildren( this);
413 return CHILDREN && typeof CHILDREN.length === 'number' ? CHILDREN.length : 0;
415 getChildFileIndex: function( _FILEorFILEDATA){
416 var CHILDREN = FILE_CONTROLER.getChildren( this);
418 if( !CHILDREN || typeof CHILDREN.length !== 'number') return -1;
419 var l = CHILDREN.length,
420 _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA);
421 if( _fileData === null) return -1;
422 for(var i=0; i<l; ++i){
423 if( CHILDREN[ i] === _fileData) return i;
427 getState: function(){
428 var _data = FILE_CONTROLER.getFileData( this);
429 return _data.state !== undefined ? _data.state : pettanr.file.FILE_STATE.OK;
436 var FileDriverBase = {
437 getSeqentialFiles: function( _file){
439 getName: function( _file){
440 var _data = FILE_CONTROLER.getFileData( _file);
441 return _data.name || 'No Name';
443 getThumbnail: function( _file){
444 var _data = FILE_CONTROLER.getFileData( _file);
447 if( _type === pettanr.file.FILE_TYPE.FOLDER){
448 _className = 'folder';
450 if( _type === pettanr.file.FILE_TYPE.IMAGE){
453 if( _type === pettanr.file.FILE_TYPE.TEXT){
456 if( _type === pettanr.file.FILE_TYPE.HTML){
459 if( _type === pettanr.file.FILE_TYPE.CSV){
462 if( _type === pettanr.file.FILE_TYPE.JSON){
465 if( _type === pettanr.file.FILE_TYPE.XML){
470 className: ' file-type-' + _className
473 isWritable: function( _file){
476 isSortable: function( _file){
479 isCreatable: function( _file){
485 write: function( _newName, _newData){
488 onCreate: function(){
497 onDelete: function(){
502 function getFileObject( TREE, parentFile, data){
503 var _file = FILE_OBJECT_POOL.length > 0 ? FILE_OBJECT_POOL.shift() : new FileClass();
504 _file.init( TREE, parentFile, data);
508 var ROOT_FILEDATA = {
510 type: FILE_TYPE_IS_FOLDER,
513 SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
514 ROOT_FILE = SYSTEM_TREE.getRootFile();
516 function createFolderUnderRoot( _fileData){
517 ROOT_FILEDATA.children.push( _fileData);
518 FILE_CONTROLER.getFileDataAccess( ROOT_FILE)
519 .dispatchFileEvent( new FileEventClass( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, ROOT_FILE, 'children', null));
521 function createFileEvent( _eventType, _file, _key, _value){
522 return new FileEventClass( _eventType, _file, _key, _value)
524 function createFileTypeID(){
525 return ++numFileType;
530 //REQUEST_CONTROLER.init();
531 //FILE_CONTROLER.init();
532 delete pettanr.file.init;
534 resisterDriver: function( _driver){
535 _driver.prototype = FileDriverBase;
540 createFolderUnderRoot: createFolderUnderRoot,
541 getFileDataAccess: FILE_CONTROLER.getFileDataAccess,
542 getFileData: FILE_CONTROLER.getFileData,
543 getJson: REQUEST_CONTROLER.getJson,
544 createFileEvent: createFileEvent,
545 createFileTypeID: createFileTypeID
548 createTree: function( _rootFile){
549 return FILE_CONTROLER.createTree( _rootFile);
551 isTreeInstance: function( _tree){
552 return _tree instanceof TreeClass;
554 isFileInstance: function( _file){
555 return _file instanceof FileClass;
558 FOLDER: FILE_TYPE_IS_FOLDER,
559 IMAGE: createFileTypeID(),
560 TEXT: createFileTypeID(),
561 HTML: createFileTypeID(),
562 CSV: createFileTypeID(),
563 JSON: createFileTypeID(),
564 XML: createFileTypeID()
574 UPDATE: 'onTreeUpdate'
577 UPDATE_ATTRIVUTE: 'onFileUpdate',
578 GET_SEQENTIAL_FILES:'gotSeqentilFiles'
580 FILE_DATA_PROPERTY_RESERVED: [
581 'children', 'driver', 'state', 'type', 'name'
586 pettanr.finder = ( function(){
587 var FINDER_ARRAY = [],
588 ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
589 ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
590 ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
591 ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
592 ICON_CLASSNAME = ELM_ORIGIN_FINDER_ICON.getElementsByTagName( 'div')[0].className,
593 FINDER_ICON_POOL = [],
594 BREAD_OBJECT_POOL = [];
596 var FinderIconClass = function(){
598 ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
599 ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-thumbnail', 'div')[0],
600 ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename', 'div')[0],
601 file, w, index, style, instansce, callback;
603 ELM_WRAPPER.onclick = onClick;
609 var _thumb = file.getThumbnail();
611 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
612 ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
614 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' +_thumb.className;
615 ELM_THUMBNAIL.style.backgroundImage = '';
617 ELM_FILENAME.innerHTML = file.getName();
620 ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
622 function onCollect(){
623 elmContainer.removeChild( ELM_WRAPPER);
625 FINDER_ICON_POOL.push( instansce);
629 init: function( _file, _elmContainer, _w, _index, _style, _callback){
631 if( elmContainer !== _elmContainer){
632 _elmContainer.appendChild( ELM_WRAPPER);
633 elmContainer = _elmContainer;
639 if( index !== _index){
643 callback = _callback;
646 index: function( _index){
650 style: function( _style){
654 onResize: function( w){
658 elmContainer.removeChild( ELM_WRAPPER);
659 file = elmContainer = null;
660 FINDER_ICON_POOL.push( instansce);
664 function updateIconPosition( _style, _w, _index, _elm){
667 var BreadcrumbClass = function(){
669 ELM_WRAPPER = ELM_ORIGIN_FINDER_LOCATION_ITEM.cloneNode( true),
670 ELM_FILENAME = ELM_WRAPPER.getElementsByTagName( 'a')[0],
671 file, w, index, instansce,
673 ELM_WRAPPER.onclick = onClick;
675 ELM_FILENAME.className = 'file-icon-' +file.getType();
676 ELM_FILENAME.innerHTML = file.getName();
678 function resize( index){
679 ELM_WRAPPER.style.left = (index * 90) +'px';
687 init: function( _file, _elmContainer, _index, _callback){
689 if( elmContainer !== _elmContainer){
690 _elmContainer.appendChild( ELM_WRAPPER);
691 elmContainer = _elmContainer;
697 if( index !== _index){
701 callback = _callback;
704 index: function( _index){
708 onResize: function( w){
712 elmContainer.removeChild( ELM_WRAPPER);
713 file = elmContainer = null;
714 BREAD_OBJECT_POOL.push( this);
719 var FinderClass = function( ELM_CONTAINER, tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
722 elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true),
723 elmLocation = elmContainer.getElementsByTagName( 'ul')[0],
724 nodesDiv = elmContainer.getElementsByTagName( 'div'),
725 elmSidebarButton = nodesDiv[1],
726 elmStyleButton = nodesDiv[2],
727 elmActionButton = nodesDiv[3],
728 elmBody = nodesDiv[ nodesDiv.length -1],
729 //tree = pettanr.file.createTree( TREE_TYPE),
732 headH = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
736 size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON),
742 tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
745 var l = tree.hierarchy() +1,
746 m = BREAD_ARRAY.length,
748 for(var i=0; i<l; ++i){
749 _file = i !== l-1 ? tree.getParentFileAt( i) : tree.getCurrentFile();
751 BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
753 BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick));
756 while( l < BREAD_ARRAY.length){
757 BREAD_ARRAY.pop().destroy();
760 l = _file.getChildFileLength();
761 m = ICON_ARRAY.length;
765 ICON_ARRAY[ i].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick);
767 ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, w, i, style, onBodyClick));
770 while( l < ICON_ARRAY.length){
771 ICON_ARRAY.pop().destroy();
774 function onHeadClick( i){
775 var l = BREAD_ARRAY.length -1;
777 var _file = tree.getParentFileAt( i);
784 function onBodyClick( i){
785 var l = ICON_ARRAY.length;
787 var _file = tree.getCurrentFile().getChildFileByIndex( i);
788 if( _file !== null && ( _file.getChildFileLength() > 0 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
795 this.init = function(){
796 ELM_CONTAINER.appendChild( elmContainer);
797 //$( elmLocation).click( onHeadClick);
798 //$( elmContainer).click( onBodyClick);
799 var position = pettanr.util.getAbsolutePosition( elmLocation);
802 bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
805 this.onOpen = function(){
806 this.init !== undefined && this.init();
809 this.onClose = function(){
812 this.onWindowResize = function( _w, _h){
816 function getFinderIcon( _file, _elmContainer, w, index, style, callback){
818 if( FINDER_ICON_POOL.length > 0){
819 _icon = FINDER_ICON_POOL.shift();
821 _icon = new FinderIconClass();
823 _icon.init( _file, _elmContainer, w, index, style, callback);
827 function getBreadcrumb( _file, _elmContainer, index, callback){
829 if( BREAD_OBJECT_POOL.length > 0){
830 _bread = BREAD_OBJECT_POOL.shift();
832 _bread = new BreadcrumbClass();
834 _bread.init( _file, _elmContainer, index, callback);
842 createFinder: function( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled){
843 var _finder = new FinderClass( _elmTarget, _tree, detailSwitchEnabled, styleSwitchEnabled, actionSwitchEnabled);
844 FINDER_ARRAY.push( _finder);
847 createFinderHead: function(){
850 resisterFinderPane: function( _finderPane){
853 isFinderInstance: function( _finder){
854 return _finder instanceof FinderClass;
860 pettanr.driver = ( function(){
861 var MyAuthorID = 'current_author' in window ? current_author.id : 1,
862 MyArtistID = 'current_artist' in window ? current_artist.id : 1,
864 getSeqentialFiles: function( _file){
865 var _data = FileAPI.getFileData( _file),
866 _json = _data !== null ? _data.json : null;
867 if( typeof _json === 'string'){
868 FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
869 _data.state = pettanr.file.FILE_STATE.LOADING;
873 getName: function( _file){
874 var _data = FileAPI.getFileData( _file),
875 _type = _data !== null ? _data.type : null;
876 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
877 return [ _data.id, _data.ext ].join( '.');
879 if( _type === pettanr.driver.FILE_TYPE.PANEL){
880 return [ _data.t, ':', _data.comic.name || _data.comic.title ].join( '');
882 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
883 return _data.name + '先生';
885 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
886 return _data.name + '先生';
888 return _data.name || _data.title;
890 getThumbnail: function( _file){
891 var _data = FileAPI.getFileData( _file);
892 _type = _data !== null ? _data.type : null;
893 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
894 return { image: [ pettanr.CONST.RESOURCE_PICTURE_PATH, 'thumbnail/', _data.id, '.', _data.ext ].join( '')};
896 if( _data === FILE_DATA_COMIC_ROOT){
897 return { className: 'file-type-cabinet'};
899 if( _type === pettanr.driver.FILE_TYPE.COMIC){
900 return { className: 'file-type-comic'};
902 if( _type === pettanr.driver.FILE_TYPE.PANEL){
903 return { className: 'file-type-panel'};
905 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
906 return { className: 'file-type-author'};
908 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
909 return { className: 'file-type-artist'};
911 if( _type === pettanr.driver.FILE_TYPE.FOLDEER){
912 return { className: 'file-type-folder'};
914 return { className: 'file-type-folder'};
917 FileAPI = pettanr.file.resisterDriver( Driver),
918 FILE_DATA_SERVICE_ROOT = {
919 name: 'PettanR root',
920 type: pettanr.file.FILE_TYPE.FOLDER,
923 FILE_DATA_COMIC_ROOT = {
925 type: pettanr.file.FILE_TYPE.FOLDER,
928 json: pettanr.CONST.URL_PANELS_JSON
930 FILE_DATA_PICTURE_ROOT = {
932 type: pettanr.file.FILE_TYPE.FOLDER,
935 json: pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
937 FILE_DATA_MY_COMICS_ROOT = {
939 type: pettanr.file.FILE_TYPE.FOLDER,
942 FILE_DATA_MY_PICTURES_ROOT = {
944 type: pettanr.file.FILE_TYPE.FOLDER,
947 FILE_DATA_AUTHOR_ROOT = {
949 type: pettanr.file.FILE_TYPE.FOLDER,
952 FILE_DATA_ARTIST_ROOT = {
954 type: pettanr.file.FILE_TYPE.FOLDER,
957 FILE_DATA_LICENSE_ROOT = {
958 name: 'Original Licenses',
959 type: pettanr.file.FILE_TYPE.FOLDER,
962 FILE_DATA_BALLOON_ROOT = {
963 name: 'Balloon templetes',
964 type: pettanr.file.FILE_TYPE.FOLDER,
971 RESOURCE_PICTURE_ARRAY = [],
972 BALLOON_TEMPLETE_ARRAY = [],
973 ORIGINAL_LICENSE_ARRAY = [],
974 BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
975 FILE_DATA_SERVICE_ROOT.children.push( FILE_DATA_COMIC_ROOT, FILE_DATA_PICTURE_ROOT, FILE_DATA_LICENSE_ROOT, FILE_DATA_BALLOON_ROOT);
976 FILE_DATA_COMIC_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_AUTHOR_ROOT);
977 FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
979 FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
981 function onLoadJson( _file, _json){
982 var _access = FileAPI.getFileDataAccess( _file),
983 _data = _access !== null ? _access.DATA : null,
989 _data.state = pettanr.file.FILE_STATE.OK;
991 for(var i=0; i<l; ++i){
992 buildFileData( _json[ i], _data);
994 _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
996 function onErrorJson( _file){
997 var _data = FileAPI.getFileData( _file);
999 _data.state = pettanr.file.FILE_STATE.ERROR;
1002 function buildFileData( _data, _parent){
1006 if( _parent === FILE_DATA_COMIC_ROOT){
1007 _data.type = pettanr.driver.FILE_TYPE.PANEL;
1008 _array = PANEL_ARRAY;
1010 if( _parent === FILE_DATA_PICTURE_ROOT){
1011 _data.type = pettanr.driver.FILE_TYPE.PICTURE;
1012 _array = RESOURCE_PICTURE_ARRAY;
1014 // original_license を含まなければ、license object を削除して ビットデータ で保持
1015 // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LICENSE_ROOT)
1016 var _license = _data.license,
1017 _Math_pow = Math.pow,
1019 if( typeof _license === 'object'){
1020 for( i=0, l=BASIC_LICENSES.length; i<l; ++i){
1021 if( typeof _license[ BASIC_LICENSES[ i]] === 'number'){
1022 _bits += _Math_pow( 2, i);
1025 _data.license = _bits;
1028 if( _parent === FILE_DATA_LICENSE_ROOT){
1029 _data.type = pettanr.driver.FILE_TYPE.LICENSE;
1030 _array = ORIGINAL_LICENSE_ARRAY;
1033 _data.driver = Driver;
1035 // _array に _data を格納 または 上書き
1036 if( typeof _id === 'number'){
1037 var __data = _array[ _id];
1039 for( var key in _data){
1040 __data[ key ] = _data[ key ];
1042 _data = __data; // このタイミングで参照が切れるので注意!!
1044 _array[ _id] = _data;
1048 if( _parent === FILE_DATA_COMIC_ROOT){
1049 if( _data.comic && _data.author){
1050 var _comic = getFolderData( _data, 'comic', FILE_DATA_COMIC_ROOT),
1051 _comics = getFolderData( _data, 'author', FILE_DATA_AUTHOR_ROOT).children;
1052 _comic.children.push( _data);
1053 pettanr.util.getIndex( _comics, _comic) === -1 && _comics.push( _comic);
1055 // picture data をファイルに取り出し
1056 var _elements = _data.panel_elements || [],
1058 for(var i=0, l=_elements.length; i<l; ++i){
1059 _elm = _elements[ i];
1060 if( _elm.resource_picture){
1061 _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT); // 上記参照切れに備えてここで上書き
1063 if( _elm.resource_picture_id && RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id]){
1064 _elm.resource_picture = RESOURCE_PICTURE_ARRAY[ _elm.resource_picture_id];
1068 if( _parent === FILE_DATA_PICTURE_ROOT){
1069 _data.artist && getFolderData( _data, 'artist', FILE_DATA_ARTIST_ROOT).children.push( _data);
1075 * folder には Artist, Author, Comic,
1077 function getFolderData( _data, _key, _parentData){
1078 if( typeof _data[ _key ] !== 'object') return {children:[]};
1080 _id = _data[ _key ].id,
1082 if( typeof _id !== 'number') return {children:[]};
1084 _array = _parentData === FILE_DATA_ARTIST_ROOT ? ARTIST_ARRAY :
1085 _parentData === FILE_DATA_AUTHOR_ROOT ? AUTHOR_ARRAY :
1086 _parentData === FILE_DATA_COMIC_ROOT ? COMIC_ARRAY : []
1088 if( typeof _array[ _id] === 'object'){
1089 var __data = _array[ _id];
1090 for( var i in _data[ _key ]){
1091 __data[ i ] = _data[ _key ][ i ];
1093 return _data[ _key ] = __data;// このタイミングで参照が切れるので注意!!
1096 _ret = _array[ _id ] = _data[ _key ];
1098 _ret.name = _ret.title;
1102 _ret.driver = Driver;
1104 if( _parentData === FILE_DATA_AUTHOR_ROOT){
1105 _ret.type = pettanr.driver.FILE_TYPE.AUTHOR;
1106 _id === MyAuthorID && FILE_DATA_MY_COMICS_ROOT.children.push( _ret);
1108 if( _parentData === FILE_DATA_ARTIST_ROOT){
1109 _ret.type = pettanr.driver.FILE_TYPE.ARTIST;
1110 _id === MyArtistID && FILE_DATA_MY_PICTURES_ROOT.children.push( _ret);
1112 if( _parentData === FILE_DATA_COMIC_ROOT){
1113 _ret.type = pettanr.driver.FILE_TYPE.COMIC;
1116 _ret.type = pettanr.file.FILE_TYPE.FOLDER;
1119 _parentData.children.push( _ret);
1125 createComicTree: function(){
1126 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMIC_ROOT);
1128 createPictureTree: function(){
1129 return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
1131 createServiceTree: function(){
1132 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
1134 isPettanrFile: function( _file){
1138 COMIC: FileAPI.createFileTypeID(),
1139 PANEL: FileAPI.createFileTypeID(),
1140 PICTURE: FileAPI.createFileTypeID(),
1141 PANEL_PICTURE: FileAPI.createFileTypeID(),
1142 BALLOON: FileAPI.createFileTypeID(),
1143 AUTHOR: FileAPI.createFileTypeID(),
1144 ARTIST: FileAPI.createFileTypeID(),
1145 LICENSE: FileAPI.createFileTypeID()
1151 pettanr.gallery = ( function(){
1153 elmContainer = document.getElementById( 'gallery'),
1157 init: function( _option){
1159 delete pettanr.gallery.init;
1161 firstOpen: function(){
1162 finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
1163 delete pettanr.gallery.firstOpen;
1166 pettanr.gallery.firstOpen !== undefined && pettanr.gallery.firstOpen();
1170 onClose: function(){
1173 onWindowResize: function( _w, _h){
1174 finder.onWindowResize( _w, _h);
1179 pettanr.cabinet = ( function(){
1181 elmContainer = document.getElementById( 'cabinet'),
1185 init: function( _option){
1187 delete pettanr.cabinet.init;
1189 firstOpen: function(){
1190 finder = pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
1191 delete pettanr.cabinet.firstOpen;
1194 pettanr.cabinet.firstOpen !== undefined && pettanr.cabinet.firstOpen();
1198 onClose: function(){
1201 onWindowResize: function( _w, _h){
1202 finder.onWindowResize( _w, _h);
1211 pettanr.fn( pettanr.view);
1212 pettanr.fn( pettanr.overlay);
1213 pettanr.fn( pettanr.key);
1214 pettanr.fn( pettanr.balloon);
1215 pettanr.fn( pettanr.editor);
1216 pettanr.fn( pettanr.file);
1217 pettanr.fn( pettanr.finder);
1218 pettanr.fn( pettanr.gallery);
1219 pettanr.fn( pettanr.cabinet);
1221 $(window).ready( pettanr.init);