var ProjectSlideShow = function() {

	if (!$('.project_slideshow').length) {
		return;
	};

	// define some variables / DOM references
	var slideTimeout;
	var offset;
	var curr_slide_num 			= 0;
	var $slideshow 				= $('DIV.project_slideshow');
	var $stage 					= $('.project_slideshow').find('DIV.stage');
	var $slide_reel 			= $stage.find('UL');
	var $slides 				= $slide_reel.find('LI');
	var $preloader 				= $stage.find('DIV.preloader');
	var $curr_slide 			= $slides.first();
	var $all_other_slides	 	= $slides.not($curr_slide);
	var max_slide 				= $slide_reel.children().length - 1;
	var $controls 				= $stage.find('DIV.controls');
	var $prev 					= $slide_reel.find('LI A.prev');
	var $next 					= $slide_reel.find('LI A.next');
	var win_width 				= $(window).width();	
	var $full_screen_button_container = $slides.find('A.full_screen');
	var $full_screen_button 	= $slides.find('A.full_screen SPAN');
	var $text_overlay 			= $slides.find('SPAN.text_overlay');

	var $full_screen_overlay 	= $('DIV#full_screen_overlay')
	var $full_screen_container 	= $('DIV#full_screen_image')
	var $full_screen_image_container = $full_screen_container.find('DIV.image');
	var $full_screen_close 		= $full_screen_container.find('A.close');
	
	// small carousel 
	var $small_carousel 		= $('DIV.carousel_container');
	var $small_stage 			= $small_carousel.find('DIV.carousel_clip');
	var $small_reel 			= $small_stage.find('UL');
	var $small_slides 			= $small_reel.find('LI');
	var small_slides_total 		= $small_slides.size();
	var small_slides_factor 	= small_slides_total/5;
	var $small_slides_current;
	var $small_prev 			= $small_carousel.find('DIV.carousel_prev');
	var $small_next 			= $small_carousel.find('DIV.carousel_next');
	var small_incr_w 			= 925;
	var small_int 				= 0;	
	
	
	
	function moveSmallCarousel( new_small_int ) {
		small_int = new_small_int;

		if(( small_slides_factor - small_int) <= 1) { 
			$small_next.addClass('disabled');
		} else {
			$small_next.removeClass('disabled');
		}

		if(small_int == 0) { 
			$small_prev.addClass('disabled');
		} else {
			$small_prev.removeClass('disabled');
		}
		
		$small_reel.animate({
			left : small_int * -small_incr_w 
		},'slow',function(){
		});
	};
	
	function changeSlide( new_slide_num ) {
	
		if (new_slide_num < 0) return;
		if (new_slide_num == max_slide+1) return;

		// Set current state on small slides
		$small_reel.find('LI.current').removeClass('current');
		$($small_slides.get(new_slide_num)).addClass('current');
	
		
		// Move small slider
		var small_pg = Math.floor(new_slide_num/5);
		moveSmallCarousel(small_pg);
		
			
		var curr_offset = $curr_slide.offset();
		curr_offset = curr_offset.left;
		curr_offset = curr_offset + $curr_slide.width()/2;

		var $target_slide = $($slides.get(new_slide_num));	
		var target_offset = $target_slide.offset();
		target_offset = target_offset.left;
		target_offset = target_offset + $target_slide.width()/2;
				
		dist = curr_offset - target_offset;
		
		// change the curr_slide_num value
		curr_slide_num = new_slide_num;
		$curr_slide = $($slides.get(curr_slide_num));
		
		// get all other slides
		$all_other_slides = $slides.not($($slides.get(curr_slide_num)));
		$all_other_slides.fadeTo('slow', 0.1);
		$all_other_slides.find('A').hide();
		
		$curr_slide.fadeTo('slow', 1.0 );		
		
		// animate the slide reel
		$slide_reel.animate({
			left : "+="+dist
		}, 400, function() {
			$curr_slide.find('A').show();
			if(curr_slide_num == 0) $curr_slide.find('A.prev').hide();
			if(curr_slide_num == max_slide) $curr_slide.find('A.next').hide();
		});
	
	}
	
	function setWidth(element) {
	
		var _list = $(element);
		var _items = _list.find('LI');
		var _w = 0;
		var item_width = 0;
		
		_items.each(function(){	
			item_width = 0;
			item_width += $(this).width();
			item_width += parseInt($(this).css('margin-left'));
			item_width += parseInt($(this).css('margin-right'));
			_w += item_width;
		});
		
		// Add one extra width to end for extra padding
		return item_width + _w;
	};
	
	function centerTheSlide() {
		var window_center = $(window).width()/2;
		var list_offset = $slide_reel.offset();
		var slide_offset = $curr_slide.offset();
		list_offset = list_offset.left;
		slide_offset = slide_offset.left;
		slide_list_offset = slide_offset - list_offset;
		slide_list_offset = slide_list_offset + ($curr_slide.width()/2)
		$slide_reel.css('left', (window_center - slide_list_offset));		
	};
	
	function placeFullScreenButton() {

		$full_screen_button_container.each(function() {
			parent_width = $(this).parent().width();
			parent_height = $(this).parent().height();
			$(this).css('width', parent_width/2);
			$(this).css('height', parent_height/2);
			
			$(this).css('left', (parent_width/4));
			$(this).css('top', (parent_height/4));
			// position the button graphic
			button_width = $(this).find('SPAN').width();
			button_height = $(this).find('SPAN').height();
			$(this).find('SPAN').css('left', parent_width/4 - button_width/2).css('top', parent_height/4 - button_height/2);
		});
		
		$full_screen_overlay.click(closeFullScreen);
		$full_screen_container.click(closeFullScreen);
		
	};
	
	function doFullScreen(ev) {

		ev.preventDefault();
	
		var src		= $(this).data('hires');
		var content	= '';

		$full_screen_overlay.show();
		$full_screen_image_container.hide();
		$full_screen_container.css('padding-top', $(window).scrollTop()+'px');
		$full_screen_overlay.height($('#layout').height());

		$full_screen_container.show();
		$full_screen_container.find('.loading').show();

		$slides.each(function(i) {
			
			if ($(this).find('.video_player').length) {
				content += '<li><div id="fullplayer_'+i+'"> </div></li>';
				content += '<'+'script type="text/javascript">embedVideo("fullplayer_'+i+'", "'+$(this).find('.video_player').data('video')+'", 800, 492);</'+'script>';
			} else {
				var src = $(this).find('.full_screen').data('hires');
				if (src) content += '<li><img src="'+src+'?w=940&h=900" /></li>';
			}
		
		});

		var content = '<ul>'+content+'</ul>';

		$full_screen_image_container.html(content);
		
		_preload($full_screen_image_container.find('IMG'), function(){

			$full_screen_container.find('.loading').hide();
			$full_screen_image_container.fadeIn();
			
			$('UL', $full_screen_image_container).cycle({
				timeout: 0, 
				startingSlide: curr_slide_num,
				next:   '#fs_next', 
				prev:   '#fs_prev',
				fx: 'scrollHorz'
			});			
			
		});

	};
	
	function closeFullScreen(){

		$full_screen_overlay.fadeOut('fast');
		$full_screen_container.fadeOut('fast');
		$full_screen_image_container.find('.loading').hide();

	};
	
	function nextSlide() {
		changeSlide( curr_slide_num + 1 );
	};
	
	function _keyPress(event) {
		if (event.keyCode == 37 || event.keyCode == 38) {
			event.preventDefault();
			changeSlide( curr_slide_num - 1 );
		} else if (event.keyCode == 39 || event.keyCode == 40) {
			event.preventDefault();
			changeSlide( curr_slide_num + 1 );
		}
	}
			
	var _windowResize = function() {
	
		win_width = $(window).width();
	
		$stage.width(win_width);
		$preloader.width(win_width);
		$slideshow.width(win_width);

		$small_reel.css('width', setWidth($small_reel));				
		$slide_reel.css('width', setWidth($slide_reel));				
		$slide_reel.css('left', (win_width/2 - $slides.first().width()/2));

		placeFullScreenButton();

		centerTheSlide();
	
	};

	var _preload = function(images, callback) {
	
		var total	= images.length;
		var loaded	= 0;

		/*		
		images.one('load', function() {
			loaded++;
			console.log($(this).attr('src'));
			console.log(loaded);
			if (loaded === total) {
				if (typeof callback === 'function') callback();  
			}			
		}).each(function() {
 			if (this.complete) $(this).load();
		});
		*/

		images.each(function() {

			$('<img />').load(function(){

				loaded++;
				if (loaded === total) {
					if (typeof callback === 'function') callback();  
				}

			}).attr('src', $(this).attr('src'));
		
		});


	
	};

	var _hideLoading = function(images, callback) {

		_windowResize();
		
		$preloader.find('IMG').fadeOut('slow', function(){ 
			$preloader.fadeOut('slow');
			_windowResize();
		});
		
		setTimeout(function(){
			_windowResize();				
		}, 100);

	};

	var _init = function(string) {

		// left arrow
		$prev.click(function(ev) {
			ev.preventDefault();
			changeSlide( curr_slide_num - 1 );
		});	
		// right arrow
		$next.click(function(ev) {
			ev.preventDefault();
			changeSlide( curr_slide_num + 1 );
		});
		
		
		$small_prev.click(function(){
			if($(this).hasClass('disabled')) {
				return false;
			}
			moveSmallCarousel(small_int - 1);
		});
		$small_next.click(function(){
			if($(this).hasClass('disabled')) {
				return false;
			}
			moveSmallCarousel(small_int +1);
		});
		
		
		$small_slides.find('A').click(function(ev){
			ev.preventDefault();
			changeSlide($(this).parent().index());
			$small_reel.find('.current').removeClass('current');
			$(this).parent().addClass('current');
		});
		
		// full screen button
		$full_screen_button_container.click(doFullScreen);
		
		$slides.mouseenter(function(){
			$(this).find('SPAN.text_overlay').fadeIn('fast');
		});
		$slides.mouseleave(function(){
			$(this).find('SPAN.text_overlay').fadeOut('fast');
		});

		$full_screen_close.click(function(event){
			event.preventDefault();
			closeFullScreen();
		});
			
		$(window).bind('resize', _windowResize).trigger('resize');

		$preloader.find('IMG').show();

		$small_prev.addClass('disabled');
		
		$all_other_slides.find('A').hide();
		$all_other_slides.fadeTo('slow',0.1);
		$curr_slide.find('A.prev').hide();
		
		// add current class to small slides
		$small_slides_current =	$small_slides.first().addClass('current');
						
		// Bind arrow keys
		$(window).keydown(_keyPress);
		
//		$full_screen_overlay.click(closeFullScreen);
		
		/*
		$full_screen_image.jmc_resizr({
			cropType : 'full',
			binding : {vertical : 'center',horizontal : 'center'},
			parentElement: $full_screen_image_container
		});
		*/

		_preload($('IMG', $slideshow), _hideLoading);
		
	};
	
	_init();

};
