;(function($) {
// displays snowflakes in a giving selector
$.fn.snow = function(options) {
 
var opts = $.extend({}, $.fn.snow.defaults, options);
 
 
// generates a random position
function getRandomPosition(width) {
return Math.floor(Math.random() * width);
}
 
// move the flake!
function moveFlakes(flakes, speed) {
for(i in flakes) {
var $left = parseInt(flakes[i].css('left'));
var $top = parseInt(flakes[i].css('top'));
 
if($top > $(window).height()) {
$top = 0;
}
if($left > $(window).width()) {
$left = 0;
}
 
flakes[i].css({
left: $left + flakes[i].particleSpeed + 'px',
top: $top + flakes[i].particleSpeed + 5 + 'px'
});
}
}
 
return this.each(function() {
 
var $this = $(this);
var $width = $(window).width();
var $height = $(window).height();
 
// Support for the Metadata Plugin.
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
 
// create a flake
var elm = $('<div>' + o.dot + '</div>');
elm.css({
left: '0px',
top: '10px',
color: o.color,
fontSize: o.dotSize,
position:'absolute'
})
elm.addClass('snowflake');
 
var flakes = [];
 
// and clone it for the amount of particles
for(var p = 0; p <= o.particles; p++) {
var flake = elm.clone();
flake.attr('id', 'snowflake-' + p);
flake.css({
top: Math.floor(Math.random() * -$height),
left: getRandomPosition($width)
})
flake.particleSpeed = Math.floor(Math.random() * o.particleSpeed);
flake.appendTo($this);
flakes.push(flake);
}
 
setInterval(function() {
moveFlakes(flakes, o.particleSpeed)
}, o.speed);
 
});
 
// private function for debugging
function debug($obj) {
if (window.console && window.console.log) {
window.console.log($obj);
}
}
};
 
// default options
$.fn.snow.defaults = {
dot: '&#149;',
dotSize: '10px',
color: '#fff',
particles: 100,
particleSpeed: 3,
speed: 20
};
 
})(jQuery);