LI.define("BaseControl");
LI.BaseControl=Fiber.extend(function(){return{init:function(a,c){var b=this,d=new $.Deferred,e=function(a){var b=_.functions(a);_.each(b,function(b){a[b]=_.bind(a[b],a)})};this._$el=$(a);this._observableEmitter=$({});this._state={};this._config=this._config||c||{};this.isReady=d.promise();this.beforeInit();this.beforeDecoration();this.decorate().pipe(function(){e(b)}).pipe(function(){b.afterDecoration()}).pipe(function(){b.beforeLoad()}).pipe(function(){if(b._config.dependencies)return b.loadDependencies()}).pipe(function(a){b.afterLoad(a)}).pipe(function(){b.attachEventListeners()}).pipe(function(){b.afterInit()}).pipe(function(){d.resolve()})},destroy:function(){this.detachEventListeners()},
state:function(a,c,b){var d=[].slice.call(arguments,0),e,g={},f=[],h=null;if("undefined"===typeof d[1]){if("undefined"===typeof d[0]){for(e in this._state)this._state.hasOwnProperty(e)&&(g[e]=this._state[e].value);return g}if("string"===typeof d[0])return this._state.hasOwnProperty(d[0])?this._state[d[0]].value:b}if("object"===typeof d[0])for(e in d[0])!d[0].hasOwnProperty(e)||!d[1]&&this._state.hasOwnProperty(e)||(this._setState(e,d[0][e]),f.push(e));"string"===typeof d[0]&&(this._setState(d[0],
d[1]),f.push(d[0]));d=0;for(e=f.length;d<e;d++)h=this._state[f[d]],this._observableEmitter.trigger(f[d],{newValue:h.value,oldValue:h.lastValue,revision:h.rev})},_setState:function(a,c){"undefined"===typeof this._state[a]?this._state[a]={rev:0,value:c,lastValue:void 0}:(this._state[a].rev++,this._state[a].lastValue=this._state[a].value,this._state[a].value=c)},observe:function(a,c){this._observableEmitter.on(a,c);return this},unobserve:function(a,c){this._observableEmitter.off(a,c);return this},beforeInit:function(){},
beforeDecoration:function(){},decorate:function(){return this._config.decorators?this.loadDependencies(this._config.decorators).pipe(_.bind(this._applyDecorators,this)):$.Deferred().resolve().promise()},_applyDecorators:function(a){_.each(this._config.decorators,function(c){if("function"!==typeof a(c))throw new TypeError("Decorator ("+c+") is not a function");Fiber.decorate(this,a(c))},this)},afterDecoration:function(){},beforeLoad:function(){},afterLoad:function(){},attachEventListeners:function(){},
detachEventListeners:function(){},afterInit:function(){},onResolve:function(){},before:function(a,c){var b=this;this.isReady.pipe(function(){b[a]=_.wrap(b[a],function(a){var e=Array.prototype.slice.apply(arguments,[1]);"string"===typeof c?b[c].apply(b,e):c.apply(b,e);return a.apply(b,e)})})},after:function(a,c){var b=this;this.isReady.pipe(function(){b[a]=_.wrap(b[a],function(a){var e=Array.prototype.slice.apply(arguments,[1]),g=a.apply(b,e);"string"===typeof c?b[c].apply(b,e):c.apply(b,e);return g})})},
clobber:function(a,c){var b=this;this.isReady.pipe(function(){b[a]=_.bind(c,b)})},loadDependencies:function(a){var c=new $.Deferred;a=a||this._config.dependencies||[];require.ensure(a,function(a){c.resolve(a)});return c.promise()},loadCss:function(a){var c=new $.Deferred;require.ensure(a,function(b){_.each(a,function(a){b(a).attach()});c.resolve()});return c.promise()}}});