/* Backbone.Statemanager, v 0.0.7 Copyright (c)2014 Patrick Camacho, Mark Roseboom, Crashlytics Distributed under MIT license https://github.com/crashlytics/backbone.statemanager */ (function(){var t;t=function(t,e){var n,r;if(!t)throw new ReferenceError("Backbone required");if(!e)throw new ReferenceError("Underscore required");return n=function(t,e){return this.options=null!=e?e:{},this.states=new n.States(t),this},n.extend=t.View.extend,e.extend(n.prototype,t.Events,{getCurrentState:function(){return this.currentState},addState:function(t,e){return this.states.add(t,e),this.trigger("add:state",t)},removeState:function(t){return this.states.remove(t),this.trigger("remove:state",t)},initialize:function(t){var e;return null==t&&(t={}),(e=this.states.findInitial())?this.triggerState(e,t):void 0},triggerState:function(t,n){return null==n&&(n={}),t!==this.currentState||n.reEnter?(e.extend(n,{toState:t,fromState:this.currentState}),this.currentState&&this.exitState(n),this.enterState(t,n)):!1},enterState:function(t,n){var r,i,a;return null==n&&(n={}),(r=this.states.find(t))&&e.isFunction(r.enter)?(this.trigger("before:enter:state",t,r,n),"function"==typeof(i=r.findTransition("onBeforeEnterFrom",n.fromState))&&i(n),r.enter(n),"function"==typeof(a=r.findTransition("onEnterFrom",n.fromState))&&a(n),this.trigger("enter:state",t,r,n),this.currentState=t,this):!1},exitState:function(t){var n,r,i;return null==t&&(t={}),(n=this.states.find(this.currentState))&&e.isFunction(n.exit)?(this.trigger("before:exit:state",this.currentState,n,t),"function"==typeof(r=n.findTransition("onBeforeExitTo",t.toState))&&r(t),n.exit(t),"function"==typeof(i=n.findTransition("onExitTo",t.toState))&&i(t),this.trigger("exit:state",this.currentState,n,t),delete this.currentState,this):!1}}),n.States=function(t){return this.states={},t&&e.isObject(t)&&e.each(t,function(t){return function(e,n){return t.add(n,e)}}(this)),this},e.extend(n.States.prototype,{add:function(t,r){return e.isString(t)&&e.isObject(r)?this.states[t]=new n.State(t,r):!1},remove:function(t){return e.isString(t)?delete this.states[t]:!1},find:function(t){return e.isString(t)?e.chain(this.states).find(function(e){return e.matchName(t)}).value():!1},findInitial:function(){var t;return null!=(t=e.find(this.states,function(t){return t.initial}))?t.name:void 0}}),n.State=function(t,r){return this.name=t,e.extend(this,r),this.regExpName=n.State._regExpStateConversion(this.name),this},e.extend(n.State.prototype,{matchName:function(t){return this.regExpName.test(t)},findTransition:function(t,r){return this.transitions&&e.isString(r)&&e.isString(t)?e.find(this.transitions,function(e,i){var a;return 0===i.indexOf(""+t+":")?(i=i.slice((a=i.indexOf(":not:")===t.length)?t.length+5:t.length+1),n.State._regExpStateConversion(i).test(r)!==a):void 0}):!1}}),n.State._regExpStateConversion=function(t){return t=t.replace(/[-[\]{}()+?.,\\^$|#\s]/g,"\\$&").replace(/:\w+/g,"([^/]+)").replace(/\*\w+/g,"(.*?)"),new RegExp("^"+t+"$")},n.addStateManager=function(n,i){var a,s;return null==i&&(i={}),n||new Error("Target must be defined"),s=e.result(n,"states"),r(s,n),a=new t.StateManager(s,i),n.stateManager=a,n.triggerState=e.bind(a.triggerState,a),n.getCurrentState=function(){return a.getCurrentState()},(i.initialize||e.isUndefined(i.initialize))&&a.initialize(i),delete n.states},r=function(t){var n;return n=e.last(arguments),e.each(t,function(i,a){return e.isFunction(i)?t[a]=e.bind(i,n):e.isObject(i)?t[a]=r(i,n):void 0}),t},t.StateManager=n},function(t,e){var n,r,i;return"function"==typeof define&&define.amd?define(["backbone","underscore"],function(t,n){return e(t,n)}):"undefined"!=typeof exports?(n=require("backbone"),i=require("underscore"),r=e(n,i),"undefined"!=typeof module&&module.exports?module.exports=r:exports.StateManger=r):t.StateManager=e(t.Backbone,t._)}(this,t)}).call(this);