/* NewsTicker */

var newsMarquee = Class.create({

    initialize: function(element, options) {
        this.element = $(element);
        this.innerDiv = this.element.down('div');
        this.options = {
            speed: 5,
            control: true
        };
        Object.extend(this.options, options || {});

        this.playScroll();
        if (this.options.control) {
            this.addObserver();
        }
    },

    addObserver: function() {
        this.element.observe('mouseover', this.pauseScroll.bind(this));
        this.element.observe('mouseout', this.playScroll.bind(this));
    },

    playScroll: function() {
        this.scrolling = true;
        this.startScroll();
    },

    pauseScroll: function() {
        if (this.timeout) {
            this.timeout.stop();
            this.scrolling = false;
        }
    },

    startScroll: function() {
        if (this.scrolling) {
            this.timeout = new PeriodicalExecuter(function() {
                this.executeScroll();
            } .bind(this), this.options.speed / 100);
        }
    }

});

var horizontalMarquee = Class.create(newsMarquee, {

    initialize: function($super, element, options) {
        $super(element, options);

        this.initialWidth = this.element.getWidth();
        this.childWidth = 0;
        this.childs = this.innerDiv.childElements();
        this.childs[0].style.paddingLeft = this.initialWidth + 'px';
        this.childs[this.childs.length - 1].style.paddingRight = this.initialWidth + 'px';
        this.childs.each(function(node) {
            this.childWidth += node.getWidth();
        } .bind(this)
 		)
        this.innerDiv.style.width = this.childWidth + 'px';
    },

    executeScroll: function() {
        if (this.element.scrollLeft > (this.element.scrollWidth - this.initialWidth)) {
            this.element.scrollLeft = 0;
        }
        this.element.scrollLeft = this.element.scrollLeft + 1;
    }

});

var verticalMarquee = Class.create(newsMarquee, {

    initialize: function($super, element, options) {
        $super(element, options);
        this.initialHeight = this.element.getHeight();
        this.innerDiv.style.paddingTop = this.initialHeight + 'px';
        this.innerDiv.style.paddingBottom = this.initialHeight + 'px';
    },

    executeScroll: function() {
        if (this.element.scrollTop >= (this.element.scrollHeight - this.initialHeight)) {
            this.element.scrollTop = 0;
        }
        this.element.scrollTop = this.element.scrollTop + 1;
    }

});
