/** @package eFocus js lib */

/**
 * newsline Class - creates and shows newslines and navigation
 *
 * @author Mirjam <mirjam[AT]efocus.nl>
 * @since 1.1, 24 mar, 2010
 * @copyright eFocus
 * @uses MooTools 1.2.4 Core <http://www.mootools.net>
 */

var newsline = new Class({

    Implements: Options,

        options: {
			intCurrentMessage: 0, 
			intFadeDuration: 500,
			intAutoPlayPause: 3500,
			messages: false,
			btnForward: false, 
			btnBack: false
	
    },

    initialize: function(options) {

        this.setOptions(options);
        this.create();

    },

    create: function() {

        this.setMessages();
        this.setNav();

    },
	
	 /**
	 * sets all messages to opacity 0, except first one
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setMessages: function() {

        this.options.messages.each(function(el) {
            el.set('opacity', 0);
        });

        this.options.messages[this.options.intCurrentMessage].set('opacity', 100);
		
		this.intTotalMessages = this.options.messages.length;
		this.intNewsLineHeight = 0;
		
		for (var i = 0; i < this.options.messages.length; i++) {
			if (this.options.messages[i].getStyle('height').toInt() > this.intNewsLineHeight) {
				this.intNewsLineHeight = this.options.messages[i].getStyle('height').toInt();
				this.options.messages[i].getParent('ul').setStyle('height', this.intNewsLineHeight);
			}
		}
		
		this.startAutoPlay();
		
    },
	
	/**
	 * specifies button actions
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setNav: function() {

        this.options.btnForward.addEvent('click', function(e) {
            e.stop();
            this.setNextMessage();
         }.bind(this));
       	
		this.options.btnBack.addEvent('click', function(e) {
            e.stop();
            this.setPreviousMessage();
         }.bind(this));
		
    },
	
	/**
	 * removes button actions
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
	removeNav: function() {
		
		this.options.btnForward.removeEvents('click'); 
		this.options.btnBack.removeEvents('click'); 
		
	},
	
	/**
	 * shows next message automatically
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 21 may 2010
	 *
	 * @return void
	 */
	 
	 startAutoPlay: function () {
		
		this.timer = this.setNextMessage.delay(this.options.intAutoPlayPause, this);
		
	 },
	 
	 /**
	 * stops autoplay
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 21 may 2010
	 *
	 * @return void
	 */
	 
	 pauseAutoPlay: function () {
		
		this.timer = $clear(this.timer);
		
	 },
	
	/**
	 * shows next message in array
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setNextMessage: function() {
       
       this.pauseAutoPlay();
       
       this.intNextMessage = this.options.intCurrentMessage + 1;
       if (this.intNextMessage >= this.intTotalMessages) {
			this.intNextMessage = 0;
	   }
       
	   this.removeNav();
        
       this.elFx = new Fx.Tween(this.options.messages[this.options.intCurrentMessage], {
			property: 'opacity',
			duration: this.options.intFadeDuration
		}).start(1,0).chain(function() {
			
			this.elFx = new Fx.Tween(this.options.messages[this.intNextMessage], {
				property: 'opacity',
				duration: this.options.intFadeDuration
			}).start(0,1);
			
			this.elFx.addEvents({
                'complete': function() {
					this.options.intCurrentMessage = this.intNextMessage; 
					this.setNav();
					this.startAutoPlay();
                } .bind(this)
            });
							
		} .bind(this));
		
    }, 
    
    /**
	 * shows previous message in array
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
    
    setPreviousMessage: function() {
       
       this.pauseAutoPlay();
       
       this.intNextMessage = this.options.intCurrentMessage - 1;
       if (this.intNextMessage < 0) {
			this.intNextMessage = this.intTotalMessages - 1;
	   }
	    
	   this.removeNav();
	    
       this.elFx = new Fx.Tween(this.options.messages[this.options.intCurrentMessage], {
			property: 'opacity',
			duration: this.options.intFadeDuration
		}).start(1,0).chain(function() {
			
			this.elFx = new Fx.Tween(this.options.messages[this.intNextMessage], {
				property: 'opacity',
				duration: this.options.intFadeDuration
			}).start(0,1);
			
			this.elFx.addEvents({
                'complete': function() {
					this.options.intCurrentMessage = this.intNextMessage; 
					this.setNav();
					this.startAutoPlay();
                } .bind(this)
            });
							
		} .bind(this));
		
    }

});