$.easing.customEase = function (x, t, b, c, d) {
	return (t==d) ? b+c : c * (-Math.pow(2, -15 * t/d) + 1) + b;
}
var slideshow = {
	backSpeed:1000,
	midSpeed:1000,
	frontSpeed:1000,
	$window: $(window),
	$slideshow: null,
	$slider: null,
	$slides: null,
	$pageBtns: null,
	$arrows: null,

	slideWidth: $(window).width(),
	currentSlide: 0,
	previousSlide: 0,
	updateTimer: null,
	numOfSlides: null,
	slideTimeout:null,
	easingFunction:'cubic-bezier(.42,0,.58,1)',
	
	slides: [],

	init: function () {
		
		this.$slideshow = $('#slideshow');
		this.$slider = this.$slideshow.find('#slider')
		this.$slides = this.$slideshow.find('.slide');
		this.$pageBtns = this.$slideshow.find('.page');
		this.$arrows = this.$slideshow.find('.prev, .next');
		this.numOfSlides = this.$slides.length;
		this.build();
		this.addListeners();
		var $centered = slideshow.$slideshow.find('[data-slideshow-center="true"]');
		this.$window.resize( function () {
			var width = $(window).width();
			if(width < 1024)
				width = 1024;
			slideshow.slideWidth = width;
			slideshow.changeSlide(slideshow.currentSlide, 0);
			slideshow.$slides.find('.bg').width(slideshow.slideWidth);
			slideshow.$slides.add(slideshow.$slideshow).height(slideshow.slideWidth * .381);
			$centered.each( function () {
				slideshow.slides[$(this).data('slideshow-index')].offset = slideshow.$slideshow.width()/2 - $(this).width()/2;
			});
			slideshow.update();
			slideshow.setArrows();
		});
		// fixes bug that is caused when resize is triggered to soon
		var $img = this.$slideshow.find('.slide:first .slide-back img');
		setTimeout(wait4Images, 25);
		function wait4Images() {
			if($img.width() == 0)
				setTimeout(wait4Images, 25);
			else {
				slideshow.$window.resize();
				slideshow.$slider.css('visibility', 'visible');
			}

		}
		slideshow.resetSlideTransition();
	},
	transitionDelay:function(delay){
		clearInterval(slideshow.slideTimeout);
		slideshow.slideTimeout = setInterval(slideshow.transitionSlide,delay);
	},
	resetSlideTransition:function(){
		slideshow.transitionDelay(9000);
	},
	transitionSlide:function(){
		var newIndex = slideshow.currentSlide +1;
		if(newIndex >= slideshow.$slides.length){
			newIndex = 0;
		}
		slideshow.jumpToSlide(newIndex);
		slideshow.changeSlide(newIndex);
	},
	setArrows: function () {
		this.$arrows.css('top', this.$slideshow.height()/2 - this.$arrows.height()/2);
	},
	build: function () {
		var count = 0;
		this.$slides.each( function (i) {
			var $slide = $(this);
			var $layers = $slide.children('div');
			slideshow.$pageBtns.eq(0).addClass('current');
			$layers.each( function (j) {
				var $this = $(this);
				var pos = $this.attr('data-slideelement').split(' ');
				var nPos = {};
				if($this.hasClass('slide-back')) {
						nPos['bottom'] = -5;
					$this.data('slideshow-halign', 'left');
					$this.attr('data-slideshow-center', true);
				} else if(pos[1] == 'center') {
					nPos[pos[0]] = 27;
					$this.data('slideshow-halign', 'left');
					$this.attr('data-slideshow-center', true);
				} else {
					nPos[pos[0]] = 27;
					nPos[pos[1]] = 170;
					$this.data('slideshow-halign', pos[1]);
				}
				slideshow.slides.push({
					$element: 1
				});
				$this.css(nPos).data('slideshow-index', count);
				slideshow.slides[count].$element = $this;
				slideshow.slides[count].offset = slideshow.offset(slideshow.slides[count].$element);
				count++;
			});
		});
	},
	jumpToSlide:function(currentIndex){
		var slides = slideshow.$slides;
		var previousIndex = slideshow.currentSlide;
		if(previousIndex == currentIndex)return;
		var dir = previousIndex < currentIndex ? 'right' : 'left';
		
		for(var i=0; i < slides.length; i ++){
			var slide = slides[i];
			if(currentIndex < i){
				slideshow.slideAnimate($(slide),'left',false);
			}else if (currentIndex == i){
				slideshow.slideAnimate($(slide),'center',false);
			}else{
				slideshow.slideAnimate($(slide),'right',false);
			}
			// i hate git
			//slideshow.slideAnimate(centerSlide,'center',false);
		}
	},
	addListeners: function () {
		this.$pageBtns.click( function () {
			var curInd = slideshow.currentSlide;
			//moves parent container
			slideshow.jumpToSlide($(this).index());
			slideshow.changeSlide($(this).index());
			slideshow.resetSlideTransition();
		});
		slideshow.$slider.parent().find('.next').click( function () {
			slideshow.changeSlide(slideshow.currentSlide+1);
			slideshow.paralaxAnimate('right');
			slideshow.resetSlideTransition();
		});
		slideshow.$slider.parent().find('.prev').click( function () {
			slideshow.changeSlide(slideshow.currentSlide-1);
			slideshow.paralaxAnimate('left');
			slideshow.resetSlideTransition();
		});
	},
	update: function () {
		var slides = slideshow.$slides;
		var stageWidth = $(window).width();
		for(var i=0; i < slides.length; i ++) {

			var slide = $(slides[i]);
			var front = slide.find('.slide-mid');
			var mid = slide.find('.slide-back');

			var midCenterPos = stageWidth/2 - mid.width()/2;
			if(i == slideshow.currentSlide) {
				slideshow.slideAnimate(slide,'center',true);
			} else if(i > slideshow.currentSlide) {
				//right of center
				slideshow.slideAnimate(slide,'left',true);
			} else {
				// left of center
				slideshow.slideAnimate(slide,'right',true);
			}
		}
	},
	paralaxAnimate: function($direction) {
		var stageWidth = $(window).width();
		var centerSlide = $(this.$slides[slideshow.currentSlide]);
		var previousCenter;
		var whichSide = 'right';
		
		if($direction == 'right') {
			previousCenter = $(this.$slides[slideshow.currentSlide - 1 ]);
			slideshow.slideAnimate(previousCenter,'right',false);
			slideshow.slideAnimate(centerSlide,'center',false);
		} else if($direction == 'left') {
			previousCenter = $(this.$slides[slideshow.currentSlide + 1 ]);
			slideshow.slideAnimate(previousCenter,'left',false);
			slideshow.slideAnimate(centerSlide,'center',false);
		}
	},
	slideAnimate: function($slide,$direction,$instant) {
		var stageWidth = $(window).width();
		var frontItem = $slide.find('.slide-mid');
		var midItem = $slide.find('.slide-back');
		var midItemCenterPos = stageWidth/2 - midItem.width()/2;
		var frontTime = $instant ? 0 : slideshow.frontSpeed;
		var midTime = $instant ? 0 : slideshow.midSpeed;
		switch($direction) {
			case 'left':
				slideshow.animate(midItem,stageWidth,midTime);
				slideshow.animate(frontItem,stageWidth*2,frontTime);
				break;
			case 'right':
				slideshow.animate(midItem,-midItem.width(),midTime);
				slideshow.animate(frontItem,-stageWidth*2,frontTime);
				break;
			case 'center':
				slideshow.animate(midItem,midItemCenterPos,midTime);
				slideshow.animate(frontItem,0,frontTime);
				break;
		}
	},
	changeSlide: function (index, speed) {
		//clearInterval(this.updateTimer);
		//this.updateTimer = setInterval(this.update, 25);
		if(index == 0)
			this.$arrows.filter('.prev').hide();
		else
			this.$arrows.filter('.prev').show();
			
		if(index == this.$slides.length-1)
			this.$arrows.filter('.next').hide();
		else
			this.$arrows.filter('.next').show();
		
		if(index >= this.numOfSlides)
			return;
		else if(index < 0)
			return;
		slideshow.currentSlide = index;
		this.$pageBtns.removeClass('current');
		this.$pageBtns.eq(slideshow.currentSlide).addClass('current');
		var gotoX = slideshow.currentSlide*-slideshow.slideWidth;
		if(speed != 0) {
			speed = slideshow.backSpeed;
		}
		this.animate(this.$slider,gotoX,speed);
		/*
		 if(speed == 0) {
		 this.$slider.stop(true, true).css({ left: slideshow.currentSlide*-slideshow.slideWidth });
		 } else {

		 this.$slider.stop().animate(
		 { left: slideshow.currentSlide*-slideshow.slideWidth },
		 {
		 duration: 3000,
		 easing: 'customEase',
		 complete: function() {
		 clearInterval(slideshow.updateTimer);
		 }
		 }
		 );
		 }
		 */
	},
	offset: function ($element) {

		var xpos = $element.data('xpos');
		if(xpos != undefined) {
			return xpos;
		} else {
			var alignment = $element.data('slideshow-halign') || 'left';
			return parseInt($element.css(alignment), 10);
		}

	},
	animate: function($element, $value, $duration) {
		if($element.hasClass('slide-mid'))return;
		var transform;
		var vendorPrefix;
		var transformStyle = false;
		if(Modernizr.csstransitions) {
			transformStyle = '2d';
		}
		if(Modernizr.csstransforms3d) {
			transformStyle = '2d';
		}

		if(transformStyle === false) {
			$element.animate({
				"left": $value + "px"
			}, $duration);
		} else {
			switch(transformStyle) {

				case "3d":
					transform = "translate3d(" + $value + "px, 0px, 0px)";
					break;

				case "2d":
					transform = "translate(" + $value + "px, 0px)";
					break;

				default:
					$element.animate({
						"left": $value + "px"
					}, $duration);
					return;
			}

			if($.browser.webkit) {
				vendorPrefix = "-webkit-transform";
				$element[0].style.webkitTransition = vendorPrefix + " " + $duration + "ms " + this.easingFunction;
				$element[0].style.webkitTransform = transform;
			}

			if($.browser.mozilla) {
				vendorPrefix = "-moz-transform";
				$element[0].style.MozTransition = vendorPrefix + " " + $duration + "ms " + this.easingFunction;
				$element[0].style.MozTransform = transform;
			}

			if($.browser.msie) {
				//fixing issue with front slide and left/ right pos on IE...removing paralax for front item on IE
				
				// right now MSIE 9 doesn't support transitions,
				// it does however support 2D transforms
				// so for now, just animate the old way:
				
				var animObj = {
						"left": $value + "px"
					};
				$element.animate(animObj, $duration);
			}

			if($.browser.opera) {
				vendorPrefix = "-o-transform";
				$element[0].style.OTransition = vendorPrefix + " " + $duration + "ms " + this.easingFunction;
				$element[0].style.OTransform = transform;
			}

		}
	}
};
