cmsss = {};

cmsss._effects = {'fade':'appear', 'slide':'slide', 'grow':'size'};
cmsss.slide_shows = [];

/** 
 * Slideshow Constructor
 */
cmsss.SlideShow = function(slide_show_div){
	this.slide_show_div = slide_show_div;
	this.playing = true;
	try{
		var duration_elem = getFirstElementByTagAndClassName('input', 'duration', slide_show_div);
		this.duration = duration_elem.value;
		var effect_elem = getFirstElementByTagAndClassName('input', 'duration', slide_show_div);
		this.effect = effect_elem.value;
	} catch (e){
		this.duration = 8;
		this.effect = fade;
	}
	
	this.current_slide = -1;
	this.current_slide_div = null;
	this.deferred = null;
	
	this.next_slide();
}

cmsss.SlideShow.prototype.stop_playing = function(){
	this.playing = false;
}

cmsss.SlideShow.prototype.clicked = function(e){
	this.stop_playing();
	this.next_slide()
}

cmsss.SlideShow.prototype.next_slide = function(slide){
	cmsss.next_slide(this, slide);
}

/**
 * Iterate to the next slide or loop to the beginning
 */	
cmsss.next_slide = function(slide_show, slide){
	if (slide == null || slide == 'undefined' || typeof(slide) == "undefined"){
		slide = slide_show.current_slide + 1;
	}
	slide = parseInt(slide);
	
	// Do nothing if we're on the same slide
	if (slide == slide_show.current_slide && slide_show.current_slide > 0){
		return;
	}
	
	if (this.deferred != null){
		this.deferred.cancel();
		this.deferred = null;
	}
	
	slides = getElementsByTagAndClassName('*', 'cms_slide_show_slide', slide_show.slide_show_div);
	if (slide >= slides.length){
		slide = 0;
	}
	
	var effects = [];
	slide_div = slides[slide];
	if (slide_show.current_slide_div != null){
		toggle(slide_show.current_slide_div, cmsss._effects[slide_show.effect], {'queue':'parallel', 'duration':0.75});	
	}
	
	toggle(slide_div, cmsss._effects[slide_show.effect], {'queue':'end', 'duration':0.75});
	slide_show.current_slide = slide;
	slide_show.current_slide_div = slide_div;	
	
	if (slide_show.playing){
		this.deferred = callLater(slide_show.duration, function(){slide_show.next_slide(slide_show.current_slide+1);});
	}
}


/**
 * Create the Numbered slide show widget.
 *
 * Overrides the clicked method and extends its super class
 */
cmsss.NumberedSlideShow = function(slide_show_div){
	slide_show = new cmsss.SlideShow(slide_show_div);
	slide_show.generate_numbers = this.generate_numbers;
	slide_show.position_numbers = this.position_numbers;
	slide_show.next_slide = this.next_slide;
	slide_show.clicked = this.clicked;
	return slide_show;
}

/**
 * Overrides next_slide to add updating the visible number box
 */
cmsss.NumberedSlideShow.prototype.next_slide = function(slide){
	cmsss.next_slide(this, slide);
	
	if (slide == null || slide == 'undefined' || typeof(slide) == "undefined"){
		slide = this.current_slide;
	}
	slide = parseInt(slide);
	var numbers = getElementsByTagAndClassName('*', 'cms_slide_show_number', this.numbers);
	forEach(numbers, function(number){
		removeElementClass(number, 'selected');
	});
	addElementClass(numbers[this.current_slide], 'selected');
}

/**
 * Overrides the SlideShow's clicked handler to accept a slide param
 */
cmsss.NumberedSlideShow.prototype.clicked = function(slide, e){
	this.playing=false;
	this.next_slide(slide);
}

cmsss.NumberedSlideShow.prototype.generate_numbers = function(){
	slide_show_div = this.slide_show_div;
	var slides = getElementsByTagAndClassName('*', 'cms_slide_show_slide', slide_show_div);
	var numbers = [];
	var i = 1; 
	for(i=1; i<=slides.length; i++){
		var number = SPAN({'class':'cms_slide_show_number ' + (i==1 && 'selected' || '')}, i);
		numbers.push(number);
		connect(number, 'onclick', bind(partial(this.clicked, i-1), this));
	};
		
	var numbers_div = DIV({'class':'numbers_container', 'style':'position:absolute'}, numbers);
	
	appendChildNodes(slide_show_div, numbers_div);
	this.numbers = numbers_div;
	
	this.position_numbers();
}

cmsss.NumberedSlideShow.prototype.position_numbers = function(){
	slide_show_div = this.slide_show_div;
	
	var slide_pos = getElementPosition(slide_show_div);
	var slide_dim = getElementDimensions(slide_show_div);
	
	var numbers_dim = getElementDimensions(this.numbers);
	var numbers_pos = Coordinates(slide_pos.x + 5,
									slide_pos.y + slide_dim.h - numbers_dim.h - 10);
	
	setElementPosition(this.numbers, numbers_pos);
}


addLoadEvent(function(){
	var slide_show_divs = getElementsByTagAndClassName('*', 'cms_slide_show_widget');
	forEach(slide_show_divs, function(slide_show_div){
		var slide_show_obj = new cmsss.SlideShow(slide_show_div);
		connect(slide_show_div, 'onclick', slide_show_obj, 'clicked');
		cmsss.slide_shows.push(slide_show_obj);
		appear(slide_show_div);
	});
	
	var numbered_slide_show = getElementsByTagAndClassName('*', 'cms_numbered_slide_show_widget');
	forEach(numbered_slide_show, function(slide_show_div){
		var slide_show_obj = new cmsss.NumberedSlideShow(slide_show_div);
		cmsss.slide_shows.push(slide_show_obj);
		appear(slide_show_div);
		// Defer this until the slideshow is visible so it has a position
		deferred = callLater(1.0, bind(slide_show_obj.generate_numbers, slide_show_obj));
	});	
});