var Slider = new Class({

	Implements: [Options],	

	numNav: new Array(),
	bgNumNav: new Array(),		
	timer: null,				
	isSliding: 0,				
	direction: 1,				
	origColor: null,	

	options: {
		slideTimer: 8000,
		isPaused: 0,
		transitionTime: 1000,
		container: null,		
		items:  null, 				
		itemNum: 0,					
		hasControls: false,			
		numNavActive: false,		
		numNavHolder: null,			
		playBtn: null,				
		prevBtn: null,				
		nextBtn: null
	},

	initialize: function(options) {
				
		this.setOptions(options);
		this.options.container.setStyle('overflow', "hidden");  

		if(this.options.hasControls != false) {
			this.pauseIt.bind(this);  
			this.options.playBtn.set('text', 'pause');

			this.options.playBtn.addEvents({
				'click': function() {
					this.pauseIt();
				}.bind(this),				

				'mouseenter': function() {
					this.setStyle('cursor', 'pointer');
				}			

			});

			this.options.playBtn.addEvent('mouseenter', function() {this.setStyle('cursor', 'pointer');} );

		}

		this.options.items.each(function(el, i){

			el.setStyle('position', "absolute");			
			var itemH = el.getSize().y;
			var itemW = el.getSize().x;

			//el.setStyle('top', (-1 * itemH));
			if(i > 0) el.setStyle('opacity', 0);

			if( this.options.numNavActive ) {
				//var numItem = this.options.numNavHolder.getElement('#num' + i);
				var numItem = this.options.numNavHolder.getElements('li')[i];
				
				this.numNav.push(numItem);

				if ( i == this.options.itemNum ) {
					var initNum = this.numNav[i];
					initNum.addClass('active');				
				}		

				numItem.addEvents({
					'mouseover' : this.numPress.bindWithEvent(this, i),
					'mouseenter' : function() {
						this.setStyle('cursor', 'pointer');
					}
				});

			}

		 }, this);	

	},

	start: function() {
		this.slideIt(this.options.itemNum);
		this.theTimer = this.slideIt.periodical(this.options.slideTimer, this, null);
	},

	slideIt: function(passedID) {
		var curItem = this.options.items[this.options.itemNum]; 

		if(this.options.numNavActive){
			var curNumItem =  this.numNav[this.options.itemNum];
		}

		this.changeIndex();

		if(passedID != null) {
			if(this.options.itemNum != passedID) {
				this.options.itemNum = passedID;
			}
		}

		var newItem = this.options.items[this.options.itemNum];
		if (this.options.numNavActive) {
			var newNumItem 		=  this.numNav[this.options.itemNum];
		}	
		
		var item_in = new Fx.Morph(newItem, {
		    duration: this.options.transitionTime,
		    transition: 'cubic:inOut', 
		    link: 'ignore',
		    onStart: this.toggleSlidingOn.create({
				bind: this
			}),		     

		    onComplete: this.toggleSlidingOff.create({
				bind: this
			})		     

		});

		if (this.options.numNavActive) {
			newNumItem.addClass('active');
		}
		if (curItem != newItem) {
			item_in.start({
				'opacity':[0,1]
			});
		}

		if(curItem != newItem) {
			var item_out = new Fx.Morph(curItem, {
				     duration: this.options.transitionTime,
				     transition: 'cubic:inOut',
				     link: 'ignore'
			});		

			if(this.options.numNavActive) {			
				curNumItem.removeClass('active');				
			}			

			
			item_out.start({
				'opacity':[0]
			});

		}
	},

	pauseIt: function () {

		if(this.isSliding == 0) {

			if(this.options.isPaused == 0) {
				this.options.isPaused = 1;
				$clear(this.theTimer);
				this.options.playBtn.set('text', 'play');
			}

			else {
				this.options.isPaused = 0;
				this.slideIt();
				this.theTimer = this.slideIt.periodical(this.options.slideTimer, this, null); 
				this.options.playBtn.set('text', 'pause');
			}			

		}	

	},

	changeIndex: function() {
		var numItems = this.options.items.length;
		
		if(this.direction == 1){
			if(this.options.itemNum < (numItems - 1)){
				this.options.itemNum++; 
			}
			else{
				this.options.itemNum = 0;
			}
		}

		else if(this.direction == 0){
			if(this.options.itemNum > 0){
				this.options.itemNum--; 
			}
			else{
				this.options.itemNum = (numItems - 1);
			}
		}	

	},

	numPress: function (e, theIndex) {
	
		if((this.isSliding == 0) && (this.options.itemNum != theIndex)){
			if(this.options.isPaused == 0) {
				$clear(this.theTimer);
				this.theTimer = this.slideIt.periodical(this.options.slideTimer, this, null);
			}

			this.slideIt(theIndex);
		}

	},

	toggleSlidingOn: function () {
		this.isSliding = 1;
	},

	toggleSlidingOff: function () {
		this.isSliding = 0;
	}

});
