(function($){
	$.fn.dSnow=function(g){
	var h=$.extend({},$.fn.dSnow.defaults,g);
	var j=window.innerWidth||document.documentElement.clientWidth;
	var k=window.innerHeight||document.documentElement.clientHeight;
	var l=h.flakes;
	var o=h.flakeMinSize;
	var p=h.flakeMaxSize;
	var q=h.fallingSpeedMin;
	var r=h.fallingSpeedMax;
	var s=$("<div><\/div>");
	window.onload=function(){s.css({width:j+"px",width:k+"px",display:"block",position:"absolute",top:"0px",left:"0px"});
	$("body").prepend(s);
	$("html").css({"overflow-x":"hidden","overflow-y":"scroll"})};
	var t=Array();
	generateFlake(l,false);
	setInterval(animateFlakes,50);
	window.onresize=function(){j=window.innerWidth||document.documentElement.clientWidth;k=window.innerHeight||document.documentElement.clientHeight};
	window.onscroll=function(){s.animate({top:$("html").scrollTop()+"px"},150)};

	function generateFlake(a,b){
		a=a||1;
		b=b||false;
		var i=0;
		for(i=0;i<a;i++){
			var c=$("<span><\/span>");
			var d=o+Math.floor(Math.random()*p);
			
			var m='<img src="images/snowflake.png" width="' + Math.floor(Math.random()*p) + '" />';
			
			c.html(m).css({display:"block",position:"absolute",cursor:"default"});
			c.css('z-index', 1000);
			$(s).append(c);
			f_left=Math.floor(Math.random()*(j-c.width()-50))+25;
			f_top=(b)?-1*c.height():Math.floor(Math.random()*(k-50));
			var e=50+Math.floor(Math.random()*150);
			jQuery.data(c,"posData",{top:f_top,left:f_left,rad:Math.random()*50,i:Math.ceil(q+Math.random()*(r-q)),swingRange:e});
			c.css({top:f_top+"px",left:f_left+"px"});
			t.push(c)
		}
	};
			
	function generateFlakes(){
		if(t.length<l){
			if(Math.random()>0.1){
				generateFlake(1,true)
			}
		}
	};
	
	function animateFlakes(){
		generateFlakes();
		var i=0;
		var a=Array();
		for(i=0;i<t.length;i++){
			var f=t[i];
			var b=jQuery.data(f,"posData");
			b.top+=b.i;
			var c=Number();
			c=Math.cos((b.rad/180)*Math.PI);
			b.rad+=2;
			var X=b.left-c*b.swingRange;
			f.css({top:b.top+"px",left:X+"px"});
			if(b.top+f.height()>=k){
				jQuery.removeData(f);
				f.remove();
				a.push(i)
			}
		}
		if(a.length>0){
			removeArrayItems(t,a);
			generateFlake(1,true)
		}
	};
	
	function removeArrayItems(A,a){
		for(i=a.length-1;i>=0;i-=1){
			A.splice(a[i],1)
		}
		a=Array()
	};
return this
};
$.fn.dSnow.defaults={flakes:50,fallingSpeedMin:1,fallingSpeedMax:3,flakeMaxSize:20,flakeMinSize:10}})(jQuery);