﻿/* Javascript by Daniel Cohen Gindi (c) danielgindi@gmail.com 054-5655765 */
/* Version: 2011-03-30 */

function contentAutoMenu(options) {
    return this.init(options);
}

contentAutoMenu.prototype = {
    init: function(options) {
        var self = this;
        var o = self.o = dgTools.extend(
            {},
            'menu content menuItemTag menuItemClass menuItemClassSelected contentTag contentClass delay autoStart currentIndex animationDuration animationFps',
            options,
            { currentIndex: 0, menuItemTag: 'li', contentTag: 'li', delay: 3000, autoStart: true, centerInParent: false, animationDuration: 500, animationFps: 50 }
        );
        o.menuItemTag = (o.menuItemTag || '').toUpperCase();
        o.contentTag = (o.contentTag || '').toUpperCase();

        var el = dgTools.$(o.menu);
        if (!el) return null;
        o.menuItems = [];
        var els = el.getElementsByTagName(o.menuItemTag);
        for (var i = 0; i < els.length; i++) {
            if (!!o.itemClass && els[i].className !== o.menuItemClass) continue;
            o.menuItems.push(els[i]);
        }

        el = dgTools.$(o.content);
        if (!el) return null;
        o.contentItems = [];
        els = el.getElementsByTagName(o.contentTag);
        for (var i = 0; i < els.length; i++) {
            if (!!o.itemClass && els[i].className !== o.contentClass) continue;
            o.contentItems.push(els[i]);
        }
        els = null;

        o.menuItems.iterate(function(item, idx) {
            dgTools.hover(item, function() {
                self._isHover = true;
                self.changeTo(idx);
            }, function() {
                self._isHover = false;
            });
        });

        o.contentItems.iterate(function(item, idx) {
            item.style.position = 'absolute';
            item.style.left = '0px';
            item.style.top = '0px';
            if (idx > 0) dgTools.Elm.hide(item);
        });

        if (self.o.autoStart) self.start();
    },
    start: function() {
        var self = this;
        if (!self.o.delay || self.o.delay <= 0 || self._started || self.o.menuItems.length <= 1 || self.o.menuItems.length != self.o.contentItems.length) return false;
        else {
            self._started = true;
            function sw() {
                var nextIdx = self.o.currentIndex + 1;
                if (nextIdx >= self.o.menuItems.length) nextIdx = 0;
                if (!self._isHover) {
                    self.changeTo(nextIdx, function() {
                        if (self._started) self._curTimeout = setTimeout(sw.bind(self), self.o.delay);
                    });
                }
                else setTimeout(sw.bind(self), self.o.delay);
            }
            self._curTimeout = setTimeout(sw.bind(self), self.o.delay);
        }
        self._startedTmp = false;
    },
    stop: function() {
        var self = this;
        self._stop();
        self._startedTmp = false;
    },
    _stop: function() {
        var self = this;
        if (!self._started) return;
        if (self._curTimeout) clearTimeout(self._curTimeout);
        self._started = false;
    },
    changeTo: function(idx, changeFinished) {
        var self = this;

        if (idx >= self.o.menuItems.length) idx = 0;
        if (idx < 0) idx = self.o.menuItems.length - 1;
        if (idx == self.o.currentIndex) return;

        self._startedTmp = self._startedTmp || self._started;
        if (self._started) self._stop();

        if (self._curAnim1) { self._curAnim1.stop(); self._curAnim1 = null; }
        if (self._curAnim2) { self._curAnim2.stop(); self._curAnim2 = null; }
        if ($isNumber(self.o.prevIdx)) {
            dgTools.Elm.hide(self.o.contentItems[self.o.prevIdx]);
            self.o.prevIdx = null;
        }

        self.o.prevIdx = self.o.currentIndex;
        self.o.currentIndex = idx;

        if (self.o.menuItemClassSelected) {
            if ($isNumber(self.o.prevIdx)) dgTools.Elm.removeClassName(self.o.menuItems[self.o.prevIdx], self.o.menuItemClassSelected);
            dgTools.Elm.addClassName(self.o.menuItems[self.o.currentIndex], self.o.menuItemClassSelected);
        }

        var pc = self.o.contentItems[self.o.prevIdx];
        var c = self.o.contentItems[self.o.currentIndex];
        c.style.zIndex = '2';
        pc.style.zIndex = '1';
        dgTools.Elm.setOpacity(c, 0);
        dgTools.Elm.show(c);
        self._curAnim1 = dgTools.easyAnimate(c, null, { opacity: 1 }, self.o.animationDuration, self.o.animationFps,
                    function() {
                        var elp = self.o.menuItems[self.o.prevIdx];
                        var el = self.o.menuItems[self.o.currentIndex];
                        self.o.prevIdx = null;
                        if (changeFinished) changeFinished();
                        if (self._startedTmp) {
                            self.start();
                        }
                    });
        self._curAnim2 = dgTools.easyAnimate(pc, null, { opacity: 0 }, self.o.animationDuration, self.o.animationFps,
                    function() { dgTools.Elm.hide(pc); });
    }
}
