var SL_Slider = new Class({

	//implements
	Implements: [Options],	
	
	//variables setup
	numNav: new Array(),		    //will store number nav elements (if used)
	timer: null,					//periodical function variable holder
	isSliding: 0,					//flag for animation/click prevention
	direction: 1,					//flag for direction (forward/reverse)
	repetitions: 2,					//how many times to loop
	currentrep: 0,
	donerepping:0,
	//options
	options: {
	slideTimer: 8000,  			    //Time between slides (1 second = 1000), a.k.a. the interval duration
	orientation: 'horizontal',      //vertical, horizontal, or none: None will create a fading in/out transition.
	fade: false,                    //if true will fade the outgoing slide - only used if orientation is != None
	isPaused: false,				//flag for paused state
	transitionTime: 1100, 		    //Transition time (1 second = 1000)
	transitionType: 'cubic:out',	//Transition type
	container: null,				//container element
	items:  null, 					//Array of elements for sliding
	itemNum: 0,						//Current item number
	numNavActive: false,			//Whether or not the number navigation will be used
	numNavHolder: null,			    //Element that holds the number navigation
	videoCloseBtns: null,					//Play (and pause) button element\
	pauseBtns: null,
	prevBtn: null,					//Previous button element
	nextBtn: null					//Next button element
	},

	//initialization
	initialize: function(options) {
		var self = this;
		
		//set options
		this.setOptions(options);
		
		//remove any scrollbar(s) on the container
		self.options.container.setStyle('overflow', "hidden");  
		

		//if there is a pause button, set up functionality for it
		//setup items (a.k.a. slides) from list
		self.options.pauseBtns.each(function(el, i){
			//self.pauseIt();  
			
			el.addEvents({
				'click': function() {
					self.pauseIt();
				},				
				'mouseenter' : function() {
					el.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
					
				}
			});
		})
		
		//if there is a pause button, set up functionality for it
		//setup items (a.k.a. slides) from list
		self.options.videoCloseBtns.each(function(el, i){
			//self.pauseIt();  
			
			el.addEvents({
				'click': function() {
					self.pauseIt();
					$('video' & i).setStyle('display','none');
					$('img' & i).setStyle('display','block');
					$('controls1').setStyle('display','block');
					$$('video#i# object').stopVideo();					
					
					//self.options.isPaused = false;
					//self.slideIt();
					//self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
				},				
				'mouseenter' : function() {
					el.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
					
				}
			});
		})		
				
		//if there is a prev & next button, set up functionality for them
		if(self.options.prevBtn && self.options.nextBtn){
			
			self.options.prevBtn.addEvents({ 
				'click' : function() {
					if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							//self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
							self.options.isPaused == true;
						}
						self.direction = 0;
						self.slideIt();
					}
				},
				'mouseenter' : function() {
					this.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
				
				}
			});	
			
			this.options.nextBtn.addEvents({ 
				'click' : function() {
					if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							//self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
							self.options.isPaused == true;
						}
						self.direction = 1;
						self.slideIt();
					}
				},
				'mouseenter' : function() {
					this.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
					
				}
			});	
		}
		
		//setup items (a.k.a. slides) from list
		self.options.items.each(function(el, i){
			  
			//f.y.i.  el = the element, i = the index
			
			// -- Number nav setup
			var numNav = $('num_nav'+i);
			if(self.options.numNavActive == true){
				//create numbered navigation boxes, and insert into the 'num_nav' ul)
				var numItem = $('num'+i);
				var numLink = $(numItem.getElement('a'));
				//var numLink = $('a', {
					//'class': 'numbtn',
					//'html': (i+1)
				//});
				//numItem.adopt(numLink);
				//self.options.numNavHolder.adopt(numItem);
				self.numNav.push(numLink);
				numLink.set('morph', {duration: 100, transition: Fx.Transitions.linear, link: 'ignore'});
				
				numLink.addEvents({
					'click' : function(){
						self.numPress(i);
					},
					'mouseenter' : function() {
						this.setStyle('cursor', 'pointer');
					}
				});
				
				//set initial number to active state
				if(i == self.options.itemNum){
					var initNum = self.numNav[i];
					initNum.addClass('active');
				}
			}
			//end if num nav 'active'
		
		 });

	
	},

	//startup method
	start: function() {
		
		var self = this;
		
		self.goTo(self.options.itemNum);  //initialize first slide
		self.options.prevBtn.set('opacity',.2);
		
		
		if(self.options.isPaused == false){
			self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
			if(self.options.playBtn) self.options.playBtn.set('text', 'pause');
		}
		else{
			//self.pauseIt();
			if(self.options.playBtn) self.options.playBtn.set('text', 'play');
		}
		
	},
	
	goTo: function(passedID) {
		var self = this;
		var tempTransitionTime = self.options.transitionTime;
		var tempTransitionType = self.options.transitionType;
		self.options.transitionTime = 1;
		self.options.transitionType = null;
		self.slideIt(passedID);
		self.options.transitionTime = tempTransitionTime;
		self.options.transitionType = tempTransitionType;
	},
	
	slideIt: function(passedID) {
		
		var self = this;
		
		//get item to slide out
		var curItem = self.options.items[self.options.itemNum]; 
		if(self.options.numNavActive == true){
			var curNumItem =  self.numNav[self.options.itemNum];
		}
		
		//check for passedID presence
		if(passedID != null) {
			if(self.options.itemNum != passedID){
				self.options.itemNum = passedID;
			}
		}
		else{
			self.changeIndex();	
		}
		
		
		//now get item to slide in using new index
		var newItem = self.options.items[self.options.itemNum];

		
		if(self.direction == 0){
			var curX = self.options.container.getSize().x;
			var newX = (-1 * newItem.getSize().x);
            var curY = self.options.container.getSize().y;
            var newY = (-1 * newItem.getSize().y);
		}
		else{
			var curX = (-1 * self.options.container.getSize().x);	
			var newX = newItem.getSize().x;
            var curY = (-1 * self.options.container.getSize().y);
            var newY = newItem.getSize().y;
		}
		//self.direction = 1;
		
		//add/remove active number's highlight
		if(self.options.numNavActive == true){
			var newNumItem =  self.numNav[self.options.itemNum];
			newNumItem.addClass('active');
		}
		if (self.options.itemNum == 0){
				self.options.prevBtn.set('opacity',.2);
				self.options.nextBtn.set('opacity',1);
		}
		else if (self.options.itemNum == (self.options.items.length - 1)){
				self.options.prevBtn.set('opacity',1);
				self.options.nextBtn.set('opacity',.2);
		}
		else {
				self.options.prevBtn.set('opacity',1);
				self.options.nextBtn.set('opacity',1);
		}	

		
		//set up our animation stylings
		var item_in = new Fx.Morph(newItem, {
		     duration: self.options.transitionTime, 
		     transition: self.options.transitionType,
		     link: 'ignore',
		     
		     onStart: function(){
				self.isSliding = 1;  //prevents extra clicks
			},
		     
		     onComplete: function(){
				self.isSliding = 0;  //prevents extra clicks
			}
		     
		});
		
		
		
        if(self.options.orientation == 'vertical'){
            if(self.options.fade == true){item_in.start({'opacity':[0,1],'top' : [newY, 0]});}
            else{item_in.start({'top' : [newY, 0]});}
        }else if(self.options.orientation == 'none') {
            item_in.start({'opacity':[0,1]});
        }else{
            if(self.options.fade == true){item_in.start({'opacity':[0,1],'left' : [newX, 0]});}
            else{item_in.start({'left' : [newX, 0]});}
        }
        
		
		if(curItem != newItem){
			var item_out = new Fx.Morph(curItem, {
				     duration: self.options.transitionTime, 
				     transition: self.options.transitionType,
				     link: 'ignore'
			});
			
			if(self.options.numNavActive == true){
				curNumItem.removeClass('active');
			}
			
            if(self.options.orientation == 'vertical'){
                if(self.options.fade == true){item_out.start({'opacity':[0],'top' : [(curY)]});}
                else{item_out.start({'top' : [(curY)]});}
            }else if(self.options.orientation == 'none') {
                item_out.start({'opacity':[1,0]});
            }else{
                if(self.options.fade == true){item_out.start({'opacity':[0],'left' : [(curX)]});}
                else{item_out.start({'left' : [(curX)]});}
            }
		}
		
	},
	
	
	//--------------------------------------------------------------------------------------------------------
	//supplementary functions  (mini-functions)
	//--------------------------------------------------------------------------------------------------------
	pauseIt: function () {
		
		var self = this;
		
		//only move if not currently moving
		if(self.isSliding == 0){
			//if(self.options.isPaused == false){
				self.options.isPaused = true;
				$clear(self.timer);
		//	}
		//	else{
		//		self.options.isPaused = false;
	//			self.slideIt();
	//			self.timer = self.slideIt.periodical(self.options.slideTimer, this, null); 
	//		}
			
		} //end if not sliding
		
	},
	
	changeIndex: function() {
		var self = this; 
		
		var numItems = self.options.items.length;  //get number of slider items

		
		if (self.options.itemNum == (numItems-1) && self.donerepping == 0){
				self.direction = 0;
		}	


		
		//change index based on value of 'direction' parameter
		if(self.direction == 1){
			if(self.options.itemNum < (numItems - 1)){
				self.options.itemNum++; 
			}
			else{
				self.options.itemNum = 0;
			}
		}
		else if(self.direction == 0){
			if(self.options.itemNum > 0){
				self.options.itemNum--; 
			}
			else{
				self.options.itemNum = (numItems - 1);
			}
		}

		if (self.options.itemNum == 0){
				self.options.prevBtn.set('opacity',.2);
				self.options.nextBtn.set('opacity',1);
		}
		else if (self.options.itemNum == (numItems - 1)){
				self.options.prevBtn.set('opacity',1);
				self.options.nextBtn.set('opacity',.2);
		}
		else {
				self.options.prevBtn.set('opacity',1);
				self.options.nextBtn.set('opacity',1);
		}	
		
		if(self.options.itemNum == 0 && self.donerepping == 0)
		{
			this.currentrep++;
		}
		if (this.currentrep == 1 && self.options.itemNum == 0 && self.options.isPaused == false && self.donerepping == 0){
			$clear(self.timer);
			self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
			self.donerepping = 1;
			self.options.itemNum = 0;
			this.pauseIt();
		}	

			
		
	},
	
	numPress: function (theIndex) {
		var self = this;
		self.donerepping = 1;
		if((self.isSliding == 0) && (self.options.itemNum != theIndex)){
			if(self.options.isPaused == false){
				$clear(self.timer);
				//self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
				self.options.isPaused == true;
			}
			if(self.options.itemNum < theIndex)
				self.direction = 1;
			else
				self.direction = 0;
			self.slideIt(theIndex);
		}
	}
	//------------------------  end supp. functions -----------------------------------------//

});



window.addEvent('domready', function() {
        
    
//slider variables for making things easier below
    var itemsHolder = $('slider');
    var myItems = $$(itemsHolder.getElements('.item'));
   
   
   //controls for slider
var theControls = $('controls1');
var numNavHolder = $(theControls.getElement('ul'));
var thePlayBtn = $(theControls.getElement('.play_btn'));
var thePrevBtn = $(theControls.getElement('.prev_btn'));
var theNextBtn = $(theControls.getElement('.next_btn')); 
var myPauseBtns = $$(itemsHolder.getElements('.sliderpause')); 
var myVideoCloseBtns = $$(itemsHolder.getElements('.videoclose')); 
    
    
//create instance of the slider, and start it up        
    var mySlider = new SL_Slider({
        slideTimer: 7000,
        orientation: 'horizontal',
        fade: false,
        isPaused: false,
        container: itemsHolder,
        items: myItems,
		numNavActive: true,
		numNavHolder: numNavHolder,
		videoCloseBtns: myVideoCloseBtns,
		pauseBtns: myPauseBtns,
		prevBtn: thePrevBtn,
		nextBtn: theNextBtn 
    });
    mySlider.start();
    $('controls1').setStyle('display','block');

            
});
