(function($){
	$.fn.extend({
		BubbleEngine: function(options){
			var defaults = {
				particleSizeMin:0,
				particleSizeMax:60,
				particleSourceX:0,
				particleSourceY:500,
				particleAnimationDuration:3000,
				particleAnimationVariance:2000,
				particleScatteringX:500,
				particleScatteringY:200,
				particleDirection:'right' /* 'right', 'left', 'center'*/,
				gravity:-100,
				imgSource:'images/bubble.png',
				RenewBubbles:'on',
				element:'body'
			};
			var options = $.extend(defaults, options);
			options.counter = 0;

			//-----------------------------------------------------------------------
			//Public Functions ------------------------------------------------------
			//-----------------------------------------------------------------------
			this.settings = function(setting){
				options = $.extend(options,setting);
			}
			this.getConfig = function(){
				ConfigValues = [
					options.particleSizeMin,
					options.particleSizeMax,
					options.particleAnimationDuration,
					options.particleScatteringX,
					options.particleScatteringY,
					options.imgSource,
					options.element
				];
				return(ConfigValues);
			};
			this.getCounter = function(){
				return(options.counter);
			};
			this.removeBubbles = function(){
				options.RenewBubbles = 'off';
				options.counter = 0;
			};
			this.addBubbles = function(number){
				if (!number) number = 25;
				options.RenewBubbles = 'on';
				for (i=1; i<=number; i++){
					options.counter++;
					window.setTimeout(function() {
						GenerateElement();
					}, Math.floor(Math.random()*3000));
				}
			};

			//-----------------------------------------------------------------------
			//Private Functions -----------------------------------------------------
			//-----------------------------------------------------------------------
	
			function GetRandom(min, max){
				if(min > max){
					return -1;
				}
				if(min == max){
					return min;
				}
				return(min+parseInt(Math.random()*(max-min+1)));
			}
			
			//-----------------------------------------------------------------------
			function GenerateElement(){
				var animationEndY = options.particleSourceY + options.gravity + GetRandom(-options.particleScatteringY, options.particleScatteringY);
				if(options.particleDirection == 'left'){
					var animationEndX = options.particleSourceX - GetRandom(0, options.particleScatteringX);
				} else if (options.particleDirection == 'right'){
					var animationEndX = options.particleSourceX + GetRandom(0, options.particleScatteringX);
				} else if (options.particleDirection == 'center'){
					var animationEndX = options.particleSourceX + GetRandom(-options.particleScatteringX, options.particleScatteringX);
				}
				var animationDuration = options.particleAnimationDuration + GetRandom(0, options.particleAnimationVariance);
				var particleSize = GetRandom(options.particleSizeMin, options.particleSizeMax);
				var div = jQuery('<img class="bubble" src="'+options.imgSource+'">').css({
					position:'absolute',
					top:options.particleSourceY,
					left:options.particleSourceX,
					width:particleSize,
					height:particleSize
				}).appendTo(options.element);
				div.animate({
					left:animationEndX,
					top:[animationEndY, 'easeOutCubic']
				},{
					queue:false,
					duration:animationDuration,
					complete:function(){
						$(this).remove();
						if(options.RenewBubbles == 'on'){
							GenerateElement();
						} else {}
					}
				});	
			}

			//-----------------------------------------------------------------------
			return this.each(function(){
				var o = options;
				var obj = $(this);			
				o.ids = Math.floor(Math.random()*1000);
			});
		}
	});
})(jQuery);
