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 ),
575 protect = pettanr.file.FILE_DATA_PROPERTY_RESERVED.join( '\n' );
577 function clone( src ) {
579 if( Type.isArray(src) === true ){
582 if( Type.isObject(src) === true ){
585 if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){
590 for( var key in src ){
591 if( protect.indexOf( key ) === -1 ){
593 ret[ key ] = clone( src[ key ]);
599 return clone( data );
601 write: function( _file, _newName, _newData){
602 var _data = FILE_CONTROLER.getFileData( _file ),
606 viewerApplicationList: function(){
609 editorApplicationList: function(){
612 onCreate: function(){
621 onDelete: function(){
626 var ROOT_FILEDATA = {
628 type: FILE_TYPE_IS_FOLDER,
631 SYSTEM_TREE = FILE_CONTROLER.createTree( ROOT_FILEDATA),
632 ROOT_FILE = SYSTEM_TREE.getRootFile();
634 function createFolderUnderRoot( _fileData){
635 ROOT_FILEDATA.children.push( _fileData);
636 FILE_CONTROLER.getFileDataAccess( ROOT_FILE)
637 .dispatchFileEvent( new FileEventClass( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, ROOT_FILE, 'children', null));
639 function createFileEvent( _eventType, _file, _key, _value){
640 return new FileEventClass( _eventType, _file, _key, _value);
642 function createFileTypeID(){
643 return ++numFileType;
648 //REQUEST_CONTROLER.init();
649 //FILE_CONTROLER.init();
650 delete pettanr.file.init;
652 registerDriver: function( _driver ){
653 _driver.prototype = FileDriverBase;
658 createFolderUnderRoot: createFolderUnderRoot,
659 getFileDataAccess: FILE_CONTROLER.getFileDataAccess,
660 getFileData: FILE_CONTROLER.getFileData,
661 getJson: REQUEST_CONTROLER.getJson,
662 createFileEvent: createFileEvent,
663 createFileTypeID: createFileTypeID
666 createTree: function( _rootFile){
667 return FILE_CONTROLER.createTree( _rootFile);
669 isTreeInstance: function( _tree){
670 return _tree instanceof TreeClass;
672 isFileInstance: function( _file){
673 return _file instanceof FileClass;
677 FOLDER: FILE_TYPE_IS_FOLDER,
678 IMAGE: createFileTypeID(),
679 TEXT: createFileTypeID(),
680 HTML: createFileTypeID(),
681 CSV: createFileTypeID(),
682 JSON: createFileTypeID(),
683 XML: createFileTypeID()
692 FILE_UPDATE_POLICY: {
693 _____: parseInt( '00000', 2),
694 ____C: parseInt( '00001', 2), // hasCreateMenu
695 ___W_: parseInt( '00010', 2), // isWritable
696 ___WC: parseInt( '00011', 2), // isWritable
697 __R__: parseInt( '00100', 2), // isRenamable
698 __R_C: parseInt( '00101', 2), // hasCreateMenu
699 __RW_: parseInt( '00110', 2), // isWritable
700 __RWC: parseInt( '00111', 2), // isWritable
701 _S___: parseInt( '01000', 2), // childrenIsSortable
702 _S__C: parseInt( '01001', 2),
703 _S_W_: parseInt( '01010', 2),
704 _S_WC: parseInt( '01011', 2),
705 _SR__: parseInt( '01100', 2),
706 _SR_C: parseInt( '01101', 2),
707 _SRW_: parseInt( '01110', 2),
708 _SRWC: parseInt( '01111', 2),
709 D____: parseInt( '10000', 2),
710 D___C: parseInt( '10001', 2), // hasCreateMenu
711 D__W_: parseInt( '10010', 2), // isWritable
712 D__WC: parseInt( '10011', 2), // isWritable
713 D_R__: parseInt( '10100', 2), // isRenamable
714 D_R_C: parseInt( '10101', 2), // hasCreateMenu
715 D_RW_: parseInt( '10110', 2), // isWritable
716 D_RWC: parseInt( '10111', 2), // isWritable
717 DS___: parseInt( '11000', 2), // childrenIsSortable
718 DS__C: parseInt( '11001', 2),
719 DS_W_: parseInt( '11010', 2),
720 DS_WC: parseInt( '11011', 2),
721 DSR__: parseInt( '11100', 2),
722 DSR_C: parseInt( '11101', 2),
723 DSRW_: parseInt( '11110', 2),
724 DSRWC: parseInt( '11111', 2),
732 UPDATE: 'onTreeUpdate'
735 UPDATE_ATTRIVUTE: 'onFileUpdate',
736 GET_SEQENTIAL_FILES:'gotSeqentilFiles'
738 FILE_DATA_PROPERTY_RESERVED: [
739 'children', 'driver', 'state', 'type'
744 pettanr.finder = ( function(){
745 var FINDER_ARRAY = [],
746 ELM_ORIGIN_FINDER_LOCATION_ITEM = pettanr.util.pullHtmlAsTemplete( 'templete-finder-location-item'),
747 ELM_ORIGIN_FINDER_ICON = pettanr.util.pullHtmlAsTemplete( 'templete-finder-icon'),
748 ELM_ORIGIN_CONTAINER = pettanr.util.pullHtmlAsTemplete( 'templete-finder-container'),
749 ICON_HEIGHT = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON).height,
750 ICON_CLASSNAME = 'finder-icon-thumbnail',
751 FINDER_ICON_POOL = [],
752 BREAD_OBJECT_POOL = [];
754 var FinderIconClass = function(){
756 ELM_WRAPPER = ELM_ORIGIN_FINDER_ICON.cloneNode( true),
757 ELM_THUMBNAIL = pettanr.util.getElementsByClassName( ELM_WRAPPER, ICON_CLASSNAME )[0],
758 ELM_FILENAME = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-filename' )[0],
759 ELM_DESCRIPTION = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-summary' )[0],
760 ELM_EDITOR_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-editor-apps' )[0],
761 ELM_VIEWER_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-viewer-apps' )[0],
762 ELM_ACTION_BUTTON = pettanr.util.getElementsByClassName( ELM_WRAPPER, 'finder-icon-console-action' )[0],
763 file, w, index, style, instansce,
764 onDownCallback, onEditorCallback, onViewerCallback, onActionCallback,
765 viewerList, editorList;
766 ELM_WRAPPER.onmouseover = onOver;
768 ELM_WRAPPER.style.backgroundColor = '#eee';
770 ELM_WRAPPER.onmouseout = onOut;
772 ELM_WRAPPER.style.backgroundColor = '';
775 ELM_WRAPPER.onclick = onDownClick;
776 function onDownClick(){
777 onDownCallback( index);
779 ELM_EDITOR_BUTTON.onclick = onEditorClick;
780 function onEditorClick(){
781 onEditorCallback( file, editorList[ 0 ] );
783 ELM_VIEWER_BUTTON.onclick = onViwerClick;
784 function onViwerClick(){
785 onViewerCallback( file, viewerList[ 0 ] );
787 ELM_ACTION_BUTTON.onclick = onActionClick;
788 function onActionClick(){
789 onActionCallback( file );
792 var _thumb = file.getThumbnail();
794 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' has-thumbnail';
795 ELM_THUMBNAIL.style.backgroundImage = [ 'url(', _thumb.image, ')'].join( '');
797 ELM_THUMBNAIL.className = ICON_CLASSNAME + ' ' + _thumb.className;
798 ELM_THUMBNAIL.style.backgroundImage = '';
800 ELM_FILENAME.firstChild.data = file.getName();
801 ELM_DESCRIPTION.firstChild.data = file.getSummary();
803 if( Type.isArray( viewerList ) === true && viewerList.length > 0 ){
804 ELM_VIEWER_BUTTON.style.display = '';
806 ELM_VIEWER_BUTTON.style.display = 'none';
808 if( Type.isArray( editorList ) === true && editorList.length > 0 ){
809 ELM_EDITOR_BUTTON.style.display = '';
811 ELM_EDITOR_BUTTON.style.display = 'none';
815 ELM_WRAPPER.style.top = (index * ICON_HEIGHT) +'px';
817 function onCollect(){
818 elmContainer.removeChild( ELM_WRAPPER);
820 FINDER_ICON_POOL.push( instansce);
824 init: function( _file, _elmContainer, _w, _index, _style, _onDownCallback, _onEditorCallback, _onViewerCallback, _onActionCallback ){
826 if( elmContainer !== _elmContainer){
827 _elmContainer.appendChild( ELM_WRAPPER);
828 elmContainer = _elmContainer;
831 file && file.destroy();
833 viewerList = file.viewerApplicationList();
834 editorList = file.editorApplicationList();
837 if( index !== _index){
841 onDownCallback = _onDownCallback;
842 onEditorCallback = _onEditorCallback;
843 onViewerCallback = _onViewerCallback;
844 onActionCallback = _onActionCallback;
847 index: function( _index){
851 style: function( _style){
855 onResize: function( w ){
859 elmContainer.removeChild( ELM_WRAPPER);
860 file && file.destroy();
861 file = elmContainer = onDownCallback = onEditorCallback = onViewerCallback = onActionCallback = viewerList = editorList = null;
862 FINDER_ICON_POOL.push( instansce);
866 function updateIconPosition( _style, _w, _index, _elm){
869 var BreadcrumbClass = function(){
871 ELM_WRAPPER = ELM_ORIGIN_FINDER_LOCATION_ITEM.cloneNode( true),
872 ELM_FILENAME = ELM_WRAPPER.getElementsByTagName( 'a')[0],
873 file, w, index, instansce,
875 ELM_WRAPPER.onclick = onClick;
877 ELM_FILENAME.className = 'file-icon-' +file.getType();
878 ELM_FILENAME.innerHTML = file.getName();
880 function resize( index){
881 ELM_WRAPPER.style.left = (index * 90) +'px';
889 init: function( _file, _elmContainer, _index, _callback ){
891 if( elmContainer !== _elmContainer){
892 _elmContainer.appendChild( ELM_WRAPPER);
893 elmContainer = _elmContainer;
899 if( index !== _index){
903 callback = _callback;
906 index: function( _index){
910 onResize: function( w){
914 elmContainer.removeChild( ELM_WRAPPER);
915 file = elmContainer = null;
916 BREAD_OBJECT_POOL.push( this );
921 var FinderClass = function( ELM_CONTAINER, tree, header, footer ){
924 elmContainer = ELM_ORIGIN_CONTAINER.cloneNode( true ),
925 elmLocation = elmContainer.getElementsByTagName( 'ul' )[0],
926 nodesDiv = elmContainer.getElementsByTagName( 'div' ),
927 elmSidebarButton = nodesDiv[1],
928 elmStyleButton = nodesDiv[2],
929 elmActionButton = nodesDiv[3],
930 elmBody = nodesDiv[ nodesDiv.length -1 ],
931 //tree = pettanr.file.createTree( TREE_TYPE),
934 headH = pettanr.util.getElementSize( nodesDiv[0] ).height,
938 size = pettanr.util.getElementSize( ELM_ORIGIN_FINDER_ICON ),
944 tree.addTreeEventListener( pettanr.file.TREE_EVENT.UPDATE, draw);
946 function draw( _w, _h ){
947 w = Type.isFinite( _w ) === true ? _w : w;
948 h = Type.isFinite( _h ) === true ? _h : h;
950 var l = tree.hierarchy() +1,
951 m = BREAD_ARRAY.length,
953 for(var i=0; i<l; ++i){
954 _file = i !== l-1 ? tree.getParentFileAt( i) : tree.getCurrentFile();
956 BREAD_ARRAY[ i].init( _file, elmLocation, i, onHeadClick);
958 BREAD_ARRAY.push( getBreadcrumb( _file, elmLocation, i, onHeadClick ));
961 while( l < BREAD_ARRAY.length){
962 BREAD_ARRAY.pop().destroy();
965 l = _file.getChildFileLength();
966 m = ICON_ARRAY.length;
970 ICON_ARRAY[ i ].init( _file.getChildFileByIndex( i), elmBody, w, i, style, onDown, onEditor, onViwer, onAction );
972 ICON_ARRAY.push( getFinderIcon( _file.getChildFileByIndex( i), elmBody, _w, i, style, onDown, onEditor, onViwer, onAction ));
975 if( _file.getState() === pettanr.file.FILE_STATE.LOADING ){
976 elmBody.className = 'finder-body loading';
978 elmBody.className = 'finder-body';
980 elmBody.style.height = bodyH + 'px';
982 while( l < ICON_ARRAY.length){
983 ICON_ARRAY.pop().destroy();
987 function onHeadClick( i){
988 var l = BREAD_ARRAY.length -1;
990 var _file = tree.getParentFileAt( i);
997 function onDown( i ){
998 if( i < ICON_ARRAY.length ){
999 var _file = tree.getCurrentFile().getChildFileByIndex( i );
1000 if( _file !== null && ( _file.getChildFileLength() !== -1 || _file.getType() === pettanr.file.FILE_TYPE.FOLDER)){
1006 function onEditor( _file, _app ){
1007 pettanr.view.show( _app, _file );
1009 function onViwer( _file, _app ){
1010 pettanr.view.show( _app, _file );
1012 function onAction( _file ){
1016 this.init = function(){
1017 ELM_CONTAINER.appendChild( elmContainer);
1018 //$( elmLocation).click( onHeadClick);
1019 //$( elmContainer).click( onBodyClick);
1020 var position = pettanr.util.getAbsolutePosition( elmLocation);
1023 bodyY = pettanr.util.getAbsolutePosition( elmBody).y;
1026 this.onOpen = function( _w, _h, _option ){
1027 this.init !== undefined && this.init();
1030 this.onClose = function(){
1033 this.onPaneResize = function( _w, _h){
1036 elmBody.style.height = ( _h - headH ) + 'px';
1038 for(var i=0, l=ICON_ARRAY.length; i<l; ++i){
1039 ICON_ARRAY[ i].onResize( _w );
1042 this.MIN_WIDTH = 240;
1043 this.MIN_HEIGHT = 240;
1046 pettanr.view.registerAsBasicPane( FinderClass );
1048 function getFinderIcon( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction){
1050 if( FINDER_ICON_POOL.length > 0){
1051 _icon = FINDER_ICON_POOL.shift();
1053 _icon = new FinderIconClass();
1055 _icon.init( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction );
1059 function getBreadcrumb( _file, _elmContainer, index, callback){
1061 if( BREAD_OBJECT_POOL.length > 0){
1062 _bread = BREAD_OBJECT_POOL.shift();
1064 _bread = new BreadcrumbClass();
1066 _bread.init( _file, _elmContainer, index, callback);
1074 createFinder: function( _elmTarget, _tree, _header, _footer ){
1075 var _finder = new FinderClass( _elmTarget, _tree, _header, _footer );
1076 FINDER_ARRAY.push( _finder);
1079 registerFinderHead: function(){
1082 registerFinderPane: function( _finderPane){
1085 isFinderInstance: function( _finder){
1086 return _finder instanceof FinderClass;
1088 isFinderPaneInstance: function(){
1091 isFinderHeadInstance: function(){
1097 pettanr.driver = ( function(){
1098 var MyAuthorID = 'current_author' in window ? current_author.id : ( pettanr.DEBUG ? 1 : -1 ),
1099 MyArtistID = 'current_artist' in window ? current_artist.id : ( pettanr.DEBUG ? 1 : -1 ),
1101 getSeqentialFiles: function( _file){
1102 var _data = FileAPI.getFileData( _file),
1103 _json = _data !== null ? _data.json : null;
1104 if( _json === true && _data.type === pettanr.driver.FILE_TYPE.COMIC ){
1105 _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'comics\/', _data.id, '.json\/play\/' ].join( '' );
1107 if( typeof _json === 'string'){
1108 FileAPI.getJson( _file, _json, onLoadJson, onErrorJson);
1109 _data.state = pettanr.file.FILE_STATE.LOADING;
1114 getName: function( _file){
1115 var _data = FileAPI.getFileData( _file),
1116 _type = _data !== null ? _data.type : null;
1117 if( _type === pettanr.driver.FILE_TYPE.PICTURE ){
1118 return [ _data.id, _data.ext ].join( '.');
1120 if( _type === pettanr.driver.FILE_TYPE.PANEL ){
1121 return [ _data.t, ':', _data.comic.title ].join( '');
1123 if( _type === pettanr.driver.FILE_TYPE.COMIC ){
1126 if( _type === pettanr.driver.FILE_TYPE.ARTIST ){
1127 return [ _data.id , ':', _data.name, '画伯' ].join( '');
1129 if( _type === pettanr.driver.FILE_TYPE.AUTHOR ){
1130 return [ _data.id , ':', _data.name, '先生' ].join( '');
1134 getThumbnail: function( _file){
1135 var _data = FileAPI.getFileData( _file),
1136 _type = _data !== null ? _data.type : null;
1137 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
1138 return { image: [ pettanr.CONST.RESOURCE_PICTURE_PATH, 'thumbnail/', _data.id, '.', _data.ext ].join( '')};
1140 if( _data === FILE_DATA_COMICS_ROOT){
1141 return { className: 'file-type-cabinet'};
1143 if( _type === pettanr.driver.FILE_TYPE.COMIC){
1144 return { className: 'file-type-comic'};
1146 if( _type === pettanr.driver.FILE_TYPE.PANEL){
1147 return { className: 'file-type-panel'};
1149 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
1150 return { className: 'file-type-author'};
1152 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
1153 return { className: 'file-type-artist'};
1155 if( _type === pettanr.file.FILE_TYPE.FOLDER){
1156 return { className: 'file-type-folder'};
1158 return { className: 'file-type-broken'};
1160 getSummary: function( _file ){
1161 var _data = FileAPI.getFileData( _file),
1162 _type = _data !== null ? _data.type : null;
1163 if( _type === pettanr.driver.FILE_TYPE.PICTURE){
1164 return [ _data.width, 'x', _data.height, ', filesize:', _data.filesize, ', lisence:', _data.license ].join( '' );
1166 if( _data === FILE_DATA_COMICS_ROOT){
1167 return 'cabinet file';
1169 if( _type === pettanr.driver.FILE_TYPE.COMIC){
1170 return 'comic file';
1172 if( _type === pettanr.driver.FILE_TYPE.PANEL){
1173 return [ _data.width, 'x', _data.height ].join( '' );
1175 if( _type === pettanr.driver.FILE_TYPE.AUTHOR){
1176 return 'author file';
1178 if( _type === pettanr.driver.FILE_TYPE.ARTIST){
1179 return [ 'Email:', _data.email || 'empty' , ', HP:', _data.homepage_url || 'empty' ].join( '' );
1181 if( _type === pettanr.file.FILE_TYPE.FOLDER){
1182 return 'pettanR folder';
1184 return 'pettanR unknown file';
1186 viewerApplicationList: function( _file ){
1187 var _data = FileAPI.getFileData( _file ),
1188 _type = _data !== null ? _data.type : null;
1191 editorApplicationList: function( _file ){
1192 var _data = FileAPI.getFileData( _file ),
1193 _type = _data !== null ? _data.type : null;
1194 if( _type === pettanr.driver.FILE_TYPE.PANEL ){
1195 return [ pettanr.editor ];
1197 if( _type === pettanr.driver.FILE_TYPE.COMIC ){
1198 return [ pettanr.editor, pettanr.comicConsole ];
1203 FileAPI = pettanr.file.registerDriver( Driver),
1204 FILE_DATA_SERVICE_ROOT = {
1205 name: 'PettanR root',
1206 type: pettanr.file.FILE_TYPE.FOLDER,
1209 FILE_DATA_COMICS_ROOT = {
1211 type: pettanr.file.FILE_TYPE.FOLDER,
1214 json: pettanr.CONST.URL_COMICS_JSON
1216 FILE_DATA_PANELS_ROOT = {
1218 type: pettanr.file.FILE_TYPE.FOLDER,
1221 json: pettanr.CONST.URL_PANELS_JSON
1223 FILE_DATA_PICTURE_ROOT = {
1225 type: pettanr.file.FILE_TYPE.FOLDER,
1228 json: pettanr.CONST.URL_RESOURCE_PICTURES_JSON
1230 FILE_DATA_MY_COMICS_ROOT = {
1232 type: pettanr.file.FILE_TYPE.FOLDER,
1236 FILE_DATA_LATEST_COMICS = {
1237 name: 'Latest Comics',
1238 type: pettanr.file.FILE_TYPE.FOLDER,
1241 FILE_DATA_MY_PICTURES_ROOT = {
1242 name: 'My Pictures',
1243 type: pettanr.file.FILE_TYPE.FOLDER,
1246 json: pettanr.CONST.URL_ORIGINAL_PICTURES_JSON
1248 FILE_DATA_AUTHOR_ROOT = {
1250 type: pettanr.file.FILE_TYPE.FOLDER,
1253 FILE_DATA_ARTIST_ROOT = {
1255 type: pettanr.file.FILE_TYPE.FOLDER,
1258 FILE_DATA_LISENCE_ROOT = {
1259 name: 'Original Lisences',
1260 type: pettanr.file.FILE_TYPE.FOLDER,
1263 FILE_DATA_BALLOON_ROOT = {
1264 name: 'Balloon templetes',
1265 type: pettanr.file.FILE_TYPE.FOLDER,
1272 RESOURCE_PICTURE_ARRAY = [],
1273 BALLOON_TEMPLETE_ARRAY = [],
1274 ORIGINAL_LICENSE_ARRAY = [],
1275 BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
1276 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);
1277 FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_LATEST_COMICS, FILE_DATA_AUTHOR_ROOT);
1278 FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT);
1280 FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT);
1282 function onLoadJson( _file, _json ){
1283 var _access = FileAPI.getFileDataAccess( _file),
1284 _data = _access !== null ? _access.DATA : null,
1286 if( _data === null){
1287 onErrorJson( _file);
1290 _data.state = pettanr.file.FILE_STATE.OK;
1292 if( Type.isArray( _json ) === true ){
1294 if( l === 0) return;
1295 for( var i=0; i<l; ++i ){
1296 buildFileData( _json[ i], _data);
1300 buildFileData( _json, _data );
1302 _access.dispatchFileEvent( FileAPI.createFileEvent( pettanr.file.FILE_EVENT.GET_SEQENTIAL_FILES, _file, 'children', null));
1304 function onErrorJson( _file ){
1305 var _data = FileAPI.getFileData( _file);
1306 if( _data !== null){
1307 _data.state = pettanr.file.FILE_STATE.ERROR;
1310 function buildFileData( _data, _parent ){
1313 if( _parent === FILE_DATA_PANELS_ROOT ){
1314 _data.type = pettanr.driver.FILE_TYPE.PANEL;
1315 _array = PANEL_ARRAY;
1318 if( _parent === FILE_DATA_COMICS_ROOT ){
1319 _data.type = pettanr.driver.FILE_TYPE.COMIC;
1320 _array = COMIC_ARRAY;
1322 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC ){
1323 _array = COMIC_ARRAY;
1326 if( _parent === FILE_DATA_LISENCE_ROOT ){
1327 _data.type = pettanr.driver.FILE_TYPE.LICENSE;
1328 _array = ORIGINAL_LICENSE_ARRAY;
1331 if( _parent === FILE_DATA_AUTHOR_ROOT ){
1332 _data.type = pettanr.driver.FILE_TYPE.AUTHOR;
1333 _array = AUTHOR_ARRAY;
1336 if( _parent === FILE_DATA_ARTIST_ROOT ){
1337 _data.type = pettanr.driver.FILE_TYPE.ARTIST;
1338 _array = ARTIST_ARRAY;
1341 if( _parent === FILE_DATA_PICTURE_ROOT || _parent === FILE_DATA_MY_PICTURES_ROOT ){
1342 _data.type = pettanr.driver.FILE_TYPE.PICTURE;
1343 _array = RESOURCE_PICTURE_ARRAY;
1344 // original_license を含まなければ、license object を削除して ビットデータ で保持
1345 // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LISENCE_ROOT)
1346 var _license = _data.license,
1348 _Math_pow = Math.pow,
1350 if( typeof _license === 'object'){
1351 for( i=0, l=BASIC_LICENSES.length; i<l; ++i){
1352 _rule = _license[ BASIC_LICENSES[ i]]
1353 if( typeof _rule === 'number' && _rule === 1 ){
1354 _bits += _Math_pow( 2, i);
1357 _data.license = _bits;
1363 _data.driver = Driver;
1365 // _array に _data を格納 または 上書き
1366 if( typeof _data.id === 'number' && _data.id > 0 ){
1367 var _id = _data.id - 1,
1368 __data = _array[ _id ],
1369 _reserved = pettanr.file.FILE_DATA_PROPERTY_RESERVED.join( ', ' );
1371 for( var key in _data){
1372 if( _reserved.indexOf( key ) === -1 ){
1373 __data[ key ] = _data[ key ];
1376 _data = __data; // このタイミングで参照が切れるので注意!!
1378 _array[ _id ] = _data;
1386 if( _parent === FILE_DATA_AUTHOR_ROOT || _parent === FILE_DATA_ARTIST_ROOT ){
1387 addChildData( _parent, _data );
1390 if( _parent.type === pettanr.driver.FILE_TYPE.COMIC || _parent === FILE_DATA_COMICS_ROOT ){
1391 var _panels = _data.panels,
1393 if( _panels && Type.isArray( _panels ) === true ){
1395 for( i=0, l=_panels.length; i<l; ++i){
1396 _panel = buildFileData( _panels[ i ], FILE_DATA_PANELS_ROOT );
1400 addChildData( _data, _panel );
1402 delete _data.panels;
1404 if( _data.json !== null ){
1407 if( Type.isArray( _data.children ) === false ){
1408 _data.children = [];
1411 var _author = _data.author || getResource( AUTHOR_ARRAY, _data.author_id );
1413 _data.author = _author = buildFileData( _author, FILE_DATA_AUTHOR_ROOT );
1414 addChildData( _author, _data );
1415 _author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, _data );
1417 if( _parent === FILE_DATA_COMICS_ROOT ){
1418 addChildData( FILE_DATA_LATEST_COMICS, _data);
1422 if( _parent === FILE_DATA_PANELS_ROOT ){
1423 _data.comic = getResource( COMIC_ARRAY, _data.comic_id );
1424 _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
1426 // picture data をファイルに取り出し
1427 if( Type.isArray( _data.panel_elements ) === true ){
1430 for( i=0, l=_elements.length; i<l; ++i){
1431 _elm = _elements[ i];
1432 if( _elm.resource_picture ){
1433 _elm.resource_picture = buildFileData( _elm.resource_picture, FILE_DATA_PICTURE_ROOT); // 上記参照切れに備えてここで上書き
1435 _elm.resource_picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.resource_picture_id );
1441 if( _data.type == pettanr.driver.FILE_TYPE.PICTURE ){
1442 var _artist = _data.artist || getResource( ARTIST_ARRAY, _data.artist_id );
1444 _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
1445 addChildData( _artist, _data );
1446 _artist.id === MyArtistID && addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
1451 function addChildData( _parent, _child ){
1452 if( Type.isArray( _parent.children ) === false){
1453 _parent.children = [];
1455 pettanr.util.getIndex( _parent.children, _child ) === -1 && _parent.children.push( _child );
1457 function getResource( _array, _id ){
1458 if( Type.isArray( _array ) === false || Type.isNumber( _id ) === false || _id < 1 ) return null;
1459 var _data = _array[ _id - 1 ];
1461 _data = _array[ _id - 1 ] = {};
1467 createComicTree: function(){
1468 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT); //FILE_DATA_COMICS_ROOT);
1470 createPictureTree: function(){
1471 return pettanr.file.createTree( FILE_DATA_PICTURE_ROOT);
1473 createServiceTree: function(){
1474 return pettanr.file.createTree( FILE_DATA_SERVICE_ROOT);
1476 isPettanrFileInstance: function( _file ){
1477 if( pettanr.file.isFileInstance( _file ) === true){
1478 var _data = FileAPI.getFileData( _file);
1479 return _data !== null && _data.driver === Driver;
1484 COMIC: FileAPI.createFileTypeID(),
1485 PANEL: FileAPI.createFileTypeID(),
1486 PICTURE: FileAPI.createFileTypeID(),
1487 PANEL_PICTURE: FileAPI.createFileTypeID(),
1488 BALLOON: FileAPI.createFileTypeID(),
1489 AUTHOR: FileAPI.createFileTypeID(),
1490 ARTIST: FileAPI.createFileTypeID(),
1491 LICENSE: FileAPI.createFileTypeID()
1496 pettanr.entrance = pettanr.view.createApplication( function(){
1497 this.displayName = 'Home';
1498 this.rootElement = document.getElementById('entrance');
1499 this.onOpen = function( _w, _h, _option ){
1500 var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1501 document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
1503 this.onClose = function(){
1504 document.getElementById('inner-wrapper').style.height = '0px';
1506 this.onWindowResize = function( _w, _h){
1507 pettanr.entrance.onOpen( _w, _h );
1510 pettanr.view.registerApplication( pettanr.entrance, true );
1512 pettanr.cabinet = pettanr.view.createApplication( function(){
1514 elmContainer = document.getElementById( 'cabinet'),
1516 pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1518 this.displayName = 'Comic list',
1519 this.rootElement = elmContainer,
1520 this.init = function( _option){
1522 delete pettanr.cabinet.init;
1524 this.onOpen = function( _w, _h, _option ){
1525 finder = finder || pettanr.finder.createFinder( elmContainer, pettanr.driver.createComicTree());
1526 finder.onOpen( _w, _h - pageHeaderH, _option );
1529 this.onClose = function(){
1532 this.onWindowResize = function( _w, _h){
1533 finder.resize( _w, _h - pageHeaderH);
1536 pettanr.view.registerApplication( pettanr.cabinet, true );
1538 pettanr.gallery = pettanr.view.createApplication( function(){
1540 elmContainer = document.getElementById( 'gallery' ),
1542 pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1543 this.displayName = 'Pictures';
1544 this.rootElement = elmContainer;
1545 this.init = function( _option){
1547 delete pettanr.gallery.init;
1549 this.onOpen = function( _w, _h, _option ){
1550 finder = finder || pettanr.finder.createFinder( elmContainer, pettanr.driver.createPictureTree());
1551 finder.onOpen( _w, _h - pageHeaderH, _option );
1553 this.onClose = function(){
1556 this.onWindowResize = function( _w, _h){
1557 finder.resize( _w, _h - pageHeaderH );
1560 pettanr.view.registerApplication( pettanr.gallery, true );
1562 pettanr.backyard = pettanr.view.createApplication( function(){
1563 this.displayName = 'Settings';
1564 this.rootElement = document.getElementById( 'backyard' );
1565 this.onOpen = function( _w, _h, _option ){
1567 this.onClose = function(){
1569 this.onWindowResize = function( _w, _h){
1572 pettanr.view.registerApplication( pettanr.backyard, true );
1574 if( pettanr.DEBUG === true){
1575 pettanr.debug = pettanr.view.createApplication( function(){
1576 var elmDl = document.getElementById( 'useragent'),
1579 pettanR: pettanr.version,
1580 ua: navigator.userAgent,
1581 platform: navigator.platform,
1582 appVersion: navigator.appVersion,
1583 appCodeName:navigator.appCodeName,
1584 appName: navigator.appName,
1585 language: navigator.browserLanguage || navigator.language,
1586 ActiveX: pettanr.ua.ACTIVEX
1590 //data.ua = 'Internet Explorer';
1591 data.version = ua.IE;
1592 if( ua.ieVersion >= 8) data.RenderingVersion = ua.ieRenderingVersion;
1593 data.browserType = ua.STANDALONE === true ? 'Standalone' : 'bundle';
1594 if( ua.ieVersion < 9) {
1600 data.RenderingMode = ua.isStanderdMode === true ? 'Standerd' : 'Quirks';
1602 for( var key in data){
1603 elmDt = document.createElement( 'dt');
1604 elmDt.innerHTML = key;
1605 elmDd = document.createElement( 'dd');
1606 elmDd.innerHTML = '' + data[ key];
1607 if( !data[ key]) elmDd.style.color = 'red';
1608 elmDl.appendChild( elmDt);
1609 elmDl.appendChild( elmDd);
1611 this.displayName = 'Debug';
1612 this.rootElement = document.getElementById( 'debug' );
1613 this.onOpen = function( _w, _h, _option ){
1614 var pageHeaderH = pettanr.util.getElementSize( document.getElementById('header') ).height;
1615 document.getElementById('inner-wrapper').style.height = ( _h - pageHeaderH ) + 'px';
1617 this.onClose = function(){
1618 document.getElementById('inner-wrapper').style.height = '0px';
1620 this.onWindowResize = function( _w, _h){
1621 pettanr.debug.onOpen( _w, _h );
1624 pettanr.view.registerApplication( pettanr.debug, true );
1627 var _debug = document.getElementById( 'debug');
1629 pettanr.util.removeAllChildren( _debug);
1630 _debug.parentNode.removeChild( _debug);
1639 pettanr.fn( pettanr.view);
1640 pettanr.fn( pettanr.overlay);
1641 pettanr.fn( pettanr.key);
1642 pettanr.fn( pettanr.balloon);
1644 pettanr.fn( pettanr.editor);
1645 pettanr.fn( pettanr.comicConsole);
1646 pettanr.fn( pettanr.uploadConsole);
1647 pettanr.fn( pettanr.panelConsole);
1648 pettanr.fn( pettanr.artistConsole);
1650 pettanr.fn( pettanr.file);
1651 pettanr.fn( pettanr.finder);
1652 pettanr.fn( pettanr.gallery);
1653 pettanr.fn( pettanr.cabinet);
1655 $(window).ready( pettanr.init);