OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 08_Box.js
index 8d07dfb..5c0b9d7 100644 (file)
@@ -1,15 +1,15 @@
 \r
-X.UI.Layout.Canvas = X.UI.Layout.create( {\r
+var XUI_Layout_Canvas = X[ 'UI' ][ 'Layout' ][ 'Canvas' ] = XUI_createLayout( {\r
        name : 'CanvasLayout',\r
        \r
        overrideAttrsForSelf : {\r
                selectable  : false,\r
-               role        : [ 0, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome,container' ],\r
+               role        : [ 0, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.LIST, 'none,chrome,container' ],\r
                \r
-               width       : [ '100%',         X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
-               maxWidth    : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
-               height      : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
-               maxHeight   : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ]\r
+               width       : [ '100%',         XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+               maxWidth    : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+               height      : [ 0,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+               maxHeight   : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ]\r
        },\r
        \r
        overrideAttrsForChild : {\r
@@ -24,7 +24,10 @@ X.UI.Layout.Canvas = X.UI.Layout.create( {
 \r
                data.preMesure( w, h );\r
                \r
-               if( isNeedsDetection && ( data.boxWidth === X.UI.Attr.AUTO || data.boxHeight === X.UI.Attr.AUTO ) ) return false;\r
+               //console.log( w + ' > ' + data.boxWidth );\r
+               \r
+               //  data.boxWidth と data.boxHeight のどちらかでも Infinity\r
+               if( isNeedsDetection && data.boxWidth + data.boxHeight === XUI_Attr_AUTO ) return false;\r
                \r
                _x = data.contentL;\r
                _y = data.contentT;\r
@@ -32,27 +35,33 @@ X.UI.Layout.Canvas = X.UI.Layout.create( {
                _h = data.contentHeight;\r
 \r
                if( ( uinodes = data.uinodes ) && ( l = uinodes.length ) ){\r
+                       //console.log( _w + ' x ' + _h + ' l:' + l );\r
                        for( i = 0; i < l; ++i ){\r
                                node = uinodes[ i ];\r
                                node.calculate( false, _x, _y, _w, _h );\r
                        };\r
                } else\r
-               if( data.contentHeight === X.UI.Attr.AUTO ){\r
-                       data.contentHeight = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
+               if( data.contentHeight === XUI_Attr_AUTO ){\r
+                       data.contentHeight = data.contentHeightMin !== XUI_Attr_AUTO ? data.contentHeightMin : 0;\r
                };\r
                \r
                data.postMesure();\r
-               data.updateLayout( x + data.boxX, y + data.boxY );\r
-               \r
+\r
+               if( !isNeedsDetection ){\r
+                       data.boxX += x;\r
+                       data.boxY += y;\r
+               };\r
                return true;\r
        }\r
 });\r
 \r
 \r
-X.UI._Box = X.UI._AbstractUINode.inherits(\r
+var XUI_Box = XUI_AbstractUINode.inherits(\r
        'X.UI._Box',\r
-       X.Class.PRIVATE_DATA | X.Class.SUPER_ACCESS, // 現状 super 指定がないとconstructor未定擬時に親のconstructor が使われない\r
+       X_Class.NONE,\r
        {\r
+               usableAttrs     : XUI_Attr_createAttrDef( XUI_AbstractUINode.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf ),\r
+               \r
                layout          : null,\r
                uinodes         : null,\r
                xnodes          : null,\r
@@ -61,41 +70,43 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                pointerChildren : true,\r
                through         : false,\r
 \r
-               scrollingX      : 0,\r
-               scrollingY      : 0,\r
+               scrollXEm       : 0,\r
+               scrollYEm       : 0,\r
 \r
-               Constructor : function( layout, args ){\r
+               Constructor : function( user, layout, args ){\r
                        var i = 0,\r
-                               l = args.length,\r
+                               l = args && args.length,\r
                                j = -1,\r
-                               uinodes, arg, _data, attrs, support;\r
+                               uinodes, arg, _data, attrs, attrDef, p;\r
                        \r
-                       if( !this.User.instanceOf( X.UI.Box ) ){\r
+                       //if( !args.length ) args = [ args ];\r
+                       \r
+                       if( !user[ 'instanceOf' ]( X.UI.Box ) ){\r
                                //throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' );\r
-                       };                      \r
+                       };\r
                        \r
-                       this.xnode  = X.Dom.Node.create( 'div' );\r
+                       this.User   = user;\r
+                       \r
+                       // TODO デフォルトの attr 指定の中から XNODE に指定するものを集めて適用。\r
+                       this.xnode  = X_Doc_create( 'div' );\r
                        \r
                        // すでに定義されていればそちらを採用\r
-                       // supportAttrs や attrClass が、layout を元に上書きされているため\r
+                       // usableAttrs や attrClass が、layout を元に上書きされているため\r
                        this.layout = this.layout || layout;\r
                        \r
                        for( ; i < l; ++i ){\r
                                arg = args[ i ];\r
-                               if( arg.instanceOf && arg.instanceOf( X.UI.AbstractUINode ) ){\r
-                                       _data = X.Class._getPrivate( arg );\r
+                               if( arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( X.UI.AbstractUINode ) ){\r
+                                       _data = X_Pair_get( arg );\r
                                        if( !uinodes ) this.uinodes = uinodes = [];\r
                                        uinodes[ ++j ] = _data;\r
                                        if( _data.parent ){\r
                                                //throw new Error( 'インスタンスはすでに親に追加されています ' + arg );\r
                                        };\r
                                } else\r
-                               if( arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){\r
-                                       //this.layout = arg;\r
-                               } else\r
-                               if( X.Type.isObject( arg ) ){\r
+                               if( X_Type_isObject( arg ) ){\r
                                        if( attrs ){\r
-                                               attrs = X.Class._override( attrs, arg );\r
+                                               attrs = X_Class_override( attrs, arg );\r
                                        } else {\r
                                                attrs = arg;\r
                                        };\r
@@ -105,57 +116,45 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                        };\r
                        \r
                        for( p in attrs ){\r
-                               ( support = this.supportAttrs[ p ] ) && this.setAttr( p, support, attrs[ p ] );\r
+                               if( X_EMPTY_OBJECT[ p ] ) continue;\r
+                               ( attrDef = this.usableAttrs[ p ] ) && this.setAttr( p, attrDef, attrs[ p ] );\r
                        };\r
                },\r
        /* Rellay */\r
                initialize : function( root, rootData, parent, parentData ){\r
                        var uinodes = this.uinodes,\r
-                               i       = uinodes && uinodes.length;\r
-                       this.root       = root;\r
-                       this.rootData   = rootData;\r
-                       this.parent     = parent;\r
-                       this.parentData = parentData;\r
-                       //this.xnode      = X.Dom.Node.create( 'div' );\r
+                               l       = uinodes && uinodes.length, i = 0;\r
                        \r
-                       if( i ){\r
-                               for( ; i; ){\r
-                                       uinodes[ --i ].initialize( root, rootData, this.User, this );\r
-                               };                              \r
+                       for( ; i < l; ++i ){\r
+                               uinodes[ i ].initialize( root, rootData, this.User, this );\r
                        };\r
                        \r
-                       this.phase = 1;\r
-                       this.User.dispatch( { type : X.UI.Event.INIT } );\r
+                       XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
                },\r
                \r
                addToParent : function( parentXNode ){\r
                        var uinodes = this.uinodes,\r
                                l       = uinodes && uinodes.length,\r
-                               i;\r
+                               i = 0;\r
 \r
-                       parentXNode && parentXNode.append( this.xnode );\r
-                       \r
-                       if( l ){\r
-                               for( i = 0; i < l; ++i ){\r
-                                       uinodes[ i ].addToParent( this.xnode );\r
-                               };\r
+                       for( ; i < l; ++i ){\r
+                               uinodes[ i ].addToParent( this.xnode );\r
                        };\r
                        \r
-                       this.phase = 2;\r
-                       this.User.dispatch( { type : X.UI.Event.ADDED } );\r
+                       XUI_AbstractUINode.prototype.addToParent.apply( this, arguments );\r
                },\r
                \r
        /* Rellay */\r
                creationComplete : function(){\r
                        var uinodes = this.uinodes,\r
-                               i       = uinodes && uinodes.length;\r
-                       if( i ){\r
-                               for( ; i; ){\r
-                                       uinodes[ --i ].creationComplete();\r
-                               };                              \r
+                               l       = uinodes && uinodes.length,\r
+                               i = 0;\r
+                               \r
+                       for( ; i < l; ++i ){\r
+                               uinodes[ i ].creationComplete();\r
                        };\r
                        \r
-                       X.UI._AbstractUINode.prototype.creationComplete.apply( this, arguments );\r
+                       XUI_AbstractUINode.prototype.creationComplete.apply( this, arguments );\r
                },\r
                \r
                calculate : function( isNeedsDetection, x, y, w, h ){\r
@@ -163,16 +162,29 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                        this.phase = 4;\r
                        return ret;\r
                },\r
+       \r
+               updateLayout : function(){\r
+                       var uinodes = this.uinodes, i, l;\r
+\r
+                       if( uinodes && ( l = uinodes.length ) ){\r
+                               for( i = 0; i < l; ++i ){\r
+                                       uinodes[ i ].updateLayout();\r
+                               };      \r
+                       };\r
+                       XUI_AbstractUINode.prototype.updateLayout.call( this );\r
+               },\r
                \r
                capcher : function( x, y ){\r
                        var uinodes, child, _x, _y, hit, i;\r
+                       \r
                        if( this.pointerDisabled ) return false;\r
+\r
                        delete this.hitChildData;\r
                        x -= this.boxX;\r
                        y -= this.boxY;\r
                        if( this.pointerChildren && ( uinodes = this.uinodes ) && ( i = uinodes.length ) ){\r
-                               _x = x - this.scrollingX;\r
-                               _y = y - this.scrollingY;\r
+                               _x = x - this.scrollXEm;\r
+                               _y = y - this.scrollYEm;\r
                                for( ; i; ){\r
                                        child = uinodes[ --i ];\r
                                        if( !child.pointerDisabled && child.boxX <= _x && _x < child.boxX + child.boxWidth && child.boxY <= _y && _y < child.boxY + child.boxHeight && child.capcher( _x, _y ) ){\r
@@ -183,18 +195,20 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                                };\r
                        };\r
                        if( this.through ){\r
-                               this.hitChildData && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
+                               this.hitChildData && !this.hovering && ( XUI_UINODES_HOVER[ XUI_UINODES_HOVER.length ] = this );\r
                                return !!this.hitChildData;\r
                        };\r
                        hit = 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight;\r
-                       ( this.hitChildData || hit ) && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
-                       if( hit && this.hitChildData === null ) this.rootData.targetNodeData = this;\r
+                       ( this.hitChildData || hit ) && !this.hovering && ( XUI_UINODES_HOVER[ XUI_UINODES_HOVER.length ] = this );\r
+                       if( hit && this.hitChildData === null ){\r
+                               XUI_uinodeTarget = this;\r
+                       };\r
                        return hit || !!this.hitChildData;\r
                },\r
                \r
                addAt : function( index, _uinodes ){\r
                        //console.log( '# AddAt ' + this.phase )\r
-                       var uinodes = this.uinodes,\r
+                       var uinodes = this.uinodes || ( this.uinodes = [] ),\r
                                num     = uinodes.length,\r
                                p1      = 1 <= this.phase,\r
                                p2      = 2 <= this.phase,\r
@@ -205,21 +219,22 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
 \r
                        //console.log( '### AddAt ' + this.phase )\r
                        for( l = _uinodes.length; i < l; ++i ){\r
-                               data = X.Class._getPrivate( _uinodes[ i ] );\r
+                               data = X_Pair_get( _uinodes[ i ] );\r
                                _p1  = p1 && data.phase < 1;\r
                                _p2  = p2 && data.phase < 2;\r
                                _p1 && data.initialize( this.root, this.rootData, this.User, this );\r
-                               if( index <= num ){\r
-                                       // _p2 && this.xnode.insertBefore( data.xnode, uinodes[ index + i ].xnode );\r
-                                       _p2 && uinodes[ index + i ].xnode.before( data.xnode );\r
+                               if( index < num ){\r
+                                       _p2 && uinodes[ index + i ].xnode[ 'prev' ]( data.xnode );\r
                                        _p2 && data.addToParent( this.xnode );\r
                                        uinodes.splice( index + i, 0, data );\r
                                } else {\r
                                        _p2 && data.addToParent( this.xnode );\r
-                                       uinodes[ uinodes.length ] = data;       \r
+                                       uinodes[ uinodes.length ] = data;\r
                                };\r
                                p3 && data.phase < 3 && data.creationComplete();\r
                        };\r
+                       \r
+                       console.log( 'addAt レイアウト 4? ' + this.phase );\r
                        4 <= this.phase && this.rootData.reserveCalc();\r
                },\r
                \r
@@ -231,7 +246,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
 \r
                        //console.log( '### AddAt ' + this.phase )\r
                        for( ; i; ){\r
-                               data = X.Class._getPrivate( _uinodes[ --i ] );\r
+                               data = X_Pair_get( _uinodes[ --i ] );\r
                                if( ( n = uinodes.indexOf( data ) ) !== -1 ){\r
                                        uinodes.splice( n, 1 );\r
                                        data._remove();\r
@@ -243,7 +258,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                removeAt : function( from, length ){\r
                        var uinodes = this.uinodes,\r
                                i       = uinodes.length,\r
-                               to      = from + ( X.Type.isNumber( length ) && 1 <= length ? length : 1 ),\r
+                               to      = from + ( X_Type_isNumber( length ) && 1 <= length ? length : 1 ),\r
                                node;\r
                        for( ; i; ){\r
                                node = uinodes[ --i ];\r
@@ -264,13 +279,12 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
                                case 4:\r
                                case 3:\r
                                case 2:\r
-                                       this.xnode.remove();\r
+                                       this.xnode[ 'remove' ]();\r
                                case 1:\r
                                        delete this.root;\r
                                        delete this.rootData;\r
                                        delete this.parent;\r
                                        delete this.parentData;\r
-                                       delete this.xnode;\r
                        };\r
                        delete this.phase;\r
                }\r
@@ -279,38 +293,39 @@ X.UI._Box = X.UI._AbstractUINode.inherits(
 \r
 X.UI.Box = X.UI.AbstractUINode.inherits(\r
        'Box',\r
-       X.Class.SUPER_ACCESS,\r
-       X.UI._Box,\r
+       X_Class.NONE,\r
        {\r
                Constructor : function(){\r
-                       X.Class._newPrivate( this, X.UI.Layout.Canvas, arguments );\r
+                       X_Pair_create( this, XUI_Box( this, XUI_Layout_Canvas, arguments ) );\r
                },\r
                \r
-               add : function( node /* , node, node ... */ ){\r
-                       X.Class._getPrivate( this ).addAt( this.numNodes() + 1, Array.prototype.slice.call( arguments ) );\r
+               add : function( /* node, node, node ... */ ){\r
+                       X_Pair_get( this ).addAt( this.numNodes() + 1, X_Array_copy( arguments ) );\r
                        return this;\r
                },\r
-               addAt : function( index, node /* , node, node ... */ ){\r
+               addAt : function( index /* , node , node, node ... */ ){\r
+                       var nodes;\r
                        if( index < 0 ) index = 0;\r
-                       X.Class._getPrivate( this ).addAt( arguments[ 0 ], Array.prototype.slice.call( arguments, 1 ) );\r
+                       nodes = X_Array_copy( arguments );\r
+                       X_Pair_get( this ).addAt( nodes.shift(), nodes );\r
                        return this;\r
                },\r
-               remove : function( node /* , node, node ... */ ){\r
-                       X.Class._getPrivate( this ).remove( Array.prototype.slice.call( arguments ) );\r
+               remove : function( /* node, node, node ... */ ){\r
+                       X_Pair_get( this )[ 'remove' ]( X_Array_copy( arguments ) );\r
                        return this;\r
                },\r
                removeAt : function( from, length ){\r
-                       X.Class._getPrivate( this ).removeAt( from, length );\r
+                       X_Pair_get( this ).removeAt( from, length );\r
                        return this;\r
                },\r
                getNodesByClass : function( klass ){\r
                        var ret     = [],\r
-                               uinodes = X.Class._getPrivate( this ).uinodes,\r
+                               uinodes = X_Pair_get( this ).uinodes,\r
                                i, l, node;\r
                        if( !uinodes || uinodes.length === 0 ) return ret;\r
                        for( i = 0, l = uinodes.length; i < l; ++i ){\r
                                node = uinodes[ i ].User;\r
-                               if( node.instanceOf( klass ) ) ret[ ret.length ] = node;\r
+                               if( node[ 'instanceOf' ]( klass ) ) ret[ ret.length ] = node;\r
                        };\r
                        return ret;\r
                },\r
@@ -318,17 +333,31 @@ X.UI.Box = X.UI.AbstractUINode.inherits(
                        return this.getNodeAt( 0 );\r
                },\r
                getLastChild : function(){\r
-                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       var uinodes = X_Pair_get( this ).uinodes;\r
                        return uinodes && uinodes.length && uinodes[ uinodes.length - 1 ].User || null;\r
                },\r
                getNodeAt : function( index ){\r
                        if( index < 0 ) return null;\r
-                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       var uinodes = X_Pair_get( this ).uinodes;\r
                        return uinodes && uinodes[ index ].User || null;\r
                },\r
                numNodes : function(){\r
-                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       var uinodes = X_Pair_get( this ).uinodes;\r
                        return uinodes && uinodes.length || 0;\r
+               },\r
+               \r
+               clone : function( opt_cloneListener ){\r
+                       var clone   = X.UI.AbstractUINode.prototype.clone.call( this,  opt_cloneListener ),\r
+                               uinodes = X_Pair_get( this ).uinodes,\r
+                               i       = 0,\r
+                               l       = uinodes && uinodes.length,\r
+                               copies  = [];\r
+                       \r
+                       for( ; i < l; ++i ){\r
+                               copies[ i ] = uinodes[ i ].clone( opt_cloneListener );\r
+                       };\r
+\r
+                       return l ? clone.add.apply( clone, copies ) : clone;\r
                }\r
        }\r
 );\r
@@ -341,7 +370,7 @@ X.UI.Box.presets = function(){
        var args   = arguments,\r
                i      = 0,\r
                l      = args.length,   \r
-               shadow = X.Class._getClassDef( this ).privateClass,\r
+               shadow = X_Class_getClassDef( this ).privateClass,\r
                layout = shadow.prototype.layout,\r
                arg, attrs, supports, klass, klassDef, privateKlass, boxName;\r
                        \r
@@ -349,41 +378,44 @@ X.UI.Box.presets = function(){
                arg = args[ i ];\r
                if( !arg ) continue;\r
                // レイアウトの preset ができるのは layout が未定義な Box だけ\r
-               if( !shadow.prototype.layout && arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){\r
+               if( !shadow.prototype.layout && arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( XUI_LayoutBase ) ){\r
                        layout = arg;\r
                } else\r
-               if( ( klassDef = X.Class._getClassDef( arg ) ) && klassDef.isPrivate ){\r
+               if( ( klassDef = X_Class_getClassDef( arg ) ) && klassDef.isPrivate ){\r
                        privateKlass = arg;\r
                        layout = privateKlass.prototype.layout;\r
                } else\r
-               if( X.Type.isObject( arg ) ){\r
+               if( X_Type_isObject( arg ) ){\r
                        if( attrs ){\r
-                               X.Class._override( attrs, arg, true );\r
+                               X_Class_override( attrs, arg, true );\r
                        } else {\r
                                attrs = arg;\r
                        };\r
                } else\r
-               if( X.Type.isString( arg ) ){\r
+               if( X_Type_isString( arg ) ){\r
                        boxName = arg;\r
                };\r
        };\r
        \r
        if( privateKlass ){\r
-               supports = X.UI.Attr.createAttrDef( privateKlass.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+               /*\r
+                * スーパークラスの属性定義リストをレイアウトの持つ属性定義で上書きした新しい属性定義リストを作る。\r
+                */\r
+               supports = XUI_Attr_createAttrDef( privateKlass.prototype.usableAttrs, layout.overrideAttrsForSelf );\r
                \r
                klass = this.inherits( privateKlass );\r
-               privateKlass.prototype.supportAttrs = supports,\r
-               privateKlass.prototype.attrClass    = X.UI.Attr.preset( privateKlass.prototype.attrClass, supports, attrs );\r
+               privateKlass.prototype.usableAttrs = supports;\r
+               privateKlass.prototype.attrClass    = XUI_Attr_preset( privateKlass.prototype.attrClass, supports, attrs );\r
        } else {\r
-               supports = X.UI.Attr.createAttrDef( shadow.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+               supports = XUI_Attr_createAttrDef( shadow.prototype.usableAttrs, layout.overrideAttrsForSelf );\r
                \r
                klass = this.inherits(\r
                        boxName,\r
                        shadow.inherits(\r
                                {\r
                                        layout       : layout,\r
-                                       supportAttrs : supports,\r
-                                       attrClass    : X.UI.Attr.preset( shadow.prototype.attrClass, supports, attrs )\r
+                                       usableAttrs : supports,\r
+                                       attrClass    : XUI_Attr_preset( shadow.prototype.attrClass, supports, attrs )\r
                                }\r
                        )\r
                );              \r