
IiiCarousel = {
    token: null,
    length: 10,
    queue: [],
    requests: [],
    requestsMax: 3,
    simofor: -1,
    tooltipPrimary: null,
    tooltipSecondary: null,
    nodeWithTooltip: null,
    updateDelay: 3000,
    rotateTimer: null,
    rotateDelay: 2000,
    rotateExpress: false,
    modeFrame: false,
    init: function() {
        var self = IiiCarousel;
        self.tooltipPrimary = $('<span/>').attr('class', 'carousel-tooltip').hide();
        self.tooltipSecondary = $('<span/>').attr('class', 'carousel-tooltip').hide();
        self.showTooltip();
        $('#carousel-button a[href=#]').click(self.showFormPayment);
        $('#carousel-infs img').mouseover(self.infMouseoverHandler);
        if (location.hash == '#carousel-form-payment') {
            self.showFormPayment();
        }
        window.setInterval(self.update, self.updateDelay);
        self.rotateTimer = window.setInterval(self.rotate, self.rotateDelay);
        $('#carousel-infs').hover(function() {
            window.clearInterval(self.rotateTimer);
        }, function() {
            self.rotateExpress = true;
            self.rotateTimer = window.setInterval(self.rotate, 1000);
        });
    },
    update: function() {
        var requests = IiiCarousel.requests;
        if (requests.length >= IiiCarousel.requestsMax) {
            return;
        }
        var request = $.ajax({
            url: '/carousel/update/token/' + IiiCarousel.token,
            dataType: 'json',
            success: function(data) {
                if (++IiiCarousel.simofor) {
                    return;
                }
                if (data.length) {
                    IiiCarousel.token = data[data.length - 1].id;
                    IiiCarousel.queue = IiiCarousel.queue.concat(data);
                }
                var requests = IiiCarousel.requests;
                if (requests.length > 1) {
                    for (var i = 0; i < requests.length; i++) {
                        requests[i].abort();
                    }
                }
                IiiCarousel.requests = [];
                IiiCarousel.simofor = -1;
            },
            complete: function(xhr, status) {
                var requests = IiiCarousel.requests;
                for (var i = 0; i < requests.length; i++) {
                    if (xhr == requests[i]) {
                        requests.splice(i, 1);
                        return;
                    }
                }
            }
        });
        requests.push(request);
    },
    rotate: function() {
        var self = IiiCarousel;
        if (!self.queue.length) {
            if (self.rotateExpress) {
                self.rotateExpress = false;
                window.clearInterval(self.rotateTimer);
                self.rotateTimer = window.setInterval(self.rotate, self.rotateDelay);
            }
            return;
        }
        var data = self.queue.shift();
        var items = $('#carousel-infs').children('div');

        /*
        var item = items.filter(':last');
        if (item.parent().width() - item.position().left >= 124) {
            //alert(item.parent().width() - item.position().left);
            return self.insert(data);
        }
        */
        
        if (items.length < self.length) {
            return self.insert(data);
        }
        var item = items.filter('[deleting!=1]:last').attr('deleting', '1');
        if (item[0] == self.nodeWithTooltip) {
            self.hideTooltip();
        }
        item.data('inf', data);
        item.hide('slow', function() {
            self.insert($(this).data('inf'));
            $(this).remove();
        });
    },
    insert: function(inf) {
        var link = inf.link, onclick = '';
        if (IiiCarousel.modeFrame) {
            onclick = ' onclick="window.parent.location = \'' + link + '\'; return false;"';
            link = '#';
        }
        var html = '<div style="display: none;" name="' + inf.name + '" text="' + inf.text + '">'
                 + '<a href="' + link + '"' + onclick + '><img src="' + inf.image + '" alt="" /></a>'
                 + '</div>';
        $('#carousel-infs').prepend(html).children(':first').show('slow', IiiCarousel.showTooltip)
            .find('img').mouseover(IiiCarousel.infMouseoverHandler);
    },
    infMouseoverHandler: function() {
        IiiCarousel.showTooltip($(this).parent().parent());
    },
    showTooltip: function(elem) {
        var self = IiiCarousel;
        elem = elem || $('#carousel-infs div:first');
        if (!elem.length || elem[0] == self.nodeWithTooltip) {
            return;
        }
        self.nodeWithTooltip = elem[0];
        self.tooltipPrimary.stop(true);
        var html = '<span class="carousel-tooltip-box"><b>' + elem.attr('name') + '</b><span>' + elem.attr('text') + '</span></span>';
        if (self.tooltipPrimary.is(':hidden')) {
            elem.after(self.tooltipPrimary.html(html));
            self.tooltipPrimary.show(200);
            return;
        }
        elem.after(self.tooltipSecondary.html(html));
        self.tooltipSecondary.css({width: 0, height: 0}).show();
        self.tooltipPrimary.animate({width: 0, height: 0}, {
            duration: 200,
            step: function(now, elem) {
                if (!$.browser.mozilla) {
                    now = Math.floor(now);
                }
                elem.prop == 'width' ? self.tooltipSecondary.width(152 - now) : self.tooltipSecondary.height(84 - now);
            },
            complete: function() {
                var buf = self.tooltipPrimary;
                self.tooltipPrimary = self.tooltipSecondary;
                self.tooltipSecondary = buf;
            }
        });
    },
    hideTooltip: function() {
        var self = IiiCarousel;
        self.tooltipPrimary.stop(true).hide();
        self.tooltipSecondary.hide();
    },
    showFormPayment: function() {
        $.ajax({
            url: '/carousel/form-payment/',
            complete: function(xhr) {
                var html = xhr.responseText || '<h1>' + _('Ошибка') + '</h1>';
                $.prompt(html, {
                    useiframe: false,
                    top: '25%',
                    classes: 'carousel-popup',
                    buttons: {}
                });
                IiiCarousel.initFormPayment();
            }
        });
        return false;
    },
    reloadFormPayment: function() {
        $.ajax({
            url: '/carousel/form-payment/',
            complete: function(xhr) {
                var html = xhr.responseText || '<h1>' + _('Ошибка') + '</h1>';
                $('div.jqimessage').html(html);
                IiiCarousel.initFormPayment();
            }
        });
        return false;
    },
    initFormPayment: function() {
        $('.infselector a', '#carousel-form-payment').eq(0).click();
        $('#carousel-form-account-add').click(function(event) {
            if (typeof IiiPayment != 'object') {
                return;
            }
            event.preventDefault();
            IiiPayment.open(function() {
                IiiCarousel.showFormPayment();
            });
            IiiCarousel.hideFormPayment();
        });
    },
    hideFormPayment: function() {
        $.prompt.close();
    },
    submitFormPayment: function() {
        $('#carousel-form-payment a').attr('onclick', 'return false;');
        var form = $('div.jqimessage form');
        $.ajax({
            type: 'POST',
            url: form.attr('action'),
            data: form.serialize(),
            complete: function(xhr) {
                var html = xhr.responseText || '<h1>' + _('Ошибка') + '</h1>';
                $('div.jqimessage div.buttons').html(html);
            }
        });
    }
};
$(IiiCarousel.init);

