(function($) {
    $.fn.jSnow = function(h) {
        if (!navigator.userAgent.toLowerCase().match(/iPhone/)) {
            var j = $.extend({}, $.fn.jSnow.defaults, h);
            var k, WIN_HEIGHT;
            setWaH();
            var l = j.flakes;
            var m = j.flakeCode;
            var n = j.flakeColor;
            var o = j.flakeMinSize;
            var p = j.flakeMaxSize;
            var q = j.fallingSpeedMin;
            var r = j.fallingSpeedMax;
            var s = j.swingMin;
            var t = j.swingMax;
            var u = j.interval;
            var v = j.zIndex;
            if ($.browser.msie && (parseFloat($.browser.version) < 8) && v == "auto") {
                v = 0
            }
            var w = $("<div \/>");
            w.css({ width: k + "px", height: 1, display: "block", overflow: "visible", position: "absolute", top: $("html").scrollTop() + 1 + "px", left: "1px" });
            $("html").css({ "overflow-y": "scroll", "overflow-x": "hidden", height: "100%" });
            $("body").prepend(w).css({ "overflow": "hidden" });
            var x = Array();
            generateFlake(l, false);
            var u = setInterval(animateFlakes, u);
            window.onresize = setWaH
        }
        function setWaH() {
            k = $('body').width();
            WIN_HEIGHT = window.innerHeight || document.documentElement.clientHeight
        };
        this.kill = function() {
            clearInterval(u);
            u = null;
            for (var i = 0; i < x.length; i++) {
                var f = x[i];
                jQuery.removeData(f);
                f.remove()
            } x = null;
            w.remove()
        };
        window.onscroll = function() {
            w.css({ top: $("html").scrollTop() + "px" })
        };
        function generateFlake(a, b) {
            a = a || 1;
            b = b || false;
            var i = 0;
            for (i = 0; i < a; i++) {
                var c = $("<span \/>");
                var d = o + Math.floor(Math.random() * p);
                var e = m[Math.floor(Math.random() * m.length)];
                if (e.indexOf(".gif") != -1 || e.indexOf(".png") != -1) {
                    var f = new Image();
                    f.src = e;
                    e = "<img src='" + e + "' alt=' '>"
                } c.html(e).css({ color: n[Math.floor(Math.random() * n.length)], fontSize: d + "px", display: "block", position: "absolute", cursor: "default", "z-index": v });
                $(w).append(c);
                f_left = Math.floor(Math.random() * (k - c.width() - 50)) + 25;
                f_top = (b) ? -1 * c.height() : Math.floor(Math.random() * (WIN_HEIGHT - 50));
                var g = Math.floor(Math.random() * (t - s)) + s;
                jQuery.data(c, "posData", { top: f_top, left: f_left, rad: Math.random() * 50, i: Math.ceil(q + Math.random() * (r - q)), swingRange: g });
                c.css({ top: f_top + "px", left: f_left + "px" });
                x.push(c)
                if ($.isFunction($.fn.supersleight)) {
                    c.supersleight({ shim: _appPath + '/images/blank.gif' });
                }
            }
        };
        function animateFlakes() {
            var i = 0;
            for (i = x.length - 1; i >= 0; i--) {
                var f = x[i];
                var a = jQuery.data(f, "posData");
                a.top += a.i;
                var b = Number();
                b = Math.cos((a.rad / 180) * Math.PI);
                a.rad += 2;
                var X = a.left - b * a.swingRange;
                f.css({ top: a.top + "px", left: X + "px" });
                if (a.top > WIN_HEIGHT) {
                    jQuery.removeData(f);
                    f.remove();
                    x.splice(i, 1);
                    generateFlake(1, true)
                }
            }
        };
        return this
    };
    $.fn.jSnow.defaults = {
        flakes: 30,
        fallingSpeedMin: 1,
        fallingSpeedMax: 3,
        flakeMaxSize: 20,
        flakeMinSize: 10,
        flakeCode: ["&bull;"],
        flakeColor: ["#fff"],
        zIndex: "auto",
        interval: 50,
        swingMin: 0,
        swingMax: 200
    }
})(jQuery);
