/**
 * This script creates the galleries used in GenericFlatPages, People Pages and News pages. Slides
 * are stacked one on top of the other using absolute positioning and crossfade when the user navigates
 * between slides.
 */

var $GALLERY = {
	slides: null,
	currentIndex: -1,
	nextSlideButton: null,
	previousSlideButton: null,
	buttons: null,
	currentSlide: null,
	currentButton: null,
	init: initialize
};

/**
 * Must be able to configure:
- Arrows enabled.
- Buttons enabled.
- Element to which controls are added.
- Autoplay
- Specify existing elements as button controls (implies buttons enabled).
 */
function initialize(controlElementSelector, slideContainerSelector, buttonsEnabled, arrowsEnabled, buttonsList, showFirst, autoPlay){
	$GALLERY.slides = $(slideContainerSelector).children();
	initializeSlides();
	if(controlElementSelector) {
		$GALLERY.controlElement = $(controlElementSelector);
	}
	if(buttonsEnabled){
		createLabelledButtons();
		addButtonListeners();
	}
	if(arrowsEnabled){
		createArrowButtons();
		addArrowListeners();
	}
	if(buttonsList){
		$GALLERY.buttons = buttonsList;
		addButtonListeners();
	}
	if(showFirst){
		setIndex(0);
	}
	if(autoPlay){
		play();
	}
}

function initializeSlides(){
	$GALLERY.slides.hide(0);
}

function play(){
	setInterval("nextSlide()", 15000);
}

function nextSlide(){
	nextIndex = $GALLERY.currentIndex + 1;
	if(nextIndex >= $GALLERY.slides.size()){
		nextIndex = 0;
	}
	setIndex(nextIndex);
}

function createLabelledButtons() {
	controlsStr = "<ul>";
	var counter =0; 
	for(var i=0; i<$GALLERY.slides.size(); i++) {
		slide = $GALLERY.slides[i];
		slideTitles = $(slide).children("h1");
		if(slideTitles.size() > 0) {
			counter++;
			slideTitle = slideTitles[0];
			if(counter > 1){
				controlsStr += "<li><span class='separator gray'>/ </span>" + $(slideTitle).text() + "</li>";
			} else {
				controlsStr += "<li><span class='separator gray'>/ </span>" + $(slideTitle).text() + "</li>";
			}
		}
		else {
			controlsStr += "<li>" + (i+1) + "</li>";
		}
	}
	controlsStr +="</ul>"
	$GALLERY.controlElement.append(controlsStr);
	$GALLERY.buttons = $GALLERY.controlElement.find('li');
}

function addButtonListeners(){
	$GALLERY.buttons.hover(
		function(event) {
			if(!$(this).hasClass('controlSelected')){
				$(this).addClass("controlHover");
			}
		},
		function(event) {
			if(!$(this).hasClass('controlSelected')){
				$(this).removeClass("controlHover");
			}
		}
	).click(
		function(event) {
			selectedIndex = $GALLERY.buttons.index($(this));
			if(selectedIndex >= 0) {
				setIndex(selectedIndex);
			}
		}
	);
}

function createArrowButtons(){
	html = '<div id="galleryButtons">\
				<div id="nextScroller"></div>\
				<div id="prevScroller"></div>\
			</div>';
	$GALLERY.controlElement.append(html);
	$GALLERY.previousSlideButton = $('#prevScroller')[0];
	$GALLERY.nextSlideButton = $('#nextScroller')[0];
}

function addArrowListeners() {
	$('#galleryButtons').click(
		function(event) {
			if(event.target == $GALLERY.nextSlideButton) {
				setIndex($GALLERY.currentIndex+1);
			}
			if(event.target == $GALLERY.previousSlideButton) {
				setIndex($GALLERY.currentIndex-1);
			}
		}
	);
}
 
function setIndex(newIndex){
	newIndex = newIndex >= 0 ? Math.min(newIndex, $GALLERY.slides.size() -1) : 0;
	if(newIndex != $GALLERY.currentIndex){
		$GALLERY.currentIndex = newIndex;
		updateDisplay();
	}
}

function updateDisplay() {
	if($GALLERY.currentSlide) {
		$GALLERY.currentSlide.css("position","absolute");
		$GALLERY.currentSlide.hide();
		updateCurrentSlide();
	} else {
		updateCurrentSlide();
	}
	if($GALLERY.buttons){
		updateButtonStates();
	}
	if($GALLERY.previousSlideButton){
		// If one exsits, so does the other!
		updateArrowStates();
	}
}

function updateCurrentSlide() {
	$GALLERY.currentSlide = $($GALLERY.slides[$GALLERY.currentIndex]);
	$GALLERY.currentSlide.show();
}

function updateButtonStates(){
	if($GALLERY.currentButton){
		$GALLERY.currentButton.removeClass("controlHover");
		$GALLERY.currentButton.removeClass("controlSelected");
	}
	$GALLERY.currentButton = $($GALLERY.buttons[$GALLERY.currentIndex]);
	$GALLERY.currentButton.addClass("controlSelected");
}

function updateArrowStates() {
	if($GALLERY.currentIndex == 0) {
		setArrowState($($GALLERY.previousSlideButton), false);
		setArrowState($($GALLERY.nextSlideButton), true);
	} else if($GALLERY.currentIndex == $GALLERY.slides.size() -1){
		setArrowState($($GALLERY.previousSlideButton), true);
		setArrowState($($GALLERY.nextSlideButton), false);
	} else {
		setArrowState($($GALLERY.previousSlideButton), true);
		setArrowState($($GALLERY.nextSlideButton), true);
	}
}

function setArrowState(buttonElement, visible){
	if(visible){
		buttonElement.fadeTo(0, 1)
		buttonElement.css("cursor", "pointer");
	} else {
		buttonElement.fadeTo(0, 0.2);
		buttonElement.css("cursor", "default");
	}
}// JavaScript Document
