/*
 * jQuery EasIng v1.1.2 - http://gsgd.co.uk/sandbox/jquery.easIng.php
 *
 * Uses the built In easIng capabilities added In jQuery 1.1
 * to offer multiple easIng options
 *
 * Copyright (c) 2007 George Smith
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

// t: current time, b: begInnIng value, c: change In value, d: duration

jQuery.extend( jQuery.easing,
{
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

	// ----------------- ************************ ----------------- //
	//   JQUERY SLIDESHOW - 1.0 
	//   writen by Kevin /DOT/ Jaako /AT/ webmedia /DOT/ ee
	//   for use with noConflict-style jQuery (object = JQ)
	// ----------------- ************************ ----------------- //



slideshow = function(vars) { //allow customization through vars

	// ---------------- global variables - set defaults ------------//
	
	this.automaticSlideshow = (vars["automatic"]) ? vars["automatic"] : 0; //auto advance?

	//times and speeds
	this.slideDuration = (vars["slideDuration"]) ? vars["slideDuration"] : 5000; //length of time each slide is displayed
	this.fastAnimationSpeed = (vars["fastAnimationSpeed"]) ? vars["fastAnimationSpeed"] : 350; 
	this.slowAnimationSpeed = (vars["slowAnimationSpeed"]) ? vars["slowAnimationSpeed"] : 1800;
	
	//DOM elements
	this.slideContainer = (vars["slideContainer"]) ? vars["slideContainer"] : ""; //class of wrapper div of all slides
	this.slideClassName = (vars["slideClassName"]) ? vars["slideClassName"] : ""; //common part of all slide classnames
	this.paginationContainer = (vars["paginationContainer"]) ? vars["paginationContainer"] : "";	//class of wrapper element of pagination links
	this.paginationLink = (vars["paginationLink"]) ? vars["paginationLink"] : "";	//pagination link
	
	this.timerObj = 0; //object to hold timeout instance
	this.currentSlide = 1; //default to slide 1	
	this.numberofSlides = 1; //number of slides (overridden later)

	// --------------------- slideshow methods ----------------------//

	this.buttonPushed = function(buttonID) {

		newSlide = buttonID; //put destination slide into newSlide (override later if "next" or "prev" was pushed)
		switch (buttonID) {
		case "next": //click next button
			newSlide = (this.currentSlide*1 < this.numberofSlides*1) ? newSlide = this.currentSlide*1+1 : newSlide = 1; break;
			
		case "prev": //click prev button
			newSlide =  (this.currentSlide*1 == 1) ? newSlide = this.numberofSlides : newSlide = this.currentSlide*1-1; break;
		}
		this.animateSlide(newSlide,this.fastAnimationSpeed); //call animateSlide() with newSlide, use fastAnimationSpeed for button presses.
		
	} // buttonPushed

	// --------------------------------------- 
	
	this.animateSlide = function(slideID,animationSpeed) {
		//perform slideshow animation
		
		slideID = parseInt(slideID);
				
		//set new and old slide nodeIDs
		oldSlide = JQ(this.slideClassName + this.currentSlide);
		newSlide = JQ(this.slideClassName + slideID);
		
		//set new and old button nodeIDs
		oldButton = JQ(this.paginationContainer + this.currentSlide);
		newButton = JQ(this.paginationContainer + slideID);
		
		if (slideID != this.currentSlide) {
			//do animation
			oldSlide.animate({"opacity":0},animationSpeed/2.5,function(){JQ(this).css({"display":"none"})});
			newSlide.css({"display":"block"}).animate({"opacity":1},animationSpeed,"easeOutQuad",function(){ JQ(this).css({"display":"block","opacity":1}) });		
			oldButton.removeClass("active");
			newButton.addClass("active");
		}
		this.currentSlide = slideID; //set currentSlide variable to use new slide
		
	} // animateSlide

	// ---------------------------------------
	
	this.slideshowTimer = function() {
		//when the auto-advance timer fires, advance to next slide
		newSlide = (this.currentSlide*1 < this.numberofSlides*1) ? this.currentSlide*1+1 : 1;
		this.animateSlide(newSlide, this.slowAnimationSpeed) //use slowAnimationSpeed for slide auto-advances
	}
			
 // ---------------------------------------

	this.init = function() {
		//initialize jQuery event hooks and set up variables and timers
		
		callback = this; //setup a callback variable to reference "this" for use inside dojo functions				

		JQ(document).ready(function() {		//init jQuery when DOM is ready
			slideCount = 0;
			//unhide all slides, set opacites to 0 (but leave slide 1 visible)			
			JQ(callback.slideContainer).each(function(node){
				JQ(this).css({"opacity": "0","display":"none"});
				JQ(this).removeClass("hidden");
				JQ(this).children("div").children("p").children("a").mouseover(function(){ clearInterval(callback.timerObj); callback.timerObj = null }).mouseout(function(){ if (!callback.timerObj) { 
							callback.timerObj = setInterval(function(){ callback.slideshowTimer(); }, callback.slideDuration) }});					
				slideCount++; //count slides
			});
			JQ(callback.slideClassName + "1").each(function(){
				JQ(this).css({"opacity": "1","display":"block"});
				JQ(this).removeClass("hidden");
			});

			callback.numberofSlides = slideCount;
			//set up event hooks for slideshow pagination links
			JQ(callback.paginationLink).each(function(node){
				JQ(this).click(function(e) {
					e.preventDefault(); //override default link behavior 
					nodeClass = JQ(this).parent().attr("class"); //get buttonID from CSS class of LI element
					buttonPushed = ((nodeClass != "prev") && (nodeClass != "next")) ? nodeClass.split("-")[1] : nodeClass; //don't split prev & next buttons
					callback.buttonPushed(buttonPushed);
				});
				if (callback.automaticSlideshow) { //if automatic slideshow, enable mouseOver/Out pause of slideshow timer
					JQ(this).mouseover(function(){ clearInterval(callback.timerObj); callback.timerObj = null });
					JQ(this).mouseout(function(){ if (!callback.timerObj) { 
						callback.timerObj = setInterval(function(){ callback.slideshowTimer(); }, callback.slideDuration) }});					
				}
			});
		
			if (callback.automaticSlideshow) {
				callback.timerObj = setInterval(function(){ callback.slideshowTimer(); },callback.slideDuration);
			}

	}); //end jQuery addOnLoad			
	} // init
	
// ---------------------------------------	
} // end of slideshow object
// ---------------------------------------

