(function(){u8.Base.ComponentMixIn=function(){};$.extend(u8.Base.ComponentMixIn,{attr:function(e){if(this._isDisposed){return this}if(typeof e=="string"){if(arguments.length==1){return this[e]}var i={};i[e]=arguments[1];e=i}var t=false,n={},r,s,a=null;for(var o in e){r=e[o];if(o==="update"){a=r;continue}var u=o.toPascalCase();var h=this["get"+u];var f=h?h.apply(this):this[o];var l=f===r;if(l){continue}var p=this["set"+u];if(p){p.apply(this,[r])}else{this[o]=r;t=true}s={value:r,oldValue:f,propertyName:o};n[o]=s;if(p){continue}u8.Base.ComponentMixIn.raisePropertyChange.call(this,o,s)}if((t||a)&&this.update){this.update({reason:"attr",properties:$.extend(n,a)})}return this},bubble:function(e,i){if(!i){i={}}var t,n;var r=u8.services.commands.getTargets(this,u8._.trueish(e));var s=u8.debug.level>=400,a=true;while(r.length>0){n=r.shift();t=n&&n[e];if(!t){continue}if(s){if(a){u8.log.startGroup("actions","Bubble event '"+e+"'");a=false}u8.log.debug("actions","Calling '"+e+"' on "+u8.tools.typeName(n)+(n.id?" (#"+n.id+")":""))}t.call(n,this,i);if(i.stopPropagation){break}}if(!a){u8.log.endGroup()}return this},raisePropertyChange:function(e,t){var n=i(this,e);if(!n){return false}if(this.raise){this.raise(n,t)}else{this[n].raise(this,t)}return true},bindPropertyChange:function(t,n,r){$assert(r,"Missing argument 'id' in call to 'bindPropertyChange()'.");var s=i(this,t);if(!s){u8.log.warn("Failed to bind to property '"+t+"'. No event is available for this property on '"+u8.tools.typeName(this)+"'!");return this}if(this.bind){if(s=="PropertyChange"){this.bind("PropertyChange",e(n,t),r)}else{this.bind(s,n,r)}}else{if(s=="onPropertyChange"){this["onPropertyChange"].bind(e(n,t),r)}else{this[s].bind(n,r)}}},unbindPropertyChange:function(e,t){if(this._isDisposed){return this}var n=i(this,e);if(!n){return this}if(this.unbind){this.unbind(n,t)}else{this[n].unbind(t)}return this}});function e(e,i){return function(t,n){if(!n.propertyName||n.propertyName==i){e(t,n)}}}function i(e,i){if(e&&e.isRaising){if(typeof i=="string"){i=i.toPascalCase()+"Change";if(e.isRaising(i)){return i}}if(e.isRaising("PropertyChange")){return"PropertyChange"}}else{if(typeof i=="string"){i="on"+i.toPascalCase()+"Change";if(e[i]){return i}}if(e["onPropertyChange"]){return"onPropertyChange"}}return null}})();