(function($){

$.fn.uberbox = function( options ) {
	var defaults = {
		width: "0px",
		height: "0px",
		speed: 5000, // 5 seconds
		theme: "uberbox-dark",
		transition: {
			fx: "fade",
			speed: "fast"
		},	
		// next a prev buttons
		//next: "#slideshow-next",
		//prev: "#slideshow-prev",
		//pager: "",
		auto: true,
		pauseOnHover: true

	}, settings = $.extend({}, defaults, options);		

	this.each(function()
	{
		var $box = $(this); 
			id = $(this).attr( "id" );
		
		$( "#" + id + " ul" ).addClass( "uberbox-slides" );
		
		if( settings.width > 0 ) { $(this).css( "width", settings.width ); }
		if( settings.height > 0 ) { $(this).css( "height", settings.height ) };

		settings.width = $(this).css( "width" );
		settings.height = $(this).css( "height" );
		
		$( "#" + id + " ul.uberbox-slides" ).css( "width", $(this).css( "width" ) );
		$( "#" + id + " ul.uberbox-slides" ).css( "height", $(this).css( "height" )  );

		// theme preparation
		$box.addClass( "uberbox" );		
		if( settings.theme != "" ) {
			$box.addClass( settings.theme );
			$('head').append( '<link rel="stylesheet" href="uberbox/theme/' + settings.theme + '/' + settings.theme + '.css" type="text/css" />' );
		}

		var top = $box.position().top;
				left = $box.position().left;
				settings.slides = $( "#" + id + " ul.uberbox-slides li" ).size();
				count = 0;

		if( settings.transition.fx == "slide" ) {
			// set overflow on container and place slides side by side, got that mclyde?
			// order slides side by side
			$( "#" + id + " ul.uberbox-slides" ).css( "overflow", "hidden" );
			$( "#" + id + " ul.uberbox-slides" ).css( "position", "relative" );

			$( "#" + id + " ul.uberbox-slides li" ).each( function() {
				count++;
				$(this).data( "uberbox-cnt", count ); 
				$(this).css( "position", "absolute" );
				$(this).css( "left", settings.width );
			});
			$( "#" + id + " ul li:first" ).css( "left", "0px" );
		} else {
			// stack slides for wipe and fade transitions	
			$( "#" + id + " ul.uberbox-slides li" ).each( function() {
				count++;
				$(this).data( "uberbox-cnt", count ); 
				$(this).css( "position", "absolute" );
				$(this).css( "z-index", settings.slides - count );			
			});
			$( "#" + id + " ul li:not(:first)" ).css( "display", "none" );
		}
		
		$( "#" + id + " ul li:first" ).addClass( "uberbox-current-slide" );

		// pager
		$( settings.pager ).addClass( "uberbox-pagination" );
		$( settings.pager ).addClass( settings.theme );
		for( i = 1; i <= settings.slides; i++ ) {
			$( settings.pager ).append( "<li><a rel=\"" + id + "\" href=\"#" + i + "\">" + i + "</a></li>" );
		}		
		$( settings.pager + " li:first-child" ).addClass( "uberbox-on" );
		
		$( settings.pager + " li a[rel=" + $box.attr( "id" ) + "]" ).click( function( e ) {
	
			var slide = $( "#" + $box.attr( "id" ) + " ul.uberbox-slides li.uberbox-current-slide" );
				nextSlide = $( "#" + $box.attr( "id" ) + " ul li:nth-child(" + $(this).attr( "href" ).replace( "#", "" ) + ")" );
			
			for( i = 1; i <= settings.slides; i++ ) {
				$( settings.pager + " li" ).removeClass( "uberbox-on" );
			}	
			$(this).parent().addClass( "uberbox-on" );

			e.navType = "paginator";
			
			settings = slideAdvance( $box.attr( "id" ), slide, nextSlide, settings, e );
		});
		
		// next / prev
		if( settings.next ) {
			$( settings.next ).addClass( "uberbox-button-next" );
			$( settings.next ).addClass( settings.theme );

			$( settings.next ).bind("click", function( e ){
				next( $box.attr( "id" ), settings, e );
			});
			$( settings.next ).mouseover( function( e ) {
				clearTimeout( settings.timer );
			});
			$( settings.next ).mouseout( function( e ) {
				clearTimeout( settings.timer );
				settings.timer = setTimeout( function() { go( $box.attr( "id" ), settings ); }, settings.speed );
			});
		}

		if( settings.prev ) {
			$( settings.prev ).addClass( "uberbox-button-prev" );
			$( settings.prev ).addClass( settings.theme );

			$( settings.prev ).bind("click", function( e ){
				prev( $box.attr( "id" ), settings, e );
			});
			$( settings.prev ).mouseover( function( e ) {
				clearTimeout( settings.timer );
			});
			$( settings.prev ).mouseout( function( e ) {
				clearTimeout( settings.timer );
				settings.timer = setTimeout( function() { go( $box.attr( "id" ), settings ); }, settings.speed );
			});
		}
		
		if( settings.auto && settings.pauseOnHover ) {
			$( this ).mouseover( function( e ) {
				clearTimeout( settings.timer );
			});
			$( this ).mouseout( function( e ) {
				clearTimeout( settings.timer );
				settings.timer = setTimeout( function() { go( $box.attr( "id" ), settings ); }, settings.speed );
			});
		}
		if( settings.auto ) {
			settings.timer = setTimeout(function() { go( $box.attr( "id" ), settings ); }, settings.speed );
		}
	});

	// returns the jQuery object to allow for chainability.
	return this;
};


})(jQuery);

function go( id, settings )
{
	//console.log( id + " go " );
	settings = next( id, settings );	
	settings.timer = setTimeout( function() { go( id, settings ); }, settings.speed );
}

function next( id, settings, event )
{
	var slide = $( "#" + id + " ul.uberbox-slides li.uberbox-current-slide" );
		nextSlide = slide.next().is( "li" ) ? slide.next() : $( "#" + id + " ul li:first-child" );
	
	return slideAdvance( id, slide, nextSlide, settings, event );
}

function prev( id, settings, event )
{
	var slide = $( "#" + id + " ul.uberbox-slides li.uberbox-current-slide" );
		prevSlide = slide.prev().is( "li" ) ? slide.prev() : $( "#" + id + " ul li:last-child" );

	return slideAdvance( id, slide, prevSlide, settings, event );
}

function slideAdvance( id, currentSlide, nextSlide, settings, event ) {

	if( currentSlide.html() == nextSlide.html() ) return settings;

	if( settings.pager != "" ) {
		for( i = 1; i <= settings.slides; i++ ) {
			$( settings.pager + " li" ).removeClass( "uberbox-on" );
		}	
		$( settings.pager + " li:nth-child(" + nextSlide.data( "uberbox-cnt" ) + ")" ).addClass( "uberbox-on" );
	}

	if( settings.transition.fx == "slide" ) {
		// new transition! YAY!

		if( event != undefined && event.navType == "paginator" ) {			
			if( nextSlide.data("uberbox-cnt") > currentSlide.data("uberbox-cnt") ) { // next
				nextSlide.css( "left", settings.width );
				currentSlide.animate( { left: "-" + settings.width }, settings.transition.speed );
				nextSlide.animate( { left: "0px" }, settings.transition.speed );
			} else if( nextSlide.data("uberbox-cnt") < currentSlide.data("uberbox-cnt") ) { // prev
				nextSlide.css( "left", "-" + settings.width );
				currentSlide.animate( { left: settings.width }, settings.transition.speed );
				nextSlide.animate( { left: "0px" }, settings.transition.speed );
			}
		} else {		
			if( currentSlide.data("uberbox-cnt")+1 == nextSlide.data("uberbox-cnt")
				|| ( currentSlide.data("uberbox-cnt") == settings.slides && nextSlide.data("uberbox-cnt") == 1 ) ) {
				
				// next
				nextSlide.css( "left", settings.width );
				currentSlide.animate( { left: "-" + settings.width }, settings.transition.speed );
				nextSlide.animate( { left: "0px" }, settings.transition.speed );
			
			} else if( currentSlide.data("uberbox-cnt")-1 == nextSlide.data("uberbox-cnt")
					|| ( currentSlide.data("uberbox-cnt") == 1 && nextSlide.data("uberbox-cnt") == settings.slides ) ) {
				// prev
				nextSlide.css( "left", "-" + settings.width );
				currentSlide.animate( { left: settings.width }, settings.transition.speed );
				nextSlide.animate( { left: "0px" }, settings.transition.speed );
			}
		}
	} else {	
		// make sure next is below currentSlide currentSlide
		if( currentSlide.css( "z-index" ) < nextSlide.css( "z-index" ) ) { //then swap
			var top = nextSlide.css( "z-index" );
				bottom = currentSlide.css( "z-index" );		
			currentSlide.css( "z-index", top );
			nextSlide.css( "z-index", bottom );
		}
		nextSlide.show();
		if( settings.transition.fx == "wipe" ) {
			var dr = settings.transition.direction;
				sp = settings.transition.speed == "" ? "normal" : settings.transition.speed;
			if( dr == "left" ) {
				currentSlide.css( "overflow", "hidden" );
				currentSlide.animate( { width: "0px" }, sp, function(){ $(this).css("width", "" ); $(this).css("height", "" ); $(this).hide(); } );
			} else if( dr == "right" ) {
				currentSlide.css( "overflow", "hidden" );
				currentSlide.animate( { marginLeft: settings.width, width: "0px" }, sp, function(){ $(this).css("margin-left", "" ); $(this).css("width", "" ); $(this).hide(); }  );
			} else if( dr == "down" ) {
				currentSlide.css( "overflow", "hidden" );
				currentSlide.animate( { marginTop: settings.height, height: "0px" }, sp, function(){ $(this).css("margin-top", "" ); $(this).css("height", "" ); $(this).hide(); }  );
			} else {
				currentSlide.slideUp( settings.transition.speed );
			}
		} else if( settings.transition.fx == "fade" ) {
			currentSlide.fadeOut( settings.transition.speed );
		}
	}
	currentSlide.removeClass( "uberbox-current-slide" );
	nextSlide.addClass( "uberbox-current-slide" );

	if( settings.auto && settings.pauseOnHover && event != undefined && event.type == "click" ) {
		clearTimeout( settings.timer );
		settings.timer = setTimeout( function() { go( id, settings ); }, settings.speed );
	}
	return settings;
}
