OSDN Git Service

Client is version 0.5.44, fetch pettanR resourcies working!
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 2 Feb 2013 10:55:39 +0000 (19:55 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 2 Feb 2013 10:55:39 +0000 (19:55 +0900)
app/assets/javascripts/libs.js
app/assets/javascripts/peta-apps.js
app/assets/javascripts/peta-common.js
app/assets/javascripts/system.js

index a21377f..aee98fe 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * pettanR libs.js\r
- *   version 0.5.39\r
+ *   version 0.5.44\r
  * \r
  * \r
  * Type\r
@@ -317,21 +317,32 @@ var getFunctionName = function( f ){
                        };\r
                }, 0 );\r
                \r
-               function clone( src ) {\r
-                       var ret;\r
+               var objSrc   = [],\r
+                       objCopy  = [],\r
+                       getIndex;       \r
+               function clone( src ){\r
+                       var ret, i, key;\r
                        if( Type.isArray(src) === true ){\r
+                               i = getIndex( objSrc, src );\r
+                               if( i !== -1 ) return objCopy[ i ];\r
                                ret = [];\r
+                               objSrc[ objSrc.length ]   = src;\r
+                               objCopy[ objCopy.length ] = ret;\r
                        } else\r
                        if( Type.isObject(src) === true ){\r
+                               i = getIndex( objSrc, src );\r
+                               if( i !== -1 ) return objCopy[ i ];\r
                                ret = {};\r
+                               objSrc[ objSrc.length ]   = src;\r
+                               objCopy[ objCopy.length ] = ret;\r
                        } else\r
                        if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){\r
                                return src;\r
                        } else {\r
                                return null;\r
                        };\r
-                       for( var key in src ){\r
-                               ret[ key ] = clone( src[ key ]);\r
+                       for( key in src ){\r
+                               ret[ key ] = clone( src[ key ] );\r
                        };\r
                        return ret;\r
                };\r
@@ -365,6 +376,8 @@ var getFunctionName = function( f ){
                                return target;\r
                        },\r
                        copy: function( objOrArray ){\r
+                               objSrc.length = objCopy.length = 0;\r
+                               getIndex = Util.getIndex;\r
                                return clone( objOrArray );\r
                        },\r
                        cleanCommentNode: function ( _targetElm ){\r
@@ -645,21 +658,21 @@ var getFunctionName = function( f ){
                                        _node.parentNode && _node.parentNode.removeChild( _node);\r
                                }\r
                        },\r
-                       getIndex: function( _array, _element ){\r
+                       getIndex: function( array, element ){\r
                                if( Array.prototype.indexof ){\r
-                                       Util.getIndex = function( _array, _element ){\r
-                                               return _array.indexof( _element );\r
+                                       Util.getIndex = function( array, element ){\r
+                                               return array.indexof( element );\r
                                        };\r
                                } else {\r
-                                       Util.getIndex = function( _array, _element ){\r
-                                               var i = _array.length;\r
+                                       Util.getIndex = function( array, element ){\r
+                                               var i = array.length;\r
                                                for( ; i; ){\r
-                                                       if( _array[ --i ] === _element ) return i;\r
+                                                       if( array[ --i ] === element ) return i;\r
                                                };\r
                                                return -1;\r
                                        };\r
                                };\r
-                               return Util.getIndex( _array, _element );\r
+                               return Util.getIndex( array, element );\r
                        },\r
                        copyArray: function( _array ){\r
                                var l = _array.length,\r
@@ -797,126 +810,95 @@ var CSS = ( function( window, documwnt, undefined ){
                                \r
                return _special;\r
        })();\r
-       \r
-       function cssToObject( css ){\r
-               var ret      = {}, i, nv, n, v,\r
-                       parse    = Util.parse,\r
-                       isNumber = Type.isNumber,\r
-                       camelize = Util.camelize;\r
-               if( Type.isString( css ) === true ){\r
-                       css = css.split( ';' );\r
-                       for( i = css.length; i; ){\r
-                               nv    = css[ --i ].split( ':' ); // filter の場合, progid: がくる\r
-                               n     = nv.shift();\r
-                               if( isNumber( parse( n ) ) === true ) continue;\r
-                               v     = nv.join( '' );\r
-                               while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );\r
-                               ret[ camelize( n ) ] = parse( v );\r
-                       };\r
-               } else {\r
-                       for( n in css ){\r
-                               if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );\r
-                       };\r
-               };\r
-\r
-               if( SPECIAL.setFilters ){\r
-                       SPECIAL.setFilters( ret );\r
-               } else {\r
-                       ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;\r
-               };\r
-               \r
-               SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );\r
-               SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );\r
-               \r
-               return ret;\r
-       };\r
 \r
        var COLOR = ( function(){\r
                var ret = {}, v, name,\r
                        list = [\r
-                               0, 'BLACK',\r
-                               parseInt( 'FF0000', 16 ), 'RED',\r
-                               parseInt( '00FF00', 16 ), 'LIME',\r
-                               parseInt( '0000FF', 16 ), 'BLUE',\r
-                               parseInt( 'FFFF00', 16 ), 'YELLOW',\r
-                               parseInt( '00FFFF', 16 ), 'AQUA or CYAN',\r
-                               parseInt( 'FF00FF', 16 ), 'FUCHSIA or MAGENTA',\r
-                               parseInt( 'FFFFFF', 16 ), 'WHITE',\r
-                               parseInt( '008000', 16 ), 'GREEN',\r
-                               parseInt( '800080', 16 ), 'PURPLE',\r
-                               parseInt( '800000', 16 ), 'MAROON',\r
-                               parseInt( '000080', 16 ), 'NAVY',\r
-                               parseInt( '808000', 16 ), 'OLIVE',\r
-                               parseInt( '008080', 16 ), 'TEAL',\r
-                               parseInt( '808080', 16 ), 'GRAY',\r
-                               parseInt( 'C0C0C0', 16 ), 'SILVER',\r
-                               parseInt( '696969', 16 ), 'DIMGRAY',\r
-                               parseInt( '708090', 16 ), 'SLATEGRAY',\r
-                               parseInt( 'A9A9A9', 16 ), 'DARKGRAY',\r
-                               parseInt( 'DCDCDC', 16 ), 'GAINSBORO',\r
-                               parseInt( '191970', 16 ), 'MIDNIGHTBLUE',\r
-                               parseInt( '6A5ACD', 16 ), 'SLATEBLUE',\r
-                               parseInt( '0000CD', 16 ), 'MEDIUMBLUE',\r
-                               parseInt( '4169E1', 16 ), 'ROYALBLUE',\r
-                               parseInt( '1E90FF', 16 ), 'DODGERBLUE',\r
-                               parseInt( '87CEEB', 16 ), 'SKYBLUE',\r
-                               parseInt( '4682B4', 16 ), 'STEELBLUE',\r
-                               parseInt( 'ADD8E6', 16 ), 'LIGHTBLUE',\r
-                               parseInt( 'AFEEEE', 16 ), 'PALETURQUOISE',\r
-                               parseInt( '40E0D0', 16 ), 'TURQUOISE',\r
-                               parseInt( 'E0FFFF', 16 ), 'LIGHTCYAN',\r
-                               parseInt( '7FFFD4', 16 ), 'AQUAMARINE',\r
-                               parseInt( '006400', 16 ), 'DARKGREEN',\r
-                               parseInt( '2E8B57', 16 ), 'SEAGREEN',\r
-                               parseInt( '90EE90', 16 ), 'LIGHTGREEN',\r
-                               parseInt( '7FFF00', 16 ), 'CHARTREUSE',\r
-                               parseInt( 'ADFF2F', 16 ), 'GREENYELLOW',\r
-                               parseInt( '32CD32', 16 ), 'LIMEGREEN',\r
-                               parseInt( '9ACD32', 16 ), 'YELLOWGREEN',\r
-                               parseInt( '6B8E23', 16 ), 'OLIVEDRAB',\r
-                               parseInt( 'BCB76B', 16 ), 'DARKKHAKI',\r
-                               parseInt( 'EEE8AA', 16 ), 'PALEGOLDENROD',\r
-                               parseInt( 'FFFFE0', 16 ), 'LIGHTYELLOW',\r
-                               parseInt( 'FFD700', 16 ), 'GOLD',\r
-                               parseInt( 'DAA520', 16 ), 'GOLDENROD',\r
-                               parseInt( 'B8860B', 16 ), 'DARKGOLDENROD',\r
-                               parseInt( 'BC8F8F', 16 ), 'ROSYBROWN',\r
-                               parseInt( 'CD5C5C', 16 ), 'INDIANRED',\r
-                               parseInt( '8B4513', 16 ), 'SADDLEBROWN',\r
-                               parseInt( 'A0522D', 16 ), 'SIENNA',\r
-                               parseInt( 'CD853F', 16 ), 'PERU',\r
-                               parseInt( 'DEB887', 16 ), 'BURLYWOOD',\r
-                               parseInt( 'F5F5DC', 16 ), 'BEIGE',\r
-                               parseInt( 'F5DEB3', 16 ), 'WHEAT',\r
-                               parseInt( 'F4A460', 16 ), 'SANDYBROWN',\r
-                               parseInt( 'D2B48C', 16 ), 'TAN',\r
-                               parseInt( 'D2691E', 16 ), 'CHOCOLATE',\r
-                               parseInt( 'B22222', 16 ), 'FIREBRICK',\r
-                               parseInt( 'A52A2A', 16 ), 'BROWN',\r
-                               parseInt( 'FA8072', 16 ), 'SALMON',\r
-                               parseInt( 'FFA500', 16 ), 'ORANGE',\r
-                               parseInt( 'FF7F50', 16 ), 'CORAL',\r
-                               parseInt( 'FF6347', 16 ), 'TOMATO',\r
-                               parseInt( 'FF69B4', 16 ), 'HOTPINK',\r
-                               parseInt( 'FFC0CB', 16 ), 'PINK',\r
-                               parseInt( 'FF1493', 16 ), 'DEEPPINK',\r
-                               parseInt( 'DB7093', 16 ), 'PALEVIOLETRED',\r
-                               parseInt( 'EE82EE', 16 ), 'VIOLET',\r
-                               parseInt( 'DDA0DD', 16 ), 'PLUM',\r
-                               parseInt( 'DA70D6', 16 ), 'ORCHILD',\r
-                               parseInt( '9400D3', 16 ), 'DARKVIOLET',\r
-                               parseInt( '8A2BE2', 16 ), 'BLUEVIOLET',\r
-                               parseInt( '9370DB', 16 ), 'MEDIUMPURPLE',\r
-                               parseInt( 'D8BFD8', 16 ), 'THISTLE',\r
-                               parseInt( 'E6E6FA', 16 ), 'LAVENDER',\r
-                               parseInt( 'FFE4E1', 16 ), 'MISTYROSE',\r
-                               parseInt( 'FFFFF0', 16 ), 'IVORY',\r
-                               parseInt( 'FFFACD', 16 ), 'LEMONCHIFFON'\r
+                               '0', 'BLACK',\r
+                               'FF0000', 'RED',\r
+                               '00FF00', 'LIME',\r
+                               '0000FF', 'BLUE',\r
+                               'FFFF00', 'YELLOW',\r
+                               '00FFFF', 'AQUA',\r
+                               '00FFFF', 'CYAN',\r
+                               'FF00FF', 'MAGENTA',\r
+                               'FF00FF', 'FUCHSIA',\r
+                               'FFFFFF', 'WHITE',\r
+                               '008000', 'GREEN',\r
+                               '800080', 'PURPLE',\r
+                               '800000', 'MAROON',\r
+                               '000080', 'NAVY',\r
+                               '808000', 'OLIVE',\r
+                               '008080', 'TEAL',\r
+                               '808080', 'GRAY',\r
+                               'C0C0C0', 'SILVER',\r
+                               '696969', 'DIMGRAY',\r
+                               '708090', 'SLATEGRAY',\r
+                               'A9A9A9', 'DARKGRAY',\r
+                               'DCDCDC', 'GAINSBORO',\r
+                               '191970', 'MIDNIGHTBLUE',\r
+                               '6A5ACD', 'SLATEBLUE',\r
+                               '0000CD', 'MEDIUMBLUE',\r
+                               '4169E1', 'ROYALBLUE',\r
+                               '1E90FF', 'DODGERBLUE',\r
+                               '87CEEB', 'SKYBLUE',\r
+                               '4682B4', 'STEELBLUE',\r
+                               'ADD8E6', 'LIGHTBLUE',\r
+                               'AFEEEE', 'PALETURQUOISE',\r
+                               '40E0D0', 'TURQUOISE',\r
+                               'E0FFFF', 'LIGHTCYAN',\r
+                               '7FFFD4', 'AQUAMARINE',\r
+                               '006400', 'DARKGREEN',\r
+                               '2E8B57', 'SEAGREEN',\r
+                               '90EE90', 'LIGHTGREEN',\r
+                               '7FFF00', 'CHARTREUSE',\r
+                               'ADFF2F', 'GREENYELLOW',\r
+                               '32CD32', 'LIMEGREEN',\r
+                               '9ACD32', 'YELLOWGREEN',\r
+                               '6B8E23', 'OLIVEDRAB',\r
+                               'BCB76B', 'DARKKHAKI',\r
+                               'EEE8AA', 'PALEGOLDENROD',\r
+                               'FFFFE0', 'LIGHTYELLOW',\r
+                               'FFD700', 'GOLD',\r
+                               'DAA520', 'GOLDENROD',\r
+                               'B8860B', 'DARKGOLDENROD',\r
+                               'BC8F8F', 'ROSYBROWN',\r
+                               'CD5C5C', 'INDIANRED',\r
+                               '8B4513', 'SADDLEBROWN',\r
+                               'A0522D', 'SIENNA',\r
+                               'CD853F', 'PERU',\r
+                               'DEB887', 'BURLYWOOD',\r
+                               'F5F5DC', 'BEIGE',\r
+                               'F5DEB3', 'WHEAT',\r
+                               'F4A460', 'SANDYBROWN',\r
+                               'D2B48C', 'TAN',\r
+                               'D2691E', 'CHOCOLATE',\r
+                               'B22222', 'FIREBRICK',\r
+                               'A52A2A', 'BROWN',\r
+                               'FA8072', 'SALMON',\r
+                               'FFA500', 'ORANGE',\r
+                               'FF7F50', 'CORAL',\r
+                               'FF6347', 'TOMATO',\r
+                               'FF69B4', 'HOTPINK',\r
+                               'FFC0CB', 'PINK',\r
+                               'FF1493', 'DEEPPINK',\r
+                               'DB7093', 'PALEVIOLETRED',\r
+                               'EE82EE', 'VIOLET',\r
+                               'DDA0DD', 'PLUM',\r
+                               'DA70D6', 'ORCHILD',\r
+                               '9400D3', 'DARKVIOLET',\r
+                               '8A2BE2', 'BLUEVIOLET',\r
+                               '9370DB', 'MEDIUMPURPLE',\r
+                               'D8BFD8', 'THISTLE',\r
+                               'E6E6FA', 'LAVENDER',\r
+                               'FFE4E1', 'MISTYROSE',\r
+                               'FFFFF0', 'IVORY',\r
+                               'FFFACD', 'LEMONCHIFFON'\r
                        ];\r
-               for( i=list.length; i; ){\r
+               for( i = list.length; i; ){\r
                        v    = list[ --i ];\r
                        name = list[ --i ];\r
-                       ret[ name ] = v;\r
+                       ret[ name ] = parseInt( v, 16 );\r
                };\r
                return ret;\r
        })();\r
@@ -1054,8 +1036,8 @@ var CSS = ( function( window, documwnt, undefined ){
                // top, bottom, left, right, topbottom, leftright, all\r
        };\r
        FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {\r
-               name:    '',\r
-               equal: function( prop ){\r
+               name  : '',\r
+               equal : function( prop ){\r
                        var ps = this.props, i = ps.length;\r
                        for( ; i; ){\r
                                --i;\r
@@ -1063,27 +1045,27 @@ var CSS = ( function( window, documwnt, undefined ){
                        };\r
                        return true;\r
                },\r
-               convert: function( prop ){\r
+               convert : function( prop ){\r
                        var ps = this.props, i = ps.length;\r
                        for( ; i; ){\r
                                --i;\r
                                ps[ i ].convert( prop[ i ] );\r
                        };\r
                },\r
-               setValue: function( ary ){\r
+               setValue : function( ary ){\r
                        var ps = this.props, i = 0, l = ps.length;\r
                        for( ; i<l; ++i ){\r
                                ps[ i ].setValue( ary[ i ] );\r
                        };\r
                },\r
-               getValue: function(){\r
+               getValue : function(){\r
                        var ret = [], ps = this.props, i = 0, l = ps.length;\r
                        for( ; i<l; ++i ){\r
                                ret.push( ps[ i ].getValue() );\r
                        };\r
                        return ret;\r
                },\r
-               getOffset: function( prop ){\r
+               getOffset : function( prop ){\r
                        var ret = [],\r
                                ps  = this.props,\r
                                _ps = prop.props,\r
@@ -1094,14 +1076,14 @@ var CSS = ( function( window, documwnt, undefined ){
                        };\r
                        return ret;\r
                },\r
-               getUnit: function(){\r
+               getUnit : function(){\r
                        var ret = [], ps = this.props, i = 0, l = ps.length;\r
                        for( ; i<l; ++i ){\r
                                ret.push( ps[ i ].getUnit() );\r
                        };\r
                        return ret;\r
                },\r
-               getValueText: function(){\r
+               getValueText : function(){\r
                        var ret = [], ps = this.props, i = 0, l = ps.length;\r
                        for( ; i<l; ++i ){\r
                                ret.push( ps[ i ].getValueText() );\r
@@ -1111,7 +1093,7 @@ var CSS = ( function( window, documwnt, undefined ){
                        };\r
                        return ret.join( ' ' );\r
                },\r
-               clear: function(){\r
+               clear : function(){\r
                        var ps = this.props, i = ps.length;\r
                        for( ; i; ){\r
                                ps[ --i ].clear();\r
@@ -1119,7 +1101,7 @@ var CSS = ( function( window, documwnt, undefined ){
                        delete this.name;\r
                        delete this.props;\r
                },\r
-               isValid: function( t ){\r
+               isValid : function( t ){\r
                        t = t || this;\r
                        var ps = t.props, i = ps.length;\r
                        for( ; i; ){\r
@@ -1138,8 +1120,8 @@ var CSS = ( function( window, documwnt, undefined ){
                this.pct  = pct;\r
        };\r
        ColorPropertyClass.prototype = {\r
-               name:    '',\r
-               equal: function( prop ){\r
+               name  : '',\r
+               equal : function( prop ){\r
                        if( this.pct === prop.pct ){\r
                                return this.r === prop.r && this.g === prop.g && this.b === prop.b;\r
                        };\r
@@ -1152,30 +1134,30 @@ var CSS = ( function( window, documwnt, undefined ){
                        };\r
                        return true;\r
                },\r
-               convert: function( prop ){\r
-                       var u = prop.pct;\r
+               convert : function( prop ){\r
+                       var u = prop.pct, x;\r
                        if( this.pct === u ) return;\r
-                       var x    = u === true ? 100 / 255 : 2.55;\r
+                       x = u === true ? 100 / 255 : 2.55;\r
                        this.r  *= x;\r
                        this.g  *= x;\r
                        this.b  *= x;\r
                        this.pct = u;\r
                },\r
-               setValue: function( rgb ){\r
+               setValue : function( rgb ){\r
                        this.r = rgb[ 0 ];\r
                        this.g = rgb[ 1 ];\r
                        this.b = rgb[ 2 ];\r
                },\r
-               getValue: function(){\r
+               getValue : function(){\r
                        return [ this.r, this.g, this.b ];\r
                },\r
-               getOffset: function( prop ){\r
+               getOffset : function( prop ){\r
                        return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];\r
                },\r
-               getUnit: function(){\r
+               getUnit : function(){\r
                        return this.pct === true ? '%' : '';\r
                },\r
-               getValueText: function(){\r
+               getValueText : function(){\r
                        if( this.pct === true ){\r
                                return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );\r
                        };\r
@@ -1185,18 +1167,18 @@ var CSS = ( function( window, documwnt, undefined ){
                        var rgb   = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );\r
                        return '#' + rgb.substr( rgb.length - 6 );\r
                },\r
-               clear: function(){\r
+               clear : function(){\r
                        var t = this, p;\r
                        for( p in t ){\r
                                if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
                                delete t[ p ];\r
                        };\r
                },\r
-               _toPct: function(){\r
+               _toPct : function(){\r
                        if( this.pct === true ) return [ this.r, this.g, this.b ];\r
                        return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];\r
                },\r
-               isValid: function( t ){\r
+               isValid : function( t ){\r
                        var isFinite = window.isFinite;\r
                        if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;\r
                        if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;\r
@@ -1471,12 +1453,43 @@ var CSS = ( function( window, documwnt, undefined ){
                        obj[ _p ] = obj[ _p ] || obj[ p ];\r
                        delete obj[ p ];\r
                };\r
+               return obj;\r
+       };\r
+       function cssToObject( css ){\r
+               var ret      = {}, i, nv, n, v,\r
+                       parse    = Util.parse,\r
+                       isNumber = Type.isNumber,\r
+                       camelize = Util.camelize;\r
+               if( Type.isString( css ) === true ){\r
+                       css = css.split( ';' );\r
+                       for( i = css.length; i; ){\r
+                               nv    = css[ --i ].split( ':' ); // filter の場合, progid: がくる\r
+                               n     = nv.shift();\r
+                               if( isNumber( parse( n ) ) === true ) continue;\r
+                               v     = nv.join( '' );\r
+                               while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );\r
+                               ret[ camelize( n ) ] = parse( v );\r
+                       };\r
+               } else {\r
+                       for( n in css ){\r
+                               if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );\r
+                       };\r
+               };\r
+\r
+               if( SPECIAL.setFilters ){\r
+                       SPECIAL.setFilters( ret );\r
+               } else {\r
+                       ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;\r
+               };\r
+               \r
+               SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );\r
+               SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );\r
+               \r
+               return ret;\r
        };\r
-       \r
        return {\r
                getWrappedStyle: function( elm, opt_css ){\r
-                       opt_css && camelizeHash( opt_css );\r
-                       return new WrappedStyleClass( elm, opt_css || CSS.getComputedStyle( elm ) );\r
+                       return new WrappedStyleClass( elm, opt_css ? camelizeHash( opt_css ) : CSS.getComputedStyle( elm ) );\r
                },\r
                getInlineStyle: function( _elm ){\r
                        return cssToObject( _elm.style.cssText );\r
index 81aaa51..0b1a931 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR peta.apps.js
- *   version 0.5.39
+ *   version 0.5.44
  *   
  * author:
  *   itozyun
                MyArtistID = 'current_artist' in window ? current_artist.id : ( pettanr.CONST.SERVER_SUPPORT === false ? 1 : -1 ),
                Driver     = null,
                FileAPI    = gOS.registerDriver( function(){
-                       var self = Driver = this;
+                       var self = Driver = this,
+                               unregisteredFileDataJsonList = [];
                        
-                       function onLoadJson( _file, _json ){
-                               var _access = FileAPI.getFileDataAccess( _file ),
-                                       _data   = _access !== null ? _access.DATA : null,
-                                       i, l;
-                               if( _data === null ){
-                                       onErrorJson( _file );
+                       function onLoadJson( file, json ){
+                               var access = FileAPI.getFileDataAccess( file ),
+                                       data   = access !== null ? access.DATA : null,
+                                       i, l, args;
+                               if( data === null ){
+                                       onErrorJson( file );
                                        return;
                                };
-                               _data.state = Const.FILE.STATE.OK;
-                               
-                               if( Type.isArray( _json ) === true ){
-                                       for( i = 0, l = _json.length; i < l; ++i ){
-                                               buildFileData( _json[ i ], _data );
+                               data.state = Const.FILE.STATE.OK;
+                               if( Type.isArray( json ) === true ){
+                                       for( i = 0, l = json.length; i < l; ++i ){
+                                               registerFileData( json[ i ], data );
                                        };
                                } else
-                               if( Type.isNumber( _json.id ) === true ){
-                                       buildFileData( _json, _data );
+                               if( Type.isNumber( json.id ) === true ){
+                                       registerFileData( json, data );
+                               };
+                               while( 0 < unregisteredFileDataJsonList.length ){
+                                       args = unregisteredFileDataJsonList.shift();
+                                       registerFileData( args[ 0 ], args[ 1 ] );
+                                       //alert( unregisteredFileDataJsonList.length )
                                };
-                               _file.dispatchEvent( FileAPI.createFileEvent( Const.FILE.EVENT.GET_SEQENTIAL_FILES, _file, 'children', null ) );
+                               file.dispatchEvent( FileAPI.createFileEvent( Const.FILE.EVENT.GET_SEQENTIAL_FILES, file, 'children', null ) );
                        };
-                       function onErrorJson( _file ){ 
-                               var _data = FileAPI.getFileData( _file);
-                               if( _data !== null){
-                                       _data.state = Const.FILE.STATE.ERROR;
+                       function onErrorJson( file ){ 
+                               var data = FileAPI.getFileData( file );
+                               if( data !== null){
+                                       data.state = Const.FILE.STATE.ERROR;
                                };
-                               _file.dispatchEvent( FileAPI.createFileEvent( Const.FILE.EVENT.GET_SEQENTIAL_FILES, _file, 'children', null ) );
+                               file.dispatchEvent( FileAPI.createFileEvent( Const.FILE.EVENT.GET_SEQENTIAL_FILES, file, 'children', null ) );
                        };
-                       function buildFileData( _data, _parent ){
-                               var _array, i, l;
-                               // Panel
-                               if( _parent === FILE_DATA_PANELS_ROOT || _parent === FILE_DATA_MY_PANELS_ROOT ){
-                                       _data.type = FILE_TYPE.PANEL;
-                                       _array = PANEL_ARRAY;
-                               } else
-                               // Comic
-                               if( _parent === FILE_DATA_COMICS_ROOT || _parent === FILE_DATA_MY_COMICS_ROOT ){
-                                       _data.type = FILE_TYPE.COMIC;
-                                       _array = COMIC_ARRAY;
-                               } else
-                               if( _parent.type === FILE_TYPE.COMIC ){
-                                       _array = PANEL_ARRAY;
-                               } else
-                               // Lisence
-                               if( _parent === FILE_DATA_LISENCE_ROOT ){
-                                       _data.type = FILE_TYPE.LICENSE;
-                                       _array = ORIGINAL_LICENSE_ARRAY;
-                               } else
-                               // Author
-                               if( _parent === FILE_DATA_AUTHOR_ROOT ){
-                                       _data.type = FILE_TYPE.AUTHOR;
-                                       _array = AUTHOR_ARRAY;
-                               } else
-                               // Artist
-                               if( _parent === FILE_DATA_ARTIST_ROOT ){
-                                       _data.type = FILE_TYPE.ARTIST;
-                                       _array = ARTIST_ARRAY;
-                               } else          
-                               // Picture
-                               if( _parent === FILE_DATA_PICTURE_ROOT || _parent === FILE_DATA_MY_PICTURES_ROOT ){
-                                       _data.type = FILE_TYPE.PICTURE;
-                                       _array = RESOURCE_PICTURE_ARRAY;
-                                       // original_license を含まなければ、license object を削除して ビットデータ で保持
-                                       // original_license なら ファイルを作る buildFileData( _license, FILE_DATA_LISENCE_ROOT)
-                                       var _license = _data.license,
-                                               _rule,
-                                               _Math_pow = Math.pow,
-                                               _bits = 0;
-                                       if( typeof _license === 'object' ){
-                                               for( i=0, l=BASIC_LICENSES.length; i<l; ++i ){
-                                                       _rule = _license[ BASIC_LICENSES[ i]];
-                                                       if( typeof _rule === 'number' && _rule === 1 ){
-                                                               _bits += _Math_pow( 2, i );
-                                                       };
+                       function registerFileData( json, parent ){
+                               var data;
+                               switch( parent ){
+                                       // Comic
+                                       case FILE_DATA_COMICS_ROOT    :
+                                       case FILE_DATA_MY_COMICS_ROOT :
+                                       case COMIC_ARRAY              :
+                                               json.type = FILE_TYPE.COMIC;
+                                               data = createFileData( json, COMIC_ARRAY, 'title' );
+                                               if( data.json !== null ) data.json = true;
+                                               if( data.author ){
+                                                       addChildData( data.author, data );
+                                                       data.author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, data );
                                                };
-                                               _data.license = _bits;
-                                       };
-                               } else {
-                                       alert( 'error' );
-                               };
+                                               parent === FILE_DATA_COMICS_ROOT && addChildData( FILE_DATA_LATEST_COMICS, data );
+                                               break;
+                                       
+                                       case STORY_ARRAY :
+                                               json.type = FILE_TYPE.STORY;
+                                               data = createFileData( json, STORY_ARRAY, 'x,y,z,t' );
+                                               addChildData( FILE_DATA_STORY_ROOT, data );
+                                               break;
+                                       
+                                       // Lisence
+                                       case FILE_DATA_LISENCE :
+                                       case LICENSE_ARRAY :
+                                               json.type = FILE_TYPE.LICENSE;
+                                               data = createFileData( json, LICENSE_ARRAY, 'name,caption,url,system_picture_id,settings,credit_pictures' );
+                                               addChildData( FILE_DATA_LISENCE, data );
+                                               break;
+                                       // License Group
+                                       case FILE_DATA_LISENCE_GROUP :
+                                       case LICENSE_GROUP_ARRAY     :
+                                               json.type = FILE_TYPE.LICENSE_GROUP;
+                                               data = createFileData( json, LICENSE_GROUP_ARRAY, 'name,caption,url,classname' );
+                                               addChildData( FILE_DATA_LISENCE_GROUP, data );
+                                               break;
+                                               
+                                       // Author
+                                       case FILE_DATA_AUTHOR_ROOT :
+                                       case AUTHOR_ARRAY          :
+                                               json.type = FILE_TYPE.AUTHOR;
+                                               data = createFileData( json, AUTHOR_ARRAY, 'name,email,homepage_url' );
+                                               addChildData( FILE_DATA_AUTHOR_ROOT, data );
+                                               break;
+                                       
+                                       // Artist
+                                       case FILE_DATA_ARTIST_ROOT :
+                                       case ARTIST_ARRAY          :
+                                               json.type = FILE_TYPE.ARTIST;
+                                               data = createFileData( json, ARTIST_ARRAY, 'name,email,homepage_url' );
+                                               addChildData( FILE_DATA_ARTIST_ROOT, data );
+                                               break;
+
+                                       case PICTURE_ARRAY :
+                                               json.type = FILE_TYPE.PICTURE;
+                                               data = createFileData( json, PICTURE_ARRAY, 'ext,revision,credit,settings' );
+                                               break;
                                
-                               _data.driver = Driver;
-                               // alert( ' _array ' + _data.id + Type.isNumber( _data.id ) );
-                               // _array に _data を格納 または 上書き
-                               if( Type.isNumber( _data.id ) === true && _data.id > 0 ){
-                                       var _id       = _data.id - 1,
-                                               __data    = _array[ _id ],
-                                               _reserved = Const.FILE.DATA_PROPERTY_RESERVED.join( ', ' );
-                                       if( __data ){
-                                               for( var key in _data ){
-                                                       if( _reserved.indexOf( key ) === -1 ){
-                                                               __data[ key ] = _data[ key ];
-                                                       };
+                                       // Resource Picture
+                                       case FILE_DATA_RESOURCE_PICTURES_ROOT    :
+                                       case FILE_DATA_MY_RESOURCE_PICTURES_ROOT :
+                                       case RESOURCE_PICTURE_ARRAY              :
+                                               json.type = FILE_TYPE.RESOURCE_PICTURE;
+                                               data = createFileData( json, RESOURCE_PICTURE_ARRAY, 'ext' );
+                                               if( data.artist ){
+                                                       addChildData( data.artist, data );
+                                                       data.artist.id === MyArtistID && addChildData( FILE_DATA_MY_RESOURCE_PICTURES_ROOT, data );
                                                };
-                                               _data = __data; // このタイミングで参照が切れるので注意!!
-                                       } else {
-                                               _array[ _id ] = _data;
-                                       };
-                               } else {
-                                       // alert( 'error' + _parent.name + ' ' + _data.id );
-                               };
-               
-                               // Author
-                               // Artist
-                               if( _parent === FILE_DATA_AUTHOR_ROOT || _parent === FILE_DATA_ARTIST_ROOT ){
-                                       addChildData( _parent, _data );
-                               } else
-                               // Comic + Panels
-                               if( _parent === FILE_DATA_COMICS_ROOT || _parent === FILE_DATA_MY_COMICS_ROOT ){
-                                       var _stories = _data.stories,
-                                               _panel;
-                                       if( Type.isArray( _stories ) === true ){
-                                               for( i=0, l=_stories.length; i<l; ++i ){
-                                                       _panel = buildFileData( _stories[ i ].panel, FILE_DATA_PANELS_ROOT );
-                                                       /*
-                                                        * 間違い! t 順に格納
-                                                        */
-                                                       addChildData( _data, _panel );
+                                               break;
+
+                                       // Original Picture
+                                       case FILE_DATA_MY_ORIGINAL_PICTURES_ROOT :
+                                       case ORIGINAL_PICTURE_ARRAY              :
+                                               json.type = FILE_TYPE.ORIGINAL_PICTURE;
+                                               data = createFileData( json, ORIGINAL_PICTURE_ARRAY, 'ext,filesize,width,height,md5' );
+                                               if( data.artist ){
+                                                       // addChildData( data.artist, data );
+                                                       data.artist.id === MyArtistID && addChildData( FILE_DATA_MY_ORIGINAL_PICTURES_ROOT, data );
                                                };
-                                               delete _data.stories;
-                                       }// else {
-                                               if( _data.json !== null ){
-                                                       _data.json = true;
+                                               break;
+                                       // Panel
+                                       case FILE_DATA_PANELS_ROOT    :
+                                       case FILE_DATA_MY_PANELS_ROOT :
+                                       case PANEL_ARRAY              :
+                                                       json.type = FILE_TYPE.PANEL;
+                                                       data = createFileData( json, PANEL_ARRAY, 'border,publish,width,height' );
+                                                       addChildData( FILE_DATA_LATEST_PANELS, data );
+                                                       data.author.id === MyAuthorID && addChildData( FILE_DATA_MY_PANELS_ROOT, data );                                                
+                                               break;
+                                               
+                                       // Panel Element
+                                       case PANEL_ELEMENT_ARRAY :
+                                               json.type = FILE_TYPE.PANEL_ELEMENT;
+                                               data = createFileData( json, PANEL_ELEMENT_ARRAY, 'caption,url,width,height,x,y,z,t' ); // 画像の分
+                                               // 噴出しの分
+                                               // 景色の分
+                                               break;
+                                               
+                                       default :
+                                               if( parent.type === FILE_TYPE.COMIC ){
+                                                       //alert( 'comicstory' )
+                                                       data = registerFileData( json, STORY_ARRAY );
+                                                       //addChildData( parent, data );
+                                                       break;
                                                };
-                                               //if( Type.isArray( _data.elements ) === false ){
-                                               //      _data.elements = [];
-                                               //};
-                                       //};
-                                       var _author = _data.author || getResource( AUTHOR_ARRAY, _data.author_id );
-                                       if( _author ){
-                                               _data.author = _author = buildFileData( _author, FILE_DATA_AUTHOR_ROOT );
-                                               addChildData( _author, _data );
-                                               _author.id === MyAuthorID && addChildData( FILE_DATA_MY_COMICS_ROOT, _data );
-                                       };
-                                       if( _parent === FILE_DATA_COMICS_ROOT ){
-                                               addChildData( FILE_DATA_LATEST_COMICS, _data );
+                                               throw new Error( 'build file error!' ); 
+                               };
+                               return data;
+                       };
+                       /*
+                        * 1. すでに一度以上ファイルを取得している場合、そのオブジェクトを取得.または、新規に作成.
+                        * 2. オブジェクトに値をコピー・上書き
+                        * 3. 
+                        */
+                       function createFileData( json, array, copyProps ){
+                               copyProps = copyProps + ',id,type';
+                               
+                               var getIndex  = Util.getIndex,
+                                       id        = json.id,
+                                       data      = getResource( array, id ),
+                                       p, i, l,
+                                       histories, history,
+                                       stories, story,
+                                       elements;
+                               
+                               // Copy Props
+                               copyProps = copyProps.split( ',' );
+                               for( p in json ){
+                                       if( getIndex( copyProps, p ) !== -1 ) data[ p ] = json[ p ];
+                               };
+                               
+                               // Common
+                               data.driver = Driver;                           
+                               if( Type.isString( json.created_at ) === true ) data.created_at = Math.floor( new Date( json.created_at ).getTime() / 1000 );
+                               if( Type.isString( json.updated_at ) === true ) data.updated_at = Math.floor( new Date( json.updated_at ).getTime() / 1000 );
+                               
+                               // 実素材履歴
+                               histories = json.pictures;
+                               if( Type.isArray( histories ) === true ){
+                                       for( i = 0, l = histories.length; i < l; ++i ){
+                                               history = getResource( PICTURE_ARRAY, histories[ i ] );
+                                               addChildData( data, history );
                                        };
-                               } else
-                               // Panel
-                               if( _parent.type === FILE_TYPE.COMIC || _parent === FILE_DATA_PANELS_ROOT || _parent === FILE_DATA_MY_PANELS_ROOT ){
-                                       _data.comic  && buildFileData( _data.comic, FILE_DATA_COMICS_ROOT );
-                                       _data.author && buildFileData( _data.author, FILE_DATA_AUTHOR_ROOT );
-                                       
-                                       _data.comic  = getResource( COMIC_ARRAY, _data.comic_id );
-                                       _data.author = getResource( AUTHOR_ARRAY, _data.author_id );
-                                       
-                                       // picture data をファイルに取り出し
-                                       var _elements = _data.elements || ( _data.panel ? _data.panel.elements : null ),
-                                               _elm;
-                                       if( Type.isArray( _elements ) === true ){
-                                               for( i = 0, l = _elements.length; i<l; ++i ){
-                                                       _elm = _elements[ i ];
-                                                       if( _elm.picture ){
-                                                               _elm.picture = buildFileData( _elm.picture, FILE_DATA_PICTURE_ROOT ); // 上記参照切れに備えてここで上書き
-                                                       } else {
-                                                               _elm.picture = getResource( RESOURCE_PICTURE_ARRAY, _elm.picture_id );
-                                                       };
-                                               };
+                                       data.picture = history;
+                               };                              
+                               
+                               // ストーリー
+                               stories = json.stories;
+                               if( Type.isArray( stories ) === true ){
+                                       for( i = 0, l = stories.length; i < l; ++i ){
+                                               story = getResource( STORY_ARRAY, stories[ i ] );
+                                               /*
+                                                * 間違い! t 順に格納
+                                                */
+                                               addChildData( data, story );
                                        };
-                                       /* _data.publish === 1 && */ addChildData( FILE_DATA_LATEST_PANELS, _data );
-                                       _data.author_id === MyAuthorID && addChildData( FILE_DATA_MY_PANELS_ROOT, _data );
-                               } else
-                               // Picture
-                               if( _data.type == FILE_TYPE.PICTURE ){
-                                       var _artist = _data.artist || getResource( ARTIST_ARRAY, _data.artist_id );
-                                       if( _artist){
-                                               _data.artist = _artist = buildFileData( _artist, FILE_DATA_ARTIST_ROOT );
-                                               addChildData( _artist, _data );
-                                               if( _artist.id === MyArtistID ){
-                                                       addChildData( FILE_DATA_MY_PICTURES_ROOT, _data );
-                                                       //FILE_DATA_MY_PICTURES_ROOT.type = FILE_TYPE.ARTIST;
-                                                       //FILE_DATA_MY_PICTURES_ROOT.id = MyArtistID;
-                                               };
+                               };
+
+                               // パネル要素
+                               elements = json.elements;
+                               if( Type.isArray( elements ) === true ){
+                                       for( i = 0, l = elements.length; i<l; ++i ){
+                                               /*
+                                                * 間違い! t 順に格納
+                                                */
+                                               addChildData( data, getResource( PANEL_ELEMENT_ARRAY, elements[ i ] ) );
                                        };
                                };
-                               return _data;
+                               
+                               // Artist
+                               if( json.artist || json.artist_id ){
+                                       data.artist = getResource( ARTIST_ARRAY, json.artist || json.artist_id );
+                               };
+                                       
+                               // Author
+                               if( json.author || json.author_id ){
+                                       data.author = getResource( AUTHOR_ARRAY, json.author || json.author_id );
+                               };
+
+                               // Comic
+                               if( json.comic || json.comic_id ){
+                                       data.comic = getResource( COMIC_ARRAY, json.comic || json.comic_id );
+                               };
+
+                               // Panel
+                               if( json.panel || json.panel_id ){
+                                       data.panel = getResource( PANEL_ARRAY, json.panel || json.panel_id );
+                               };
+
+                               // 実素材
+                               if( json.picture || json.picture_id ){
+                                       data.picture = getResource( PICTURE_ARRAY, json.picture || json.picture_id );
+                               };
+
+                               // License
+                               if( json.license || json.license_id ){
+                                       data.license = getResource( LICENSE_ARRAY, json.license || json.license_id );
+                               };
+
+                               // License Group
+                               if( json.license_group || json.license_group_id ){
+                                       data.license_group = getResource( LICENSE_GROUP_ARRAY, json.license_group || json.license_group_id );
+                               };
+                               
+                               // 原画
+                               if( json.original_picture || json.original_picture_id ){
+                                       data.original_picture = getResource( ORIGINAL_PICTURE_ARRAY, json.original_picture || {
+                                               id        : json.original_picture_id,
+                                               ext       : json.ext,
+                                               filesize  : json.filesize,
+                                               width     : json.width,
+                                               height    : json.height,
+                                               md5       : json.md5,
+                                               artist    : json.artist,
+                                               artist_id : json.artist_id
+                                       } );                                            
+                               };
+                               
+                               return data;
                        };
-                       function addChildData( _parent, _child ){
-                               if( Type.isArray( _parent.children ) === false ){
-                                       _parent.children = [];
+                       function addChildData( parent, child ){
+                               if( Type.isArray( parent.children ) === false ){
+                                       parent.children = [ child ];
+                                       return;
                                };
-                               Util.getIndex( _parent.children, _child ) === -1 && _parent.children.push( _child );
+                               Util.getIndex( parent.children, child ) === -1 && parent.children.push( child );
                        };
-                       function getResource( _array, _id ){
-                               if( Type.isArray( _array ) === false || Type.isNumber( _id ) === false || _id < 1 ) return null;
-                               var _data = _array[ _id - 1 ];
-                               if( !_data ){
-                                       _data = _array[ _id - 1 ] = {};
+                       function getResource( list, IDorOBJECT ){
+                               var data, id, obj;
+                               if( Type.isNumber( IDorOBJECT ) === true ){
+                                       id = IDorOBJECT;
+                               } else
+                               if( IDorOBJECT && Type.isNumber( IDorOBJECT.id ) === true ){
+                                       obj = IDorOBJECT;
+                                       id  = obj.id;
+                                       unregisteredFileDataJsonList.push( [ obj, list ] );
+                               } else {
+                                       alert( 'getResource error' + IDorOBJECT.toString() );
+                                       return undefined;
                                };
-                               return _data;
+                               data = list[ id ];
+                               if( !data ) data = list[ id ] = { id : id };
+                               return data;
                        };
                        
-                       this.getSeqentialFiles = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _json = _data !== null ? _data.json : null;
-                               if( _data.type === FILE_TYPE.COMIC && _json === true ){
+                       this.getSeqentialFiles = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       json = data.json || null;
+                               if( data.type === FILE_TYPE.COMIC && json === true ){
                                        if( pettanr.CONST.SERVER_SUPPORT === false ){
-                                               _json = [ 'json\/comics_', _data.id, '.json' ].join( '' );
+                                               json = [ 'json\/comics_', data.id, '.json' ].join( '' );
                                        } else {
-                                               _json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'stories\/', _data.id, '\/comic.json' ].join( '' );
+                                               json = [ pettanr.CONST.PETTANR_ROOT_PATH, 'stories\/', data.id, '\/comic.json' ].join( '' );
                                        };
+                                       data.json = null;
                                };
-                               if( typeof _json === 'string' ){
-                                       FileAPI.getJson( _file, _json, onLoadJson, onErrorJson );
-                                       _data.state = Const.FILE.STATE.LOADING;
-                                       _data.json  = null;
+                               if( typeof json === 'string' ){
+                                       FileAPI.getJson( file, json, onLoadJson, onErrorJson );
+                                       data.state = Const.FILE.STATE.LOADING;
+                                       if( data.json !== null ) delete data.json;
                                        return;
                                };
                        };
-                       this.getName = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.PICTURE ){
-                                       return [ _data.id, _data.ext ].join( '.' );
-                               } else
-                               if( _type === FILE_TYPE.PANEL ){
-                                       return [ 'id:' + _data.id + ', ' + ( _data.t || '' ) + ':', _data.comic ? _data.comic.title : 'no comic' ].join( '' );
-                               } else
-                               if( _type === FILE_TYPE.COMIC ){
-                                       return _data.title;
-                               } else
-                               if( _type === FILE_TYPE.ARTIST ){
-                                       return [ _data.name, '画伯' ].join( '' );
-                               } else
-                               if( _type === FILE_TYPE.AUTHOR ){
-                                       return [ _data.name, '先生' ].join( '' );
+                       this.getName = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               switch( type ){
+                                       case FILE_TYPE.BALLOON :
+                                               break;
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                               return 'パネル要素';
+                                       case FILE_TYPE.RESOURCE_PICTURE :
+                                               return [ '素材 ' + data.id, '.', data.ext ].join( '' );
+                                       case FILE_TYPE.PICTURE  :
+                                               return [ '実素材 ' + data.id, '.', data.ext ].join( '' );
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
+                                               return [ '原画 ', data.id, '.', data.ext ].join( '' );
+                                       case FILE_TYPE.COMIC :
+                                               return data.title;
+                                       case FILE_TYPE.STORY :
+                                               return [ 'story id:', data.id, ' ', data.comic ? data.comic.title : 'no comic', ':', data.t ].join( '' );
+                                       case FILE_TYPE.PANEL :
+                                               return [ 'panel id:', data.id ].join( '' );
+                                       case FILE_TYPE.AUTHOR :
+                                               return [ data.name, '先生' ].join( '' );
+                                       case FILE_TYPE.ARTIST :
+                                               return [ data.name, '画伯' ].join( '' );
+                                       case FILE_TYPE.FOLDER :
                                };
-                               return _data.name;
+                               return data.name;
                        };
-                       this.getThumbnail = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.PICTURE ){
-                                       return { image: [ pettanr.CONST.THUMBNAIL_PATH, _data.id, '.', _data.ext ].join( '' )};
-                               };
-                               if( _data === FILE_DATA_COMICS_ROOT ){
-                                       return { className: 'file-type-cabinet' };
-                               };
-                               if( _type === FILE_TYPE.COMIC ){
-                                       return { className: 'file-type-comic' };
-                               };
-                               if( _type === FILE_TYPE.PANEL ){
-                                       return { className: 'file-type-panel' };
-                               };
-                               if( _type === FILE_TYPE.AUTHOR ){
-                                       return { className: 'file-type-author' };
-                               };
-                               if( _type === FILE_TYPE.ARTIST ){
-                                       return { className: 'file-type-artist' };
-                               };
-                               if( _type === FILE_TYPE.FOLDER){
-                                       return { className: 'file-type-folder' };
+                       this.getThumbnail = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               if( data === FILE_DATA_COMICS_ROOT ) return { className: 'file-type-cabinet' };
+                               switch( type ){
+                                       
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                               return { className: 'file-type-charactor' };
+                                       case FILE_TYPE.RESOURCE_PICTURE :
+                                               return { image: [ pettanr.CONST.THUMBNAIL_PATH, data.id, '.', data.ext ].join( '' )};
+                                       case FILE_TYPE.PICTURE  :
+                                               //data = data.original_picture;
+                                               return { image: [ pettanr.CONST.THUMBNAIL_PATH, data.id, '.', data.ext ].join( '' )};
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
+                                               return { className: 'file-type-charactor' };                    
+                                               // return { image: [ pettanr.CONST.THUMBNAIL_PATH, data.id, '.', data.ext ].join( '' )};
+                                       case FILE_TYPE.BALLOON :
+                                               break;
+                                       case FILE_TYPE.COMIC :
+                                               return { className: 'file-type-comic' };
+                                       case FILE_TYPE.STORY :
+                                               data = data.panel;
+                                       case FILE_TYPE.PANEL :
+                                               return { className: 'file-type-panel' };
+                                       case FILE_TYPE.AUTHOR :
+                                               return { className: 'file-type-author' };
+                                       case FILE_TYPE.ARTIST :
+                                               return { className: 'file-type-artist' };
+                                       case FILE_TYPE.FOLDER :
+                                               return { className: 'file-type-folder' };
                                };
                                return { className: 'file-type-broken' };
                        };
-                       this.getSummary = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.PICTURE ){
-                                       return [ _data.width, 'x', _data.height, ', filesize:', _data.filesize, ', lisence:', _data.license ].join( '' );
-                               };
-                               if( _data === FILE_DATA_COMICS_ROOT ){
-                                       return 'cabinet file';
-                               };
-                               if( _type === FILE_TYPE.COMIC ){
-                                       return 'comic file, id:' + _data.id;
-                               };
-                               if( _type === FILE_TYPE.PANEL ){
-                                       return [ _data.width, 'x', _data.height ].join( '' );
-                               };
-                               if( _type === FILE_TYPE.AUTHOR ){
-                                       return 'author file, id:' + _data.id;
-                               };
-                               if( _type === FILE_TYPE.ARTIST ){
-                                       return [ 'id:', _data.id, ' Email:', _data.email || 'empty' , ', HP:', _data.homepage_url || 'empty' ].join( '' );
-                               };
-                               if( _type === FILE_TYPE.FOLDER ){
-                                       return 'pettanR folder';
+                       this.getSummary = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               if( data === FILE_DATA_COMICS_ROOT ) return 'cabinet file';
+                               switch( type ){
+                                       case FILE_TYPE.BALLOON :
+                                               break;
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                               return 'caption:' + data.caption + ' url:' + data.url + ' ' + data.width + 'x' + data.height + ' x:' + data.x + ' y:' + data.y + ' z:' + data.z + ' t:' + data.t;
+                                       case FILE_TYPE.RESOURCE_PICTURE :
+                                               data = data.picture;
+                                       case FILE_TYPE.PICTURE :
+                                               return '実素材情報 revision:' + data.revision + ' ' + data.credit + ' ' + data.settings;
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
+                                               return [ '原画情報 ', data.width, 'x', data.height, ', filesize:', data.filesize, ' md5', data.md5 ].join( '' );
+                                       case FILE_TYPE.COMIC :
+                                               return 'comic id:' + data.id;
+                                       case FILE_TYPE.STORY :
+                                               data = data.panel;
+                                       case FILE_TYPE.PANEL :
+                                               return [ 'panel id:', data.id, ', width:', data.width, ', height:', data.height, ', 枠線:', data.border, ', 公開:', data.publish ].join( '' );
+                                       case FILE_TYPE.AUTHOR :
+                                               return 'author id:' + data.id;
+                                       case FILE_TYPE.ARTIST :
+                                               return [ 'artist id:', data.id, ' Email:', data.email || 'empty' , ', HP:', data.homepage_url || 'empty' ].join( '' );
+                                       case FILE_TYPE.FOLDER :
+                                               return 'pettanR folder';
                                };
                                return 'pettanR unknown file';
                        };
-                       this.read = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null,
-                                       ret;
-                               if( _type === FILE_TYPE.COMIC ){
-                                       // children を panels に deepcopy
-                                       ret = {};
-                                       for( var key in _data ){
-                                               ret[ key ] = _data[ key ]
-                                       }
-                                       ret.stories = _data.children;
-                                       return ret;
-                               }
-                               if( _type === FILE_TYPE.PANEL ){
-                               };
-                               if( _type === FILE_TYPE.PANEL_PICTURE ){
-                                       
-                               };
-                               if( _type === FILE_TYPE.BALLOON ){
-                               };
-                               if( _type === FILE_TYPE.PICTURE ){
+                       this.read = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null,
+                                       ret, i, elm;
+                               switch( type ){
+                                       case FILE_TYPE.COMIC :
+                                               ret = Util.copy( data );
+                                               ret.panels = ret.children;
+                                               if( Type.isArray( ret.panels ) === true ){
+                                                       for( i = ret.panels.length; i; ){
+                                                               elm = ret.panels[ --i ];
+                                                               elm.elements = elm.children;
+                                                       };
+                                               };
+                                               return ret;
+                                       case FILE_TYPE.STORY :
+                                               ret = Util.copy( data );
+                                               ret.panel.elements = ret.panel.children;
+                                               return ret;
+                                       case FILE_TYPE.PANEL :
+                                               ret = Util.copy( data );
+                                               ret.elements = ret.children;
+                                               return ret;
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                       case FILE_TYPE.BALLOON :
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
                                };
                        };
-                       this.write = function( _file, _newData, _onUpdate ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.COMIC ){
-                               };
-                               if( _type === FILE_TYPE.PANEL ){
-                               };
-                               if( _type === FILE_TYPE.PANEL_PICTURE ){
-                                       
-                               };
-                               if( _type === FILE_TYPE.BALLOON ){
-                               };
-                               if( _type === FILE_TYPE.PICTURE ){
+                       this.write = function( file, newData, onUpdate ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               switch( type ){
+                                       case FILE_TYPE.COMIC :
+                                       case FILE_TYPE.PANEL :
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                       case FILE_TYPE.BALLOON :
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
                                };
                        };
-                       this.viewerApplicationList = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.PANEL ){
-                                       return [ Reader ];
-                               };
-                               if( _type === FILE_TYPE.COMIC ){
-                                       return [ Reader ];
-                               };
-                               if( _data === FILE_DATA_MY_PICTURES_ROOT ){
-                                       return [ PremiumSatge ];
-                               };
-                               if( _type === FILE_TYPE.ARTIST ){
-                                       return [ PremiumSatge ];
+                       this.viewerApplicationList = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               switch( type ){
+                                       case FILE_TYPE.COMIC :
+                                       case FILE_TYPE.PANEL :
+                                       case FILE_TYPE.STORY :
+                                               return [ Reader ];
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                       case FILE_TYPE.BALLOON :
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
+                                               break;
+                                       case FILE_TYPE.ARTIST :
+                                               return [ PremiumSatge ];
+                                       default :
+                                               if( data === FILE_DATA_MY_ORIGINAL_PICTURES_ROOT ){
+                                                       return [ PremiumSatge ];
+                                               };                                              
                                };
                                return [];
                        };
-                       this.editorApplicationList = function( _file ){
-                               var _data = FileAPI.getFileData( _file ),
-                                       _type = _data !== null ? _data.type : null;
-                               if( _type === FILE_TYPE.PANEL ){
-                                       return [ Editor ];
-                               }
-                               if( _type === FILE_TYPE.COMIC ){
-                                       return [ Editor, ComicConsole ];
-                               }
+                       this.editorApplicationList = function( file ){
+                               var data = FileAPI.getFileData( file ),
+                                       type = data !== null ? data.type : null;
+                               switch( type ){
+                                       case FILE_TYPE.COMIC :
+                                               return [ Editor, ComicConsole ];
+                                       case FILE_TYPE.PANEL :
+                                               return [ Editor ];
+                                       case FILE_TYPE.PANEL_ELEMENT :
+                                       case FILE_TYPE.BALLOON :
+                                       case FILE_TYPE.ORIGINAL_PICTURE :
+                                       case FILE_TYPE.ARTIST :
+                                       default :                                               
+                               };
                                return [];
                        }
                }),
                FILE_TYPE = Util.extend(
                        Const.FILE.TYPE,
                        {
-                               COMIC:                          FileAPI.createFileTypeID(),
-                               PANEL:                          FileAPI.createFileTypeID(),
-                               PICTURE:                        FileAPI.createFileTypeID(),
-                               PANEL_PICTURE:          FileAPI.createFileTypeID(),
-                               BALLOON:                        FileAPI.createFileTypeID(),
-                               AUTHOR:                         FileAPI.createFileTypeID(),
-                               ARTIST:                         FileAPI.createFileTypeID(),
-                               LICENSE:                        FileAPI.createFileTypeID()
+                               COMIC            : FileAPI.createFileTypeID(),
+                               STORY            : FileAPI.createFileTypeID(),
+                               PANEL            : FileAPI.createFileTypeID(),
+                               PANEL_ELEMENT    : FileAPI.createFileTypeID(),
+                               BALLOON          : FileAPI.createFileTypeID(),                          
+                               ORIGINAL_PICTURE : FileAPI.createFileTypeID(),
+                               RESOURCE_PICTURE : FileAPI.createFileTypeID(),
+                               PICTURE          : FileAPI.createFileTypeID(),
+                               AUTHOR           : FileAPI.createFileTypeID(),
+                               ARTIST           : FileAPI.createFileTypeID(),
+                               LICENSE          : FileAPI.createFileTypeID(),
+                               LICENSE_GROUP    : FileAPI.createFileTypeID()
                        }
                ),
+               AUTHOR_ARRAY  = [],
+               ARTIST_ARRAY  = [],
+               COMIC_ARRAY   = [],
+               STORY_ARRAY   = [],
+               PANEL_ARRAY   = [],
+               LICENSE_ARRAY = [],
+               PICTURE_ARRAY = [],
+               LICENSE_GROUP_ARRAY    = [],
+               PANEL_ELEMENT_ARRAY    = [],
+               ORIGINAL_PICTURE_ARRAY = [],
+               RESOURCE_PICTURE_ARRAY = [],
+               BALLOON_TEMPLETE_ARRAY = [],
+               BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ','),
                FILE_DATA_SERVICE_ROOT = {
                        name:           'PettanR root',
                        type:           FILE_TYPE.FOLDER,
                        driver:         Driver,
                        json:           pettanr.CONST.URL_PANELS_JSON
                },
-               FILE_DATA_PICTURE_ROOT = {
-                       name:           'Picutures',
+               FILE_DATA_RESOURCE_PICTURES_ROOT = {
+                       name:           '素材',
                        type:           FILE_TYPE.FOLDER,
                        children:       [],
                        driver:         Driver,
                        json:           pettanr.CONST.URL_RESOURCE_PICTURES_JSON
                },
+               FILE_DATA_ORIGINAL_PICTURES_ROOT = {
+                       name:           '原画',
+                       type:           FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver
+               },
                FILE_DATA_MY_COMICS_ROOT = {
                        name:           'My Comics',
                        type:           FILE_TYPE.FOLDER,
                        type:           FILE_TYPE.FOLDER,
                        children:       []
                },
+               FILE_DATA_STORY_ROOT = {
+                       name:           'Stories',
+                       type:           FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver
+               },
                FILE_DATA_LATEST_PANELS = {
                        name:           'Latest Panels',
                        type:           FILE_TYPE.FOLDER,
                        driver:         Driver,
                        json:           pettanr.CONST.URL_MY_PANELS_JSON
                },
-               FILE_DATA_MY_PICTURES_ROOT = {
-                       name:           'My Pictures',
+               FILE_DATA_MY_RESOURCE_PICTURES_ROOT = {
+                       name:           'My 素材画像',
+                       type:           FILE_TYPE.FOLDER,
+                       children:       [],
+                       driver:         Driver,
+                       // json:                pettanr.CONST.URL_RESOURCE_PICTURES_JSON,
+                       id:                     MyArtistID
+               },
+               FILE_DATA_MY_ORIGINAL_PICTURES_ROOT = {
+                       name:           'My 原画',
                        type:           FILE_TYPE.FOLDER,
                        children:       [],
                        driver:         Driver,
-                       json:           pettanr.CONST.URL_ORIGINAL_PICTURES_JSON,
+                       json:           pettanr.CONST.URL_MY_ORIGINAL_PICTURES_JSON,
                        id:                     MyArtistID
                },
                FILE_DATA_AUTHOR_ROOT = {
                        children:       []
                },
                FILE_DATA_LISENCE_ROOT = {
-                       name:           'Original Lisences',
+                       name:           'Lisence Root',
+                       type:           FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_LISENCE = {
+                       name:           'Lisence',
+                       type:           FILE_TYPE.FOLDER,
+                       children:       []
+               },
+               FILE_DATA_LISENCE_GROUP = {
+                       name:           'Lisence Group',
                        type:           FILE_TYPE.FOLDER,
                        children:       []
                },
                        name:           'Balloon templetes',
                        type:           FILE_TYPE.FOLDER,
                        children:       []
-               },
-               AUTHOR_ARRAY = [],
-               ARTIST_ARRAY = [],
-               PANEL_ARRAY  = [],
-               COMIC_ARRAY  = [],
-               RESOURCE_PICTURE_ARRAY = [],
-               BALLOON_TEMPLETE_ARRAY = [],
-               ORIGINAL_LICENSE_ARRAY = [],
-               BASIC_LICENSES = 'cc_by,cc_nc,cc_nd,cc_sa,keep_aspect_ratio,no_convert,no_flip,no_resize'.split( ',');
-       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 );
-       FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_LATEST_COMICS, FILE_DATA_AUTHOR_ROOT );
+               };
+       FILE_DATA_SERVICE_ROOT.children.push( FILE_DATA_COMICS_ROOT, FILE_DATA_RESOURCE_PICTURES_ROOT, FILE_DATA_ORIGINAL_PICTURES_ROOT, FILE_DATA_LISENCE_ROOT, FILE_DATA_BALLOON_ROOT );
+       FILE_DATA_COMICS_ROOT.children.push( FILE_DATA_MY_COMICS_ROOT, FILE_DATA_LATEST_COMICS, FILE_DATA_AUTHOR_ROOT, FILE_DATA_STORY_ROOT, FILE_DATA_PANELS_ROOT );
        FILE_DATA_PANELS_ROOT.children.push( FILE_DATA_LATEST_PANELS, FILE_DATA_MY_PANELS_ROOT );
-       FILE_DATA_PICTURE_ROOT.children.push( FILE_DATA_MY_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT );
+       FILE_DATA_RESOURCE_PICTURES_ROOT.children.push( FILE_DATA_MY_RESOURCE_PICTURES_ROOT, FILE_DATA_ARTIST_ROOT );
+       FILE_DATA_LISENCE_ROOT.children.push( FILE_DATA_LISENCE_GROUP, FILE_DATA_LISENCE );
+       FILE_DATA_ORIGINAL_PICTURES_ROOT.children.push( FILE_DATA_MY_ORIGINAL_PICTURES_ROOT );
        
        FileAPI.createFolderUnderRoot( FILE_DATA_SERVICE_ROOT );
 
-       Driver.isPettanrFileInstance = function( _file ){
-               if( FileAPI.isFileInstance( _file ) === true ){
-                       var _data = FileAPI.getFileData( _file.getUID() );// _file でなく  _file.getUID()
+       Driver.isPettanrFileInstance = function( file ){
+               if( FileAPI.isFileInstance( file ) === true ){
+                       var _data = FileAPI.getFileData( file.getUID() );// file でなく  file.getUID()
                        return _data !== null && _data.driver === Driver;
                };
                return false;
@@ -562,7 +720,7 @@ var Gallery = gOS.registerApplication( function(){
                
                self.fetchCSS( pettanr.CONST.URL_PETA_APPS_CSS );
                
-               tree = FileAPI.createTree( FILE_DATA_PICTURE_ROOT );
+               tree = FileAPI.createTree( FILE_DATA_RESOURCE_PICTURES_ROOT );
                var     _root  = tree.getRootFile(),
                        _myPic = _root.getChildFileAt( 0 ),
                        _pic   = _root.getChildFileAt( 1 );
@@ -695,19 +853,20 @@ var PremiumSatge = gOS.registerApplication( function(){
        var ImageGroupIconClass = function( index, data ){
                var elmIconWrap     = elmIconOrigin.cloneNode( true ),
                        elmIconTitle    = Util.getElementsByClassName( elmIconWrap, 'image-group-item-title' )[ 0 ],
+                       originalPicture = data.original_picture,
                        SRC             = [ BASE_PATH, data.id, '.', data.ext ].join( ''),
-                       LOW_SRC         = data.filesize && data.filesize > LIMIT_FILESIZE ? [ THUMB_PATH, data.id, '.', data.ext ].join( '') : null,
+                       LOW_SRC         = originalPicture.filesize && originalPicture.filesize > LIMIT_FILESIZE ? [ THUMB_PATH, data.id, '.', originalPicture.ext ].join( '') : null,
                        reversibleImage = null,
                        timer           = null,
                        onEnterFlag     = false,
                        instance        = this;
                elmContainer.appendChild( elmIconWrap );
                elmIconWrap.style.left = ( index * itemW ) + 'px';
-               elmIconTitle.appendChild( document.createTextNode( data.filesize + 'bytes' ) );
+               elmIconTitle.appendChild( document.createTextNode( originalPicture.filesize + 'bytes' ) );
                
                function onImageLoad( url, _imgW, _imgH ){
-                       data.width  = _imgW = _imgW || data.width  || 64;
-                       data.height = _imgH = _imgH || data.height || 64;
+                       data.width  = _imgW = _imgW || originalPicture.width  || 64;
+                       data.height = _imgH = _imgH || originalPicture.height || 64;
                        elmIconTitle.firstChild.data = _imgW + 'x' + _imgH;
                        var zoom = 128 /( _imgW > _imgH ? _imgW : _imgH ),
                                MATH_FLOOR = Math.floor,
@@ -777,56 +936,56 @@ var PremiumSatge = gOS.registerApplication( function(){
                        
                        self.removeTimer( onEnterShowImage );
                        self.addTimer( onEnterShowImage, 500 );
-               }
+               };
                return false;                   
-       }
+       };
        
        function drawIcons(){
                while( ICON_ARRAY.length > 0 ){
                        ICON_ARRAY.shift().destroy();
-               }
+               };
                var _index = rootFile.search( {
-                               id:   artistID,
-                               type: FILE_TYPE.ARTIST
+                               id   : artistID,
+                               type : FILE_TYPE.ARTIST
                        })[ 0 ],
                        _artistFile = rootFile.getChildFileAt( _index ),
-                       _file;
+                       file;
                if( _artistFile !== null ){
-                       for(var i=0, l=_artistFile.getChildFileLength(); i<l; ++i ){
-                               _file = _artistFile.getChildFileAt( i );
-                               ICON_ARRAY.push( new ImageGroupIconClass( i, FileAPI.getFileData( _file ) ));
-                               _file.destroy();
-                       }
+                       for( var i=0, l=_artistFile.getChildFileLength(); i<l; ++i ){
+                               file = _artistFile.getChildFileAt( i );
+                               ICON_ARRAY.push( new ImageGroupIconClass( i, FileAPI.getFileData( file ) ));
+                               file.destroy();
+                       };
                        elmName.firstChild.data = _artistFile.getName();
                        _artistFile.destroy();
-               }
-       }
+               };
+       };
        
        function onFadeout(){
                while( ICON_ARRAY.length > 0 ){
                        ICON_ARRAY.shift().destroy();
-               }
+               };
                onUpdate !== null && onUpdateData !== null && onUpdate.call( onUpdateContext, onUpdateData );
                onUpdate = onUpdateData = onUpdateContext = null;
                PremiumSatge.shutdown();
-       }
+       };
        
        
        this.MIN_WIDTH   = 320;
        this.MIN_HEIGHT  = 320;
        this.onInit = function(){
-                       self.rootElement.id = 'image-group-wrapper';
+               self.rootElement.id = 'image-group-wrapper';
 
-                       self.rootElement.innerHTML = [
-                               '<div id="image-group-icon-container"></div>',
-                               '<div id="image-group-name">NO DATA...</div>',
-                               '<div id="image-group-button" class="button">close</div>'
-                       ].join( '' );
-                       
-                       self.fetchCSS( pettanr.CONST.URL_PETA_APPS_CSS );
-                       
-                       tree      = FileAPI.createTree( FILE_DATA_ARTIST_ROOT );
-                       rootFile  = tree.getRootFile();
+               self.rootElement.innerHTML = [
+                       '<div id="image-group-icon-container"></div>',
+                       '<div id="image-group-name">NO DATA...</div>',
+                       '<div id="image-group-button" class="button">close</div>'
+               ].join( '' );
+               
+               self.fetchCSS( pettanr.CONST.URL_PETA_APPS_CSS );
+               
+               tree      = FileAPI.createTree( FILE_DATA_ARTIST_ROOT );
+               rootFile  = tree.getRootFile();
        };
        this.onOpen = function( _windowW, _windowH, _ARTISTIDorFILE, _onUpdate, opt_thisObj ){
                elmContainer  = document.getElementById( 'image-group-icon-container' );
@@ -855,11 +1014,13 @@ var PremiumSatge = gOS.registerApplication( function(){
                tree.addTreeEventListener( Const.TREE.EVENT.UPDATE, drawIcons );
                
                var data = FileAPI.getFileData( _ARTISTIDorFILE );
-               if( data.type === FILE_TYPE.ARTIST || FILE_DATA_MY_PICTURES_ROOT === data ){
+               if( !data ){
+                       artistID = MyArtistID || -1;
+               } else
+               if( data.type === FILE_TYPE.ARTIST || FILE_DATA_MY_ORIGINAL_PICTURES_ROOT === data ){
                        artistID = data.id || -1;
                } else
                if( Type.isNumber( _ARTISTIDorFILE ) === true ){
-                       alert( _ARTISTIDorFILE )
                        artistID = _ARTISTIDorFILE;
                };
                
@@ -1062,30 +1223,41 @@ var Reader = gOS.registerApplication( function(){
 
        }
        function draw(){
-               var fileData, title, author;
+               var fileData, title, author, story;
                
                if( Driver.isPettanrFileInstance( currentFile ) === true ){
-                       if( currentFile.getType() === FILE_TYPE.COMIC ){
-                               fileData    = currentFile.read();
-                               title       = fileData.title;
-                               author      = fileData.author.name;
-                               comicData   = fileData;
-                               numPanel    = currentFile.getChildFileLength();
-                       } else
-                       if( currentFile.getType() === FILE_TYPE.PANEL ){
-                               fileData    = currentFile.read();
-                               title       = fileData.comic.title;
-                               author      = fileData.comic.author.name;
-                               comicData   = fileData;
-                               numPanel    = 1;
-                       }
+                       switch( currentFile.getType() ){
+                               case FILE_TYPE.COMIC :
+                                       fileData    = currentFile.read();
+                                       title       = fileData.title;
+                                       author      = fileData.author.name;
+                                       comicData   = fileData;
+                                       numPanel    = currentFile.getChildFileLength();
+                                       break;
+                               case FILE_TYPE.STORY :
+                                       story       = currentFile.read();
+                                       fileData    = story.panel;
+                                       title       = story.comic.title;
+                                       author      = fileData.author.name;
+                                       comicData   = fileData;
+                                       numPanel    = 1;
+                                       break;
+                               case FILE_TYPE.PANEL :
+                                       fileData    = currentFile.read();
+                                       title       = 'No comic';
+                                       author      = fileData.author.name;
+                                       comicData   = fileData;
+                                       numPanel    = 1;
+                                       break;                  
+                       };
                } else {
                        
                };
                if( comicData !== null ){
                        elmTitle.data  = title;
                        elmAuthor.data = author;
-                       bindWorker.json( comicData );
+                       // bindWorker.json( comicData );
+                       bindWorker.file( currentFile );
                        self.addAsyncCall( asyncResize );
                };
        }
@@ -1120,7 +1292,7 @@ var Reader = gOS.registerApplication( function(){
                self.fetchCSS( pettanr.CONST.URL_PETA_APPS_CSS );
                
        };
-       this.onOpen = function( _w, _h, _file ){
+       this.onOpen = function( _w, _h, file ){
                headerH       = Util.getElementSize( document.getElementById( 'comic-reader-header' ) ).height;
                consoleH      = Util.getElementSize( document.getElementById( 'comic-reader-console' ) ).height;
                elmContainer  = document.getElementById( 'comic-reader-panel-container' );
@@ -1140,10 +1312,10 @@ var Reader = gOS.registerApplication( function(){
                
                windowW = _w;
                windowH = _h;
-               if( FileAPI.isFileInstance( _file ) === true ){
-                       currentFile = _file;
-                       _file.addEventListener( Const.FILE.EVENT.GET_SEQENTIAL_FILES, draw );
-                       _file.getSeqentialFiles();
+               if( FileAPI.isFileInstance( file ) === true ){
+                       currentFile = file;
+                       file.addEventListener( Const.FILE.EVENT.GET_SEQENTIAL_FILES, draw );
+                       file.getSeqentialFiles();
                        draw();
                };
        };
@@ -2141,11 +2313,11 @@ var Editor = gOS.registerApplication( function(){
        var IMAGE_EXPLORER_WINDOW = ( function(){
                var tree, finder;
                
-               function onFileSelect( _file ){
+               function onFileSelect( file ){
                        // 他の image ファイルも許可する?
-                       if( Driver.isPettanrFileInstance( _file ) === true ){
-                               if( _file.getType() === FILE_TYPE.PICTURE ){
-                                       PANEL_ELEMENT_CONTROL.onImageSelect( FileAPI.getFileData( _file ) );
+                       if( Driver.isPettanrFileInstance( file ) === true ){
+                               if( file.getType() === FILE_TYPE.RESOURCE_PICTURE ){
+                                       PANEL_ELEMENT_CONTROL.onImageSelect( FileAPI.getFileData( file ) );
                                };
                        };
                };
@@ -2154,7 +2326,7 @@ var Editor = gOS.registerApplication( function(){
                        {
                                onInit: function(){},
                                onFirstOpen: function( _w, _h, nodeBody ){
-                                       tree = FileAPI.createTree( FILE_DATA_PICTURE_ROOT );
+                                       tree = FileAPI.createTree( FILE_DATA_RESOURCE_PICTURES_ROOT );
                                        var     _root  = tree.getRootFile(),
                                                _myPic = _root.getChildFileAt( 0 ),
                                                _pic   = _root.getChildFileAt( 1 );
@@ -3512,8 +3684,9 @@ var Editor = gOS.registerApplication( function(){
                this.keepSize = false;
                this.flipV    = data.height < 0 ? -1 : 1;
                this.flipH    = data.width  < 0 ? -1 : 1;
-               this.rPicture = data.resource_picture;
-               this.artistID = this.rPicture.artist_id || this.rPicture.artist.id || -1;
+               this.rPicture = data.picture;
+               //this.oPicture = this.rPicture.original_picture;
+               //this.artistID = this.oPicture.artist.id || -1;
                
                var self = this;
                function animeComplete(){
@@ -3577,12 +3750,14 @@ var Editor = gOS.registerApplication( function(){
                        },
                        _updateResourcePicture : function( _rPicture ){
                                this.rPicture = _rPicture;
-                               
-                               this.actualW = _rPicture.width;
-                               this.actualH = _rPicture.height;
+                               this.oPicture = this.rPicture.original_picture;
+                               this.artistID = this.oPicture.artist.id || -1;
+
+                               this.actualW = this.oPicture.width;
+                               this.actualH = this.oPicture.height;
                                
                                var _reversibleImage = pettanr.image.createReversibleImage( 
-                                               [ pettanr.CONST.RESOURCE_PICTURE_PATH, _rPicture.id, '.', _rPicture.ext ].join(''),
+                                               [ pettanr.CONST.RESOURCE_PICTURE_PATH, this.rPicture.id, '.', this.rPicture.ext ].join( '' ),
                                                this.flipH * this.w, this.flipV * this.h
                                        );
                                if( this.reversibleImage !== null ){
@@ -3896,17 +4071,17 @@ var Editor = gOS.registerApplication( function(){
                                var _panelElement;
                                if( isPanelPictureData !== true ){
                                        _panelElement = new ImageElementClass( {
-                                               resource_picture:data,
-                                               x:               Math.floor( panelW / 2 - data.width / 2 ),
-                                               y:               Math.floor( panelH / 2 - data.height / 2 ),
-                                               z:               -1,
-                                               t:               PANEL_ELEMENT_ARRAY.length + 1,
-                                               width:           1,
-                                               height:          1
+                                               picture : data,
+                                               x       : Math.floor( panelW / 2 - data.width / 2 ),
+                                               y       : Math.floor( panelH / 2 - data.height / 2 ),
+                                               z       : -1,
+                                               t       : PANEL_ELEMENT_ARRAY.length + 1,
+                                               width   : 1,
+                                               height  : 1
                                        });
                                        _panelElement.init();
                                        PANEL_ELEMENT_CONTROL.add( _panelElement );
-                                       _panelElement.animate( undefined, undefined, Math.abs( data.width ), Math.abs( data.height ) );
+                                       _panelElement.animate( undefined, undefined, Math.abs( data.picture.original_picture.width ), Math.abs( data.picture.original_picture.height ) );
                                } else {
                                        _panelElement = new ImageElementClass( data );
                                        _panelElement.init();
@@ -4119,7 +4294,7 @@ var Editor = gOS.registerApplication( function(){
                
                delete app.onInit;
        };
-       this.onOpen = function( _w, _h, _file ){
+       this.onOpen = function( _w, _h, file ){
                // 表示奥の物から順に init() していく
                PANEL_ELEMENT_CONTROL.init();
                PANEL_CONTROL.init();
@@ -4144,16 +4319,16 @@ var Editor = gOS.registerApplication( function(){
                        borderSize,
                        fileData, panelElements, panelElm;
 
-               if( FileAPI.isFileInstance( _file ) === true ){
-                       if( Driver.isPettanrFileInstance( _file ) === true ){
-                               if( _file.getType() === FILE_TYPE.COMIC ){
-                                       fileData = _file.read();
+               if( FileAPI.isFileInstance( file ) === true ){
+                       if( Driver.isPettanrFileInstance( file ) === true ){
+                               if( file.getType() === FILE_TYPE.COMIC ){
+                                       fileData = file.read();
                                        panelW   = fileData.width;
                                        panelH   = fileData.height;
                                        comicID  = fileData.id || -1;
                                } else
-                               if( _file.getType() === FILE_TYPE.PANEL ){
-                                       fileData      = _file.read();
+                               if( file.getType() === FILE_TYPE.PANEL ){
+                                       fileData      = file.read();
                                        panelW        = fileData.width;
                                        panelH        = fileData.height;
                                        borderSize    = fileData.border;
@@ -4188,7 +4363,7 @@ var Editor = gOS.registerApplication( function(){
                if( Type.isArray( panelElements ) === true ){
                        for( var i=0; i<panelElements.length; ++i ){
                                panelElm = panelElements[ i ];
-                               if( panelElm.resource_picture ){
+                               if( panelElm.picture ){
                                        PANEL_ELEMENT_CONTROL.createImageElement( panelElm );
                                } else
                                if( panelElm.balloon_template_id ){
index d718096..21b701b 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * pettanR peta.common.js\r
- *   version 0.5.41\r
+ *   version 0.5.44\r
  * \r
  *   author:\r
  *     itozyun\r
@@ -84,25 +84,26 @@ pettanr.CONST = ( function(){
                })();\r
                \r
        return {\r
-               PETTANR_ROOT_PATH:                      PETTANR_ROOT_PATH,\r
-               URL_ORIGINAL_PICTURES_JSON: ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'original_pictures.json',\r
-               URL_RESOURCE_PICTURES_JSON: ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'resource_pictures.json',\r
-               URL_MY_RESOURCE_PICTURES_JSON: ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/resource_picture.json',\r
-               URL_COMICS_JSON:                        ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'comics.json',\r
-               URL_MY_COMICS_JSON:                     ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/comic.json',\r
-               URL_PANELS_JSON:                        ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'panels.json',\r
-               URL_MY_PANELS_JSON:                     ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/panel.json',\r
-               NS_PETTANR_COMIC:                       'pettanr-comic',\r
-               THUMBNAIL_PATH:             SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/thumbnail\/' : PETTANR_ROOT_PATH + 'resource_pictures\/',\r
-               RESOURCE_PICTURE_PATH:          SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/' : PETTANR_ROOT_PATH + 'resource_pictures\/full\/',\r
-               PANEL_PICTURE_PATH:                 SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/' : PETTANR_ROOT_PATH + 'pictures\/',\r
-               SYSTEM_PICTURE_PATH:            ( SERVER_SUPPORT === false ? RELATIVE : PETTANR_ROOT_PATH ) + 'system_pictures\/',\r
-               CREATE_COMIC_JS:                        SERVER_SUPPORT === false ? 'js\/create_new_comic.js' : PETTANR_ROOT_PATH + 'comics\/new.js',\r
-               CREATE_PANEL_JS:                        SERVER_SUPPORT === false ? 'js\/create_new_panel.js' : PETTANR_ROOT_PATH + 'panels\/new.js',\r
-               UPLOAD_PICTURE_JS:                      SERVER_SUPPORT === false ? 'js\/upload_picture.js' : PETTANR_ROOT_PATH + 'original_pictures\/new.js',\r
-               REGISTER_ARTIST_JS:                     SERVER_SUPPORT === false ? 'js\/register_artist.js' : PETTANR_ROOT_PATH + 'artists\/new.js',\r
-               SERVER_SUPPORT:                         SERVER_SUPPORT,\r
-               URL_PETA_APPS_CSS:                      ( SERVER_SUPPORT === false ? 'stylesheets' : '\/assets' ) + '\/peta.apps.css'\r
+               PETTANR_ROOT_PATH             : PETTANR_ROOT_PATH,\r
+               URL_MY_ORIGINAL_PICTURES_JSON : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'original_pictures.json',\r
+               URL_MY_RESOURCE_PICTURES_JSON : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/resource_pictures.json',\r
+               URL_RESOURCE_PICTURES_JSON    : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'resource_pictures.json',\r
+               URL_MY_RESOURCE_PICTURES_JSON : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/resource_picture.json',\r
+               URL_COMICS_JSON               : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'comics.json',\r
+               URL_MY_COMICS_JSON            : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/comic.json',\r
+               URL_PANELS_JSON               : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'panels.json',\r
+               URL_MY_PANELS_JSON            : ( SERVER_SUPPORT === false ? 'json\/' : PETTANR_ROOT_PATH ) + 'home\/panel.json',\r
+               NS_PETTANR_COMIC              : 'pettanr-comic',\r
+               THUMBNAIL_PATH                : SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/thumbnail\/' : PETTANR_ROOT_PATH + 'resource_pictures\/',\r
+               RESOURCE_PICTURE_PATH         : SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/' : PETTANR_ROOT_PATH + 'resource_pictures\/full\/',\r
+               PANEL_PICTURE_PATH            : SERVER_SUPPORT === false ? RELATIVE + 'resource_pictures\/' : PETTANR_ROOT_PATH + 'pictures\/',\r
+               SYSTEM_PICTURE_PATH           : ( SERVER_SUPPORT === false ? RELATIVE : PETTANR_ROOT_PATH ) + 'system_pictures\/',\r
+               CREATE_COMIC_JS               : SERVER_SUPPORT === false ? 'js\/create_new_comic.js' : PETTANR_ROOT_PATH + 'comics\/new.js',\r
+               CREATE_PANEL_JS               : SERVER_SUPPORT === false ? 'js\/create_new_panel.js' : PETTANR_ROOT_PATH + 'panels\/new.js',\r
+               UPLOAD_PICTURE_JS             : SERVER_SUPPORT === false ? 'js\/upload_picture.js' : PETTANR_ROOT_PATH + 'original_pictures\/new.js',\r
+               REGISTER_ARTIST_JS            : SERVER_SUPPORT === false ? 'js\/register_artist.js' : PETTANR_ROOT_PATH + 'artists\/new.js',\r
+               SERVER_SUPPORT                : SERVER_SUPPORT,\r
+               URL_PETA_APPS_CSS             : ( SERVER_SUPPORT === false ? 'stylesheets' : '\/assets' ) + '\/peta.apps.css'\r
        }\r
 })();\r
 \r
@@ -686,12 +687,12 @@ pettanr.bind = ( function(){
                        this.clean();\r
                        \r
                        // json is Comic ? Panel ?\r
-                       var panels = json.children || json.stories,\r
+                       var stories = json.children || json.stories,\r
                                i, l;\r
-                       if( Type.isArray( panels ) === true ){\r
+                       if( Type.isArray( stories ) === true ){\r
                                // comic\r
-                               for( i = 0, l = panels.length; i<l; ++i ){\r
-                                       this.buildPanelElement( panels[ i ], zoom );\r
+                               for( i = 0, l = stories.length; i<l; ++i ){\r
+                                       this.buildPanelElement( stories[ i ], zoom );\r
                                };\r
                        } else\r
                        if( json.elements ){\r
@@ -701,6 +702,30 @@ pettanr.bind = ( function(){
                                // invalid json\r
                        };\r
                },\r
+               buildFromFile : function( file, zoom ){\r
+                       this.clean();\r
+                       \r
+                       var l    = file.getChildFileLength(),\r
+                               data = file.read(),\r
+                               i, story;\r
+                       if( data.title ){\r
+                               // comic\r
+                               for( i = 0; i<l; ++i ){\r
+                                       story = file.getChildFileAt( i ).read();\r
+                                       this.buildPanelElement( story.panel, zoom );\r
+                               };\r
+                       } else\r
+                       if( data.panel ){\r
+                               // story\r
+                               this.buildPanelElement( data.panel, zoom );\r
+                       } else\r
+                       if( data.border ){\r
+                               // panel\r
+                               this.buildPanelElement( data, zoom );\r
+                       } else {\r
+                               // invalid json\r
+                       };\r
+               },\r
                buildComicElement : function(){\r
                        \r
                },\r
@@ -711,8 +736,8 @@ pettanr.bind = ( function(){
                                                width:                          json.width  + 'px',\r
                                                height:                         json.height + 'px'\r
                                },\r
-                               cssText = [],\r
-                               elements = json.elements || ( json.panel ? json.panel.elements : [] ),\r
+                               cssText  = [],\r
+                               elements = json.elements,\r
                                rPic,\r
                                p, i, l;\r
                        this.elmTarget.appendChild( elmPanel );\r
@@ -727,6 +752,7 @@ pettanr.bind = ( function(){
                        };\r
                        elmPanel.style.cssText = cssText.join( ';' );\r
                        \r
+                       if( !elements ) return;\r
                        for( i = 0, l = elements.length; i < l; ++i ){\r
                                data = elements[ i ];\r
                                rPic = data.picture;\r
@@ -738,8 +764,9 @@ pettanr.bind = ( function(){
                        };\r
                },\r
                buildImage : function( elmPanel, data, rPic ){\r
-                       var rImg = pettanr.image.createReversibleImage(\r
-                                       [ PICTURE_PATH, data.picture_id, '.', rPic.ext ].join( '' ),\r
+                       var oPic = rPic.original_picture,\r
+                               rImg = pettanr.image.createReversibleImage(\r
+                                       [ PICTURE_PATH, oPic.id, '.', oPic.ext ].join( '' ),\r
                                        data.width, data.height\r
                                ),\r
                                elmImg = rImg.elm;\r
@@ -832,6 +859,9 @@ pettanr.bind = ( function(){
                        this._json = json;\r
                        this.builder.build( json, this.noClassname );\r
                },\r
+               file : function( file ){\r
+                       this.builder.buildFromFile( file, this.noClassname );\r
+               },\r
                targetElement : function(){\r
                                \r
                },\r
index f9a6a77..54cc8a0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR system.js
- *   version 0.5.41
+ *   version 0.5.44
  *
  * gadgetOS
  *   author:
@@ -131,8 +131,9 @@ var Class = ( function(){
                PRIVATE_DEF_LIST   = [],
                CONSTRUCTOR        = 'Constructor',
                GET_INDEX          = Util.getIndex,
-               abstractFlag       = true,
-               privateFlag        = true,
+               killPrivateFlag    = false,
+               dataUser           = null,
+               traits             = null,
                f                  = true,
                c                  = Util.copyArray,
                a; /* arguments */
@@ -173,7 +174,6 @@ var Class = ( function(){
        /* over のプロパティを target にコピーする.ただし target の プロパティが優先, force で解除 */
        function override( target, over, force ){
                for( var p in over ){
-                       if( p === CONSTRUCTOR ) continue;
                        if( force === true || typeof target[ p ] === 'undefined' ){
                                target[ p ] = over[ p ];
                        };
@@ -186,11 +186,11 @@ var Class = ( function(){
         * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002
         */
        function inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){
-               var args         = c( arguments ),
-                       params       = [],
-                       Super        = this,
-                       superDef     = getClassDef( Super ),
-                       displayName  = args[ 0 ],
+               var args        = c( arguments ),
+                       params      = [],
+                       Super       = this,
+                       superDef    = getClassDef( Super ),
+                       displayName = args[ 0 ],
                        classSetting,
                        opt_super,
                        klass;
@@ -205,30 +205,37 @@ var Class = ( function(){
                
                classSetting = args[ 0 ];
                if( Type.isNumber( classSetting ) === true ){
+                       if( superDef.isPrivate === true ) classSetting = classSetting | Class.PRIVATE_DATA;
                        opt_super = !!( classSetting & Class.SUPER_ACCESS );
-                       params.push( args.shift() );
+                       params.push( classSetting );
+                       args.shift();
                };
-               if( getClassDef( args[ 0 ] ) ){
+               if( getClass( args[ 0 ] ) ){
                        params.push( args.shift() );
-               } else {
-                       superDef.privateClass && params.push( superDef.privateClass );
-               };
-               params.push( override( new Super(), args[ 0 ], true ) ); /* props */
-               
-               abstractFlag = false;
-               klass = Class.create.apply( null, params );
-               abstractFlag = true;
+               } else
+               if( superDef.privateClass ){
+                       params.push( superDef.privateClass );
+               };
+               params.push( args[ 0 ] ); /* props */
+               f      = false;
+               traits = new Super();
+               f      = true;
+               klass  = Class.create.apply( Class, params );
+               traits = null;
                if( opt_super === true ) getClassDef( klass ).Super = Super.prototype;
                return klass;
        };
        
        /* Class.create で作られたクラスのインスタンスが共通で備えるメソッド */
-       var ClassBase = {
+       var CommonProps = {
                kill : function(){
                        var instance = this,
-                               klass = getClass( instance ),
-                               def   = getClassDef( klass ),
-                               privateData, p, i;
+                               klass    = getClass( instance ),
+                               def      = getClassDef( klass ),
+                               data, p, i;
+                       if( def.isPrivate === true && killPrivateFlag === false ){
+                               throw new Error( 'PrivateInstance.kill() work in PrivateUser.kill().' );
+                       };
                        Type.isFunction( instance.onKill ) === true && instance.onKill();
                        for( p in instance ){
                                if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;
@@ -239,10 +246,12 @@ var Class = ( function(){
                                def.pool.push( instance );
                        };
                        if( def.privateClass ){
-                               privateData = klass.getPrivateData( instance );
-                               if( privateData ){
-                                       privateData.kill();
-                                       i = GET_INDEX( def.dataList, privateData );
+                               i = GET_INDEX( def.userList, instance );
+                               if( i !== -1 ){
+                                       data            = klass.getPrivateData( instance );
+                                       killPrivateFlag = true;
+                                       data.kill();
+                                       killPrivateFlag = false;
                                        def.dataList.splice( i, 1 );
                                        def.userList.splice( i, 1 );
                                };
@@ -260,8 +269,7 @@ var Class = ( function(){
                                rList = def.callbackRegisterList = [];
                        };
                        i = GET_INDEX( iList, this );
-                       if( index === -1 ){
-                               index = iList.length;
+                       if( i === -1 ){
                                cList = [];
                                iList.push( this );
                                rList.push( cList );
@@ -276,19 +284,24 @@ var Class = ( function(){
                        return myCallback;
                },
                releaseMyCallback : function( callback ){
-                       var def       = getClassDef( this ),
-                               iList     = def.callbackInstanceList,
-                               rList     = def.callbackRegisterList,
-                               i, cList, myCallback;
+                       var def   = getClassDef( this ),
+                               iList = def.callbackInstanceList,
+                               rList = def.callbackRegisterList,
+                               i, _i, cList;
                        if( !iList ) return;
                        i = GET_INDEX( iList, this );
-                       if( index === -1 ) return;
+                       if( i === -1 ) return;
                        cList = rList[ i ];
-                       i     = GET_INDEX( cList, callback );
-                       if( i !== -1 ) return;
-                       myCallback = cList[ i ];
-                       cList.splice( i, 1 );
-                       myCallback.kill();
+                       _i    = GET_INDEX( cList, callback );
+                       if( _i === -1 ) return;
+                       cList.splice( _i, 1 );
+                       callback.kill();
+                       if( cList.length !== 0 ) return;
+                       iList.splice( i, 1 );
+                       rList.splice( i, 1 );
+                       if( iList.length !== 0 ) return;
+                       delete def.callbackInstanceList;
+                       delete def.callbackRegisterList;
                }
        };
 
@@ -310,12 +323,10 @@ var Class = ( function(){
                if( i !== -1 ){
                        throw new Error( 'PrivateData already exist!' );
                };
-               privateFlag = false;
-               data        = new privateClass();
-               privateFlag = false;
-               def.dataList.push( data );
-               def.userList.push( user );
-               privateDef[ CONSTRUCTOR ] && privateDef[ CONSTRUCTOR ].apply( data, args );
+               dataUser  = user;
+               data      = new privateClass( args );
+               data.User = user;
+               dataUser  = null;       
                return data;
        };
        function getPrivateData( instance ){
@@ -329,59 +340,33 @@ var Class = ( function(){
         * これにより pool された オブジェクト(破棄されたインスタンス) を再利用できる
         */
        /* Constructor Real for GeneralClass */
-       function G(){
-               var klass = this,
-                       def   = getClassDef( klass ),   
-                       instance;       
-               if( def.pool && def.pool.length > 0 ){
-                       instance = def.pool.shift();
-               } else {
-                       f = false;
-                       instance = new klass();
-                       f = true;
-               };
-               if( def.Super && !instance.Super ){
-                       instance.Super = def.Super;
-               };
-               def.live && def.live.push( instance );
-               def[ CONSTRUCTOR ] && def[ CONSTRUCTOR ].apply( instance, c( arguments ) );
-               return instance;
-       };
-       
-       /* Constructor Real for PrivateClass */
-       function P(){
+       function C( args ){
                var klass = this,
                        def   = getClassDef( klass ),   
-                       instance;
-               if( privateFlag === true ){
-                       throw new Error( 'use class.newPrivateData( instance, args )!' );
-               };              
-               if( def.pool && def.pool.length > 0 ){
-                       instance = def.pool.shift();
-               } else {
-                       f = false;
-                       instance = new klass();
-                       f = true;
-               };
-               if( def.Super && !instance.Super ){
-                       instance.Super = def.Super;
-               };
-               return instance;
-       };
-       /* Constructor Real for AbstractClass */
-       function A(){
-               var klass = this,
-                       instance;
-               if( abstractFlag === true ){
+                       instance,
+                       userDef;
+               if( def.Abstract === true ){
                        throw new Error( 'AbstractClass!' );
                };
+               if( def.isPrivate === true && dataUser === null ){
+                       throw new Error( 'use myClass.newPrivateData( instance, ...args )!' );
+               };
                f = false;
-               instance = new klass();
+               instance = def.pool && def.pool.length > 0 ? def.pool.shift() : instance = new klass();
                f = true;
+               if( def.Super && !instance.Super ) instance.Super = def.Super;
+               if( def.isPrivate === true ){
+                       userDef = getClassDef( dataUser );
+                       userDef.dataList.push( instance );
+                       userDef.userList.push( dataUser );
+               } else {
+                       def.live && def.live.push( instance );
+                       args = c( arguments );
+               };
+               def[ CONSTRUCTOR ] && def[ CONSTRUCTOR ].apply( instance, args );
                return instance;
        };
        
-       
        return {
                POOL_OBJECT  : 1,
                ABSTRACT     : 2,
@@ -412,10 +397,11 @@ var Class = ( function(){
                                };                              
                                args.shift();
                        };
-                       privateDef = getClassDef( args[ 0 ] );
-                       if( privateDef ){
+                       
+                       if( GET_INDEX( PRIVATE_CLASS_LIST, args[ 0 ] ) !== -1 ){
+                               privateDef = getClassDef( args[ 0 ] );
                                if( privateDef.isPrivate !== true ){
-                                       throw new Error( 'PrivateClass not found! please, Class.createPrivateData().' );
+                                       throw new Error( 'PrivateClass not found! please, Class.create( Class.PRIVATE, {...} ).' );
                                } else
                                if( privateDef.Abstract === true ){
                                        throw new Error( 'PrivateClass is Abstract!' );
@@ -430,23 +416,17 @@ var Class = ( function(){
                        if( Type.isFunction( props[ CONSTRUCTOR ] ) === true ){
                                classDef[ CONSTRUCTOR ] = props[ CONSTRUCTOR ];
                        };
-
+                       
+                       klass = function(){ a = arguments; if( f ) return C.apply( a.callee, c( a ) )};
+                       klass.prototype = override( override( traits || {}, props, true ), CommonProps, false );
+                       
                        if( opt_abstract === true ){
-                               klass = function(){ a = arguments; if( f ) return A.apply( a.callee, c( a ) )};
                                classDef.Abstract = true;
                        } else
-                       if( opt_private === true ){
-                               klass = function(){ a = arguments; if( f ) return P.apply( a.callee, c( a ) )};
-                               if( opt_pool === true ) classDef.pool = [];
-                       } else {
-                               klass = function(){ a = arguments; if( f ) return G.apply( a.callee, c( a ) )};
-                               if( opt_pool === true ){
-                                       classDef.pool = [];
-                                       classDef.live = [];
-                               };
-                       };
-                       klass.prototype = override( override( {}, props, true ), ClassBase, false );
-                       
+                       if( opt_pool === true ){
+                               classDef.pool = [];
+                               if( opt_private === false )classDef.live = [];
+                       };                      
                        if( opt_final === true ){
                                classDef.Final = true;
                        } else {
@@ -461,8 +441,8 @@ var Class = ( function(){
                                PRIVATE_DEF_LIST.push( classDef );
                        } else {
                                if( classDef.privateClass ){
-                                       klass.newPrivateData  = newPrivateData;
-                                       klass.getPrivateData  = getPrivateData; 
+                                       klass.newPrivateData = newPrivateData;
+                                       klass.getPrivateData = getPrivateData;  
                                };
                                CLASS_LIST.push( klass );
                                DEF_LIST.push( classDef );                              
@@ -473,7 +453,7 @@ var Class = ( function(){
                        
                },
                getClass : function( instance ){
-                       
+                       return getClass( instance );
                },
                getClassDef : function(){
                        
@@ -1089,7 +1069,7 @@ var File = ( function(){
                        if( typeof driver.getName === 'function'){
                                return driver.getName( this );
                        }
-                       return BASE_DRIVER.getName( this);
+                       return BASE_DRIVER.getName( this );
                },
                getThumbnail: function(){
                        var driver = FILE_CONTROLER.getDriver( this );
@@ -1132,9 +1112,9 @@ var File = ( function(){
                        // simpleDeepCopy
                        var driver = FILE_CONTROLER.getDriver( this ),
                                data;
-                       if( typeof driver.read === 'function'){
+                       if( Type.isFunction( driver.read ) === true ){
                                 data = driver.read( this );
-                       }
+                       };
                        return BASE_DRIVER.read( data || this );
                },
                write: function( _newData, _onUpdateFunction ){
@@ -1292,36 +1272,46 @@ var File = ( function(){
                        // debug用 全てのメニューを許可
                        return Const.FILE.UPDATE_POLICY.DSRWC;
                };
-               this.read = function( _FILEorDATA ){
+               this.read = function( FILEorDATA ){
                        var data,
-                               protects = Const.FILE.DATA_PROPERTY_RESERVED;                   
-                       if( _FILEorDATA instanceof FileClass ){
-                               data = FILE_CONTROLER.getFileData( _FILEorDATA )
+                               protects = Const.FILE.DATA_PROPERTY_RESERVED,
+                               objSrc   = [],
+                               objCopy  = [],
+                               getIndex = Util.getIndex;                       
+                       if( FILEorDATA instanceof FileClass ){
+                               data = FILE_CONTROLER.getFileData( FILEorDATA )
                        } else {
-                               data = _FILEorDATA;
-                       }
-
+                               data = FILEorDATA;
+                       };
+                       
                        function clone( src ) {
-                               var ret;
-                               if( Type.isArray(src) === true ){
+                               var ret, i, key;
+                               if( Type.isArray( src ) === true ){
+                                       i = getIndex( objSrc, src );
+                                       if( i !== -1 ) return objCopy[ i ];
                                        ret = [];
+                                       objSrc[ objSrc.length ]   = src;
+                                       objCopy[ objCopy.length ] = ret;
                                } else
-                               if( Type.isObject(src) === true ){
+                               if( Type.isObject( src ) === true ){
+                                       i = getIndex( objSrc, src );
+                                       if( i !== -1 ) return objCopy[ i ];
                                        ret = {};
+                                       objSrc[ objSrc.length ]   = src;
+                                       objCopy[ objCopy.length ] = ret;
                                } else
-                               if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){
+                               if( Type.isNumber( src ) === true || Type.isString( src ) === true || Type.isBoolean( src ) === true ){
                                        return src;
                                } else {
-                                       return null;
-                               }
-                               for( var key in src ){
-                                       if( Util.getIndex( protects, key ) === -1 ){
+                                       return src;
+                               };
+                               for( key in src ){
+                                       if( getIndex( protects, key ) === -1 ){
                                                ret[ key ] = clone( src[ key ]);
-                                       }
-                               }
+                                       };
+                               };
                                return ret;
-                       };
-                               
+                       };                              
                        return clone( data );
                };
                this.write = function( _file, _newData, _onUpdateFunction ){
@@ -6342,4 +6332,1411 @@ var DHTML = ( function(){
        gOS.registerApplication = Application.register;
        gOS.registerDriver      = File.registerDriver;
        
+var BoxModel
+
+var DOM = ( function( window, document ){
+       var DIV_LIST  = [],
+               SPAN_LIST = [],
+               TEXT_LIST = [];
+       
+       var elmTextSize;
+       
+       function correctNodes( node ){
+               var child;
+               if( node && node.parentNode ){
+                       while( node.lastChild ) correctNodes( node.lastChild );
+                       node.parentNode.removeChild( node );
+                       if( node.nodeType === 1 ){
+                               switch( node.tagName ){
+                                       case 'DIV':
+                                               DIV_LIST.push( node );
+                                               break;
+                                       case 'SPAN':
+                                               SPAN_LIST.push( node );
+                                               break;
+                                       
+                               };
+                               node.removeAttribute( 'className' );
+                               node.removeAttribute( 'style' );
+                               node.removeAttribute( 'id' );
+                       } else
+                       if( node.nodeType === 3 ){
+                               node.data = '';
+                               TEXT_LIST.push( node );
+                       };
+               };
+       };
+       
+       return {
+               createDiv : function(){
+                       return 0 < DIV_LIST.length ? DIV_LIST.shift() : document.createElement( 'div' );
+               },
+               createSpan : function(){
+                       
+               },
+               createText : function(){
+                       
+               },
+               getTextSize : function( elm, content ){
+                       var span = DOM.createSpan(),
+                               text = DOM.createText(),
+                               w, h;
+                       elm.appendChild( span );
+                       span.style.cssText = 'visibility:hidden;position:absolute;';
+                       span.appendChild( text );
+                       text.data = content;
+                       w = span.offsetWidth;
+                       h = span.offsetHeight;
+                       DOM.correctNodes( span );
+                       return [ w, h ];
+               },
+               correctNodes : function( node ){
+                       var child;
+                       if( node && node.parentNode ){
+                               while( node.lastChild ) DOM.correctNodes( node.lastChild );
+                               node.parentNode.removeChild( node );
+                               if( node.nodeType === 1 ){
+                                       switch( node.tagName ){
+                                               case 'DIV':
+                                                       DIV_LIST.push( node );
+                                                       break;
+                                               case 'SPAN':
+                                                       SPAN_LIST.push( node );
+                                                       break;
+                                               
+                                       };
+                                       node.removeAttribute( 'className' );
+                                       node.removeAttribute( 'style' );
+                                       node.removeAttribute( 'id' );
+                               } else
+                               if( node.nodeType === 3 ){
+                                       node.data = '';
+                                       TEXT_LIST.push( node );
+                               };
+                       };
+               }
+       }
+})( window, document );
+
+var XBrowserStyle = ( function(){
+       var     EMPTY          = '',
+               CORON          = ':',
+               SEMICORON      = ';',
+               SPACE          = ' ',
+               UNITS          = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),
+               CLIP_SEPARATOR = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';
+
+       var SPECIAL = ( function(){
+               var special = {};
+               if( UA.isIE === true && UA.ieVersion < 9 ){
+                       if( UA.ACTIVEX === true ){
+                               // special.opacity    = 'ActiveXOpacity';
+                               special.setFilters = function( style ){
+                                       var filters = ( style.filter || '' ).split( ') ' ),
+                                               data    = {},
+                                               i       = filters.length,
+                                               filter, names, props, prop, j, l, key, v;
+                                       for( ; i; ){
+                                               filter   = filters[ --i ].split( ' ' ).join( '' ).split( '(' );
+                                               if( filter.length !== 2 ) continue;
+                                               names    = filter[ 0 ].split( '.' ); // progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9)
+                                               props    = filter[ 1 ].split( ',' ); // 
+                                               filter   = {};
+                                               for( j = 0, l = props.length; j < l; ++j ){
+                                                       prop = props[ j ].split( '=' );
+                                                       key  = prop[ 0 ].toLowerCase();
+                                                       v    = prop[ 1 ];
+                                                       filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );
+                                               };
+                                               data[ names[ names.length - 1 ] ] = filter;
+                                       };
+                                       
+                                       style.filter  = data;
+                                       style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;
+                               };
+                               special.hasLayout = function( elm ){
+                                       return elm.currentStyle.hasLayout;
+                               };
+                       } else {
+                               special.opacity = null;
+                       };
+               } else {
+                       var style = document.documentElement.style;
+                       special.opacity = style.opacity           !== undefined ? 'opacity' : 
+                                                       style.MozOpacity          !== undefined ? 'MozOpacity' :
+                                                       style.KhtmlOpacity        !== undefined ? 'KhtmlOpacity' :
+                                                       style[ '-khtml-opacity' ] !== undefined ? 'KhtmlOpacity' : null;
+
+                       // if( style.backgroundPositionX === undefined ){
+                               special.setBackgroundPositionXY = function( style ){
+                                       var bgp = ( style.backgroundPosition || '' ).split( ' ' );
+                                       style.backgroundPositionX = bgp[ 0 ] || 0;
+                                       style.backgroundPositionY = bgp[ 1 ] || 0;
+                               };
+                       // };
+                       if( style.clipTop === undefined && style[ 'clip-top' ] === undefined ){
+                               special.setClipTopRightBottomLeft = function( style ){
+                                       var clip = style.clip;
+                                       if( !cliop || clip.indexOf( 'rect(' ) === -1 ){
+                                               style.clipTop    = 0;
+                                               style.clipRight  = 0;
+                                               style.clipBottom = 0;
+                                               style.clipLeft   = 0;
+                                               return;
+                                       };
+                                       clip = clip.split( '(' )[ 1 ].split( ')' )[ 0 ].split( clip.indexOf( ',' ) !== -1 ? ',' : ' ' );
+                                       ret.clipTop    = clip[ 0 ];
+                                       ret.clipRight  = clip[ 1 ];
+                                       ret.clipBottom = clip[ 2 ];
+                                       ret.clipLeft   = clip[ 3 ];
+                               };
+                       };
+               };
+               return special;
+       })();
+       
+       function cssToObject( css ){
+               var ret      = {}, i, nv, n, v,
+                       parse    = Util.parse,
+                       isNumber = Type.isNumber,
+                       camelize = Util.camelize;
+               if( Type.isString( css ) === true ){
+                       css = css.split( SEMICORON );
+                       for( i = css.length; i; ){
+                               nv = css[ --i ].split( CORON ); // filter の場合, progid: がくる
+                               n  = nv.shift();
+                               if( isNumber( parse( n ) ) === true ) continue;
+                               v  = nv.join( EMPTY );
+                               while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
+                               ret[ camelize( n ) ] = parse( v );
+                       };
+               } else {
+                       for( n in css ){
+                               if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );
+                       };
+               };
+
+               if( SPECIAL.setFilters ){
+                       SPECIAL.setFilters( ret );
+               } else {
+                       ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;
+               };
+               
+               SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );
+               SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );
+               
+               return ret;
+       };
+
+       var COLOR = ( function(){
+               var ret = {}, v, name,
+                       list = [
+                               '0', 'BLACK',
+                               'FF0000', 'RED',
+                               '00FF00', 'LIME',
+                               '0000FF', 'BLUE',
+                               'FFFF00', 'YELLOW',
+                               '00FFFF', 'AQUA',
+                               '00FFFF', 'CYAN',
+                               'FF00FF', 'MAGENTA',
+                               'FF00FF', 'FUCHSIA',
+                               'FFFFFF', 'WHITE',
+                               '008000', 'GREEN',
+                               '800080', 'PURPLE',
+                               '800000', 'MAROON',
+                               '000080', 'NAVY',
+                               '808000', 'OLIVE',
+                               '008080', 'TEAL',
+                               '808080', 'GRAY',
+                               'C0C0C0', 'SILVER',
+                               '696969', 'DIMGRAY',
+                               '708090', 'SLATEGRAY',
+                               'A9A9A9', 'DARKGRAY',
+                               'DCDCDC', 'GAINSBORO',
+                               '191970', 'MIDNIGHTBLUE',
+                               '6A5ACD', 'SLATEBLUE',
+                               '0000CD', 'MEDIUMBLUE',
+                               '4169E1', 'ROYALBLUE',
+                               '1E90FF', 'DODGERBLUE',
+                               '87CEEB', 'SKYBLUE',
+                               '4682B4', 'STEELBLUE',
+                               'ADD8E6', 'LIGHTBLUE',
+                               'AFEEEE', 'PALETURQUOISE',
+                               '40E0D0', 'TURQUOISE',
+                               'E0FFFF', 'LIGHTCYAN',
+                               '7FFFD4', 'AQUAMARINE',
+                               '006400', 'DARKGREEN',
+                               '2E8B57', 'SEAGREEN',
+                               '90EE90', 'LIGHTGREEN',
+                               '7FFF00', 'CHARTREUSE',
+                               'ADFF2F', 'GREENYELLOW',
+                               '32CD32', 'LIMEGREEN',
+                               '9ACD32', 'YELLOWGREEN',
+                               '6B8E23', 'OLIVEDRAB',
+                               'BCB76B', 'DARKKHAKI',
+                               'EEE8AA', 'PALEGOLDENROD',
+                               'FFFFE0', 'LIGHTYELLOW',
+                               'FFD700', 'GOLD',
+                               'DAA520', 'GOLDENROD',
+                               'B8860B', 'DARKGOLDENROD',
+                               'BC8F8F', 'ROSYBROWN',
+                               'CD5C5C', 'INDIANRED',
+                               '8B4513', 'SADDLEBROWN',
+                               'A0522D', 'SIENNA',
+                               'CD853F', 'PERU',
+                               'DEB887', 'BURLYWOOD',
+                               'F5F5DC', 'BEIGE',
+                               'F5DEB3', 'WHEAT',
+                               'F4A460', 'SANDYBROWN',
+                               'D2B48C', 'TAN',
+                               'D2691E', 'CHOCOLATE',
+                               'B22222', 'FIREBRICK',
+                               'A52A2A', 'BROWN',
+                               'FA8072', 'SALMON',
+                               'FFA500', 'ORANGE',
+                               'FF7F50', 'CORAL',
+                               'FF6347', 'TOMATO',
+                               'FF69B4', 'HOTPINK',
+                               'FFC0CB', 'PINK',
+                               'FF1493', 'DEEPPINK',
+                               'DB7093', 'PALEVIOLETRED',
+                               'EE82EE', 'VIOLET',
+                               'DDA0DD', 'PLUM',
+                               'DA70D6', 'ORCHILD',
+                               '9400D3', 'DARKVIOLET',
+                               '8A2BE2', 'BLUEVIOLET',
+                               '9370DB', 'MEDIUMPURPLE',
+                               'D8BFD8', 'THISTLE',
+                               'E6E6FA', 'LAVENDER',
+                               'FFE4E1', 'MISTYROSE',
+                               'FFFFF0', 'IVORY',
+                               'FFFACD', 'LEMONCHIFFON'
+                       ];
+               for( i = list.length; i; ){
+                       v    = list[ --i ];
+                       name = list[ --i ];
+                       ret[ name ] = parseInt( v, 16 );
+               };
+               return ret;
+       })();
+       
+       var PARAMS = ( function(){
+               var ret = {};
+               register( ret.percent = {},
+                       'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'
+               );
+               register( ret.offset = {},
+                       'height,width,bottom,left,right,top'
+               );              
+               register( ret.size = {},
+                       'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'
+               );
+               register( ret.color = {},
+                       'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'
+               );
+               register( ret.region = {},
+                       'margin,padding,borderWidth,borderColor'
+               );              
+               register( ret.special = {},
+                       'clip,backgroundPosition,opacity,lineHeight,zIndex'
+               );
+               register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );
+               
+               register( ret.margin = {}, 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom' );
+               register( ret.padding = {}, 'paddingBottom,paddingLeft,paddingRight,paddingTop' );
+               register( ret.borderWidth = {}, 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth' );
+               register( ret.borderColor = {}, 'borderBottomColor,borderLeftColor,borderRightColor,borderTopColor' );
+               
+               function register( obj, params ){
+                       params = params.split( ',' );
+                       for( var i=params.length; i; ) obj[ params[ --i ] ] = true;
+               };
+               return ret;
+       })();
+       
+       /*
+        * 
+        */
+       var Property = Class.create(
+               'Property',
+               Class.POOL_OBJECT,
+               {
+                       Constructor : function( name, value, unit, pxPerEm ){
+                               this.name    = name;
+                               this.value   = value;
+                               this.unit    = unit;
+                               this.pxPerEm = pxPerEm; // XXpx = 1em;
+                       },
+                       name    : '',
+                       value   : 0,
+                       pxPerEm : 12, // 1em === ??px
+                       unit    : '',
+                       equal : function( prop ){
+                               if( this.unit === prop.unit ){
+                                       return this.value === prop.value;
+                               };
+                               return Math.abs( this.toPx() - prop.toPx() ) < 1;
+                       },
+                       convert: function( prop ){
+                               var u = prop.unit, v;
+                               if( this.unit === u ) return;
+                               this.value = v = this.toPx();
+                               this.unit  = u;
+                               if( u !== px ){
+                                       this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );
+                               };
+                       },
+                       setValue: function( v ){
+                               this.value = v;
+                       },
+                       getValue: function(){
+                               return this.value;
+                       },
+                       getOffset: function( prop ){
+                               return prop.value - this.value;
+                       },
+                       getUnit: function(){
+                               return this.unit;
+                       },
+                       getValueText: function(){
+                               return this.value === 0 ? '0' : this.value + this.unit;
+                       },
+                       toPx: function(){
+                               var v = this.value, u = this.unit;
+                               if( u === px )   return v;
+                               if( u === 'em' ) return v * this.pxPerEm;
+                               if( u === '' && this.name === 'lineHeight' ) return v * this.pxPerEm;
+                               return Util.toPx( v, u );
+                       },
+                       isValid: function( t ){
+                               t = t || this;
+                               var n = t.name,
+                                       v = t.value,
+                                       u = t.unit,
+                                       z = u !== '' ? true : v === 0;
+                               if( PARAMS.percent[ n ] === true ) return z;
+                               if( PARAMS.offset[ n ] === true  ) return z;
+                               if( PARAMS.size[ n ] === true  )   return z && u !== '%';
+                               if( PARAMS.special[ n ] === true  ){
+                                       if( n === 'lineHeight' ) return true;
+                                       if( n === 'opacity' )    return 0 <= v && v <= 1 && u === '';
+                                       if( n === 'zIndex'  )    return u === '';
+                               };
+                               return false;
+                       }
+               }
+       );
+       
+       /**
+        * backgroundPosition, clip
+        */
+       var PropertyGroup = Class.create(
+               'PropertyGroup',
+               Class.POOL_OBJECT,
+               {
+                       Constructor : function( name ){
+                               this.name  = name;
+                               this.props = [];
+                               for( var i = 1, l = arguments.length; i<l; ++i ){
+                                       this.props.push( arguments[ i ] );
+                               };
+                       },
+                       name  : '',
+                       equal : function( prop ){
+                               var ps = this.props, i = ps.length;
+                               for( ; i; ){
+                                       --i;
+                                       if( ps[ i ].equal( prop[ i ] ) === false ) return false;
+                               };
+                               return true;
+                       },
+                       convert : function( prop ){
+                               var ps = this.props, i = ps.length;
+                               for( ; i; ){
+                                       --i;
+                                       ps[ i ].convert( prop[ i ] );
+                               };
+                       },
+                       setValue : function( ary ){
+                               var ps = this.props, i = 0, l = ps.length;
+                               for( ; i<l; ++i ){
+                                       ps[ i ].setValue( ary[ i ] );
+                               };
+                       },
+                       getValue : function(){
+                               var ret = [], ps = this.props, i = 0, l = ps.length;
+                               for( ; i<l; ++i ){
+                                       ret.push( ps[ i ].getValue() );
+                               };
+                               return ret;
+                       },
+                       getOffset : function( prop ){
+                               var ret = [],
+                                       ps  = this.props,
+                                       _ps = prop.props,
+                                       i   = 0,
+                                       l = ps.length;
+                               for( ; i<l; ++i ){
+                                       ret.push( ps[ i ].getOffset( _ps[ i ] ) );
+                               };
+                               return ret;
+                       },
+                       getUnit : function(){
+                               var ret = [], ps = this.props, i = 0, l = ps.length;
+                               for( ; i<l; ++i ){
+                                       ret.push( ps[ i ].getUnit() );
+                               };
+                               return ret;
+                       },
+                       getValueText : function(){
+                               var ret = [], ps = this.props, i = 0, l = ps.length;
+                               for( ; i<l; ++i ){
+                                       ret.push( ps[ i ].getValueText() );
+                               };                      
+                               if( this.name === 'clip' ){
+                                       return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';
+                               };
+                               return ret.join( ' ' );
+                       },
+                       onKill : function(){
+                               var ps = this.props, i = ps.length;
+                               for( ; i; ){
+                                       ps[ --i ].kill();
+                               };
+                       },
+                       isValid : function( t ){
+                               t = t || this;
+                               var ps = t.props, i = ps.length;
+                               for( ; i; ){
+                                       if( ps[ --i ].isValid() === false ) return false;
+                               };
+                               return true;
+                       }
+               }
+       );
+       
+       /**
+        * margin, padding, borderWidth, borderColor
+        */
+       var FrexibleProperty = PropertyGroup.inherits(
+               'FrexibleProperty',
+               Class.POOL_OBJECT, {
+                       Constructor : function( name ){
+                               this.name  = name;
+                               this.props = [];
+                               for( var i = 1, l = arguments.length; i<l; ++i ){
+                                       this.props.push( arguments[ i ] );
+                               };
+                               // top, bottom, left, right, topbottom, leftright, all                          
+                       }
+               }
+       );
+
+       var ColorProperty = Class.create(
+               'ColorProperty',
+               Class.POOL_OBJECT, {
+                       Constructor : function( name, r, g, b, pct ){
+                               this.name = name;
+                               this.r    = r;
+                               this.g    = g;
+                               this.b    = b;
+                               this.pct  = pct;
+                       },
+                       name  : '',
+                       equal : function( prop ){
+                               if( this.pct === prop.pct ){
+                                       return this.r === prop.r && this.g === prop.g && this.b === prop.b;
+                               };
+                               var rgb  = this._toPct(),
+                                       _rgb = prop._toPct(),
+                                       i    = rgb.length;
+                               for( ; i; ){
+                                       --i;
+                                       if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;
+                               };
+                               return true;
+                       },
+                       convert : function( prop ){
+                               var u = prop.pct, x;
+                               if( this.pct === u ) return;
+                               x = u === true ? 100 / 255 : 2.55;
+                               this.r  *= x;
+                               this.g  *= x;
+                               this.b  *= x;
+                               this.pct = u;
+                       },
+                       setValue : function( rgb ){
+                               this.r = rgb[ 0 ];
+                               this.g = rgb[ 1 ];
+                               this.b = rgb[ 2 ];
+                       },
+                       getValue : function(){
+                               return [ this.r, this.g, this.b ];
+                       },
+                       getOffset : function( prop ){
+                               return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];
+                       },
+                       getUnit : function(){
+                               return this.pct === true ? '%' : '';
+                       },
+                       getValueText : function(){
+                               if( this.pct === true ){
+                                       return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );
+                               };
+                               var round = Math.round;
+                               //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );
+                               
+                               var rgb   = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );
+                               return '#' + rgb.substr( rgb.length - 6 );
+                       },
+                       _toPct : function(){
+                               if( this.pct === true ) return [ this.r, this.g, this.b ];
+                               return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];
+                       },
+                       isValid : function( t ){
+                               var isFinite = window.isFinite;
+                               if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;
+                               if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;
+                               if( this.pct === true ) return this.r <= 100 && this.g <= 100 && this.b <= 100;
+                               return this.r <= 255 && this.g <= 255 && this.b <= 255;
+                       }
+               }
+       );
+       
+       var isString       = Type.isString,
+               isNumber       = Type.isNumber;
+       var REG_UINIT      = /.*\d(\w{1,2})?/,
+               $1             = '$1',
+               px             = 'px',
+               REG_XXXXXX     = /^#[\da-fA-F]{6}?/,
+               REG_XXX        = /^#[\da-fA-F]{3}?/;
+       
+       var WrappedStyle = Class.create(
+               'WrappedStyle',
+               Class.POOL_OBJECT,
+               {
+                       Constructor : function( style ){
+                               this.style   = style;
+                               var fontsize = this.get( 'fontSize' );
+                               this.pxPerEm = fontsize.toPx();
+                               fonstsize.kill();
+                       },
+                       get: function( p ){
+                               if( PARAMS.special[ p ] === true || PARAMS.region[ p ] === true ){
+                                       if( p === 'clip' )        return this.getClip();
+                                       if( p === 'margin' )      return this.getMarginPaddingBorder( p, '' );
+                                       if( p === 'padding' )     return this.getMarginPaddingBorder( p, '' );
+                                       if( p === 'borderWidth' ) return this.getMarginPaddingBorder( 'border', 'Width' );
+                                       if( p === 'borderColor' ) return this.getBorderColor( 'borderColor' );
+                                       if( p === 'backgroundPosition' ) return this.getBackgroundPosition( p );
+                                       // opacity, zindex, lineHeight
+                                       return new Property( p, this.getValue( x ), this.getUnit( x ), this.pxPerEm );
+                               };
+                               var x = this.style[ p ], e, v, u;
+                               if( PARAMS.offset[ p ] === true ){
+                                       return new Property( p, this.getValue( x ), this.getUnit( x, p ), this.pxPerEm );
+                                       /*
+                                       e = this.elm;
+                                       if( p === 'width'  ) v = e.offsetWidth;
+                                       if( p === 'height' ) v = e.offsetHeight;
+                                       if( p === 'top'    ) v = e.offsetTop;
+                                       if( p === 'bottom' ) v = e.offsetBottom;
+                                       if( p === 'left'   ) v = e.offsetLeft;
+                                       if( p === 'right'  ) v = e.offsetRight;
+                                       u = this.getUnit( x, p );
+                                       // alert( p + this.pxTo( v, u ) + u )
+                                       return new Property( p, this.pxTo( v, u ), u, this.pxPerEm ); */
+                               };
+                               if( p === 'fontSize' ){ // xx-small 等
+                                       v = Util.absoluteFontSizeToPx( x );
+                                       if( v !== 0 ){
+                                               return new Property( p, v, px, this.pxPerEm );
+                                       };
+                               };                      
+                               if( PARAMS.percent[ p ] === true ){
+                                       // alert( p + ' , ' + x + ' , ' + this.getUnit( x, p ) )
+                                       return new Property( p, this.getValue( x ), this.getUnit( x, p ), this.pxPerEm );
+                               };
+                               if( PARAMS.size[ p ] === true ){
+                                       return new Property( p, this.getValue( x ), this.getUnit( x, p ), this.pxPerEm );
+                               };
+                               if( PARAMS.color[ p ] === true ){
+                                       return this.getColor( x, p );
+                               };
+                       },
+                       pxTo: function( px, unit ){
+                               if( unit === 'em' ) return px / this.pxPerEm;
+                               return Util.pxTo( px, unit );
+                       },
+                       getValue: function( x ){
+                               return isString( x ) === true ? parseInt( x ) :
+                                      isNumber( x ) === true ? x : 0;
+                       },
+                       getUnit: function( x, p ){
+                               var u;
+                               if( isString( x ) === true ){
+                                       u = x.replace( REG_UINIT, $1 );
+                                       if( p === 'lineHeight' ) return u;
+                                       if( PARAMS.unit[ u ] !== true ) return px;
+                                       return u;
+                               };
+                               return px;
+                       },
+                       getColor: function( x, p ){
+                               var rgb = COLOR[ x.toUpperCase() ],
+                                       pct = false,
+                                       r   = 0,
+                                       g   = 0,
+                                       b   = 0;
+                               if( isNumber( rgb ) === true ){
+                                       r = ( rgb & 0xff0000 ) >> 16;
+                                       g = ( rgb & 0xff00 ) >> 8;
+                                       b = ( rgb & 0xff );
+                               } else
+                               if( x.match( REG_XXXXXX ) ){
+                                       r = parseInt( x.charAt( 1 ) + x.charAt( 2 ), 16 );
+                                       g = parseInt( x.charAt( 3 ) + x.charAt( 4 ), 16 );
+                                       b = parseInt( x.charAt( 5 ) + x.charAt( 6 ), 16 );
+                                       //alert( x + ' g: ' + g )
+                               } else                  
+                               if( x.match( REG_XXX ) ){
+                                       r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
+                                       g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );
+                                       b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );
+                               } else
+                               if( x.indexOf( 'rgb(' ) === 0 ){
+                                       rgb = x.substr( 4 ).split( ',' );
+                                       r = parseFloat( rgb[ 0 ] );
+                                       g = parseFloat( rgb[ 1 ] );
+                                       b = parseFloat( rgb[ 2 ] );
+                                       if( x.indexOf( '%' ) !== -1 ) pct = true;
+                               } else {
+                                       r = 255;
+                                       g = 255;
+                                       b = 255;
+                               };
+                               return new ColorProperty( p, r, g, b, pct );
+                       },
+                       getClip: function( name ){
+                               // rect(...)    クリップします。<top>, <bottom> は上端からの、 <right>, <left> は左端からのオフセットで指定します。Internet Explorer 4~7 では、カンマの代わりにスペースで区切る必要があります。
+                               // position:absolute または position:fixed を適用した要素に対してのみ有効です。
+                               var top    = this.get( name + 'Top' ),
+                                       right  = this.get( name + 'Right' ),
+                                       bottom = this.get( name + 'Bottom' ),
+                                       left   = this.get( name + 'Left' ),
+                                       ret    = new PropertyGroup( name, top, right, bottom, left );
+                               if( ret.isValid() === true ) return ret;
+                               ret.kill();
+                               all    = this.style[ name ].split( '(' )[ 1 ].split( ')' )[ 0 ].split( CLIP_SEPARATOR );
+                               return new PropertyGroup( name,
+                                       new Property( name + 'Top',    all[ 0 ], px, this.pxPerEm ),
+                                       new Property( name + 'Right',  all[ 1 ], px, this.pxPerEm ),
+                                       new Property( name + 'Bottom', all[ 2 ], px, this.pxPerEm ),
+                                       new Property( name + 'Left',   all[ 3 ], px, this.pxPerEm )
+                               );
+                       },
+                       getBackgroundPosition: function( name ){
+                               var x   = this.get( name + 'X' ),
+                                       y   = this.get( name + 'Y' ),
+                                       ret = new PropertyGroup( name, x, y ),
+                                       xy;
+                               if( ret.isValid() === true ) return ret;
+                               ret.kill();
+                               xy  = this.style[ name ].split( ' ' );
+                               return new PropertyGroup( name,
+                                       new Property( name + 'X', this.getValue( xy[ 0 ] ), this.getUnit( xy[ 0 ] ), this.pxPerEm ),
+                                       new Property( name + 'Y', this.getValue( xy[ 1 ] ), this.getUnit( xy[ 1 ] ), this.pxPerEm )
+                               );
+                       },
+                       getMarginPaddingBorder: function( name, width ){
+                               var props  = [ name + 'Top'    + width,
+                                                  name + 'Right'  + width,
+                                                  name + 'Bottom' + width,
+                                                  name + 'Left'   + width ],
+                                       top    = this.get( props[ 0 ] ),
+                                       right  = this.get( props[ 1 ] ),
+                                       bottom = this.get( props[ 2 ] ),
+                                       left   = this.get( props[ 3 ] ),
+                                       ret    = new FrexibleProperty( name, top, right, bottom, left ),
+                                       klass, pxPerEm, getValue, getUnit,
+                                       all, _0, _1, _2, _3, v, u;
+                               if( ret.isValid() === true ) return ret;
+                               ret.kill();
+                               klass    = Property;
+                               pxPerEm  = this.pxPerEm;
+                               getValue = this.getValue;
+                               getUnit  = this.getUnit;
+                               all = this.style[ name + width ].split( ' ' );
+                               _0 = all[ 0 ];
+                               _1 = all[ 1 ];
+                               _2 = all[ 2 ];
+                               _3 = all[ 3 ];
+                               v  = getValue( _0 );
+                               u  = getUnit( _0 );
+                               switch( all.length ){
+                                       case 1 :
+                                               top    = new klass( props[ 0 ], v, u, pxPerEm );
+                                               right  = new klass( props[ 1 ], v, u, pxPerEm );
+                                               bottom = new klass( props[ 2 ], v, u, pxPerEm );
+                                               left   = new klass( props[ 3 ], v, u, pxPerEm );
+                                               break;
+                                       case 2 :
+                                               top    = new klass( props[ 0 ], v, u, pxPerEm );
+                                               bottom = new klass( props[ 2 ], v, u, pxPerEm );
+                                               v  = getValue( _1 );
+                                               u  = getUnit( _1 );
+                                               right  = new klass( props[ 1 ], v, u, pxPerEm );
+                                               left   = new klass( props[ 3 ], v, u, pxPerEm );
+                                               break;
+                                       case 3 :
+                                               top    = new klass( props[ 0 ], v, u, pxPerEm );
+                                               v  = getValue( _1 );
+                                               u  = getUnit( _1 );
+                                               right  = new klass( props[ 1 ], v, u, pxPerEm );
+                                               left   = new klass( props[ 3 ], v, u, pxPerEm );
+                                               bottom = new klass( props[ 2 ], getValue( _2 ), getUnit( _2 ), pxPerEm );
+                                               break;
+                                       case 4 :
+                                               top    = new klass( props[ 0 ], v, u, pxPerEm );
+                                               right  = new klass( props[ 1 ], getValue( _1 ), getUnit( _1 ), pxPerEm );
+                                               bottom = new klass( props[ 2 ], getValue( _2 ), getUnit( _2 ), pxPerEm );
+                                               left   = new klass( props[ 3 ], getValue( _3 ), getUnit( _3 ), pxPerEm );
+                                               break;
+                               };
+                               return new FrexibleProperty( name, top, right, bottom, left );
+                       },
+                       getBorderColor: function( name ){
+                               var props    = 'borderTopColor,borderRightColor,borderBottomColor,borderLeftColor'.split( ',' ),
+                                       top      = this.get( props[ 0 ] ),
+                                       right    = this.get( props[ 1 ] ),
+                                       bottom   = this.get( props[ 2 ] ),
+                                       left     = this.get( props[ 3 ] ),
+                                       ret      = new FrexibleProperty( name, top, right, bottom, left ),
+                                       all, _0, _1, getColor;
+                               if( ret.isValid() === true ) return ret;
+                               ret.kill();
+                               getColor = this.getColor;
+                               all = this.style[ name ].split( ' ' );
+                               _0  = all[ 0 ];
+                               _1  = all[ 1 ];
+                               switch( all.length ){
+                                       case 1 :
+                                               top    = getColor( _0, props[ 0 ] );
+                                               right  = getColor( _0, props[ 1 ] );
+                                               bottom = getColor( _0, props[ 2 ] );
+                                               left   = getColor( _0, props[ 3 ] );
+                                               break;
+                                       case 2 :
+                                               top    = getColor( _0, props[ 0 ] );
+                                               right  = getColor( _1, props[ 1 ] );
+                                               bottom = getColor( _0, props[ 2 ] );
+                                               left   = getColor( _1, props[ 3 ] );
+                                               break;
+                                       case 3 :
+                                               top    = getColor( _0,       props[ 0 ] );
+                                               right  = getColor( _1,       props[ 1 ] );
+                                               bottom = getColor( all[ 2 ], props[ 2 ] );
+                                               left   = getColor( _1,       props[ 3 ] );
+                                               break;
+                                       case 4 :
+                                               top    = getColor( _0,       props[ 0 ] );
+                                               right  = getColor( _1,       props[ 1 ] );
+                                               bottom = getColor( all[ 2 ], props[ 2 ] );
+                                               left   = getColor( all[ 3 ], props[ 3 ] );
+                                               break;
+                               };
+                               return new FrexibleProperty( name, top, right, bottom, left );
+                       }
+               }
+       );
+       function camelizeHash( obj ){
+               var p, _p, came = Util.camelize;
+               for( p in obj ){
+                       _p = came( p );
+                       if( _p === p ) continue;
+                       obj[ _p ] = obj[ _p ] || obj[ p ];
+                       delete obj[ p ];
+               };
+       };      
+       return {
+               create: function( css ){
+                       return new WrappedStyle( camelizeHash( p ) );
+               }
+       };
+})();
+
+var XDocument = ( function( window, document ){
+       
+       var getIndex = Util.getIndex;
+       
+       var DEF_ATTRS = [];
+       
+       var AbstractLayoutManager = Class.create(
+               'AbstractLayoutManager',
+               Class.ABSTRACT, {
+                       reflow : function(){}
+               }
+       );
+       
+       var BasicLayoutManager = AbstractLayoutManager.inherits(
+               'BasicLayoutManager',
+               {
+                       Constructor : function(){
+                               
+                       }
+               }
+       );
+       
+       var AbstractStylePrivate = Class.create(
+               Class.ABSTRACT | Class.PRIVATE_DATA,
+               {
+                       register : function( node ){
+                               var list = this.nodeList;
+                               if( !list ){
+                                       this.nodeList = [ node ];
+                                       return;
+                               };
+                               if( getIndex( list, node ) === -1 ) list[ list.length ] = node;
+                       },
+                       unRegister : function( node ){
+                               var list = this.nodeList,
+                                       i    = getIndex( list, node );
+                               if( i !== -1 && list.splice( i, 1 ) && list.length === 0 ) delete this.nodeList;
+                       },
+                       clone : function(){
+                               var styleClass = Class.getClass( this.User ),
+                                       dataClass  = Class.getClass( this );
+                       },
+                       attr : function( prop, v ){
+                               var update    = prop[ 0 ],
+                                       propID    = prop[ 1 ],
+                                       type      = prop[ 2 ],
+                                       list      = prop[ 3 ],
+                                       length    = !!( type & DEF_ATTRS.LENGTH    ),
+                                       percent   = !!( type & DEF_ATTRS.PERCENT   ),
+                                       color     = !!( type & DEF_ATTRS.COLOR     ),
+                                       uDecimal  = !!( type & DEF_ATTRS.U_DECIMAL ),
+                                       numerical = !!( type & DEF_ATTRS.NUMERICAL ),
+                                       flag      = !!( type & DEF_ATTRS.BOOLEAN   ),
+                                       quartet   = !!( type & DEF_ATTRS.QUARTET   ),
+                                       url       = !!( type & DEF_ATTRS.URL       ),
+                                       fontName  = !!( type & DEF_ATTRS.FONT_NAME ),
+                                       list      = !!( type & DEF_ATTRS.LIST      ),
+                                       combi     = !!( type & DEF_ATTRS.COMBI     ),
+                                       data      = this.data,
+                                       _v        = -1,
+                                       _type, i, l, nodes;
+                                       
+                               if( v !== undefined ){
+                                       if( Type.isNumber( v ) === true ){
+                                               if( numerical === false ){
+                                                       if( uDecimal === false || v < 0 || 1 < v ) throw new Error( '' );
+                                               };
+                                       } else
+                                       if( Type.isBoolean( v ) === true ){
+                                               if( flag === false ) throw new Error( '' );
+                                       } else
+                                       if( Type.isString( v ) === true ){
+                                               if( url === false && fontName === false ){
+                                                       if( v.indexOf( ' ' ) !== -1 ){
+                                                               v = v.split( ' ' );
+                                                       } else {
+                                                               if( length === false && percent === false && color === false ) throw new Error( '' );
+                                                       };
+                                               };
+                                       };                                      
+                                       if( Type.isArray( v ) === true ){
+                                               if( v.length <= 4 && quartet === true ){
+                                                       _type = type ^ DEF_ATTRS.QUARTET;
+                                               } else
+                                               if( v.length === 2 && combi === true ){
+                                                       _type = type ^ DEF_ATTRS.COMBI;
+                                               } else {
+                                                       throw new Error( '' );
+                                               };
+                                               switch( v.length ){
+                                                       case 1 :
+                                                               this.attr( [ propID  , _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 0 ] );
+                                                               break;
+                                                       case 2 :
+                                                               this.attr( [ propID  , _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 1 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 1 ] );
+                                                               break;
+                                                       case 3 :
+                                                               this.attr( [ propID  , _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 1 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 2 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 1 ] );
+                                                               break;
+                                                       case 4 :
+                                                               this.attr( [ propID  , _type, list ], v[ 0 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 1 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 2 ] );
+                                                               this.attr( [ ++propID, _type, list ], v[ 3 ] );
+                                                               break;
+                                                       default :
+                                               };
+                                               return this.User;
+                                       };
+                                       if( this.invalidateLayout < update ) this.invalidate = update;
+                                       
+                                       if( list ) _v = Util.getIndex( list, v );
+                                       data[ propID ] = _v !== -1 ? _v : v;
+                                       return this.User;
+                               };
+                               if( this.invalidate === DEF_ATTRS.REFLOW ){
+                                       nodes = this.nodeList;
+                                       if( nodes ){
+                                               for( i = 0, l = nodes.length; i < l; ++i ){
+                                                       nodes[ i ].reflow();
+                                               };
+                                       };
+                               };
+                               v = data[ propID ];
+                               if( quartet === true ) return [ v, data[ ++propID ], data[ ++propID ], data[ ++propID ] ];
+                               if( combi === true ) return [ v, data[ ++propID ] ];
+                               if( list && Type.isNumber( v ) === true ) return list[ v ];
+                               return v;
+                       }
+               }
+       );
+       
+       var PaintPrivate = AbstractStylePrivate.inherits(
+               'PaintPrivate',
+               Class.PRIVATE_DATA | Class.POOL_OBJECT,
+               {
+                       Constructor : function(){
+                               this.data = [];
+                               this.invalidate = 0;
+                       },
+                       cssText : function(){
+                               
+                       },
+                       cssObject : function(){
+                               
+                       },
+                       paint : function( node ){
+                               
+                       }
+               }
+       );
+       
+       var PaintStyle = Class.create(
+               'PaintStyle',
+               Class.POOL_OBJECT,
+               PaintPrivate,
+               {
+                       Constructor : function(){
+                               PaintStyle.newPrivateData( this );
+                       },
+                       borderWidth : function( v ){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.borderWidth, v );
+                       },
+                       borderColor : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.borderColor, v );
+                       },
+                       borderStyle : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.borderStyle, v );
+                       },
+                       cornerRadius : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.cornerRadius, v );
+                       },
+                       bgColor : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgColor, v );
+                       },
+                       bgAlpha : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgAlpha, v );
+                       },
+                       bgImgUrl : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgImgUrl, v );
+                       },
+                       bgImgRepeatX : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgImgRepeatX, v );
+                       },
+                       bgImgRepeatY : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgImgRepeatY, v );
+                       },
+                       bgImgPositionX : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgImgPositionX, v );
+                       },
+                       bgImgPositionY : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.bgImgPositionY, v );
+                       },
+                       shadowColor : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowColor, v );
+                       },
+                       shadowAlpha : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowAlpha, v );
+                       },
+                       shadowOffsetX : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowOffsetX, v );
+                       },
+                       shadowOffsetY : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowOffsetY, v );
+                       },
+                       shadowBlur : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowBlur, v );
+                       },
+                       shadowSpread : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowSpread, v );
+                       },
+                       shadowInset : function(){
+                               return PaintStyle.getPrivateData( this ).attr( PaintPrivate.shadowInset, v );
+                       }
+               }
+       );
+       
+       var TypoPrivate = AbstractStylePrivate.inherits(
+               'TypoPrivate',
+               Class.PRIVATE_DATA | Class.POOL_OBJECT,
+               {
+                       Constructor : function(){
+                               this.data = [];
+                               this.invalidate = 0;
+                       },
+                       cssText : function(){
+                               
+                       },
+                       cssObject : function(){
+                               
+                       }
+               }
+       );
+       
+       var TypoStyle = Class.create(
+               'TypoStyle',
+               Class.POOL_OBJECT,
+               TypoPrivate,
+               {
+                       Constructor : function( v ){
+                               TypoStyle.newPrivateData( this );
+                       },
+                       color : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.color, v );
+                       },
+                       fontFamily : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.fontFamily, v );
+                       },
+                       fontSize : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.fontSize, v );
+                       },
+                       bold : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.bold, v );
+                       },
+                       italic : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.italic, v );
+                       },
+                       lineHeight : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.lineHeight, v );
+                       },
+                       letterSpacing : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.letterSpacing, v );
+                       },
+                       wordSpacing : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.wordSpacing, v );
+                       },
+                       align : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.align, v );
+                       },
+                       decoration : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.decoration, v );
+                       },
+                       transform : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.transform, v );
+                       },
+                       shadowColor : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.shadowColor, v );
+                       },
+                       shadowOffsetX : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.shadowOffsetX, v );
+                       },
+                       shadowOffsetY : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.shadowOffsetY, v );
+                       },
+                       shadowBlur : function( v ){
+                               return TypoStyle.getPrivateData( this ).attr( TypoPrivate.shadowBlur, v );
+                       }
+               }
+       );
+       
+       var LayoutPrivate = AbstractStylePrivate.inherits(
+               'LayoutPrivate',
+               Class.PRIVATE_DATA | Class.POOL_OBJECT,
+               {
+                       Constructor : function(){
+                               this.data = [];
+                               this.invalidate = 0;
+                       },
+                       cssText : function(){
+                               
+                       },
+                       cssObject : function(){
+                               
+                       }
+               }
+       );
+       
+       DEF_ATTRS.LENGTH            =  1;
+       DEF_ATTRS.PERCENT           =  2;
+       DEF_ATTRS.COLOR             =  4;
+       DEF_ATTRS.U_DECIMAL         =  8;
+       DEF_ATTRS.NUMERICAL         = 16;
+       DEF_ATTRS.BOOLEAN           = 32;
+       DEF_ATTRS.QUARTET           = 64;
+       DEF_ATTRS.URL               = 128;
+       DEF_ATTRS.FONT_NAME         = 256;
+       DEF_ATTRS.LIST              = 512;
+       DEF_ATTRS.AUTO              = 1024;
+       DEF_ATTRS.COMBI             = 2048;
+       DEF_ATTRS.BORDER_STYLE      = 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset'.split(',');
+       DEF_ATTRS.POSITION_X        = 'left,center,right'.split(',');
+       DEF_ATTRS.POSITION_Y        = 'top,center,bottom'.split(',');
+       DEF_ATTRS.ALIGN             = 'left,center,right,justify'.split(',');
+       DEF_ATTRS.TEXT_DECORATION   = 'none,underline,overline,line-through,blink'.split(',');
+       DEF_ATTRS.TEXT_TRANSFORM    = 'none,capitalize,lowercase,uppercase'.split(',');
+       DEF_ATTRS.WIDTH_HEIGHT      = 'auto'.split(',');
+       DEF_ATTRS.PAINT             = 1; // 再描画のみ必要
+       DEF_ATTRS.REFLOW            = 2; // レイアウトの再計算が必要
+       
+       PaintPrivate.borderWidth    = [ DEF_ATTRS.REFLOW,  0, DEF_ATTRS.QUARTET | DEF_ATTRS.LENGTH      ]; // em [ top, right, bottom, left ]
+       PaintPrivate.borderColor    = [ DEF_ATTRS.PAINT,   4, DEF_ATTRS.QUARTET | DEF_ATTRS.DEF_COLOR   ]; // color [ top, right, bottom, left ]
+       PaintPrivate.borderStyle    = [ DEF_ATTRS.REFLOW,  8, DEF_ATTRS.QUARTET | DEF_ATTRS.LIST, DEF_ATTRS.BORDER_STYLE ]; // string [ top, right, bottom, left ]
+       PaintPrivate.cornerRadius   = [ DEF_ATTRS.PAINT,  12, DEF_ATTRS.QUARTET | DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ]; // em, px [ top, right, bottom, left ]
+       PaintPrivate.bgColor        = [ DEF_ATTRS.PAINT,  16, DEF_ATTRS.COLOR     ]; // color
+       PaintPrivate.bgAlpha        = [ DEF_ATTRS.PAINT,  17, DEF_ATTRS.U_DECIMAL ]; // 0 - 1
+       PaintPrivate.bgImgUrl       = [ DEF_ATTRS.PAINT,  18, DEF_ATTRS.URL       ]; // url
+       PaintPrivate.bgImgRepeatX   = [ DEF_ATTRS.PAINT,  19, DEF_ATTRS.BOOLEAN   ]; // true / false
+       PaintPrivate.bgImgRepeatY   = [ DEF_ATTRS.PAINT,  20, DEF_ATTRS.BOOLEAN   ]; // true / false
+       PaintPrivate.bgImgPositionX = [ DEF_ATTRS.PAINT,  21, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT | DEF_ATTRS.LIST, DEF_ATTRS.POSITION_X ]; // em %, px, string
+       PaintPrivate.bgImgPositionY = [ DEF_ATTRS.PAINT,  22, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT | DEF_ATTRS.LIST, DEF_ATTRS.POSITION_Y ]; // em %, px, string
+       PaintPrivate.shadowColor    = [ DEF_ATTRS.PAINT,  23, DEF_ATTRS.COLOR     ]; // color
+       PaintPrivate.shadowAlpha    = [ DEF_ATTRS.PAINT,  24, DEF_ATTRS.U_DECIMAL ]; // 0 - 1
+       PaintPrivate.shadowOffsetX  = [ DEF_ATTRS.PAINT,  25, DEF_ATTRS.LENGTH    ]; // em
+       PaintPrivate.shadowOffsetY  = [ DEF_ATTRS.PAINT,  26, DEF_ATTRS.LENGTH    ]; // em
+       PaintPrivate.shadowBlur     = [ DEF_ATTRS.PAINT,  27, DEF_ATTRS.LENGTH    ]; // em
+       PaintPrivate.shadowSpread   = [ DEF_ATTRS.PAINT,  28, DEF_ATTRS.LENGTH    ]; // em
+       PaintPrivate.shadowInset    = [ DEF_ATTRS.PAINT,  29, DEF_ATTRS.BOOLEAN   ]; // true / false
+       
+       TypoPrivate.color           = [ DEF_ATTRS.PAINT,   0, DEF_ATTRS.COLOR     ]; // color
+       TypoPrivate.fontFamily      = [ DEF_ATTRS.REFLOW,  1, DEF_ATTRS.FONT_NAME ]; // string
+       TypoPrivate.fontSize        = [ DEF_ATTRS.REFLOW,  2, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ]; // em, %
+       TypoPrivate.bold            = [ DEF_ATTRS.REFLOW,  3, DEF_ATTRS.BOOLEAN   ]; // true / false
+       TypoPrivate.italic          = [ DEF_ATTRS.REFLOW,  4, DEF_ATTRS.BOOLEAN   ]; // true / false
+       TypoPrivate.lineHeight      = [ DEF_ATTRS.REFLOW,  5, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT | DEF_ATTRS.NUMERICAL ]; // em, %, 
+       TypoPrivate.letterSpacing   = [ DEF_ATTRS.REFLOW,  6, DEF_ATTRS.LENGTH    ]; // em
+       TypoPrivate.wordSpacing     = [ DEF_ATTRS.REFLOW,  7, DEF_ATTRS.LENGTH    ];
+       TypoPrivate.align           = [ DEF_ATTRS.REFLOW,  8, DEF_ATTRS.LIST, DEF_ATTRS.ALIGN           ];
+       TypoPrivate.decoration      = [ DEF_ATTRS.PAINT,   9, DEF_ATTRS.LIST, DEF_ATTRS.TEXT_DECORATION ];
+       TypoPrivate.transform       = [ DEF_ATTRS.REFLOW, 10, DEF_ATTRS.LIST, DEF_ATTRS.TEXT_TRANSFORM  ];
+       TypoPrivate.shadowColor     = [ DEF_ATTRS.PAINT,  11, DEF_ATTRS.COLOR     ];
+       TypoPrivate.shadowOffsetX   = [ DEF_ATTRS.PAINT,  12, DEF_ATTRS.LENGTH    ];
+       TypoPrivate.shadowOffsetY   = [ DEF_ATTRS.PAINT,  13, DEF_ATTRS.LENGTH    ];
+       TypoPrivate.shadowBlur      = [ DEF_ATTRS.PAINT,  14, DEF_ATTRS.LENGTH    ];
+       
+       LayoutPrivate.width         = [ DEF_ATTRS.REFLOW,  0, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT, DEF_ATTRS.WIDTH_HEIGHT ];
+       LayoutPrivate.minWidth      = [ DEF_ATTRS.REFLOW,  1, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+       LayoutPrivate.maxWidth      = [ DEF_ATTRS.REFLOW,  2, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+       LayoutPrivate.height        = [ DEF_ATTRS.REFLOW,  3, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT, DEF_ATTRS.WIDTH_HEIGHT ];
+       LayoutPrivate.minHeight     = [ DEF_ATTRS.REFLOW,  4, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+       LayoutPrivate.maxHeight     = [ DEF_ATTRS.REFLOW,  5, DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+       LayoutPrivate.padding       = [ DEF_ATTRS.REFLOW,  6, DEF_ATTRS.QUARTET | DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+       LayoutPrivate.margin        = [ DEF_ATTRS.REFLOW, 10, DEF_ATTRS.QUARTET | DEF_ATTRS.LENGTH | DEF_ATTRS.PERCENT ];
+
+
+       var NodePrivate = Class.create(
+               'NodePrivate',
+               Class.PRIVATE_DATA | Class.POOL_OBJECT,
+               {
+                       elmWrap       : null,
+                       textNode      : null,
+                       contentWidth  : 0,
+                       contentHeight : 0,
+                       Constructor   : function( __root, __parent ){
+                               this.__root   = __root;
+                               if( __parent ) this.__parent = __parent;
+                       },
+                       paint : function( v ){
+                               if( v instanceof PaintStyle ){
+                                       this.__paint && this.__paint.unRegister( this );
+                                       this._paint = v;
+                                       this.__paint = PaintStyle.getPrivateData( v );                                  
+                                       this.__paint.register( this );
+                                       return this.User;
+                               } else
+                               if( v === null ){
+                                       this.__paint && this.__paint.unRegister( this );
+                                       delete this._paint;
+                                       delete this.__paint;
+                                       return this.User;
+                               };
+                               return this._paint;
+                       },
+                       typo : function( v ){
+                               if( v instanceof TypoStyle ){
+                                       this.__typo && this.__typo.unRegister( this );
+                                       this._typo = v;
+                                       this.__typo = TypoStyle.getPrivateData( v );                                    
+                                       this.__typo.register( this );
+                                       return this.User;
+                               } else
+                               if( v === null ){
+                                       this.__typo && this.__typo.unRegister( this );
+                                       delete this._typo;
+                                       delete this.__typo;
+                                       return this.User;
+                               };
+                               return this._typo;
+                       },
+                       /**
+                        * 1. 要素の追加・削除
+                        * 2. auto 指定時は要素の高さ取得.
+                        * 3. 親の許す子の最大サイズと自信のスタイル指定から、自身の位置とサイズを計算
+                        * 4. 描画更新リストに追加
+                        */
+                       reflow : function(){
+                               var content = this._textContent,
+                                       layout  = this.__layout,
+                                       targetW = this.__parent.childWidth,
+                                       targetH = this.__parent.childHeight,
+                                       size, data, w, h;
+                               
+                               if( content || ( this.__paint && this.__paint.hasStyle === true ) || ( this.__typo && this.__typo.hasStyle === true ) ){
+                                       if( !this.elmWrap ) this.elmWrap = DOM.createDiv();
+                                       this.__parent.addDiv( this );
+                                       if( conetnt ){
+                                               if( !this.textNode ){
+                                                       this.textNode = DOM.cerateText();
+                                                       this.elmWrap.appendChild( this.textNode );
+                                               };
+                                               if( layout && ( layout.autoWidth === true || layout.autoHeight === true ) ){
+                                                       size = DOM.getTextSize( this.elmWrap, content );
+                                                       this.contentWidth  = size[ 0 ];
+                                                       this.conetntHeight = size[ 1 ];
+                                               };
+                                               this.textNode.data = content;
+                                       } else
+                                       if( this.textNode ){
+                                               DOM.correct( this.textNode );
+                                               delete this.textNode;
+                                               delete this.contentWidth;
+                                               delete this.conetntHeight;
+                                       };
+                                       this.currentWidth  = this.elmWrap.offsetWidth;
+                                       this.currentHeight = this.elmWrap.offsetHeight;                                 
+                               } else
+                               if( this.elmWrap ){
+                                       DOM.correct( this.elmWrap );
+                                       delete this.elmWrap;
+                                       delete this.textNode;
+                                       delete this.contentWidth;
+                                       delete this.conetntHeight;
+                                       delete this.currentWidth;
+                                       delete this.currentHeight
+                               };
+                               
+                               // this.__parent.layoutManager.reflow();
+                       },
+                       addDiv : function( nodeData ){
+                               
+                       }       
+               }
+       );
+       var Node = Class.create(
+               'Node',
+               Class.POOL_OBJECT,
+               NodePrivate,
+               {
+                       Constructor : function( root, parent ){
+                               Node.newPrivateData( this,  LayoutBox.getPrivateData( root ), parent ? LayoutBox.getPrivateData( parent ) : undefined, this );
+                       },
+                       paint : function( v ){
+                               return Node.getPrivateData( this ).paint( v );
+                       },
+                       typo : function( v ){
+                               return Node.getPrivateData( this ).typo( v );
+                       },
+                       remove : function(){
+                               Node.getPrivateData( this ).remove();
+                       },
+                       nodeIndex : function( v ){
+                               return Node.getPrivateData( this ).nodeIndex( v );
+                       },
+                       displayIndex : function(){
+                               
+                       },
+                       disabled : function( v ){
+                               return Node.getPrivateData( this ).disabled( v );
+                       },
+                       cursor : function( v ){
+                               return Node.getPrivateData( this ).cursor( v );
+                       },
+                       getAbsolutePositionX : function(){
+                               return Node.getPrivateData( this ).getAbsolutePositionX();
+                       },
+                       getAbsolutePositionY : function(){
+                               return Node.getPrivateData( this ).getAbsolutePositionY();
+                       },
+                       addEventListener : function( type, handler, opt_thisObject ){
+                               Node.getPrivateData( this ).addEventListener( type, handler, opt_thisObject );
+                       },
+                       removeEventListener : function( type, handler ){
+                               Node.getPrivateData( this ).removeEventListener( type, handler );
+                       },
+                       scrollTo : function( x, y ){
+                               Node.getPrivateData( this ).scrollTo( x, y );
+                       },
+                       scrollX : function( v ){
+                               return Node.getPrivateData( this ).scrollX( v );
+                       },
+                       scrollY : function( v ){
+                               return Node.getPrivateData( this ).scrollY( v );
+                       }
+               }
+       );
+       
+       var LayoutBoxPrivate = NodePrivate.inherits(
+               'LayoutBoxPrivate',
+               Class.POOL_OBJECT,
+               {
+                       Constructor : function( layoutManager, root, parent ){
+                               this.layoutManager = layoutManager;
+                               this._root         = _root;
+                               if( _parent ) this._parent = _parent;
+                       },
+                       reflow : function(){
+                               this.manager.reflow( this );
+                       },
+                       repaint : function(){
+                               this.manager.repaint( this );
+                       }
+               }
+       );
+       
+       var LayoutBox = Node.inherits(
+               'LayoutBox',
+               Class.POOL_OBJECT,
+               LayoutBoxPrivate,
+               {
+                       Constructor : function( layoutManager, root, parent ){
+                               LayoutBox.newPrivateData( this, layoutManager, LayoutBox.getPrivateData( root ), parent ? LayoutBox.getPrivateData( parent ) : undefined );
+                       },
+                       layoutManager : function( v ){
+                               
+                       },
+                       createLayoutBox : function(){
+                               
+                       },
+                       createContentBox : function(){
+                               
+                       }
+               }
+       );
+       
+})( window, document );
+       
 })( window, document );