﻿var HistoryManagerControl = {
    index_: 1,
    cViewStates_: {},

    Init: function(el) {
        var className = (el.id);
        if (ControlManager.Exists(className)) {
            var ctrl = ControlManager.Get(className);
        }
        else {
            var ctrl = new BaseControl(
            el.dom.innerHTML,
            "",
            "",
            null,
            "action_" + Utils.GetControlName(el),
            this.CurrentPage,
            el
            );
        }
        ctrl.init();

        //this.HistoryManagerControl.InitializeHistory();        
        var token = this.GetHash();
        if (!Ext.isEmpty(token)) {
            HistoryManagerControl.FireOnCahnge(token);
        }
        
        return ctrl;
    },

    InitializeHistory: function() {
        // The only requirement for history manager to work is that you must have a hidden field and
        // an iframe available in the page with ids corresponding to Ext.History.fieldId
        // and Ext.History.iframeId.  See history.html for an example.

        Ext.History.add = Ext.History.add.createInterceptor(function(token, preventDupe) {
            if ((token - Ext.History.getToken()) > 1) {
                for (var i = parseInt(Ext.History.getToken()) + 1; i < token - 1; i++) {
                    HistoryManagerControl.Remove(i)
                }
            }
            var history_form = Ext.get("history-form");
            history_form.isAdding = true;
            return true;
        })

        Ext.History.init();

        Ext.History.on('change', function(token) {
            var history_form = Ext.get("history-form");

            if (history_form.isAdding) {
                history_form.isAdding = false;
            } else {
                HistoryManagerControl.FireOnCahnge(token);
            }
        });       
    },
    GetHash: function() {
        var href = top.location.href, i = href.indexOf("#");
        return i >= 0 ? href.substr(i + 1) : null;
    },
    FireOnCahnge: function(token) {
        if (HistoryManagerControl.CurrentPage) {
            token_str = new String(token);
            token_str = token_str.substr(0, token_str.length - 1);
            var tokens = "{" + token_str.replace(/\//g, "',").replace(/:/g, ":'") + "'}";
            var objTokens = Ext.decode(tokens);
            //Ext.getBody().mask();
            var fullActionName = "action_historyManager_ChangeState";
            var parameters = Ext.urlEncode(objTokens);
            AjaxProcessor.Request(
                    HistoryManagerControl.CurrentPage,
                    fullActionName,
                    parameters, null);
        }

    },
    AddStateOnNonHistoryResponse: function(actions, state) {

        var addHistory = true;
        for (var i = 0; i < actions.length; i++) {
            if (actions[i].Action == "updateHistoryGroup") {
                addHistory = false;
            }
        }
        if (addHistory) {
            var indx = HistoryManagerControl.Add(state);
        }

    },
    Add: function(params) {
        var params = Ext.decode(params);
        var hashQuery = "";
        for (var i in params) {
            hashQuery += i + ":" + params[i] + "/";
        }
        Ext.History.add(hashQuery);
    },

    GetIndex: function() {
        return HistoryManagerControl.index_;
    },

    Get: function(id) {
        if (HistoryManagerControl.Exists(id)) {
            return HistoryManagerControl.cViewStates_[id];
        }
        else {
            return null;
        }
    },

    Exists: function(id) {
        if (HistoryManagerControl.cViewStates_[id] != null) {
            return true;
        }
        else {
            return false;
        }
    },

    Remove: function(id) {
        if (HistoryManagerControl.Exists(id)) {
            delete HistoryManagerControl.cViewStates_[id];
        }
    }
};

Ext.onReady(HistoryManagerControl.InitializeHistory, HistoryManagerControl);
