/** @package eFocus js lib */

/**
 * Carousel Class - creates carousel
 *
 * @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 Carousel = new Class({

    Implements: Options,

        options: {
			intCurrentPosition: 0, 
			intScrollDistance: 0,
			intTotalWidth: 0,
			intViewPortWidth: 0,
			intTotalItems: 0,
			arrItems: false,
			elItemList: false,
			elViewport: false,
			btnForward: false, 
			btnBack: false,
			intTweenDuration: 200
	
    },

    initialize: function(options) {

        this.setOptions(options);
        this.create();

    },

    create: function() {
	
        this.setItems();
        this.setNav();

    },
	
	 /**
	 * sets all items to opacity 0, except first one
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setItems: function() {
		
        this.options.intTotalItems = this.options.arrItems.length;
		this.options.intTotalWidth = 0;
		
		this.options.arrItems.each(function(elItem, index) {
			
			if (index == 0) {
				this.options.elItemList = elItem.getParent('ul');
			}
			
			this.options.intScrollDistance = elItem.getSize().x.toInt() + elItem.getStyle('margin-left').toInt() + elItem.getStyle('margin-right').toInt();		
			this.options.intTotalWidth += elItem.getSize().x.toInt() + elItem.getStyle('margin-left').toInt() + elItem.getStyle('margin-right').toInt();
					
		}.bind(this));
		
		this.options.intViewPortWidth = this.options.elViewport.getSize().x.toInt();
		this.options.elItemList.setStyle('width', this.options.intTotalWidth);
				
    },
	
	/**
	 * specifies button actions
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setNav: function() {
		
		if (this.options.btnForward) {
			
			this.options.btnForward.addClass('inactive');
			
	       	if ((this.options.intCurrentPosition - this.options.intScrollDistance) > (0 - this.options.intTotalWidth + this.options.intViewPortWidth)) {
	     		 this.options.btnForward.removeClass('inactive');
	    	}
	        
			this.options.btnForward.removeEvents('click'); 
	        this.options.btnForward.addEvent('click', function(e) {
	            e.stop();
	            this.setNextItem();
	         }.bind(this));
       	}
       	
       	if (this.options.btnBack) {
			
			this.options.btnBack.addClass('inactive');
			
			if ((this.options.intCurrentPosition + this.options.intScrollDistance) <= 0) {
				this.options.btnBack.removeClass('inactive');	
			}
			
			this.options.btnBack.removeEvents('click'); 
			this.options.btnBack.addEvent('click', function(e) {
	            e.stop();
	            this.setPreviousItem();
	         }.bind(this));
	         
	    }
		
    },
	
	/**
	 * shows next item in array
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
	
    setNextItem: function() {
       
       if ((this.options.intCurrentPosition - this.options.intScrollDistance) > (0 - this.options.intTotalWidth + this.options.intViewPortWidth)) {
			
			this.options.intCurrentPosition -= this.options.intScrollDistance;	
			
			this.elFx = new Fx.Tween(this.options.elItemList, {
				property: 'left',
				duration: this.options.intTweenDuration
			}).start(this.options.intCurrentPosition);
				
			this.elFx.addEvents({
			    'complete': function() {
					this.setNav();
			    } .bind(this)
			});	
			
		}
		
    }, 
    
    /**
	 * shows previous item in array
	 *
	 * @author Mirjam <mirjam[AT]efocus.nl>
	 * @since 1.0, 26 mar 2010
	 *
	 * @return void
	 */
    
    setPreviousItem: function() {
       
       if ((this.options.intCurrentPosition + this.options.intScrollDistance) <= 0) {
			
			this.options.intCurrentPosition += this.options.intScrollDistance;	
		
			this.elFx = new Fx.Tween(this.options.elItemList, {
				property: 'left',
				duration: this.options.intTweenDuration
			}).start(this.options.intCurrentPosition);
				
			this.elFx.addEvents({
			    'complete': function() {
					this.setNav();
			    } .bind(this)
			});	
		
		}
	   
    }

});
