(function($){
	$.absolutise = function(el, parent, options){
		// To avoid scope issues, use 'base' instead of 'this'
		// to reference this class from internal events and functions.
		var base = this;
		
		// Access to jQuery and DOM versions of element
		base.$el = $(el);
		base.el = el;
		
		// Add a reverse reference to the DOM object
		base.$el.data("absolutise", base);
		
		base.init = function(){
			
			if( typeof( parent ) === "undefined" || parent === null ) parent = false;
			
			base.options = $.extend({},$.absolutise.defaultOptions, options);
			
			if (parent) {
				base.parent = base.$el.closest(parent);
			} else {
				base.parent= base.$el.offsetParent();
			}
			
			// Put your initialization code here
			base.positionParent();
			base.positionElement();
		};
		
		// Sample Function, Uncomment to use
		base.positionParent = function(){
			if ('static' == base.parent.css('position')) {
				base.parent.css('position', 'relative');
			};
		};
		
		base.positionElement = function(){
			base.$el.css({
				top: base.$el.position().top,
				left: base.$el.position().left
			});
			base.addToQueue();
		};
		
		base.addToQueue = function() {
			base.$el.addClass('pending-absolutise');
		};
		
		// Run initializer
		base.init();
	};
	
	$.absolutise.defaultOptions = {
	};
		
	$.absolutise.purgeQueue = function(queue) {
		$('.pending-absolutise').css('position','absolute').removeClass('pending-absolutise');
	};
	
	$.fn.absolutise = function(parent, options){
		this.each(function(){
			(new $.absolutise(this, parent, options));
		});
		$.absolutise.purgeQueue();
		return this;
	};
	
})(jQuery);
