/************************ SLIDE SHOW FUNCTIONS ************************/

// handler for the slideshows (acts as an abstract factory function)
function slideShow(dom_container, dom_slides, previous, next, paging, has_link) {
	if($(dom_container) != undefined) {
		// Time between rotations
		wait = 5000;
		// determine the number of slideshow items and begin looping
		var slides = new getSlides('#' + dom_container + ' ' + dom_slides);
		if(has_link) {
			slides.divs.each(function(elm) {
				elm.next().observe('click', function() {followLink(elm.id);});
			});
		}
		
		
		// get pageing (either numbers, or thumnails)
		var slideshow_paging = null;
		if(paging != null) {
			var slideshow_paging = $$(paging);

			slideshow_paging.each(function(elm) {
				elm.observe('click', function(e) {goToSlide(elm, slideshow_paging, slides, timer); e.stop();});
			});
		}
		

		setInitialSlideState(slides);

		var timer = startSlideshow(slides, slideshow_paging, wait);

		$(previous).observe('click', function(e) {
			stopSlideshow(timer);
			swapFade(slides, 'prev');
			if(paging != null) {
				setNumSelected(slides, slideshow_paging);
			}
			e.stop();
		});
		$(next).observe('click', function(e) {
			stopSlideshow(timer);
			swapFade(slides, 'next');
			if(paging != null) {
				setNumSelected(slides, slideshow_paging);
			}
			e.stop();
		});
	}
}

// gets all the slides with a specific class name and returns an object.
function getSlides(slide_class) {
	this.divs = $$(slide_class);
	this.i = 0;
}

// set only the first slide visible and hide all others
function setInitialSlideState(slides) {
	slides.divs.each(function(elm, key) {
		if(key != 0) {
			elm.hide();
		}
	});
}

// the function that performs the fade
function swapFade(slides, direction) {
	if(direction == 'prev') {
		Effect.Fade(slides.divs[slides.i], {duration:0.5, from:1.0, to:0.0});
		slides.i--;
		if(slides.i < 0 ) {	
			slides.i = slides.divs.length - 1;
		}
		Effect.Appear(slides.divs[slides.i], {duration:0.5, from:0.0, to:1.0});
	} else {
		Effect.Fade(slides.divs[slides.i], {duration:0.5, from:1.0, to:0.0});
		slides.i++;
		if(slides.i == slides.divs.length) {	
			slides.i = 0;
		}
		Effect.Appear(slides.divs[slides.i], {duration:0.5, from:0.0, to:1.0});
	}
	return true;
}

// shows the current number as selected when that slide is showing
function setNumSelected(slides, nums) {
	if(slides.i == 0) {
		nums[slides.divs.length - 1].removeClassName("selected");
	} else {
		nums[slides.i - 1].removeClassName("selected");
	}
	nums[slides.i].addClassName("selected");
}

// sets a slide when it's number is clicked
function goToSlide(elm, nums, slides, timer) {
	slides.divs.invoke('hide');
	nums.each(function(e, key) {
		if(elm == e) {
			slides.divs[key].show();
			slides.i = key;
		}
	});
	nums.invoke('removeClassName', 'selected');
	elm.addClassName("selected");
	stopSlideshow(timer);
}

function followLink(link) {
	window.location.href=link;
}

function stopSlideshow(timer) {
	clearTimeout(timer);
}

function startSlideshow(slides, nums, delay) {
	// set initial state of paging
	if(nums != null) {
		setNumSelected(slides, nums);
	}
	return setInterval(function() {
		swapFade(slides);
		// is paging is turned set, then rotate through that as well.
		if(nums != null) {
			setNumSelected(slides, nums);
		}
	}, delay);
}

/******************** STAFF REVEAL/HIDE FUNCTIONS *********************/
function staffSliders() {
	setInitialStaffState();
	togglePersonnelSections();
	togglePersonnel();
}

function setInitialStaffState() {
	$$("ul.personnel .interior_info_box").invoke('hide');
	$$("ul.personnel").invoke('hide');
}

function togglePersonnelSections() {
	$$("#staff_list h2 a.expand").each(function(elm) {
		elm.observe('click', function(e) {
			var ul_id = elm.up().next('ul').identify();
			new Effect.toggle(ul_id, 'blind', {duration: 0.5});
			e.stop();
		});
	});
}

function togglePersonnel() {
	$$("#staff_list .personnel li a").each(function(elm) {
		elm.observe('click', function(e) {
			var div_id = elm.next('div.interior_info_box').identify();
			new Effect.toggle(div_id, 'blind', {duration: 0.5});
			e.stop();
		});
	});
}


/*************************** HEADER TOOLTIPS **************************/
function toggleToolTip() {
	$$("#mini-nav ul li img").each(function(elm) {
		elm.observe('mouseover', function(e) {
			var icon = elm.up().next().id;
			new Effect.Appear(icon, {duration:0.2});
		});
		elm.observe('mouseout', function(e) {
			var icon = elm.up().next().id;
			new Effect.Fade(icon, {duration:0.2});
		});
	});
}


/*************************** EVENT OBSERVERS **************************/

// when the dom has loaded, begin the slideshows
document.observe('dom:loaded', function() {slideShow('home_banner_inside', '.home-slide', 'arrow_prev', 'arrow_next', null, true);});
document.observe('dom:loaded', function() {slideShow('info_box_outside', '.info_box_inside', 'news_prev', 'news_next', '#update_nav .pages a', false);});

// when the dom has loaded, set the staff pages correctly
document.observe('dom:loaded', staffSliders);

// when the dom has loaded, set the tooltips to display on hover
document.observe('dom:loaded', toggleToolTip);
