﻿var diaporamaproj = new Class({
    Implements: [Options],
    _slidesNumber: 0,
    _curSlideNum: 0,
    _inte: false,
    options: {
        container: false,
        duration: 1000,
        delay: 4000,
        eltpath: false,
        linkpath: false,
        linktonextpath: false,
        linktoprevpath: false,
        slideWidth: 750
    },
    initialize: function(options) {
        this.init(options);
        $(this.options.container).getElement("div.slides").setStyle('overflow', 'hidden');
        site.addHistoryEvent('diaporamaprojHistory', 'j');
        site.addEvent('diaporamaprojHistory', function(o) { this._moveTo(o.v % this._slidesNumber); } .bind(this));
        site.addEvent('diaporamaproj', function(i) { site.HM.set("j", i); this._stop(); this._moveTo(i); } .bind(this));
    },
    init: function(options) {
        this.setOptions(options);

        if (this._inte)
            $clear(this._inte);

        if (this.options.container && $(this.options.container).retrieve("fx"))
            $(this.options.container).eliminate('fx');

        this._curSlideNum = 0;
        if (!$(this.options.container) || !(this.options.eltpath))
            return;
        var imagesArr = $(this.options.container).getElements(this.options.eltpath);
        this._slidesNumber = imagesArr.length;
        if (this._slidesNumber == 0)
            return;

        if (this.options.linktonextpath) {
            $(this.options.container).getElements(this.options.linktonextpath).each(function(nextElt) {
                nextElt.addEvent('click', function() {
                    this._stop();
                    this._moveTo((this._curSlideNum + 1) % this._slidesNumber);
                } .bind(this))
            }, this);
        }
        if (this.options.linktoprevpath) {
            $(this.options.container).getElements(this.options.linktoprevpath).each(function(prevElt) {
                prevElt.addEvent('click', function() {
                    this._stop();
                    if (this._curSlideNum <= 0) {
                        this._moveTo(this._slidesNumber - 1);
                    }
                    else
                        this._moveTo(this._curSlideNum - 1);
                } .bind(this));
            }, this);
        }
        var fx = new Fx.Scroll($(this.options.container).getElement("div.slides"), { duration: this.options.duration, wheelStops: false });
        $(this.options.container).store("fx", fx);
        imagesArr.each(function(image, index) {
            image.set({ "rel": index });
        }, this);
        if (this.options.linkpath)
            this._hightlightLink();
        this._inte = this._moveNext.periodical(this.options.delay, this);
    },
    _stop: function() {
        if (this._inte)
            $clear(this._inte);
    },
    _moveNext: function() {
        this._moveTo((this._curSlideNum + 1) % this._slidesNumber);
    },
    _moveTo: function(slideNum) {
        if (slideNum == this._curSlideNum)
            return;
        $(this.options.container).retrieve("fx").cancel().start(slideNum * this.options.slideWidth, 0);
        this._curSlideNum = slideNum;
        if (this.options.linkpath)
            this._hightlightLink();
    },
    _hightlightLink: function() {
        $(this.options.container).getElements(this.options.linkpath).each(function(aElt, ind) {
            if (ind == this._curSlideNum) {
                aElt.addClass('active');
            }
            else {
                aElt.removeClass('active');
            }
        }, this);
    },
    destroy: function() {
        if (this._inte)
            $clear(this._inte);

        if (this.options.container && $(this.options.container).retrieve("fx"))
            $(this.options.container).eliminate('fx');
    }
});

