﻿viewState = {
    currentHash: '#',
    hashListeners: {},
    updateInterval: null,
    addListener: function (name, listener) {
        if (!name || name == '')
            name = 'Default';
        viewState.hashListeners[name] = listener
    },
    inProcess: false,
    getParams: function (params) {
        if (!params) {
            var s = window.location.hash.replace('#', '');
            var parts = s.split('?');
            if (parts.length == 1)
                params = parts[0];
            else
                params = parts[1];
        }

        var parameters = {};
        var paramsCollection = params.split('&');
        for (var i in paramsCollection) {
            var name = paramsCollection[i].split('=')[0];
            var value = paramsCollection[i].split('=')[1];
            if (name && value) {
                parameters[name] = value;
            }
        }
        return parameters;
    },
    executeListener: function (key, params, hash) {
        var parameters = viewState.getParams(params);
        viewState.hashListeners[key](parameters, hash);
    },
    lookUp: function (hash) {
        var hashCollection = hash.replace('#', '');
        if (hashCollection.indexOf('?') < 0 && hashCollection.indexOf('=') < 0 && hashCollection.length > 0)
            hashCollection += '?';
        var parts = hashCollection.split('?');
        var key = 'Default';
        var params = parts[0];
        if (parts.length > 1) {
            key = parts[0];
            params = parts[1];
        }
        if (viewState.hashListeners[key])
            try {
                viewState.inProcess = true;
                viewState.executeListener(key, params, hash);
            }
            catch (e) {
                viewState.inProcess = false;
            }
            viewState.inProcess = false;
        },
    checkHash: function () {
        if (viewState.inProcess)
            return;
        var hash = window.location.hash;
        if (hash != viewState.currentHash) {
            viewState.currentHash = hash;
            viewState.lookUp(hash);
        }
    },
    track: function (freq) {
        viewState.updateInterval = setInterval(viewState.checkHash, freq);
    },
    untrack: function () {
        clearInterval(viewState.updateInterval);
    }
}
