﻿function StateHolder(hashSection, holder_selector, url) {
    this.hashSection = hashSection;
    this.holder_selector = holder_selector;
    this.url = url;
    this.defaults = {};
    this.state = { gsdfg: 1234 };
    this.beforeRenew = null;
    this.afterPageLoad = null;
}

StateHolder.prototype.bindToViewState = function () {
    var th = this;
    viewState.addListener(th.hashSection, function (obj, hash) {
        th.onNewState(obj);
    });
}

StateHolder.prototype.applyState = function (prm) {
    for (var i in prm)
        if (prm[i] && (!this.defaults[i] || this.defaults[i] != prm[i]))
            this.state[i] = prm[i];
}

StateHolder.prototype.loadState = function (prm) {
    this.state = prm;
}

StateHolder.prototype.renew = function () {
    if (this.beforeRenew)
        this.beforeRenew();

    this.getState();
    jQuery(this.holder_selector).load(this.url, this.state, this.afterPageLoad)
    return false;
}

StateHolder.prototype.show = function () {
    jQuery('#hpopup').hide();
    if (window.location.hash.replace('#', '') != this.hashSection) {
        this.getState();
        this.saveState();
        this.state.gdfsgdf = 434234;
    } else {
        this.renew();
    }
}
StateHolder.prototype.onNewState = function (prm) {
    if (!this.equalsToStoredState(prm)) {
        this.loadState(prm);
        this.renew();
    }
}

StateHolder.prototype.getState = function () {
    this.state = {};
}

StateHolder.prototype.saveState = function () {
    var s = "";
    for (var i in this.state)
        s += "&" + i + "=" + this.state[i];
    if (s.length > 0)
        s = s.substring(1);
    if (this.hashSection && this.hashSection != 'default')
        s = this.hashSection + (s && s.length > 0 ? "?" : "") + s;
    if (s.length > 0) {
        window.location.hash = s;
    }
}

StateHolder.prototype.equalsToStoredState = function (prm) {
    if (!prm || jQuery.param(prm).split('=').length != jQuery.param(this.state).split('=').length)
        return false;
    for (var i in prm)
        if (!this.state[i] || this.state[i] != prm[i])
            return false;
    return true;
}


//--------- ListBrowser ---------
function ListBrowser(holder_selector, url) {
    this.holder_selector = holder_selector;
    this.url = url;

    this.page = 0;
    this.sort = 0;
    this.rpp = 10;
    this.fltr = {};
    this.masterFilter = {};
    this.flterFormSelector = '#search_form';

    this.defaults = { sort: 0, page: 0, rpp: 10 };

    this.inProcess = false;
}

ListBrowser.prototype = new StateHolder(null, null, null);

ListBrowser.prototype.beforeChangePage = function () { };
ListBrowser.prototype.beforeChangeSort = function () { };
ListBrowser.prototype.beforeChangeRPP = function () { };
ListBrowser.prototype.beforeChangeFilter = function () { };

ListBrowser.prototype.getState = function () {
    this.state = {}

    this.applyState({
        page: this.page,
        sort: this.sort,
        rpp: this.rpp
    });

    this.applyState(this.fltr);
    this.applyState(this.masterFilter);
}

ListBrowser.prototype.loadState = function (prm) {
    if (this.defaults.sort)
        this.sort = this.defaults.sort;
    if (this.defaults.rpp)
        this.rpp = this.defaults.rpp;
    if (this.defaults.page)
        this.page = this.defaults.page;

    for (var i in this.defaults)
        if (this.masterFilter[i])
            this.masterFilter[i] = this.defaults[i];
    this.resetFilterForm();

    if (prm.sort) this.sort = prm.sort;
    if (prm.page) this.page = prm.page;
    if (prm.rpp) this.rpp = prm.rpp;

    var jform = jQuery(this.flterFormSelector);

    for (var i in prm) {
        this.inProcess = true;
        try {
            var jinpt = jform.find("input[name='" + i + "'],select[name='" + i + "']");
            if (jinpt.attr('type') == 'checkbox') {
                jinpt.attr('checked', false);
                if (jinpt.length == 1)
                    jinpt.attr('checked', true);
                else {
                    var vals = prm[i].split(',');
                    for (var j in vals)
                        if (vals[j] && vals[j].length > 0) {
                            var jcb = jinpt.each(function () {
                                if (this.value && this.value == vals[j])
                                    this.checked = true;
                            });
                        }
                }
            }
            else
                jinpt.val(prm[i]);
        }
        catch (e) {
            this.inProcess = false;
        }
        this.inProcess = false;

        for (var j in this.masterFilter)
            if (j == i)
                this.masterFilter[i] = prm[i];

    }
    this.getState();
    if (this.afterLoadState)
        this.afterLoadState();
}

ListBrowser.prototype.resetFilterForm = function () {
    if (!this.flterFormSelector) return false;
    var jform = jQuery(this.flterFormSelector);
    if (jform.length > 0) jform[0].reset();
    jform.find("input[type='checkbox']").attr('checked', false);
    for (var i in this.defaults)
        jform.find('[name="' + i + '"]').val(this.defaults[i]);
}

ListBrowser.prototype.setPage = function (page) {
    this.beforeChangePage();
    this.page = page;
    this.show();
    return false;
}

ListBrowser.prototype.setSort = function (sort) {
    this.beforeChangeSort(sort);
    this.sort = sort;
    this.show();
    return false;
}

ListBrowser.prototype.setRPP = function (rpp) {
    this.beforeChangeRPP(rpp);
    this.rpp = rpp;
    this.show();
    return false;
}


ListBrowser.prototype.setFilter = function () {
    this.beforeChangeFilter();
    this.applyFilter();
    this.show();
    return false;
}

ListBrowser.prototype.applyFilter = function () {
    if (!this.flterFormSelector) return false;
    this.fltr = {};
    var th = this;
    jQuery(this.flterFormSelector).find('input,select').each(function () {
        if (!this.name) return;
        if (this.type == 'checkbox') {
            if (this.checked) {
                var s = th.fltr[this.name] ? th.fltr[this.name] : "";
                if (s.length > 0) s += ',';
                s += this.value;
                th.fltr[this.name] = s;
            }
        } else {
            th.fltr[this.name] = this.value;
        }
    });
    var _hash = '';
    var k = 0;
    var l = th.fltr.length;

    for (var i in th.fltr) {
        if (k > 0) {
            _hash += '&';
        }
        _hash += i + '=' + th.fltr[i];
        k++;
    }
    window.location.hash = _hash;
}

ListBrowser.prototype.resetFilter = function () {
    this.resetFilterForm();
    this.fltr = {};
}

ListBrowser.prototype.init = function () {
    if (window.location.hash && window.location.hash.length > 1) {
        var state = viewState.getParams();
        this.loadState(state);
        this.afterInit();
    }
    this.applyFilter();
    this.getState();
    this.renew();
}

ListBrowser.prototype.afterLoadState = function () { }
ListBrowser.prototype.afterInit = function () {}
