var FSM={};FSM.Machine=function(data){this._state_transitions={};this._state_transitions_any={};this._default_transition=null;this._initial_state=null;this._current_state=null;this.data=data;}
FSM.Machine.prototype.set_initial_state=function(state){this._initial_state=state;if(this._current_state===null){this.reset();}}
FSM.Machine.prototype.reset=function(){this._current_state=this._initial_state;}
FSM.Machine.prototype.add_transition=function(action,state,next_state,callback){if(!next_state){next_state=state;}
this._state_transitions[[action,state]]=[callback,next_state];}
FSM.Machine.prototype.add_transitions=function(action_list,state,next_state,callback){if(!next_state){next_state=state;}
for(var i=0;i<action_list.length;i++){this.add_transition(action_list[i],state,next_state,callback);}}
FSM.Machine.prototype.add_transition_any=function(state,next_state,callback){if(!next_state){next_state=state;}
this._state_transitions_any[state]=[callback,next_state];}
FSM.Machine.prototype.set_default_transition=function(state,callback){this._default_transition=[callback,state];}
FSM.Machine.prototype.get_transition=function(action,state){if(this._state_transitions[[action,state]]){return this._state_transitions[[action,state]];}else if(this._state_transitions_any[state]){return this._state_transitions_any[state];}else if(this._default_transition){return this._default_transition;}else{throw Error('Transition is undefined: ('+action+', '+state+')');}}
FSM.Machine.prototype.get_current_state=function(){return this._current_state;}
FSM.Machine.prototype.process=function(action){result=this.get_transition(action,this._current_state);if(result[0]){result[0].call(this,action);}
this._current_state=result[1];}