X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F20_ui%2F02_XUI_Attr.js;h=4908ed3eca4a67e130c88cc746fdf1d598ee4c19;hb=f01f21c6d473692d016cb2b286a61d55380be3b3;hp=ae31c1e86f11b58f9bb724da6eb6bb22f7fd357d;hpb=51e22031f9629d4bc32444a0228930642144ee9e;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/20_ui/02_XUI_Attr.js b/0.6.x/js/20_ui/02_XUI_Attr.js index ae31c1e..4908ed3 100644 --- a/0.6.x/js/20_ui/02_XUI_Attr.js +++ b/0.6.x/js/20_ui/02_XUI_Attr.js @@ -1,66 +1,37 @@ -X.UI.Attr = { - AUTO : Number.POSITIVE_INFINITY, - FLOOR : new Function( 'v', 'return 0 <= v ? v | 0 : -( -v | 0 )' ), - - USER : { - XNODE : 0, - UINODE : 1, - LAYOUT : 2 - }, - - Type : { - LIST : 0, - LENGTH : 1, // '1.5em' - MINUS_LENGTH : 2, - PERCENT : 4, // '90%', 0.0 ~ 1.0 こういう指定はできない! - MINUS_PERCENT : 8, - NUMERICAL : 16, // 1.1 (lineHeight only) - AUTO : 32, // 'auto' - COLOR : 64, // 0x000000 ~ 0xFFFFFF, RED, #000000 ~ #FFFFFF, #000 ~ #FFF - URL : 128, - STRING : 128, - FONT_NAME : 256, - BOOLEAN : 512, - COMBI : 1024, - QUARTET : 2048, - DEFAULT_ONLY : 4096, - INIT_ONLY : 8192 +var XUI_Attr_AUTO = 1/0,//Number.POSITIVE_INFINITY, + XUI_Attr_FLOOR = new Function( 'v', 'return 0 <= v ? v | 0 : -( -v | 0 )' ), + XUI_Attr_USER = { + XNODE : 0, // 値は xnode.css にコピーされます。 + UINODE : 1, // 値は _uinode にコピーされます。 + LAYOUT : 2 // }, - - Option : { - BORDER_STYLE : X.UI.Util.createChecker( 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset' ), - ALIGN : X.UI.Util.createChecker( 'left,center,right,justify' ), - TEXT_DECORATION : X.UI.Util.createChecker( 'none,underline,overline,line-through,blink' ), - TEXT_TRANSFORM : X.UI.Util.createChecker( 'none,capitalize,lowercase,uppercase' ), - BOX_SIZING : X.UI.Util.createChecker( 'content,padding,border' ), - CURSOR : X.UI.Util.createChecker( 'pointer,wait' ) + XUI_Attr_Type = { + LIST : 16384, + LENGTH : 1, // '1.5em' + MINUS_LENGTH : 2, + PERCENT : 4, // '90%', 0.0 ~ 1.0 こういう指定はできない! + MINUS_PERCENT : 8, + NUMERICAL : 16, // 1.1 (lineHeight only) + AUTO : 32, // 'auto' + COLOR : 64, // 0x000000 ~ 0xFFFFFF, RED, #000000 ~ #FFFFFF, #000 ~ #FFF + URL : 128, + STRING : 128, + FONT_NAME : 256, + BOOLEAN : 512, + COMBI : 1024, + QUARTET : 2048, + DEFAULT_ONLY : 4096, + INIT_ONLY : 8192 }, - - createAttrDef : function( base, defs ){ - var F = base ? X.cloneObject( base ) : {}, - z = base ? base._last : 0, - n = 1, - p, def; - - // 属性定義の上書き - for( p in defs ){ - if( p === '_last' ) continue; - if( !X.Type.isArray( def = defs[ p ] ) ) continue; - F[ p ] = def; - if( !base || !X.Type.isArray( base[ p ] ) ){ - def.No = z += n; - // add - n = def[ 3 ] & X.UI.Attr.Type.QUARTET ? 4 : - def[ 3 ] & X.UI.Attr.Type.COMBI ? 2 : 1; - } else { - def.No = base[ p ].No; - }; - }; - F._last = z; - return F; + XUI_Attr_Option = { + BORDER_STYLE : 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset', + ALIGN : 'left,center,right,justify', + TEXT_DECORATION : 'none,underline,overline,line-through,blink', + TEXT_TRANSFORM : 'none,capitalize,lowercase,uppercase', + BOX_SIZING : 'content,padding,border', + CURSOR : 'pointer,wait' }, - - CSS3 : { + XUI_Attr_CSS3 = { opacity : true, bgColorAlpha : true, bgGradient : true, @@ -73,15 +44,13 @@ X.UI.Attr = { textShadowBlur : true, textShadowAlpha : true }, - - Rename : { + XUI_Attr_Rename = { bgColor : 'background-color', fontColor : 'color', fontBold : 'fontWeight', fontItalic : 'fontStyle', fontSmallCaps : 'fontVariant' - } -}; + }, /* * 0: 初期値 : undefined は不可! @@ -90,98 +59,128 @@ X.UI.Attr = { * 3: 受け付けるデータ型 * 4: 選択方式の場合、その候補 */ -X.UI.Attr.Support = X.UI.Attr.createAttrDef( false, + XUI_Attr_Support = XUI_Attr_createAttrDef( 0, { - className : [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ], - pointerHoverClass : [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ], - pointerDownClass : [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ], - invalidLayoutColor: [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.COLOR ], + className : [ null, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ], + pointerHoverClass : [ null, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ], + pointerDownClass : [ null, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ], + invalidLayoutColor: [ null, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.COLOR ], - role : [ 0, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome' ], - selectable : [ false, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.BOOLEAN ], + role : [ 1, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.LIST, 'none,chrome' ], + selectable : [ false, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.BOOLEAN ], - visible : [ true, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ], - pointerEnabled : [ false, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ], - pointerChildren : [ true, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ], - cursor : [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.CURSOR ], - tooltip : [ null, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.STRING ], + visible : [ true, XUI_Dirty.LAYOUT, XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ], + pointerEnabled : [ false, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ], + pointerChildren : [ true, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ], + cursor : [ 1, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.LIST, XUI_Attr_Option.CURSOR ], + tooltip : [ null, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.STRING ], - borderWidth : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.QUARTET | X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], // em [ top, right, bottom, left ] - padding : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.QUARTET | X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], + borderWidth : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.QUARTET | XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], // em [ top, right, bottom, left ] + padding : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.QUARTET | XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], - width : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.AUTO ], - minWidth : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - maxWidth : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.AUTO ], - height : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.AUTO ], - minHeight : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - maxHeight : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.AUTO ], - sizing : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LIST, X.UI.Attr.Option.BOX_SIZING ], - left : [ null, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.MINUS_LENGTH | X.UI.Attr.Type.MINUS_PERCENT ], - top : [ null, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.MINUS_LENGTH | X.UI.Attr.Type.MINUS_PERCENT ], - bottom : [ null, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.MINUS_LENGTH | X.UI.Attr.Type.MINUS_PERCENT ], - right : [ null, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT | X.UI.Attr.Type.MINUS_LENGTH | X.UI.Attr.Type.MINUS_PERCENT ], + width : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ], + minWidth : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + maxWidth : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ], + height : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ], + minHeight : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + maxHeight : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ], + sizing : [ 1, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LIST, XUI_Attr_Option.BOX_SIZING ], + left : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ], + top : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ], + bottom : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ], + right : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ], - borderColor : [ 0x0, X.UI.Dirty.PAINT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.QUARTET | X.UI.Attr.Type.COLOR ], // color [ top, right, bottom, left ] - borderStyle : [ 0, X.UI.Dirty.PAINT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.QUARTET | X.UI.Attr.Type.LIST, X.UI.Attr.Option.BORDER_STYLE ], // string [ top, right, bottom, left ] - bgColor : [ 0xFFFFFF, X.UI.Dirty.PAINT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.COLOR ], // color, none + borderColor : [ 0x0, XUI_Dirty.PAINT, XUI_Attr_USER.XNODE, XUI_Attr_Type.QUARTET | XUI_Attr_Type.COLOR ], // color [ top, right, bottom, left ] + borderStyle : [ 1, XUI_Dirty.PAINT, XUI_Attr_USER.XNODE, XUI_Attr_Type.QUARTET | XUI_Attr_Type.LIST, XUI_Attr_Option.BORDER_STYLE ], // string [ top, right, bottom, left ] + bgColor : [ 0xFFFFFF, XUI_Dirty.PAINT, XUI_Attr_USER.XNODE, XUI_Attr_Type.COLOR ], // color, none - fontColor : [ 0x0, X.UI.Dirty.PAINT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.COLOR ], - fontFamily : [ null, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.FONT_NAME ], - fontSize : [ 1, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - fontBold : [ false, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'bold' ], - fontItalic : [ false, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'italic' ], - fontSmallCaps : [ false, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'small-caps' ], - lineHeight : [ 1, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.NUMERICAL ], // percent - letterSpacing : [ 0, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH ], - wordSpacing : [ 0, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH ], - textAlign : [ 0, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.ALIGN ], - textDecoration : [ 0, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.TEXT_DECORATION ], - textTransform : [ 0, X.UI.Dirty.FONT, X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.TEXT_TRANSFORM ] + fontColor : [ 0x0, XUI_Dirty.PAINT, XUI_Attr_USER.XNODE, XUI_Attr_Type.COLOR ], + fontFamily : [ null, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.FONT_NAME ], + fontSize : [ 1, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + fontBold : [ false, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'bold' ], + fontItalic : [ false, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'italic' ], + fontSmallCaps : [ false, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'small-caps' ], + lineHeight : [ 1, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.NUMERICAL ], // percent + letterSpacing : [ 0, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH ], + wordSpacing : [ 0, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH ], + textAlign : [ 1, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.ALIGN ], + textDecoration : [ 1, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.TEXT_DECORATION ], + textTransform : [ 1, XUI_Dirty.FONT, XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.TEXT_TRANSFORM ] } -); +), /* * 共通する attr 指定を prototype に設定しながら拡張できる、属性データ保持クラス */ -X.UI.attrClassProto = null; +XUI_attrClassProto = null, -X.UI.AttrClass = X.Class.create( 'X.UI.AttrClass', X.Class.POOL_OBJECT ); +XUI_AttrClass = X_Class_create( 'XUI_AttrClass', X_Class.POOL_OBJECT ); -X.UI.Attr.copy = function( proto, supports ){ + function XUI_Attr_createAttrDef( base, defs ){ + var F = base ? X_Object_clone( base ) : {}, + z = base ? base._last : 0, + n = 1, + p, def; + + // 属性定義の上書き + for( p in defs ){ + if( X_EMPTY_OBJECT[ p ] ) continue; + if( p === '_last' ) continue; + if( !X_Type_isArray( def = defs[ p ] ) ) continue; + F[ p ] = def; + if( !base || !X_Type_isArray( base[ p ] ) ){ + def.No = z += n; + // add + n = def[ 3 ] & XUI_Attr_Type.QUARTET ? 4 : + def[ 3 ] & XUI_Attr_Type.COMBI ? 2 : 1; + } else { + def.No = base[ p ].No; + }; + if( def[ 3 ] & XUI_Attr_Type.LIST && X_Type_isString( def[ 4 ] ) ){ + def[ 4 ] = XUI_createChecker( def[ 4 ] ); + }; + }; + F._last = z; + return F; + }; + +function XUI_Attr_copy( proto, supports ){ var support, p; for( p in supports ){ + if( X_EMPTY_OBJECT[ p ] ) continue; if( p === '_last' ) continue; support = supports[ p ]; proto[ support.No ] = support[ 0 ]; - if( support[ 3 ] & X.UI.Attr.Type.QUARTET ){ + if( support[ 3 ] & XUI_Attr_Type.QUARTET ){ proto[ support.No + 1 ] = support[ 0 ]; proto[ support.No + 2 ] = support[ 0 ]; proto[ support.No + 3 ] = support[ 0 ]; } else - if( support[ 3 ] & X.UI.Attr.Type.COMBI ){ + if( support[ 3 ] & XUI_Attr_Type.COMBI ){ proto[ support.No + 1 ] = support[ 0 ]; }; }; }; -X.UI.Attr.copy( X.UI.AttrClass.prototype, X.UI.Attr.Support ); +XUI_Attr_copy( XUI_AttrClass.prototype, XUI_Attr_Support ); -X.UI.Attr.preset = function( baseKlass, opt_supports, opt_attrs ){ +function XUI_Attr_preset( baseKlass, opt_supports, opt_attrs ){ var klass = baseKlass.inherits(), proto = klass.prototype, p; // 属性プリセット - X.UI.Attr.copy( proto, opt_supports ); + XUI_Attr_copy( proto, opt_supports ); // setAttr に書き換え - X.UI.attrClassProto = proto; + XUI_attrClassProto = proto; for( p in opt_attrs ){ - opt_supports[ p ] && X.UI._AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] ); + if( X_EMPTY_OBJECT[ p ] ) continue; + opt_supports[ p ] && XUI_AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] ); }; - X.UI.attrClassProto = null; + XUI_attrClassProto = null; return klass; };