var HashListener = require('./hash-listener'); /** * Class to handle the URL. */ module.exports = { path: null ,_hash: null ,_hashMap: {} ,_listener: null ,initialize: function() { this.$ = this._hasMap; this._listener = new HashListener(); this._hashChangedHandler = this._hashChanged.bind(this); window.addEventListener('hashchange', this._hashChangedHandler); this._hashChanged(); } ,destroy: function() { window.removeEventListener('hashchange', this._hashChangedHandler); } ,getListener: function() { return this._listener; } /** * Gets the hash part of the URL. * * @param {string} key The variable name */ ,get: function(key) { return this._hashMap[key]; } /** * Unsets a hash key. * * @param {string} key The variable name */ ,unset: function(key) { this.add({[key]: undefined}); } /** * Sets the hash part of the URL, respecting the current hash variables. * * @param {Object} map A key-value map */ ,add: function(map) { var newMap = this._hashMap; for (var key in map) newMap[key] = map[key]; this.set(newMap); } /** * Sets the hash part of the URL. * * @param {Object} map A key-value map */ ,set: function(map) { if (map) for (var key in map) if (map[key] === null || map[key] === undefined) delete map[key]; var newHash = this.make(map); if (!map) map = {}; if (newHash !== this._hash) { this._hashMap = map; this.$ = map; this._hash = newHash; this._blockChanged = true; location.hash = newHash; this._blockChanged = false; this._listener.changed(); } } /** * Creates a URL with the given hash data. * * @param {Object} map A key-value map * @param {boolean} add %true to combine with the current map, %false otherwise * @return {String} The URL */ ,make: function(map, add) { var hash = '#!'; if (add && map) for (var key in this._hashMap) if (!map[key]) map[key] = this._hashMap[key]; for (var key in map) { if (hash.length > 2) hash += '&'; hash += encodeURIComponent(key) +'='+ encodeURIComponent(map[key]); } return hash; } ,_hashChanged: function() { var newHash = location.hash; if (this._blockChanged || newHash === this._hash) return; var newMap = hashMap = {}; var kvPairs = newHash.substring(2).split('&'); for (var i = 0; i < kvPairs.length; i++) { var kvPair = kvPairs[i].split('=', 2); if (kvPair[0]) newMap[decodeURIComponent(kvPair[0])] = decodeURIComponent(kvPair[1]); } this._hashMap = newMap; this.$ = newMap; this._hash = newHash; this._listener.changed(); } };