var stacker = {
	// Settings
	lastBlock: 0,
	readyToStack: true,
	stopStacking: false,
	
	defaults: {
		totalBlocks: 9,
		bumperHeight: 183, // This should be the same as #content.margin-bottom
		blockURL: 'blocks/block%INDEX%.html',
		container: '#content',
		wrapperClass: 'blockWrapper',
		animate: true,
		animateSpeed: 'normal',
		resetScroll: true,
		stackDelay: 125,
		initialPopulation: 'fill', // Options 'fill' to stack blocks until the vertical scroll bar appears, or an integer number of blocks to load.
		loop: true
	},
	settings: {},
	
	init: function(options){
		// console.log('--- init():');
		var self = this;
		
		// Merge custom settings with the default settings
		$.extend(self.settings, self.defaults, options);
		
		// Reset the scrollTop for browsers that remember it when the page reloads.
		if(self.settings.resetScroll){
			window.scrollTo(0,0);
			setTimeout(function(){ window.scrollTo(0,0); }, 100);
		}
		
		if(isNaN(parseInt(self.settings.initialPopulation))){
			// Load enough blocks to activate the vertical scroll bar.
			while($(self.settings.container).height() < $(window).height() + self.settings.bumperHeight){
				self.stack();
			}
		} else {
			for(var i = 0; i < parseInt(self.settings.initialPopulation); i++){
				self.stack();
			}
		}
		
		// Stack another block when we get to the bottom.
		$(window).scroll(function(event){
			if(($(document).height() - $(window).height()) - $(window).scrollTop() < self.settings.bumperHeight / 2 && self.readyToStack && !self.stopStacking){
				setTimeout(function(){ self.stack(); }, self.settings.stackDelay);
				self.readyToStack = false;
			}
		});
	},
	
	stack: function(){
		// console.log('--- stack():');
		var self = this;
		
		// Only loop stacking if settings.loop = true
		if(self.lastBlock < self.settings.totalBlocks || (self.lastBlock >= self.settings.totalBlocks && self.settings.loop)){
			var loadURL = self.settings.blockURL.replace('%INDEX%', self.lastBlock % self.settings.totalBlocks + 1);
			
			$(self.settings.container).append('<div class="' + self.settings.wrapperClass + '"></div>');
			$('.' + self.settings.wrapperClass + ':last').hide().load(self.settings.blockURL.replace('%INDEX%', self.lastBlock % self.settings.totalBlocks + 1));
			self.settings.animate ? $('.' + self.settings.wrapperClass + ':last').fadeIn(self.settings.animateSpeed) : $('.' + self.settings.wrapperClass + ':last').show();
			
			self.lastBlock++;
			self.readyToStack = true;
		} else {
			self.stopStacking = true;
			$('.' + self.settings.wrapperClass + ':first').parent().css('marginBottom',0);
		}
	}
} // end stacker
