+ \r
+ if( ( quartet || combi ) && !X.Type.isArray( v ) ){\r
+ v = [ v ];\r
+ };\r
+ \r
+ if( X.Type.isNumber( v ) ){\r
+ if( \r
+ ( length && ( 0 <= v ) ) ||\r
+ ( minusLen && ( v <= 0 ) ) ||\r
+ ( percent && 0 <= v && v <= 1 ) ||\r
+ ( minusPct && -1 <= v && v < 0 ) ||\r
+ ( numerical && 0 <= v ) ||\r
+ ( auto && v === X.UI.Attr.AUTO ) ||\r
+ ( color && 0 <= v && v <= 0xFFFFFF ) ||\r
+ ( list && list[ v ] )\r
+ ){\r
+ // good\r
+ } else {\r
+ // bad\r
+ return;\r
+ };\r
+ } else\r
+ if( X.Type.isBoolean( v ) && !flag ){\r
+ return;\r
+ } else\r
+ if( X.Type.isArray( v ) ){\r
+ if( v.length <= 4 && quartet ){\r
+ type &= ~X.UI.Attr.Type.QUARTET;\r
+ switch( v.length ){\r
+ case 1 :\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+ break;\r
+ case 2 :\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ break;\r
+ case 3 :\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 2 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ break;\r
+ case 4 :\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 2 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 3 ] );\r
+ break;\r
+ }; \r
+ } else\r
+ if( v.length === 2 && combi ){\r
+ type &= ~X.UI.Attr.Type.COMBI;\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, propID ], v[ 0 ] );\r
+ this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+ } else {\r
+ // bad\r
+ return;\r
+ };\r
+\r
+ if( !X.UI.attrClassProto && user === X.UI.Attr.USER.XNODE && this.xnode ){\r
+ this.xnode.css( X.UI.Attr.Rename[ name ] || name, this._createCssText( name ) );\r
+ //console.log( ( X.UI.Attr.Rename[ name ] || name ) + ' ' + this._createCssText( name ) + ' ' + propID + ' ' + attrs[ propID ] );\r
+ };\r
+ return;\r
+ };\r
+\r
+ if( !v && v !== 0 ) v = defaultVal;\r
+ \r
+ if( X.UI.attrClassProto ){\r
+ attrs[ propID ] = v;\r
+ return; \r
+ }; \r
+\r
+ if( currentVal !== v ){\r
+ switch( propID ){\r
+ case X.UI.Attr.Support.left.No :\r
+ this.constraintW = attrs[ X.UI.Attr.Support.right.No ] !== null;\r
+ break;\r
+ case X.UI.Attr.Support.right.No :\r
+ this.constraintW = attrs[ X.UI.Attr.Support.left.No ] !== null;\r
+ break;\r
+ case X.UI.Attr.Support.top.No :\r
+ this.constraintH = attrs[ X.UI.Attr.Support.bottom.No ] !== null;\r
+ break;\r
+ case X.UI.Attr.Support.bottom.No :\r
+ this.constraintH = attrs[ X.UI.Attr.Support.top.No ] !== null;\r
+ break;\r
+ case X.UI.Attr.Support.width.No :\r
+ this.autoWidth = v === X.UI.Attr.AUTO;\r
+ this.percentWidth = X.Type.isString( v );\r
+ break;\r
+ case X.UI.Attr.Support.height.No :\r
+ this.autoHeight = v === X.UI.Attr.AUTO;\r
+ this.percentHeight = X.Type.isString( v );\r
+ break;\r
+ };\r