(function($) {
	
	$.fn.siteScroll = function( options )
	{
		return this.each(function(){
			
			var scroller, totalPages, currentPage, viewportWidth, isScrolling, cache = {};
						
			// set options
			opts = $.extend({}, $.fn.siteScroll.defaults, options);
			
			scroller = $(this);
			outer = $(opts.outer);
			inner = $(opts.inner);
			pages = opts.pages;
			
			viewportWidth = $('body').width();

			setupEvents();
			setUp();
			
			$(window).resize(function(){
				refresh();
			});

			///////////////////////////////////////////////
			
			function setUp()
			{
				
				// $("body").ajaxError(function(event, request, settings){
				//    
				// 		location.reload(true);
				// 
				// 	});
	
				
				totalPages = pages.length;
				currentPage = opts.startPage;
				
				scroller.css( 'position', 'relative' );
				
				outer.width( viewportWidth ).addClass('siteScroll_outer');
				inner.addClass('siteScroll_inner');
								
				// if ( opts.autoLoadFirst ) inner.load( pages[0]+' '+opts.inner+' *' );
				if ( opts.autoLoadFirst ) inner.load( pages[0]+' #content_inner' );

				scroller.trigger( 'siteScroll.finishedSetup', [opts.startPage, totalPages] );
			};
			
			function refresh()
			{
				viewportWidth = $('body').width();
				outer.width( viewportWidth );
				scroller.width( viewportWidth );
				scroller.trigger( 'siteScroll.finishedRefresh', [opts.startPage, totalPages] );
			};
			
			function goTo( pageNum )
			{
		
				if ( currentPage != pageNum && ! scroller.is(":animated") )
				{
					scroller.trigger( 'siteScroll.startedGoTo', pageNum );
	
					if ( currentPage < pageNum )
					{
						// going forwards
						$.fn.siteScroll.transitions.next(  opts, viewportWidth, currentPage, pageNum, scroller, outer, inner, totalPages, cache  );
					}
					else
					{
						// going backwards
						$.fn.siteScroll.transitions.prev(  opts, viewportWidth, currentPage, pageNum, scroller, outer, inner, totalPages, cache );
					}
				
					currentPage = pageNum;
				}
			};
			
			function goNext()
			{
				if ( opts.loopType == 'loop' ) var goToPage = ( currentPage == totalPages - 1 ) ? 0 : currentPage + 1; 
				else  var goToPage = ( currentPage == totalPages - 1 ) ? totalPages - 1 : currentPage + 1; // stop when getting to last page
				goTo( goToPage );
			};
			
			function goPrev()
			{
				if ( opts.loopType == 'loop' ) var goToPage = ( currentPage == 0 ) ? totalPages - 1 : currentPage - 1;
				else  var goToPage = ( currentPage == 0 ) ? 0 : currentPage - 1; // stop when getting to last page
				goTo( goToPage );
			};
			
			function setupEvents()
			{
				scroller.bind( 'siteScroll.goTo', function( e, pageNum ){ goTo( pageNum ); });
				scroller.bind( 'siteScroll.goNext', function(){ goNext(); });
				scroller.bind( 'siteScroll.goPrev', function(){ goPrev(); });
				scroller.bind( 'siteScroll.refresh', function(){ refresh(); });
				
				$().keyup( function( e ) {
					if ( e.keyCode == 39 ) scroller.trigger( 'siteScroll.keyUp', ['right'] );
					else if ( e.keyCode == 37 ) scroller.trigger( 'siteScroll.keyUp', ['left'] );
				});
			};
			
			function preload( pageNum )
			{
				
			};
			
		});
	};
	
	$.fn.siteScroll.transitions = {
		
		next : function( opts, viewportWidth, currentPage, pageNum, scroller, outer, inner, totalPages, cache )
		{
			var tempContentWrapper = $('<div class="siteScroll_outer"></div>');
		
			tempContentWrapper.width( viewportWidth );
			tempContent = $('<div class="siteScroll_inner"></div>');
			tempContentWrapper.append( tempContent );
			
			// if ( cache[pages[pageNum]] !== undefined )
			// 		{
			// 			
			// 			tempContent.empty();
			// 			tempContent.append(cache[pages[pageNum]]);
			// 			opts.onContentLoaded();
			// 			// scroller.trigger( 'siteScroll.contentLoaded' );
			// 		}
			// 		else
			// 		{
				tempContent.load( pages[pageNum]+' #content_inner', function(){
					cache[pages[pageNum]] = tempContent.html();
					opts.onContentLoaded();
					// scroller.trigger( 'siteScroll.contentLoaded' );
				});
			// }
			
			if ( opts.transistionType == 'relative' )
			{
				scrollsize = (Math.ceil( viewportWidth / opts.bgUnitWidth ) * ( opts.transitionUnits * ( pageNum-currentPage ) ) * opts.bgUnitWidth) + viewportWidth;
			}
			else
			{
				scrollsize = (Math.ceil( viewportWidth / opts.bgUnitWidth ) * ( opts.transitionUnits ) * opts.bgUnitWidth) + viewportWidth;
			}
			
			scroller.append(tempContentWrapper).width( scrollsize );
				
			outer.css( { position : 'absolute', left : 0 } );
			
			tempContentWrapper.css( { position : 'absolute', right : 0 } );
			
			scroller.animate({ 'left' : -1 * ( scrollsize - viewportWidth ) }, opts.speed, null, function(){
				
				var content = tempContent.html();
				
				inner.html(content).css({position: 'relative', 'z-index':100});
				
				tempContentWrapper.remove();

				scroller.width( viewportWidth ).css( 'left', 0 );
				
				opts.onFinishGoTo();
				
				scroller.trigger( 'siteScroll.finishedGoTo', pageNum );
				
				if ( currentPage == 0 ) scroller.trigger( 'siteScroll.reachedFirstPage' );
				if ( currentPage == totalPages - 1 ) scroller.trigger( 'siteScroll.reachedLastPage' );
				
			});
		
		},
		
		prev : function( opts, viewportWidth, currentPage, pageNum, scroller, outer, inner, totalPages, cache )
		{
			if ( opts.transistionType == 'relative' )
			{
				scrollsize = (Math.ceil( viewportWidth / opts.bgUnitWidth ) * ( opts.transitionUnits * ( currentPage-pageNum ) ) * opts.bgUnitWidth) + viewportWidth;
			}
			else
			{
				scrollsize = (Math.ceil( viewportWidth / opts.bgUnitWidth ) * ( opts.transitionUnits  ) * opts.bgUnitWidth) + viewportWidth;	
			}
			
			var tempContentWrapper = $('<div class="siteScroll_outer"></div>');
		
			tempContentWrapper.width( viewportWidth );
			tempContent = $('<div class="siteScroll_inner"></div>');
			tempContentWrapper.append( tempContent );
		
			// if ( cache[pages[pageNum]] !== undefined )
			// 		{
			// 			tempContent.empty();
			// 			tempContent.append(cache[pages[pageNum]]);
			// 			opts.onContentLoaded();
			// 			// scroller.trigger( 'siteScroll.contentLoaded' );
			// 		}
			// 		else
			// 		{
				// tempContent.load( pages[pageNum]+' '+opts.inner+' *', function(){
				tempContent.load( pages[pageNum]+' #content_inner', function(){
					cache[pages[pageNum]] = tempContent.html();
					// scroller.trigger( 'siteScroll.contentLoaded' );					
					opts.onContentLoaded();
				});
			// }
			
			scroller.append(tempContentWrapper).width( scrollsize );

			tempContentWrapper.css( { position : 'absolute', left : 0 } );
			
			outer.css( { position : 'absolute', left :  ( scrollsize - viewportWidth  ) } );
			scroller.css( 'left',  -1 * ( scrollsize - viewportWidth ) );
			
		
			scroller.animate({ 'left' : 0 }, opts.speed, null, function(){
				
				inner.html(tempContent.html());
				
				tempContentWrapper.remove();
				scroller.width( viewportWidth ).css( 'left', 0 );
				outer.css('left',0);
			
				scroller.trigger( 'siteScroll.finishedGoTo', pageNum );
				
				opts.onFinishGoTo();
			
				
				if ( currentPage == 0 ) scroller.trigger( 'siteScroll.reachedFirstPage' );
				if ( currentPage == totalPages - 1 ) scroller.trigger( 'siteScroll.reachedLastPage' );
				
			});
		}
		
	};

	$.fn.siteScroll.defaults = {
		startPage : 0,
		pages : new Array(),
		speed: 2000,
		inner : null,
		outer : null,
		bgUnitWidth : 2208,
		transitionUnits : 2,
		transistionType : 'set', // set, relative
		loopType : 'stop', // loop, stop
		autoLoadFirst : true,
		onFinishGoTo : function(){},
		onContentLoaded : function(){}
	};
	
})(jQuery);
