﻿$.indaco.i.factory({
    className: "Pager",
    methods: {
        init: function () {
            var self = this;
            this._addDelegates();
        }
        ,
        _addDelegates: function () {
            $('.main_content').on("click", ".btn-page,.btn-page_nav", $.indaco.__bind(
                this.evPager
            , this));
        }
        ,
        evPager: function (event) {

            event.preventDefault();
            var btn = $(event.currentTarget);
            if (!btn.data('page')) return;
            var section = btn.parents('section:first');

            // block element
            btn.parents('ol').find('span').addClass('preloader');

            var ajaxOpt = $.extend(true, {}, $.indaco.__ajax);

            //trigger
            ajaxOpt.trigger = btn;

            // data
            ajaxOpt.data = "page=" + btn.data('page');

            // url
            ajaxOpt.url = section.data('action');

            //success
            ajaxOpt.success = $.indaco.__bind(function (data) {
                this.ajaxPagerSuccess(data, ajaxOpt)
            }, this);

            // error
            ajaxOpt.error = $.indaco.__bind(
                this.ajaxPagerError
            , this);

            // complete
            ajaxOpt.complete = $.indaco.__bind(function (data) {
                this.ajaxPagerComplete(data, ajaxOpt)
            }, this);

            // ajax call
            $.ajax(ajaxOpt);
        }
        ,
        ajaxPagerSuccess: function (data, ajaxOpt) {

            if (data && data.status == "success") {
                var btn = ajaxOpt.trigger;
                var section = btn.parents('section:first');
                section.html(data.obj);

                //TODO: fix scroll
                $.indaco.h.scrollToElement(this.options.scrollTo);

                $('a.buy:not(".disabled"):not(".iButton")').iButton({
                    updateHtml: '#panel-cart',
                    urls: {
                        ajaxUrl: $('.main_body').data('carturl')
                    }
                });

                if (this.options.enableHistory && SimpleHistory.supported) {
                    SimpleHistory.pushState('?page=' + btn.data('page'));
                }

                return;
            }

            this.ajaxPagerError(data);

        }
        ,
        ajaxPagerError: function (data) {
            if (data.status) {
                humane.error([INDACO.resources.fatalErrorTryAgain, data.message]);
            } else {
                humane.error([INDACO.resources.fatalError, INDACO.resources.tryAgain, INDACO.resources.fatalErrorRefresh]);
            }
        }
        ,
        ajaxPagerComplete: function (data, ajaxOpt) {
            var btn = ajaxOpt.trigger;
            btn.parents('ol').find('span').removeClass('preloader');
        }
    }
});

(function (window, undefined) {

    window.SimpleHistory = {
        supported: !!(window.history && window.history.pushState),
        pushState: function (fragment) {
            history.pushState({}, null, fragment);
            this.notify();
        },
        replaceState: function (fragment) {
            history.replaceState({}, null, fragment);
            this.notify();
        },
        notify: function () {
            this.matcher(location.pathname + location.search);
        },
        start: function (matcher) {
            this.matcher = matcher;
            // delay binding to ignore first popstate event in Chrome
            setTimeout(function () {
                window.addEventListener("popstate", function () {
                    SimpleHistory.notify();
                }, false);
            }, 1);
            this.notify();
        }
    };

} (window));


