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_REGISTER = [],
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 = {
98 createTree: function( _rootFileData){
99 var _tree = new TreeClass( _rootFileData);
101 TREE_ARRAY.push( _tree);
104 getFileDataAccess: function( UIDorFILEorFILEDATA){
105 var _uid, _data, _access;
107 if( typeof UIDorFILEorFILEDATA === 'number'){
108 _data = FILEDATA_RESITER[ UIDorFILEorFILEDATA] || null;
110 if( UIDorFILEorFILEDATA instanceof FileClass){
111 _uid = UIDorFILEorFILEDATA.getUID();
112 _data = FILEDATA_RESITER[ _uid] || null;
114 _data = UIDorFILEorFILEDATA || null;
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;
124 getFileData: function( UIDorFILEorFILEDATA){
125 var _access = FILE_CONTROLER.getFileDataAccess( UIDorFILEorFILEDATA);
126 return _access !== null ? _access.DATA : null;
128 getChildren: function( UIDorFILEorFILEDATA){
129 var _data = FILE_CONTROLER.getFileData( UIDorFILEorFILEDATA);
130 return _data !== null ? _data.children || null : null;
132 getDriver: function( _file){
133 var _data = FILE_CONTROLER.getFileData( _file);
134 return _data !== null && _data.driver ? _data.driver : FileDriverBase;
136 getUpdateFlag: function( _file, _bit){
137 var _driver = FILE_CONTROLER.getDriver( _file ),
139 if( typeof _driver.getUpdatePolicy === 'function'){
140 _policy = _driver.getUpdatePolicy( _file );
143 if( typeof _policy !== 'number') {
144 _policy = FileDriverBase.getUpdatePolicy( _file )
146 return _policy % ( _bit * 2) >= _bit;
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;
154 replace: function( _uid, _file, _newIndex){
157 addEventListener: function( FILEorNULL, _eventType, _callback){
158 var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL;
159 EVENT_LISTENER_REGISTER.push( new FileEventTicketClass( _uid, _eventType, _callback));
161 removeEventListener: function( FILEorNULL, _eventType, _callback){
162 var _uid = FILEorNULL instanceof FileClass ? FILEorNULL.getUID() : FILEorNULL,
164 for(var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i){
165 _ticket = EVENT_LISTENER_REGISTER[i];
166 if( _ticket.fileUID === _uid && _ticket.eventType === _eventType && _ticket.callBack === _callback){
167 EVENT_LISTENER_REGISTER.splice( i, 1);
172 getTreeAccess: function(){
175 fileEventRellay: function( _uid, _event ){
176 var _fileAccess = FILE_CONTROLER.getFileDataAccess( _uid );
177 if( _fileAccess === null ) return;
178 var _treeUID = _fileAccess.TREE.getUID(),
179 _treeAccess = TREE_ACCESS_ARRAY[ _treeUID ],
180 _data = _fileAccess.DATA,
182 if( !_treeAccess ) return;
183 _treeAccess.dispatchFileEvent( _event );
184 for( var i=0, l = TREE_ARRAY.length; i<l; ++i){
185 if( i !== _treeUID ){
186 _tree = TREE_ARRAY[ i ];
187 if( FILE_CONTROLER.getFileData( _tree.getCurrentFile() ) === _data ){
188 _treeAccess = TREE_ACCESS_ARRAY[ _tree.getUID() ];
189 _treeAccess && _treeAccess.dispatchFileEvent( _event );
196 var TreeClass = function( rootFileData ){
197 var PARENT_FILE_RESITER = [],
199 dispatchFileEvent: dispatchFileEvent
201 EVENT_LISTENER_ARRAY = [],
206 TREE_ACCESS_ARRAY.push( ACCESS );
208 function dispatchFileEvent( e ){
209 var _eventType = e.eventType,
210 _targetFile = e.targetFile,
211 _uid = _targetFile.getUID(),
212 _ticket, _type, _callback;
213 for(var i=0, l = EVENT_LISTENER_REGISTER.length; i<l; ++i ){
214 _ticket = EVENT_LISTENER_REGISTER[ i ];
215 _type = _ticket.eventType;
216 _callback = _ticket.callBack;
217 if( _eventType === _type && _uid === _ticket.fileUID ){
218 _callback( _eventType, _targetFile, e.key, e.value );
220 if( _type === pettanr.file.TREE_EVENT.UPDATE && _eventType === pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES ){
221 _callback( _eventType, _targetFile );
229 currentFile = rootFile = new FileClass( instance, null, rootFileData );
231 currentFile.getSeqentialFiles();
235 return pettanr.util.getIndex( TREE_ACCESS_ARRAY, ACCESS );
237 getRootFile : function(){
240 getCurrentFile: function(){
243 hierarchy: function(){
244 return PARENT_FILE_RESITER.length;
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];
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();
258 up: function( _index){
259 var l = PARENT_FILE_RESITER.length;
260 if( l === 0) return null;
263 var _currentFile = currentFile;
265 _currentFile.destroy();
267 if( typeof _index === 'number'){
268 if( _index >= l) return null;
269 currentFile = this.getParentFileAt( _index );
270 PARENT_FILE_RESITER.splice( 0, l -_index);
272 currentFile = PARENT_FILE_RESITER.shift();
274 currentFile.getSeqentialFiles();
277 addTreeEventListener: function( _eventType, _callback){
278 FILE_CONTROLER.addEventListener( null, _eventType, _callback);
280 removeTreeEventListener: function( _eventType, _callback){
281 FILE_CONTROLER.removeEventListener( null, _eventType, _callback);
284 FILE_CONTROLER.destroyTree( instance.getUID() );
286 var _currentFile = currentFile;
287 currentFile = rootFile = rootFileData = null;
288 _currentFile.destroy();
289 while( PARENT_FILE_RESITER.length > 0 ){
290 _currentFile = PARENT_FILE_RESITER.shift();
291 _currentFile.destroy();
298 var FileEventTicketClass = function( UID, _eventType, _callback){
300 this.eventType = _eventType;
301 this.callBack = _callback;
302 this.destroy = function(){
303 this.callBack = _callback = null;
307 var FileEventClass = function( eventType, file, key, value){
308 this.eventType = eventType;
309 this.targetFile = file;
310 this.updatedAttribute = key;
311 this.updatedValue = value;
315 * fileのdataはobjectで保持している。
316 * pettanr.file.の外からファイルをみるときは、FileClassを通して操作する。
317 * fileの変更、それに付随して追加されたイベントは、TreeClassで管理される。
318 * treeがdestryされると、fileのイベントリスナーも全て削除される。
319 * 他の tree も data の共通する currentFile に対してのみは、file の変更イベントを受け取って流す.
322 var FileClass = function( tree, parentFile, data ){
323 var uid = pettanr.util.getIndex( FILEDATA_RESITER, data ),
327 uid = FILEDATA_RESITER.length;
328 FILEDATA_RESITER.push( data );
331 FILEDATA_ACCESS.push(
334 parentFile: parentFile,
336 dispatchFileEvent: dispatchEvent
340 tree = parentFile = data = null;
342 function dispatchEvent( e ){
343 FILE_CONTROLER.fileEventRellay( uid, e );
345 this.getUID = function(){
350 FileClass.prototype = {
351 isChildFile: function( _FILEorFILEDATA){
352 return this.getChildFileIndex( _FILEorFILEDATA) !== -1;
354 getSeqentialFiles: function(){
355 var _driver = FILE_CONTROLER.getDriver( this );
356 if( _driver !== null && typeof _driver.getSeqentialFiles === 'function'){
357 _driver.getSeqentialFiles( this );
360 addEventListener: function( _eventType, _callback){
361 FILE_CONTROLER.addEventListener( this, _eventType, _callback);
363 removeEventListener: function( _eventType, _callback){
364 FILE_CONTROLER.removeEventListener( this, _eventType, _callback);
366 getChildFileLength: function(){
367 var children = FILE_CONTROLER.getChildren( this);
368 return Type.isArray( children ) === true ? children.length : -1;
370 getChildFileIndex: function( _FILEorFILEDATA){
371 var children = FILE_CONTROLER.getChildren( this);
372 if( Type.isArray( children.length ) === false ) return -1;
373 var l = children.length,
374 _fileData = FILE_CONTROLER.getFileData( _FILEorFILEDATA);
375 if( _fileData === null) return -1;
376 for(var i=0; i<l; ++i){
377 if( children[ i] === _fileData) return i;
382 var driver = FILE_CONTROLER.getDriver( this );
383 if( typeof driver.getName === 'function'){
384 return driver.getName( this );
386 return FileDriverBase.getName( this);
388 getThumbnail: function(){
389 var driver = FILE_CONTROLER.getDriver( this);
390 if( typeof driver.getThumbnail === 'function'){
391 return driver.getThumbnail( this);
393 return FileDriverBase.getThumbnail( this);
396 var _data = FILE_CONTROLER.getFileData( this);
397 return typeof _data.type === 'number' ? _data.type : pettanr.file.FILE_TYPE.UNKNOWN;
399 getState: function(){
400 var _data = FILE_CONTROLER.getFileData( this);
401 return typeof _data.state === 'number' ? _data.state : pettanr.file.FILE_STATE.OK;
403 getSummary: function(){
404 var driver = FILE_CONTROLER.getDriver( this );
405 if( typeof driver.getSummary === 'function'){
406 return driver.getSummary( this );
408 return FileDriverBase.getSummary( this);
410 isWritable: function(){
411 return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.WRITE );
413 isSortable: function(){
414 return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.SORT );
416 isCreatable: function(){
417 return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.CREATE );
419 isRenamable: function(){
420 return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.RENAME );
422 isDeletable: function(){
423 return FILE_CONTROLER.getUpdateFlag( this, pettanr.file.FILE_UPDATE_POLICY.DELETE );
427 var driver = FILE_CONTROLER.getDriver( this );
428 if( typeof driver.read === 'function'){
429 return driver.read( this );
431 return FileDriverBase.read( this );
433 write: function( _newName, _newData ){
434 var driver = FILE_CONTROLER.getDriver( this );
435 if( typeof driver.write === 'function'){
436 return driver.write( this, _newName, _newData );
438 return FileDriverBase.write( this, _newName, _newData );
440 viewerApplicationList: function(){
441 var driver = FILE_CONTROLER.getDriver( this );
442 if( typeof driver.viewerApplicationList === 'function'){
443 return driver.viewerApplicationList( this );
445 return FileDriverBase.viewerApplicationList( this );
447 editorApplicationList: function(){
448 var driver = FILE_CONTROLER.getDriver( this );
449 if( typeof driver.editorApplicationList === 'function'){
450 return driver.editorApplicationList( this );
452 return FileDriverBase.viwerApps( this );
463 onDelete: function(){
466 getChildFileByIndex: function( _index ){
467 var _access = FILE_CONTROLER.getFileDataAccess( this ),
468 _children = FILE_CONTROLER.getChildren( this );
469 if( typeof _index !== 'number' || _index < 0 || Type.isArray( _children ) === false || _index >= _children.length) return null;
470 var _file = new FileClass( _access.TREE, this, _children[ _index ]);
474 move: function( _newFolder, _newIndex, opt_callback ){
475 var _access = FILE_CONTROLER.getFileDataAccess( this );
476 _access.TREE.move( _access.parentFile, this.getUID(), _newFolder, _newIndex, opt_callback );
478 replace: function( _newIndex, opt_callback){
479 var _access = FILE_CONTROLER.getFileDataAccess( this );
480 _access.TREE.replace( _access.parentFile, this.getUID(), _newIndex, opt_callback);
483 var _access = FILE_CONTROLER.getFileDataAccess( this );
484 var TREE = _access.TREE;
485 if( TREE.getCurrentFile() === this ) return;
486 if( TREE.getRootFile() === this ) return;
487 for( var i=0, l = TREE.hierarchy(); i<l; ++i ){
488 if( TREE.getParentFileAt( i ) === this ){
492 var _index = pettanr.util.getIndex( FILEDATA_ACCESS, _access );
493 if( _index === -1 || _access === null ) return;
495 FILEDATA_ACCESS.splice( _index, 1 );
498 delete _access.parentFile;
499 delete _access.dispatchFileEvent;
506 var FileDriverBase = {
507 getSeqentialFiles: function( _file){
509 getName: function( _file){
510 var _data = FILE_CONTROLER.getFileData( _file);
511 return _data.name || 'No Name';
513 getThumbnail: function( _file){
514 var _data = FILE_CONTROLER.getFileData( _file),
517 if( _type === pettanr.file.FILE_TYPE.FOLDER){
518 _className = 'folder';
520 if( _type === pettanr.file.FILE_TYPE.IMAGE){
523 if( _type === pettanr.file.FILE_TYPE.TEXT){
526 if( _type === pettanr.file.FILE_TYPE.HTML){
529 if( _type === pettanr.file.FILE_TYPE.CSV){
532 if( _type === pettanr.file.FILE_TYPE.JSON){
535 if( _type === pettanr.file.FILE_TYPE.XML){
540 className: ' file-type-' + _className
543 getSummary: function( _file ){
544 var _data = FILE_CONTROLER.getFileData( _file ),
546 if( _type === pettanr.file.FILE_TYPE.FOLDER){
549 if( _type === pettanr.file.FILE_TYPE.IMAGE){
552 if( _type === pettanr.file.FILE_TYPE.TEXT){
555 if( _type === pettanr.file.FILE_TYPE.HTML){
556 return 'html document file';
558 if( _type === pettanr.file.FILE_TYPE.CSV){
559 return 'csv daat file';
561 if( _type === pettanr.file.FILE_TYPE.JSON){
562 return 'json data file';
564 if( _type === pettanr.file.FILE_TYPE.XML){
565 return 'xml data file';
569 getUpdatePolicy: function( _file ){
571 return pettanr.file.FILE_UPDATE_POLICY.DSRWC;
573 read: function( _file ){
574 var _data = FILE_CONTROLER.getFileData( _file ),
578 write: function( _file, _newName, _newData){
579 var _data = FILE_CONTROLER.getFileData( _file ),
583 viewerApplicationList: function(){
586 editorApplicationList: function(){
589 onCreate: function(){
598 onDelete: function(){
603 var ROOT_FILEDATA = {
605 type: FILE_TYPE_IS_FOLDER,
608 SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
609 ROOT_FILE = SYSTEM_TREE.getRootFile();
611 function createFolderUnderRoot( _fileData){
612 ROOT_FILEDATA.children.push( _fileData);
613 FILE_CONTROLER.getFileDataAccess( ROOT_FILE)
614 .dispatchFileEvent( new FileEventClass( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, ROOT_FILE, 'children', null));
616 function createFileEvent( _eventType, _file, _key, _value){
617 return new FileEventClass( _eventType, _file, _key, _value);
619 function createFileTypeID(){
620 return ++numFileType;
625 //REQUEST_CONTROLER.init();
626 //FILE_CONTROLER.init();
627 delete pettanr.file.init;
629 registerDriver: function( _driver){
630 _driver.prototype = FileDriverBase;
635 createFolderUnderRoot: createFolderUnderRoot,
636 getFileDataAccess: FILE_CONTROLER.getFileDataAccess,
637 getFileData: FILE_CONTROLER.getFileData,
638 getJson: REQUEST_CONTROLER.getJson,
639 createFileEvent: createFileEvent,
640 createFileTypeID: createFileTypeID
643 createTree: function( _rootFile){
644 return FILE_CONTROLER.createTree( _rootFile);
646 isTreeInstance: function( _tree){
647 return _tree instanceof TreeClass;
649 isFileInstance: function( _file){
650 return _file instanceof FileClass;
654 FOLDER: FILE_TYPE_IS_FOLDER,
655 IMAGE: createFileTypeID(),
656 TEXT: createFileTypeID(),
657 HTML: createFileTypeID(),
658 CSV: createFileTypeID(),
659 JSON: createFileTypeID(),
660 XML: createFileTypeID()
669 FILE_UPDATE_POLICY: {
670 _____: parseInt( '00000', 2),
671 ____C: parseInt( '00001', 2), // hasCreateMenu
672 ___W_: parseInt( '00010', 2), // isWritable
673 ___WC: parseInt( '00011', 2), // isWritable
674 __R__: parseInt( '00100', 2), // isRenamable
675 __R_C: parseInt( '00101', 2), // hasCreateMenu
676 __RW_: parseInt( '00110', 2), // isWritable
677 __RWC: parseInt( '00111', 2), // isWritable
678 _S___: parseInt( '01000', 2), // childrenIsSortable
679 _S__C: parseInt( '01001', 2),
680 _S_W_: parseInt( '01010', 2),
681 _S_WC: parseInt( '01011', 2),
682 _SR__: parseInt( '01100', 2),
683 _SR_C: parseInt( '01101', 2),
684 _SRW_: parseInt( '01110', 2),
685 _SRWC: parseInt( '01111', 2),
686 D____: parseInt( '10000', 2),
687 D___C: parseInt( '10001', 2), // hasCreateMenu
688 D__W_: parseInt( '10010', 2), // isWritable
689 D__WC: parseInt( '10011', 2), // isWritable
690 D_R__: parseInt( '10100', 2), // isRenamable
691 D_R_C: parseInt( '10101', 2), // hasCreateMenu
692 D_RW_: parseInt( '10110', 2), // isWritable
693 D_RWC: parseInt( '10111', 2), // isWritable
694 DS___: parseInt( '11000', 2), // childrenIsSortable
695 DS__C: parseInt( '11001', 2),
696 DS_W_: parseInt( '11010', 2),
697 DS_WC: parseInt( '11011', 2),
698 DSR__: parseInt( '11100', 2),
699 DSR_C: parseInt( '11101', 2),
700 DSRW_: parseInt( '11110', 2),
701 DSRWC: parseInt( '11111', 2),
709 UPDATE: 'onTreeUpdate'
712 UPDATE_ATTRIVUTE: 'onFileUpdate',
713 GET_SEQENTIAL_FILES:'gotSeqentilFiles'
715 FILE_DATA_PROPERTY_RESERVED: [
716 'children', 'driver', 'state', 'type'
721 pettanr.finder = ( function(){
722 var FINDER_ARRAY = [],
723 ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
724 ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
725 ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
726 ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
727 ICON_CLASSNAME = 'finder-icon-thumbnail',
728 FINDER_ICON_POOL = [],
729 BREAD_OBJECT_POOL = [];
731 var FinderIconClass = function(){
733 ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
734 ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, ICON_CLASSNAME )[0],
735 ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename' )[0],
736 ELM_DESCRIPTION = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-summary' )[0],
737 ELM_EDITOR_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-editor-apps' )[0],
738 ELM_VIEWER_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-viewer-apps' )[0],
739 ELM_ACTION_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-action' )[0],
740 file, w, index, style, instansce,
741 onDownCallback, onEditorCallback, onViewerCallback, onActionCallback,
742 viewerList, editorList;
743 ELM_WRAPPER.onmouseover = onOver;
745 ELM_WRAPPER.style.backgroundColor = '#eee';
747 ELM_WRAPPER.onmouseout = onOut;
749 ELM_WRAPPER.style.backgroundColor = '';
752 ELM_WRAPPER.onclick = onDownClick;
753 function onDownClick(){
754 onDownCallback( index );
756 ELM_EDITOR_BUTTON.onclick = onEditorClick;
757 function onEditorClick(){
758 onEditorCallback( index );
760 ELM_VIEWER_BUTTON.onclick = onViwerClick;
761 function onViwerClick(){
762 onViewerCallback( index );
764 ELM_ACTION_BUTTON.onclick = onActionClick;
765 function onActionClick(){
766 onActionCallback( index );
769 var _thumb = file.getThumbnail();
771 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
772 ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
774 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' + _thumb.className;
775 ELM_THUMBNAIL.style.backgroundImage = '';
777 ELM_FILENAME.firstChild.data = file.getName();
778 ELM_DESCRIPTION.firstChild.data = file.getSummary();
780 if( Type.isArray( viewerList ) === true && viewerList.length > 0 ){
781 ELM_VIEWER_BUTTON.style.display = '';
783 ELM_VIEWER_BUTTON.style.display = 'none';
785 if( Type.isArray( editorList ) === true && editorList.length > 0 ){
786 ELM_EDITOR_BUTTON.style.display = '';
788 ELM_EDITOR_BUTTON.style.display = 'none';
792 ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
794 function onCollect(){
795 elmContainer.removeChild( ELM_WRAPPER);
797 FINDER_ICON_POOL.push( instansce);
801 init: function( _file, _elmContainer, _w, _index, _style, _onDownCallback, _onEditorCallback, _onViewerCallback, _onActionCallback ){
803 if( elmContainer !== _elmContainer){
804 _elmContainer.appendChild( ELM_WRAPPER);
805 elmContainer = _elmContainer;
808 file && file.destroy();
810 viewerList = file.viewerApplicationList();
811 editorList = file.editorApplicationList();
814 if( index !== _index){
818 onDownCallback = _onDownCallback;
819 onEditorCallback = _onEditorCallback;
820 onViewerCallback = _onViewerCallback;
821 onActionCallback = _onActionCallback;
824 index: function( _index){
828 style: function( _style){
832 onResize: function( w ){
836 elmContainer.removeChild( ELM_WRAPPER);
837 file && file.destroy();
838 file = elmContainer = onDownCallback = onEditorCallback = onViewerCallback = onActionCallback = viewerList = editorList = null;
839 FINDER_ICON_POOL.push( instansce);
843 function updateIconPosition( _style, _w, _index, _elm){
846 var BreadcrumbClass = function(){
848 ELM_WRAPPER = ELM_ORIGIN_FINDER_LOCATION_ITEM.cloneNode( true),
849 ELM_FILENAME = ELM_WRAPPER.getElementsByTagName( 'a')[0],
850 file, w, index, instansce,
852 ELM_WRAPPER.onclick = onClick;
854 ELM_FILENAME.className = 'file-icon-' +file.getType();
855 ELM_FILENAME.innerHTML = file.getName();
857 function resize( index){
858 ELM_WRAPPER.style.left = (index * 90) +'px';
866 init: function( _file, _elmContainer, _index, _callback ){
868 if( elmContainer !== _elmContainer){
869 _elmContainer.appendChild( ELM_WRAPPER);
870 elmContainer = _elmContainer;
876 if( index !== _index){
880 callback = _callback;
883 index: function( _index){
887 onResize: function( w){
891 elmContainer.removeChild( ELM_WRAPPER);
892 file = elmContainer = null;
893 BREAD_OBJECT_POOL.push( this );
898 var FinderClass = function( ELM_CONTAINER, tree, header, footer ){
901 elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true ),
902 elmLocation = elmContainer.getElementsByTagName( 'ul' )[0],
903 nodesDiv = elmContainer.getElementsByTagName( 'div' ),
904 elmSidebarButton = nodesDiv[1],
905 elmStyleButton = nodesDiv[2],
906 elmActionButton = nodesDiv[3],
907 elmBody = nodesDiv[ nodesDiv.length -1 ],
908 //tree = pettanr.file.createTree( TREE_TYPE),
911 headH = pettanr.util.getElementSize( nodesDiv[0] ).height,
915 size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON ),
921 tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
923 function draw( _w, _h ){
924 w = Type.isFinite( _w ) === true ? _w : w;
925 h = Type.isFinite( _h ) === true ? _h : h;
927 var l = tree.hierarchy() +1,
928 m = BREAD_ARRAY.length,
930 for(var i=0; i<l; ++i){
931 _file = i !== l-1 ? tree.getParentFileAt( i) : tree.getCurrentFile();
933 BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
935 BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick ));
938 while( l < BREAD_ARRAY.length){
939 BREAD_ARRAY.pop().destroy();
942 l = _file.getChildFileLength();
943 m = ICON_ARRAY.length;
947 ICON_ARRAY[ i ].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onDown, onEditor, onViwer, onAction );
949 ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, _w, i, style, onDown, onEditor, onViwer, onAction ));
952 if( _file.getState() === pettanr.file.FILE_STATE.LOADING ){
953 elmBody.className = 'finder-body loading';
955 elmBody.className = 'finder-body';
957 elmBody.style.height = bodyH + 'px';
959 while( l < ICON_ARRAY.length){
960 ICON_ARRAY.pop().destroy();
964 function onHeadClick( i){
965 var l = BREAD_ARRAY.length -1;
967 var _file = tree.getParentFileAt( i);
974 function onDown( i ){
975 if( i < ICON_ARRAY.length ){
976 var _file = tree.getCurrentFile().getChildFileByIndex( i );
977 if( _file !== null && ( _file.getChildFileLength() !== -1 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
983 function onEditor( i ){
984 if( i < ICON_ARRAY.length ){
985 var _file = tree.getCurrentFile().getChildFileByIndex( i );
988 function onViwer( i ){
989 if( i < ICON_ARRAY.length ){
990 var _file = tree.getCurrentFile().getChildFileByIndex( i );
993 function onAction( i ){
994 if( i < ICON_ARRAY.length ){
995 var _file = tree.getCurrentFile().getChildFileByIndex( i );
1000 this.init = function(){
1001 ELM_CONTAINER.appendChild( elmContainer);
1002 //$( elmLocation).click( onHeadClick);
1003 //$( elmContainer).click( onBodyClick);
1004 var position = pettanr.util.getAbsolutePosition( elmLocation);
1007 bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
1010 this.onOpen = function( _w, _h, _option ){
1011 this.init !== undefined && this.init();
1014 this.onClose = function(){
1017 this.onPaneResize = function( _w, _h){
1020 elmBody.style.height = ( _h - headH ) + 'px';
1022 for(var i=0, l=ICON_ARRAY.length; i<l; ++i){
1023 ICON_ARRAY[ i].onResize( _w );
1026 this.MIN_WIDTH = 240;
1027 this.MIN_HEIGHT = 240;
1030 pettanr.view.registerAsBasicPane( FinderClass );
1032 function getFinderIcon( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction){
1034 if( FINDER_ICON_POOL.length > 0){
1035 _icon = FINDER_ICON_POOL.shift();
1037 _icon = new FinderIconClass();
1039 _icon.init( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction );
1043 function getBreadcrumb( _file, _elmContainer, index, callback){
1045 if( BREAD_OBJECT_POOL.length > 0){
1046 _bread = BREAD_OBJECT_POOL.shift();
1048 _bread = new BreadcrumbClass();
1050 _bread.init( _file, _elmContainer, index, callback);
1058 createFinder: function( _elmTarget, _tree, _header, _footer ){
1059 var _finder = new FinderClass( _elmTarget, _tree, _header, _footer );
1060 FINDER_ARRAY.push( _finder);
1063 registerFinderHead: function(){
1066 registerFinderPane: function( _finderPane){
1069 isFinderInstance: function( _finder){
1070 return _finder instanceof FinderClass;
1072 isFinderPaneInstance: function(){
1075 isFinderHeadInstance: function(){
1081 pettanr.driver = ( function(){
1082 var MyAuthorID = 'current_author' in window ? current_author.id : ( pettanr.DEBUG ? 1 : -1 ),
1083 MyArtistID = 'current_artist' in window ? current_artist.id : ( pettanr.DEBUG ? 1 : -1 ),
1085 getSeqentialFiles: function( _file){
1086 var _data = FileAPI.getFileData( _file),
1087 _json = _data !== null ? _data.json : null;
1088 if( _json === true && _data.type === pettanr.driver.FILE_TYPE.COMIC ){
1089 _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'comics\/', _data.id, '.json\/play\/' ].join( '' );
1091 if( typeof _json === 'string'){
1092 FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
1093 _data.state = pettanr.file.FILE_STATE.LOADING;
1098 getName: function( _file){
1099 var _data = FileAPI.getFileData( _file),
1100 _type = _data !== null ? _data.type : null;
1101 if( _type === pettanr.driver.FILE_TYPE.PICTURE ){
1102 return [ _data.id, _data.ext ].join( '.');
1104 if( _type === pettanr.driver.FILE_TYPE.PANEL ){
1105 return [ _data.t, ':', _data.comic.title ].join( '');
1107 if( _type === pettanr.driver.FILE_TYPE.COMIC ){
1110 if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
1111 return [ _data.id , ':', _data.name, '画伯' ].join( '');
1113 if( _type === pettanr.driver.FILE_TYPE.AUTHOR ){
1114 return [ _data.id , ':', _data.name, '先生' ].join( '');
1118 getThumbnail: function( _file){
1119 var _data = FileAPI.getFileData( _file),
1120 _type = _data !== null ? _data.type : null;
1121 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
1122 return { image: [ pettanr.CONST.RESOURCE_PICTURE_PATH, 'thumbnail/', _data.id, '.', _data.ext ].join( '')};
1124 if( _data === FILE_DATA_COMICS_ROOT){
1125 return { className: 'file-type-cabinet'};
1127 if( _type === pettanr.driver.FILE_TYPE.COMIC){
1128 return { className: 'file-type-comic'};
1130 if( _type === pettanr.driver.FILE_TYPE.PANEL){
1131 return { className: 'file-type-panel'};
1133 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
1134 return { className: 'file-type-author'};
1136 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
1137 return { className: 'file-type-artist'};
1139 if( _type === pettanr.file.FILE_TYPE.FOLDER){
1140 return { className: 'file-type-folder'};
1142 return { className: 'file-type-broken'};
1144 getSummary: function( _file ){
1145 var _data = FileAPI.getFileData( _file),
1146 _type = _data !== null ? _data.type : null;
1147 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
1148 return [ _data.width, 'x', _data.height, ', filesize:', _data.filesize, ', lisence:', _data.license ].join( '' );
1150 if( _data === FILE_DATA_COMICS_ROOT){
1151 return 'cabinet file';
1153 if( _type === pettanr.driver.FILE_TYPE.COMIC){
1154 return 'comic file';
1156 if( _type === pettanr.driver.FILE_TYPE.PANEL){
1157 return [ _data.width, 'x', _data.height ].join( '' );
1159 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
1160 return 'author file';
1162 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
1163 return [ 'Email:', _data.email || 'empty' , ', HP:', _data.homepage_url || 'empty' ].join( '' );
1165 if( _type === pettanr.file.FILE_TYPE.FOLDER){
1166 return 'pettanR folder';
1168 return 'pettanR unknown file';
1170 viewerApplicationList: function( _file ){
1171 var _data = FileAPI.getFileData( _file ),
1172 _type = _data !== null ? _data.type : null;
1175 editorApplicationList: function( _file ){
1176 var _data = FileAPI.getFileData( _file ),
1177 _type = _data !== null ? _data.type : null;
1178 if( _type === pettanr.driver.FILE_TYPE.PANEL ){
1179 return [ pettanr.editor ];
1181 if( _type === pettanr.driver.FILE_TYPE.COMIC ){
1182 return [ pettanr.editor, pettanr.comicConsole ];
1187 FileAPI = pettanr.file.registerDriver( Driver),
1188 FILE_DATA_SERVICE_ROOT = {
1189 name: 'PettanR root',
1190 type: pettanr.file.FILE_TYPE.FOLDER,
1193 FILE_DATA_COMICS_ROOT = {
1195 type: pettanr.file.FILE_TYPE.FOLDER,
1198 json: pettanr.CONST.URL_COMICS_JSON
1200 FILE_DATA_PANELS_ROOT = {
1202 type: pettanr.file.FILE_TYPE.FOLDER,
1205 json: pettanr.CONST.URL_PANELS_JSON
1207 FILE_DATA_PICTURE_ROOT = {
1209 type: pettanr.file.FILE_TYPE.FOLDER,
1212 json: pettanr.CONST.URL_RESOURCE_PICTURES_JSON
1214 FILE_DATA_MY_COMICS_ROOT = {
1216 type: pettanr.file.FILE_TYPE.FOLDER,
1220 FILE_DATA_LATEST_COMICS = {
1221 name: 'Latest Comics',
1222 type: pettanr.file.FILE_TYPE.FOLDER,
1225 FILE_DATA_MY_PICTURES_ROOT = {
1226 name: 'My Pictures',
1227 type: pettanr.file.FILE_TYPE.FOLDER,
1230 json: pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
1232 FILE_DATA_AUTHOR_ROOT = {
1234 type: pettanr.file.FILE_TYPE.FOLDER,
1237 FILE_DATA_ARTIST_ROOT = {
1239 type: pettanr.file.FILE_TYPE.FOLDER,
1242 FILE_DATA_LISENCE_ROOT = {
1243 name: 'Original Lisences',
1244 type: pettanr.file.FILE_TYPE.FOLDER,
1247 FILE_DATA_BALLOON_ROOT = {
1248 name: 'Balloon templetes',
1249 type: pettanr.file.FILE_TYPE.FOLDER,
1256 RESOURCE_PICTURE_ARRAY = [],
1257 BALLOON_TEMPLETE_ARRAY = [],
1258 ORIGINAL_LICENSE_ARRAY = [],
1259 BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
1260 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);
1261 FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_LATEST_COMICS, FILE_DATA_AUTHOR_ROOT);
1262 FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
1264 FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
1266 function onLoadJson( _file, _json ){
1267 var _access = FileAPI.getFileDataAccess( _file),
1268 _data = _access !== null ? _access.DATA : null,
1270 if( _data === null){
1271 onErrorJson( _file);
1274 _data.state = pettanr.file.FILE_STATE.OK;
1276 if( Type.isArray( _json ) === true ){
1278 if( l === 0) return;
1279 for( var i=0; i<l; ++i ){
1280 buildFileData( _json[ i], _data);
1284 buildFileData( _json, _data );
1286 _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
1288 function onErrorJson( _file ){
1289 var _data = FileAPI.getFileData( _file);
1290 if( _data !== null){
1291 _data.state = pettanr.file.FILE_STATE.ERROR;
1294 function buildFileData( _data, _parent ){
1297 if( _parent === FILE_DATA_PANELS_ROOT ){
1298 _data.type = pettanr.driver.FILE_TYPE.PANEL;
1299 _array = PANEL_ARRAY;
1302 if( _parent === FILE_DATA_COMICS_ROOT ){
1303 _data.type = pettanr.driver.FILE_TYPE.COMIC;
1304 _array = COMIC_ARRAY;
1306 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC ){
1307 _array = COMIC_ARRAY;
1310 if( _parent === FILE_DATA_LISENCE_ROOT ){
1311 _data.type = pettanr.driver.FILE_TYPE.LICENSE;
1312 _array = ORIGINAL_LICENSE_ARRAY;
1315 if( _parent === FILE_DATA_AUTHOR_ROOT ){
1316 _data.type = pettanr.driver.FILE_TYPE.AUTHOR;
1317 _array = AUTHOR_ARRAY;
1320 if( _parent === FILE_DATA_ARTIST_ROOT ){
1321 _data.type = pettanr.driver.FILE_TYPE.ARTIST;
1322 _array = ARTIST_ARRAY;
1325 if( _parent === FILE_DATA_PICTURE_ROOT || _parent === FILE_DATA_MY_PICTURES_ROOT ){
1326 _data.type = pettanr.driver.FILE_TYPE.PICTURE;
1327 _array = RESOURCE_PICTURE_ARRAY;
1328 // original_license を含まなければ、license object を削除して ビットデータ で保持
1329 // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LISENCE_ROOT)
1330 var _license = _data.license,
1332 _Math_pow = Math.pow,
1334 if( typeof _license === 'object'){
1335 for( i=0, l=BASIC_LICENSES.length; i<l; ++i){
1336 _rule = _license[ BASIC_LICENSES[ i]]
1337 if( typeof _rule === 'number' && _rule === 1 ){
1338 _bits += _Math_pow( 2, i);
1341 _data.license = _bits;
1347 _data.driver = Driver;
1349 // _array に _data を格納 または 上書き
1350 if( typeof _data.id === 'number' && _data.id > 0 ){
1351 var _id = _data.id - 1,
1352 __data = _array[ _id ],
1353 _reserved = pettanr.file.FILE_DATA_PROPERTY_RESERVED.join( ', ' );
1355 for( var key in _data){
1356 if( _reserved.indexOf( key ) === -1 ){
1357 __data[ key ] = _data[ key ];
1360 _data = __data; // このタイミングで参照が切れるので注意!!
1362 _array[ _id ] = _data;
1370 if( _parent === FILE_DATA_AUTHOR_ROOT || _parent === FILE_DATA_ARTIST_ROOT ){
1371 addChildData( _parent, _data );
1374 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC || _parent === FILE_DATA_COMICS_ROOT ){
1375 var _panels = _data.panels,
1377 if( _panels && Type.isArray( _panels ) === true ){
1379 for( i=0, l=_panels.length; i<l; ++i){
1380 _panel = buildFileData( _panels[ i ], FILE_DATA_PANELS_ROOT );
1384 addChildData( _data, _panel );
1386 delete _data.panels;
1388 if( _data.json !== null ){
1391 if( Type.isArray( _data.children ) === false ){
1392 _data.children = [];
1395 var _author = _data.author || getResource( AUTHOR_ARRAY, _data.author_id );
1397 _data.author = _author = buildFileData( _author, FILE_DATA_AUTHOR_ROOT );
1398 addChildData( _author, _data );
1399 _author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, _data );
1401 if( _parent === FILE_DATA_COMICS_ROOT ){
1402 addChildData( FILE_DATA_LATEST_COMICS, _data);
1406 if( _parent === FILE_DATA_PANELS_ROOT ){
1407 _data.comic = getResource( COMIC_ARRAY, _data.comic_id );
1408 _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
1410 // picture data をファイルに取り出し
1411 if( Type.isArray( _data.panel_elements ) === true ){
1414 for( i=0, l=_elements.length; i<l; ++i){
1415 _elm = _elements[ i];
1416 if( _elm.resource_picture ){
1417 _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT); // 上記参照切れに備えてここで上書き
1419 _elm.resource_picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.resource_picture_id );
1425 if( _data.type == pettanr.driver.FILE_TYPE.PICTURE ){
1426 var _artist = _data.artist || getResource( ARTIST_ARRAY, _data.artist_id );
1428 _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
1429 addChildData( _artist, _data );
1430 _artist.id === MyArtistID && addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
1435 function addChildData( _parent, _child ){
1436 if( Type.isArray( _parent.children ) === false){
1437 _parent.children = [];
1439 pettanr.util.getIndex( _parent.children, _child ) === -1 && _parent.children.push( _child );
1441 function getResource( _array, _id ){
1442 if( Type.isArray( _array ) === false || Type.isNumber( _id ) === false || _id < 1 ) return null;
1443 var _data = _array[ _id - 1 ];
1445 _data = _array[ _id - 1 ] = {};
1451 createComicTree: function(){
1452 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMICS_ROOT);
1454 createPictureTree: function(){
1455 return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
1457 createServiceTree: function(){
1458 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
1460 isPettanrFileInstance: function( _file){
1461 if( pettanr.file.isPettanFileInstance( _file) === true){
1462 var _data = FileAPI.getFileData( _file);
1463 return _data !== null && _data.driver === Driver;
1468 COMIC: FileAPI.createFileTypeID(),
1469 PANEL: FileAPI.createFileTypeID(),
1470 PICTURE: FileAPI.createFileTypeID(),
1471 PANEL_PICTURE: FileAPI.createFileTypeID(),
1472 BALLOON: FileAPI.createFileTypeID(),
1473 AUTHOR: FileAPI.createFileTypeID(),
1474 ARTIST: FileAPI.createFileTypeID(),
1475 LICENSE: FileAPI.createFileTypeID()
1480 pettanr.entrance = {
1481 displayName: 'Home',
1482 rootElement: document.getElementById('entrance'),
1483 onOpen: function( _w, _h, _option ){
1484 var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1485 document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
1487 onClose: function(){
1488 document.getElementById('inner-wrapper').style.height = '0px';
1490 onWindowResize: function( _w, _h){
1491 pettanr.entrance.onOpen( _w, _h );
1494 pettanr.view.registerApplication( pettanr.entrance, true );
1496 pettanr.cabinet = ( function(){
1498 elmContainer = document.getElementById( 'cabinet'),
1500 pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1503 displayName: 'Comic list',
1504 rootElement: elmContainer,
1505 init: function( _option){
1507 delete pettanr.cabinet.init;
1509 onOpen: function( _w, _h, _option ){
1510 finder = finder || pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
1511 finder.onOpen( _w, _h - pageHeaderH, _option );
1514 onClose: function(){
1517 onWindowResize: function( _w, _h){
1518 finder.resize( _w, _h - pageHeaderH);
1522 pettanr.view.registerApplication( pettanr.cabinet, true );
1524 pettanr.gallery = ( function(){
1526 elmContainer = document.getElementById( 'gallery' ),
1528 pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1530 displayName: 'Pictures',
1531 rootElement: elmContainer,
1532 init: function( _option){
1534 delete pettanr.gallery.init;
1536 onOpen: function( _w, _h, _option ){
1537 finder = finder || pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
1538 finder.onOpen( _w, _h - pageHeaderH, _option );
1540 onClose: function(){
1543 onWindowResize: function( _w, _h){
1544 finder.resize( _w, _h - pageHeaderH );
1548 pettanr.view.registerApplication( pettanr.gallery, true );
1550 pettanr.backyard = {
1551 displayName: 'Settings',
1552 rootElement: document.getElementById( 'backyard' ),
1553 onOpen: function( _w, _h, _option ){
1555 onClose: function(){
1557 onWindowResize: function( _w, _h){
1560 pettanr.view.registerApplication( pettanr.backyard, true );
1562 if( pettanr.DEBUG === true){
1563 pettanr.debug = ( function(){
1564 var elmDl = document.getElementById( 'useragent'),
1567 pettanR: pettanr.version,
1568 ua: navigator.userAgent,
1569 platform: navigator.platform,
1570 appVersion: navigator.appVersion,
1571 appCodeName:navigator.appCodeName,
1572 appName: navigator.appName,
1573 language: navigator.browserLanguage || navigator.language,
1574 ActiveX: pettanr.ua.ACTIVEX
1578 //data.ua = 'Internet Explorer';
1579 data.version = ua.IE;
1580 if( ua.ieVersion >= 8) data.RenderingVersion = ua.ieRenderingVersion;
1581 data.browserType = ua.STANDALONE === true ? 'Standalone' : 'bundle';
1582 if( ua.ieVersion < 9) {
1588 data.RenderingMode = ua.isStanderdMode === true ? 'Standerd' : 'Quirks';
1590 for( var key in data){
1591 elmDt = document.createElement( 'dt');
1592 elmDt.innerHTML = key;
1593 elmDd = document.createElement( 'dd');
1594 elmDd.innerHTML = '' + data[ key];
1595 if( !data[ key]) elmDd.style.color = 'red';
1596 elmDl.appendChild( elmDt);
1597 elmDl.appendChild( elmDd);
1600 displayName: 'Debug',
1601 rootElement: document.getElementById( 'debug' ),
1602 onOpen: function( _w, _h, _option ){
1603 var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1604 document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
1606 onClose: function(){
1607 document.getElementById('inner-wrapper').style.height = '0px';
1609 onWindowResize: function( _w, _h){
1610 pettanr.debug.onOpen( _w, _h );
1614 pettanr.view.registerApplication( pettanr.debug, true );
1617 var _debug = document.getElementById( 'debug');
1619 pettanr.util.removeAllChildren( _debug);
1620 _debug.parentNode.removeChild( _debug);
1629 pettanr.fn( pettanr.view);
1630 pettanr.fn( pettanr.overlay);
1631 pettanr.fn( pettanr.key);
1632 pettanr.fn( pettanr.balloon);
1634 pettanr.fn( pettanr.editor);
1635 pettanr.fn( pettanr.comicConsole);
1636 pettanr.fn( pettanr.uploadConsole);
1637 pettanr.fn( pettanr.panelConsole);
1638 pettanr.fn( pettanr.artistConsole);
1640 pettanr.fn( pettanr.file);
1641 pettanr.fn( pettanr.finder);
1642 pettanr.fn( pettanr.gallery);
1643 pettanr.fn( pettanr.cabinet);
1645 $(window).ready( pettanr.init);