var menuSnake = new Class({
    Extends: jsCore.Base,

    elements: {},
    itemsDimension: {},
    snakeLocked: false,
    active: null,

    options: {
        'classes': {
            'snake': 'snake',
            'holder': 'js-holder'
        },
        'backing': 8
    },

    initialize: function (options) {
        this.parent(options);
        this.buildHTMLStucture();

       

        this.fxSlide = new Fx.Morph(this.elements.snake, {
            'link': 'cancel',
            'transition': Fx.Transitions.Pow.easeOut,
            'duration': 550
        });

        // Get active item
        this.active = this.getActiveItem();

        // Slide to active item if we leave menu panel
        this.elements.menu.addEvent('mouseleave', this.slide.bind(this, this.active, false));

        // Attach event's to make slide effect
        this.attachEvents();

        // Force slide to active item
        this.slide(this.active, true);
    },


    buildHTMLStucture: function () {
        this.elements.snake = new Element('DIV', {'class': this.iGet('class::snake')}).adopt(new Element('DIV'));
        this.elements.snake.inject(this.elements.menu);
    },

    attachEvents: function () {
        this.elements.menu.getElements('ul>li>a').each(function (item) {
            // Replace defined CSS rule
            item.addClass(this.iGet('class::holder'));
            // Create dimension cache
            this.itemsDimension[item.get('rel')] = item.getCoordinates(this.elements.menu);
            item.addEvents({
                'mouseenter': this.slide.bind(this, item.get('rel'), false),
                'click': function () {
                    this.snakeLocked = true;
                }.bind(this)
            });
        }, this);
    },

    getActiveItem: function () {
         return (this.elements.menu.getElement('ul>li>a.active') ? this.elements.menu.getElement('ul>li>a.active') : this.elements.menu.getElement('ul>li>a')).get('rel');
    },

    slide: function (section, force) {
        if (this.snakeLocked) return false;
        this.fxSlide[force ? 'set' : 'start'].call(this.fxSlide, {
            'left': this.itemsDimension[section].left - this.options.backing.toInt() / 2,
            'width': this.itemsDimension[section].width + this.options.backing
        });
    }
});
