File: src/StateManager/StateManager.js
(function(glesea) {
/**
stateManager object is for managing state changes using History API. Global single object.
@class glesea.stateManager
**/
/**
Gets current state of the stateManager
var state = glesea.stateManager.getState();
// When current location is http://localhost/menu?foo=bar
// { screen: '/menu', variables: { foo: bar } }
@method getState
@return Object with two keys, 'screen' is for URL path before ?, 'variables' is for serialized query string after ?.
@for glesea.stateManager
**/
/**
Push new state to the stateManager
var state = { screen: '/menu', variables: { foo: bar } };
glesea.stateManager.pushState(state);
// The location changes to http://localhost/menu?foo=bar
@method pushState
@param {Object} newState New state to push
@param {Boolean} isReset Whether to defaultize from existing state
@for glesea.stateManager
**/
/**
Relace new state to the stateManager
var state = { screen: '/menu', variables: { foo: bar } };
glesea.stateManager.replaceState(state);
// The location changes to http://localhost/menu?foo=bar
@method replaceState
@param {Object} newState New state to replace
@param {Boolean} isReset Whether to defaultize from existing state
@for glesea.stateManager
**/
/**
The event when any state change occurs
glesea.stateManager.onchangestate = function(newState) {
print(newState);
};
@method onchangestate
@param {Object} The new state changed
@for glesea.stateManager
**/
var StateManager = function() {
this.onchangestate = function() {};
this._initialize();
};
var _ = StateManager.prototype;
_._initialize = function() {
this._bindEvents();
};
_._bindEvents = function() {
var that = this;
window.onpopstate = function(e) {
that.onchangestate(e.state);
};
};
_.getState = function() {
return {
screen: document.location.pathname,
variables: window.deserializeURL(document.location.href)
};
};
_.pushState = function(newState, isReset) {
var nowState = this.getState();
if (newState.screen + window.serializeURL(newState.variables) === nowState.screen + window.serializeURL(nowState.variables)) {
return;
}
if (!isReset) {
newState = glesea.defaultize(this.getState(), newState);
}
window.history.pushState(newState, document.title, newState.screen + window.serializeURL(newState.variables));
this.onchangestate(newState);
};
_.replaceState = function(newState, isReset) {
var nowState = this.getState();
if (newState.screen + window.serializeURL(newState.variables) === nowState.screen + window.serializeURL(nowState.variables)) {
return;
}
if (!isReset) {
newState = glesea.defaultize(this.getState(), newState);
}
window.history.replaceState(newState, document.title, newState.screen + window.serializeURL(newState.variables));
this.onchangestate(newState);
};
glesea.stateManager = new StateManager();
})(glesea);