API Docs for: 2.5.3
Show:

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);