<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://gend3r.com/index.php?action=history&amp;feed=atom&amp;title=User%3AUnalivedLoafff%2Fcommon.js</id>
	<title>User:UnalivedLoafff/common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://gend3r.com/index.php?action=history&amp;feed=atom&amp;title=User%3AUnalivedLoafff%2Fcommon.js"/>
	<link rel="alternate" type="text/html" href="https://gend3r.com/index.php?title=User:UnalivedLoafff/common.js&amp;action=history"/>
	<updated>2026-04-07T15:09:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://gend3r.com/index.php?title=User:UnalivedLoafff/common.js&amp;diff=13207&amp;oldid=prev</id>
		<title>imported&gt;UnalivedLoafff: Snow!</title>
		<link rel="alternate" type="text/html" href="https://gend3r.com/index.php?title=User:UnalivedLoafff/common.js&amp;diff=13207&amp;oldid=prev"/>
		<updated>2023-11-24T00:03:01Z</updated>

		<summary type="html">&lt;p&gt;Snow!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/** @license&lt;br /&gt;
 * DHTML Snowstorm! JavaScript-based snow for web pages, &lt;br /&gt;
 * ported from https://github.com/scottschiller/Snowstorm for fandom wikis&lt;br /&gt;
 * -----------------------------------------------------------&lt;br /&gt;
 * Version 1.44.20131215 (Previous rev: 1.44.20131208)&lt;br /&gt;
 * Copyright (c) 2007, Scott Schiller. All rights reserved.&lt;br /&gt;
 * Code provided under the BSD License&lt;br /&gt;
 * https://github.com/scottschiller/Snowstorm/blob/master/license.txt&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*jslint nomen: true, plusplus: true, sloppy: true, vars: true, white: true */&lt;br /&gt;
/*global window, document, navigator, clearInterval, setInterval */&lt;br /&gt;
window.snowStorm = (new function() { // jshint ignore:line&lt;br /&gt;
	var defaults = {&lt;br /&gt;
		autoStart: true, // Whether the snow should start automatically or not.&lt;br /&gt;
		excludeMobile: true, // Snow is likely to be bad news for mobile phones&amp;#039; CPUs (and batteries.) Enable at your own risk.&lt;br /&gt;
		flakesMax: 128, // Limit total amount of snow made (falling + sticking)&lt;br /&gt;
		flakesMaxActive: 64,  // Limit amount of snow falling at once (less = lower CPU use)&lt;br /&gt;
		animationInterval: 35, // Theoretical &amp;quot;milliseconds per frame&amp;quot; measurement. 20 = fast + smooth, but high &lt;br /&gt;
							// CPU use. 50 = more conservative, but slower&lt;br /&gt;
		useGPU: true, // Enable transform-based hardware acceleration, reduce CPU load.&lt;br /&gt;
		className: null, // CSS class name for further customization on snow elements&lt;br /&gt;
		flakeBottom: null, // Integer for Y axis snow limit, 0 or null for &amp;quot;full-screen&amp;quot; snow effect&lt;br /&gt;
		followMouse: true, // Snow movement can respond to the user&amp;#039;s mouse&lt;br /&gt;
		snowColor: &amp;#039;#fff&amp;#039;, // Don&amp;#039;t eat (or use?) yellow snow.&lt;br /&gt;
		snowCharacter: &amp;#039;&amp;amp;bull;&amp;#039;, // &amp;amp;bull; = bullet, &amp;amp;middot, is square on some systems etc.&lt;br /&gt;
		snowStick: true, // Whether or not snow should &amp;quot;stick&amp;quot; at the bottom. When off, will never collect.&lt;br /&gt;
		targetElement: null, // element which snow will be appended to (null = document.body) - can be an element &lt;br /&gt;
	// ID eg. &amp;#039;myDiv&amp;#039;, or a DOM node reference&lt;br /&gt;
		useMeltEffect: true, // When recycling fallen snow (or rarely, when falling), have it &amp;quot;melt&amp;quot; and fade out &lt;br /&gt;
	// if browser supports it&lt;br /&gt;
		useTwinkleEffect: false, // Allow snow to randomly &amp;quot;flicker&amp;quot; in and out of view while falling&lt;br /&gt;
		usePositionFixed: false, // true = snow does not shift vertically when scrolling. May increase CPU load, &lt;br /&gt;
	// disabled by default - if enabled, used only where supported&lt;br /&gt;
		usePixelPosition: false, // Whether to use pixel values for snow top/left vs. percentages. Auto-enabled if &lt;br /&gt;
	// body is position:relative or targetElement is specified.&lt;br /&gt;
&lt;br /&gt;
		// --- less-used bits ---&lt;br /&gt;
		freezeOnBlur: true, // Only snow when the window is in focus (foreground.) Saves CPU.&lt;br /&gt;
		flakeLeftOffset: 0, // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars.&lt;br /&gt;
		flakeRightOffset: 0, // Right margin/gutter space on edge of container&lt;br /&gt;
		flakeWidth: 8, // Max pixel width reserved for snow element&lt;br /&gt;
		flakeHeight: 8, // Max pixel height reserved for snow element&lt;br /&gt;
		vMaxX: 5, // Maximum X velocity range for snow&lt;br /&gt;
		vMaxY: 4, // Maximum Y velocity range for snow&lt;br /&gt;
		zIndex: -1, // CSS stacking order applied to each snowflake&lt;br /&gt;
		windOffset: 1,&lt;br /&gt;
		windMultiplier: 2,&lt;br /&gt;
		flakeTypes: 6,&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var config = Object.assign(defaults, window.snowStorm || {});&lt;br /&gt;
	&lt;br /&gt;
	// Support deprecated configuration parameters - support will be removed at any time without warning&lt;br /&gt;
	Object.keys(defaults).forEach(function(key) {&lt;br /&gt;
		if (key in window) {&lt;br /&gt;
			console.warn(&amp;#039;[SnowStorm] You are using a deprecated configuration key `&amp;#039; + key + &amp;#039;`. Please see &amp;lt;https://dev.fandom.com/wiki/SnowStorm&amp;gt; for supported parameter.&amp;#039;);&lt;br /&gt;
			config[key] = window[key];&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	Object.assign(this, config);&lt;br /&gt;
&lt;br /&gt;
	// --- &amp;quot;No user-serviceable parts inside&amp;quot; past this point, yadda yadda ---&lt;br /&gt;
	var storm = this,&lt;br /&gt;
		features,&lt;br /&gt;
		// UA sniffing and backCompat rendering mode checks for fixed position, etc.&lt;br /&gt;
		isIE = navigator.userAgent.match(/msie/i),&lt;br /&gt;
		isIE6 = navigator.userAgent.match(/msie 6/i),&lt;br /&gt;
		isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i),&lt;br /&gt;
		isBackCompatIE = (isIE &amp;amp;&amp;amp; document.compatMode === &amp;#039;BackCompat&amp;#039;),&lt;br /&gt;
		noFixed = (isBackCompatIE || isIE6),&lt;br /&gt;
		screenX = null,&lt;br /&gt;
		screenX2 = null,&lt;br /&gt;
		screenY = null,&lt;br /&gt;
		scrollY = null,&lt;br /&gt;
		docHeight = null,&lt;br /&gt;
		vRndX = null,&lt;br /&gt;
		vRndY = null,&lt;br /&gt;
		fixedForEverything = false,&lt;br /&gt;
		targetElementIsRelative = false,&lt;br /&gt;
		opacitySupported = (function() {&lt;br /&gt;
			try {&lt;br /&gt;
				document.createElement(&amp;#039;div&amp;#039;).style.opacity = &amp;#039;0.5&amp;#039;;&lt;br /&gt;
			} catch(e) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		}()),&lt;br /&gt;
		didInit = false,&lt;br /&gt;
		docFrag = document.createDocumentFragment();&lt;br /&gt;
&lt;br /&gt;
	features = (function() {&lt;br /&gt;
		var getAnimationFrame;&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * hat tip: paul irish&lt;br /&gt;
		 * https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/&lt;br /&gt;
		 * https://gist.github.com/838785&lt;br /&gt;
		 */&lt;br /&gt;
		function timeoutShim(callback) {&lt;br /&gt;
			window.setTimeout(callback, 1000 / (storm.animationInterval || 20));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var _animationFrame = (window.requestAnimationFrame ||&lt;br /&gt;
			window.webkitRequestAnimationFrame ||&lt;br /&gt;
			window.mozRequestAnimationFrame ||&lt;br /&gt;
			window.oRequestAnimationFrame ||&lt;br /&gt;
			window.msRequestAnimationFrame ||&lt;br /&gt;
			timeoutShim);&lt;br /&gt;
&lt;br /&gt;
		// apply to window, avoid &amp;quot;illegal invocation&amp;quot; errors in Chrome&lt;br /&gt;
		getAnimationFrame = _animationFrame ? function() {&lt;br /&gt;
			return _animationFrame.apply(window, arguments);&lt;br /&gt;
		} : null;&lt;br /&gt;
&lt;br /&gt;
		var testDiv = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		function has(prop) {&lt;br /&gt;
			// test for feature support&lt;br /&gt;
			var result = testDiv.style[prop];&lt;br /&gt;
			return result !== undefined ? prop : null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// note local scope.&lt;br /&gt;
		var localFeatures = {&lt;br /&gt;
			transform: {&lt;br /&gt;
				ie: has(&amp;#039;-ms-transform&amp;#039;),&lt;br /&gt;
				moz: has(&amp;#039;MozTransform&amp;#039;),&lt;br /&gt;
				opera: has(&amp;#039;OTransform&amp;#039;),&lt;br /&gt;
				webkit: has(&amp;#039;webkitTransform&amp;#039;),&lt;br /&gt;
				w3: has(&amp;#039;transform&amp;#039;),&lt;br /&gt;
				prop: null // the normalized property value&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			getAnimationFrame: getAnimationFrame&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		localFeatures.transform.prop = (&lt;br /&gt;
			localFeatures.transform.w3 ||&lt;br /&gt;
			localFeatures.transform.moz ||&lt;br /&gt;
			localFeatures.transform.webkit ||&lt;br /&gt;
			localFeatures.transform.ie ||&lt;br /&gt;
			localFeatures.transform.opera&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		testDiv = null;&lt;br /&gt;
		return localFeatures;&lt;br /&gt;
	}());&lt;br /&gt;
&lt;br /&gt;
	this.timer = null;&lt;br /&gt;
	this.flakes = [];&lt;br /&gt;
	this.disabled = false;&lt;br /&gt;
	this.active = false;&lt;br /&gt;
	this.meltFrameCount = 20;&lt;br /&gt;
	this.meltFrames = [];&lt;br /&gt;
&lt;br /&gt;
	this.setXY = function(o, x, y) {&lt;br /&gt;
		if (!o) return false;&lt;br /&gt;
&lt;br /&gt;
		if (storm.usePixelPosition || targetElementIsRelative) {&lt;br /&gt;
			o.style.left = (x - storm.flakeWidth) + &amp;#039;px&amp;#039;;&lt;br /&gt;
			o.style.top = (y - storm.flakeHeight) + &amp;#039;px&amp;#039;;&lt;br /&gt;
		} else if (noFixed) {&lt;br /&gt;
			o.style.right = (100 - (x / screenX * 100)) + &amp;#039;%&amp;#039;;&lt;br /&gt;
			// avoid creating vertical scrollbars&lt;br /&gt;
			o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + &amp;#039;px&amp;#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!storm.flakeBottom) {&lt;br /&gt;
				// if not using a fixed bottom coordinate...&lt;br /&gt;
				o.style.right = (100 - (x / screenX * 100)) + &amp;#039;%&amp;#039;;&lt;br /&gt;
				o.style.bottom = (100 - (y / screenY * 100)) + &amp;#039;%&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				// absolute top.&lt;br /&gt;
				o.style.right = (100 - (x / screenX * 100)) + &amp;#039;%&amp;#039;;&lt;br /&gt;
				o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + &amp;#039;px&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.events = (function() {&lt;br /&gt;
		var old = !window.addEventListener &amp;amp;&amp;amp; window.attachEvent,&lt;br /&gt;
			slice = Array.prototype.slice,&lt;br /&gt;
			evt = {&lt;br /&gt;
				add: old ? &amp;#039;attachEvent&amp;#039; : &amp;#039;addEventListener&amp;#039;,&lt;br /&gt;
				remove: old ? &amp;#039;detachEvent&amp;#039; : &amp;#039;removeEventListener&amp;#039;,&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
		function getArgs(oArgs) {&lt;br /&gt;
			var args = slice.call(oArgs),&lt;br /&gt;
				len = args.length;&lt;br /&gt;
			if (old) {&lt;br /&gt;
				args[1] = &amp;#039;on&amp;#039; + args[1]; // prefix&lt;br /&gt;
				if (len &amp;gt; 3) {&lt;br /&gt;
					args.pop(); // no capture&lt;br /&gt;
				}&lt;br /&gt;
			} else if (len === 3) {&lt;br /&gt;
				args.push(false);&lt;br /&gt;
			}&lt;br /&gt;
			return args;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function apply(args, sType) {&lt;br /&gt;
			var element = args.shift(),&lt;br /&gt;
				method = [evt[sType]];&lt;br /&gt;
			if (old) {&lt;br /&gt;
				element[method](args[0], args[1]);&lt;br /&gt;
			} else {&lt;br /&gt;
				element[method].apply(element, args);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function addEvent() {&lt;br /&gt;
			apply(getArgs(arguments), &amp;#039;add&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function removeEvent() {&lt;br /&gt;
			apply(getArgs(arguments), &amp;#039;remove&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return {&lt;br /&gt;
			add: addEvent,&lt;br /&gt;
			remove: removeEvent&lt;br /&gt;
		};&lt;br /&gt;
	}());&lt;br /&gt;
&lt;br /&gt;
	function rnd(n, min) {&lt;br /&gt;
		if (isNaN(min)) min = 0;&lt;br /&gt;
		&lt;br /&gt;
		return (Math.random() * n) + min;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function plusMinus(n) {&lt;br /&gt;
		return parseInt(rnd(2), 10) === 1 ? n * -1 : n;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	this.randomizeWind = function() {&lt;br /&gt;
		var i;&lt;br /&gt;
		vRndX = plusMinus(rnd(storm.vMaxX, 0.2));&lt;br /&gt;
		vRndY = rnd(storm.vMaxY, 0.2);&lt;br /&gt;
		if (this.flakes) {&lt;br /&gt;
			for(i = 0; i &amp;lt; this.flakes.length; i++) {&lt;br /&gt;
				if (this.flakes[i].active) this.flakes[i].setVelocities();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.scrollHandler = function() {&lt;br /&gt;
		var i;&lt;br /&gt;
		// &amp;quot;attach&amp;quot; snowflakes to bottom of window if no absolute bottom value was given&lt;br /&gt;
		scrollY = (storm.flakeBottom ? 0 : parseInt(window.scrollY || document.documentElement.scrollTop || (noFixed ? document.body.scrollTop : 0), 10));&lt;br /&gt;
		if (isNaN(scrollY)) scrollY = 0; // Netscape 6 scroll fix&lt;br /&gt;
		if (!fixedForEverything &amp;amp;&amp;amp; !storm.flakeBottom &amp;amp;&amp;amp; storm.flakes) {&lt;br /&gt;
			for(i = 0; i &amp;lt; storm.flakes.length; i++) {&lt;br /&gt;
				if (storm.flakes[i].active === 0) {&lt;br /&gt;
					storm.flakes[i].stick();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.resizeHandler = function() {&lt;br /&gt;
		if (window.innerWidth || window.innerHeight) {&lt;br /&gt;
			screenX = window.innerWidth - 16 - storm.flakeRightOffset;&lt;br /&gt;
			screenY = (storm.flakeBottom || window.innerHeight);&lt;br /&gt;
		} else {&lt;br /&gt;
			screenX = (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth) - (!isIE ? 8 : 0) - storm.flakeRightOffset;&lt;br /&gt;
			screenY = storm.flakeBottom || document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight;&lt;br /&gt;
		}&lt;br /&gt;
		docHeight = document.body.offsetHeight;&lt;br /&gt;
		screenX2 = parseInt(screenX / 2, 10);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.resizeHandlerAlt = function() {&lt;br /&gt;
		screenX = storm.targetElement.offsetWidth - storm.flakeRightOffset;&lt;br /&gt;
		screenY = storm.flakeBottom || storm.targetElement.offsetHeight;&lt;br /&gt;
		screenX2 = parseInt(screenX / 2, 10);&lt;br /&gt;
		docHeight = document.body.offsetHeight;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.freeze = function() {&lt;br /&gt;
		// pause animation&lt;br /&gt;
		if (!storm.disabled) {&lt;br /&gt;
			storm.disabled = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		storm.timer = null;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.resume = function() {&lt;br /&gt;
		if (storm.disabled) {&lt;br /&gt;
			storm.disabled = 0;&lt;br /&gt;
		} else {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		storm.timerInit();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.toggleSnow = function() {&lt;br /&gt;
		if (!storm.flakes.length) {&lt;br /&gt;
			// first run&lt;br /&gt;
			storm.start();&lt;br /&gt;
		} else {&lt;br /&gt;
			storm.active = !storm.active;&lt;br /&gt;
			if (storm.active) {&lt;br /&gt;
				storm.show();&lt;br /&gt;
				storm.resume();&lt;br /&gt;
			} else {&lt;br /&gt;
				storm.stop();&lt;br /&gt;
				storm.freeze();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.stop = function() {&lt;br /&gt;
		var i;&lt;br /&gt;
		this.freeze();&lt;br /&gt;
		for(i = 0; i &amp;lt; this.flakes.length; i++) {&lt;br /&gt;
			this.flakes[i].o.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		storm.events.remove(window, &amp;#039;scroll&amp;#039;, storm.scrollHandler);&lt;br /&gt;
		storm.events.remove(window, &amp;#039;resize&amp;#039;, storm.resizeHandler);&lt;br /&gt;
		if (storm.freezeOnBlur) {&lt;br /&gt;
			if (isIE) {&lt;br /&gt;
				storm.events.remove(document, &amp;#039;focusout&amp;#039;, storm.freeze);&lt;br /&gt;
				storm.events.remove(document, &amp;#039;focusin&amp;#039;, storm.resume);&lt;br /&gt;
			} else {&lt;br /&gt;
				storm.events.remove(window, &amp;#039;blur&amp;#039;, storm.freeze);&lt;br /&gt;
				storm.events.remove(window, &amp;#039;focus&amp;#039;, storm.resume);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.show = function() {&lt;br /&gt;
		var i;&lt;br /&gt;
		for(i = 0; i &amp;lt; this.flakes.length; i++) {&lt;br /&gt;
			this.flakes[i].o.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.SnowFlake = function(type, x, y) {&lt;br /&gt;
		var s = this;&lt;br /&gt;
		this.type = type;&lt;br /&gt;
		this.x = x || parseInt(rnd(screenX - 20), 10);&lt;br /&gt;
		this.y = (!isNaN(y) ? y : -rnd(screenY) - 12);&lt;br /&gt;
		this.vX = null;&lt;br /&gt;
		this.vY = null;&lt;br /&gt;
		this.vAmpTypes = [1, 1.2, 1.4, 1.6, 1.8]; // &amp;quot;amplification&amp;quot; for vX/vY (based on flake size/type)&lt;br /&gt;
		this.vAmp = this.vAmpTypes[this.type] || 1;&lt;br /&gt;
		this.melting = false;&lt;br /&gt;
		this.meltFrameCount = storm.meltFrameCount;&lt;br /&gt;
		this.meltFrames = storm.meltFrames;&lt;br /&gt;
		this.meltFrame = 0;&lt;br /&gt;
		this.twinkleFrame = 0;&lt;br /&gt;
		this.active = 1;&lt;br /&gt;
		this.fontSize = (10 + (this.type / 5) * 10);&lt;br /&gt;
		this.o = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
		this.o.innerHTML = storm.snowCharacter;&lt;br /&gt;
		if (storm.className) {&lt;br /&gt;
			this.o.setAttribute(&amp;#039;class&amp;#039;, storm.className);&lt;br /&gt;
		}&lt;br /&gt;
		this.o.style.color = storm.snowColor;&lt;br /&gt;
		this.o.style.position = (fixedForEverything ? &amp;#039;fixed&amp;#039; : &amp;#039;absolute&amp;#039;);&lt;br /&gt;
		if (storm.useGPU &amp;amp;&amp;amp; features.transform.prop) {&lt;br /&gt;
			// GPU-accelerated snow.&lt;br /&gt;
			this.o.style[features.transform.prop] = &amp;#039;translate3d(0px, 0px, 0px)&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		this.o.style.width = storm.flakeWidth + &amp;#039;px&amp;#039;;&lt;br /&gt;
		this.o.style.height = storm.flakeHeight + &amp;#039;px&amp;#039;;&lt;br /&gt;
		this.o.style.fontFamily = &amp;#039;arial,verdana&amp;#039;;&lt;br /&gt;
		this.o.style.cursor = &amp;#039;default&amp;#039;;&lt;br /&gt;
		this.o.style.overflow = &amp;#039;hidden&amp;#039;;&lt;br /&gt;
		this.o.style.fontWeight = &amp;#039;normal&amp;#039;;&lt;br /&gt;
		this.o.style.zIndex = storm.zIndex;&lt;br /&gt;
		docFrag.appendChild(this.o);&lt;br /&gt;
&lt;br /&gt;
		this.refresh = function() {&lt;br /&gt;
			if (isNaN(s.x) || isNaN(s.y)) {&lt;br /&gt;
				// safety check&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			storm.setXY(s.o, s.x, s.y);&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.stick = function() {&lt;br /&gt;
			if (noFixed || (storm.targetElement !== document.documentElement &amp;amp;&amp;amp; storm.targetElement !== document.body)) {&lt;br /&gt;
				s.o.style.top = (screenY + scrollY - storm.flakeHeight) + &amp;#039;px&amp;#039;;&lt;br /&gt;
			} else if (storm.flakeBottom) {&lt;br /&gt;
				s.o.style.top = storm.flakeBottom + &amp;#039;px&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				s.o.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
				s.o.style.top = &amp;#039;auto&amp;#039;;&lt;br /&gt;
				s.o.style.bottom = &amp;#039;0%&amp;#039;;&lt;br /&gt;
				s.o.style.position = &amp;#039;fixed&amp;#039;;&lt;br /&gt;
				s.o.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.vCheck = function() {&lt;br /&gt;
			if (s.vX &amp;gt;= 0 &amp;amp;&amp;amp; s.vX &amp;lt; 0.2) {&lt;br /&gt;
				s.vX = 0.2;&lt;br /&gt;
			} else if (s.vX &amp;lt; 0 &amp;amp;&amp;amp; s.vX &amp;gt; -0.2) {&lt;br /&gt;
				s.vX = -0.2;&lt;br /&gt;
			}&lt;br /&gt;
			if (s.vY &amp;gt;= 0 &amp;amp;&amp;amp; s.vY &amp;lt; 0.2) {&lt;br /&gt;
				s.vY = 0.2;&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.move = function() {&lt;br /&gt;
			var vX = s.vX * storm.windOffset,&lt;br /&gt;
				yDiff;&lt;br /&gt;
			s.x += vX;&lt;br /&gt;
			s.y += (s.vY * s.vAmp);&lt;br /&gt;
			if (s.x &amp;gt;= screenX || screenX - s.x &amp;lt; storm.flakeWidth) { // X-axis scroll check&lt;br /&gt;
				s.x = 0;&lt;br /&gt;
			} else if (vX &amp;lt; 0 &amp;amp;&amp;amp; s.x - storm.flakeLeftOffset &amp;lt; -storm.flakeWidth) {&lt;br /&gt;
				s.x = screenX - storm.flakeWidth - 1; // flakeWidth;&lt;br /&gt;
			}&lt;br /&gt;
			s.refresh();&lt;br /&gt;
			yDiff = screenY + scrollY - s.y + storm.flakeHeight;&lt;br /&gt;
			if (yDiff &amp;lt; storm.flakeHeight) {&lt;br /&gt;
				s.active = 0;&lt;br /&gt;
				if (storm.snowStick) {&lt;br /&gt;
					s.stick();&lt;br /&gt;
				} else {&lt;br /&gt;
					s.recycle();&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				if (storm.useMeltEffect &amp;amp;&amp;amp; s.active &amp;amp;&amp;amp; s.type &amp;lt; 3 &amp;amp;&amp;amp; !s.melting &amp;amp;&amp;amp; Math.random() &amp;gt; 0.998) {&lt;br /&gt;
					// ~1/1000 chance of melting mid-air, with each frame&lt;br /&gt;
					s.melting = true;&lt;br /&gt;
					s.melt();&lt;br /&gt;
					// only incrementally melt one frame&lt;br /&gt;
					// s.melting = false;&lt;br /&gt;
				}&lt;br /&gt;
				if (storm.useTwinkleEffect) {&lt;br /&gt;
					if (s.twinkleFrame &amp;lt; 0) {&lt;br /&gt;
						if (Math.random() &amp;gt; 0.97) {&lt;br /&gt;
							s.twinkleFrame = parseInt(Math.random() * 8, 10);&lt;br /&gt;
						}&lt;br /&gt;
					} else {&lt;br /&gt;
						s.twinkleFrame--;&lt;br /&gt;
						if (!opacitySupported) {&lt;br /&gt;
							s.o.style.visibility = (s.twinkleFrame &amp;amp;&amp;amp; s.twinkleFrame % 2 === 0 ? &amp;#039;hidden&amp;#039; : &amp;#039;visible&amp;#039;);&lt;br /&gt;
						} else {&lt;br /&gt;
							s.o.style.opacity = (s.twinkleFrame &amp;amp;&amp;amp; s.twinkleFrame % 2 === 0 ? 0 : 1);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.animate = function() {&lt;br /&gt;
			// main animation loop&lt;br /&gt;
			// move, check status, die etc.&lt;br /&gt;
			s.move();&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.setVelocities = function() {&lt;br /&gt;
			s.vX = vRndX + rnd(storm.vMaxX * 0.12, 0.1);&lt;br /&gt;
			s.vY = vRndY + rnd(storm.vMaxY * 0.12, 0.1);&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.setOpacity = function(o, opacity) {&lt;br /&gt;
			if (!opacitySupported) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			o.style.opacity = opacity;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.melt = function() {&lt;br /&gt;
			if (!storm.useMeltEffect || !s.melting) {&lt;br /&gt;
				s.recycle();&lt;br /&gt;
			} else {&lt;br /&gt;
				if (s.meltFrame &amp;lt; s.meltFrameCount) {&lt;br /&gt;
					s.setOpacity(s.o, s.meltFrames[s.meltFrame]);&lt;br /&gt;
					s.o.style.fontSize = s.fontSize - (s.fontSize * (s.meltFrame / s.meltFrameCount)) + &amp;#039;px&amp;#039;;&lt;br /&gt;
					s.o.style.lineHeight = storm.flakeHeight + 2 + (storm.flakeHeight * 0.75 * (s.meltFrame / s.meltFrameCount)) + &amp;#039;px&amp;#039;;&lt;br /&gt;
					s.meltFrame++;&lt;br /&gt;
				} else {&lt;br /&gt;
					s.recycle();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.recycle = function() {&lt;br /&gt;
			s.o.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
			s.o.style.position = (fixedForEverything ? &amp;#039;fixed&amp;#039; : &amp;#039;absolute&amp;#039;);&lt;br /&gt;
			s.o.style.bottom = &amp;#039;auto&amp;#039;;&lt;br /&gt;
			s.setVelocities();&lt;br /&gt;
			s.vCheck();&lt;br /&gt;
			s.meltFrame = 0;&lt;br /&gt;
			s.melting = false;&lt;br /&gt;
			s.setOpacity(s.o, 1);&lt;br /&gt;
			s.o.style.padding = &amp;#039;0px&amp;#039;;&lt;br /&gt;
			s.o.style.margin = &amp;#039;0px&amp;#039;;&lt;br /&gt;
			s.o.style.fontSize = s.fontSize + &amp;#039;px&amp;#039;;&lt;br /&gt;
			s.o.style.lineHeight = (storm.flakeHeight + 2) + &amp;#039;px&amp;#039;;&lt;br /&gt;
			s.o.style.textAlign = &amp;#039;center&amp;#039;;&lt;br /&gt;
			s.o.style.verticalAlign = &amp;#039;baseline&amp;#039;;&lt;br /&gt;
			s.x = parseInt(rnd(screenX - storm.flakeWidth - 20), 10);&lt;br /&gt;
			s.y = parseInt(rnd(screenY) * -1, 10) - storm.flakeHeight;&lt;br /&gt;
			s.refresh();&lt;br /&gt;
			s.o.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
			s.active = 1;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		this.recycle(); // set up x/y coords etc.&lt;br /&gt;
		this.refresh();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.snow = function() {&lt;br /&gt;
		var active = 0,&lt;br /&gt;
			flake = null,&lt;br /&gt;
			i, j;&lt;br /&gt;
		for(i = 0, j = storm.flakes.length; i &amp;lt; j; i++) {&lt;br /&gt;
			if (storm.flakes[i].active === 1) {&lt;br /&gt;
				storm.flakes[i].move();&lt;br /&gt;
				active++;&lt;br /&gt;
			}&lt;br /&gt;
			if (storm.flakes[i].melting) {&lt;br /&gt;
				storm.flakes[i].melt();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (active &amp;lt; storm.flakesMaxActive) {&lt;br /&gt;
			flake = storm.flakes[parseInt(rnd(storm.flakes.length), 10)];&lt;br /&gt;
			if (flake.active === 0) {&lt;br /&gt;
				flake.melting = true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (storm.timer) {&lt;br /&gt;
			features.getAnimationFrame(storm.snow);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.mouseMove = function(e) {&lt;br /&gt;
		if (!storm.followMouse) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		var x = parseInt(e.clientX, 10);&lt;br /&gt;
		if (x &amp;lt; screenX2) {&lt;br /&gt;
			storm.windOffset = -storm.windMultiplier + (x / screenX2 * storm.windMultiplier);&lt;br /&gt;
		} else {&lt;br /&gt;
			x -= screenX2;&lt;br /&gt;
			storm.windOffset = (x / screenX2) * storm.windMultiplier;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.createSnow = function(limit, allowInactive) {&lt;br /&gt;
		var i;&lt;br /&gt;
		for(i = 0; i &amp;lt; limit; i++) {&lt;br /&gt;
			storm.flakes[storm.flakes.length] = new storm.SnowFlake(parseInt(rnd(storm.flakeTypes), 10));&lt;br /&gt;
			if (allowInactive || i &amp;gt; storm.flakesMaxActive) {&lt;br /&gt;
				storm.flakes[storm.flakes.length - 1].active = -1;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		storm.targetElement.appendChild(docFrag);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.timerInit = function() {&lt;br /&gt;
		storm.timer = true;&lt;br /&gt;
		storm.snow();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.init = function() {&lt;br /&gt;
		var i;&lt;br /&gt;
		for(i = 0; i &amp;lt; storm.meltFrameCount; i++) {&lt;br /&gt;
			storm.meltFrames.push(1 - (i / storm.meltFrameCount));&lt;br /&gt;
		}&lt;br /&gt;
		storm.randomizeWind();&lt;br /&gt;
		storm.createSnow(storm.flakesMax); // create initial batch&lt;br /&gt;
		storm.events.add(window, &amp;#039;resize&amp;#039;, storm.resizeHandler);&lt;br /&gt;
		storm.events.add(window, &amp;#039;scroll&amp;#039;, storm.scrollHandler);&lt;br /&gt;
		if (storm.freezeOnBlur) {&lt;br /&gt;
			if (isIE) {&lt;br /&gt;
				storm.events.add(document, &amp;#039;focusout&amp;#039;, storm.freeze);&lt;br /&gt;
				storm.events.add(document, &amp;#039;focusin&amp;#039;, storm.resume);&lt;br /&gt;
			} else {&lt;br /&gt;
				storm.events.add(window, &amp;#039;blur&amp;#039;, storm.freeze);&lt;br /&gt;
				storm.events.add(window, &amp;#039;focus&amp;#039;, storm.resume);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		storm.resizeHandler();&lt;br /&gt;
		storm.scrollHandler();&lt;br /&gt;
		if (storm.followMouse) {&lt;br /&gt;
			storm.events.add(isIE ? document : window, &amp;#039;mousemove&amp;#039;, storm.mouseMove);&lt;br /&gt;
		}&lt;br /&gt;
		storm.animationInterval = Math.max(20, storm.animationInterval);&lt;br /&gt;
		storm.timerInit();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.start = function(bFromOnLoad) {&lt;br /&gt;
		if (!didInit) {&lt;br /&gt;
			didInit = true;&lt;br /&gt;
		} else if (bFromOnLoad) {&lt;br /&gt;
			// already loaded and running&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if (typeof storm.targetElement === &amp;#039;string&amp;#039;) {&lt;br /&gt;
			var targetID = storm.targetElement;&lt;br /&gt;
			storm.targetElement = document.getElementById(targetID);&lt;br /&gt;
			if (!storm.targetElement) {&lt;br /&gt;
				throw new Error(&amp;#039;Snowstorm: Unable to get targetElement &amp;quot;&amp;#039; + targetID + &amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (!storm.targetElement) {&lt;br /&gt;
			storm.targetElement = (document.body || document.documentElement);&lt;br /&gt;
		}&lt;br /&gt;
		if (storm.targetElement !== document.documentElement &amp;amp;&amp;amp; storm.targetElement !== document.body) {&lt;br /&gt;
			// re-map handler to get element instead of screen dimensions&lt;br /&gt;
			storm.resizeHandler = storm.resizeHandlerAlt;&lt;br /&gt;
			//and force-enable pixel positioning&lt;br /&gt;
			storm.usePixelPosition = true;&lt;br /&gt;
		}&lt;br /&gt;
		storm.resizeHandler(); // get bounding box elements&lt;br /&gt;
		storm.usePositionFixed = (storm.usePositionFixed &amp;amp;&amp;amp; !noFixed &amp;amp;&amp;amp; !storm.flakeBottom); // whether or not position:fixed is to be used&lt;br /&gt;
		if (window.getComputedStyle) {&lt;br /&gt;
			// attempt to determine if body or user-specified snow parent element is relatlively-positioned.&lt;br /&gt;
			try {&lt;br /&gt;
				targetElementIsRelative = (window.getComputedStyle(storm.targetElement, null).getPropertyValue(&amp;#039;position&amp;#039;) === &amp;#039;relative&amp;#039;);&lt;br /&gt;
			} catch(e) {&lt;br /&gt;
				// oh well&lt;br /&gt;
				targetElementIsRelative = false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		fixedForEverything = storm.usePositionFixed;&lt;br /&gt;
		if (screenX &amp;amp;&amp;amp; screenY &amp;amp;&amp;amp; !storm.disabled) {&lt;br /&gt;
			storm.init();&lt;br /&gt;
			storm.active = true;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	function doDelayedStart() {&lt;br /&gt;
		window.setTimeout(function() {&lt;br /&gt;
			storm.start(true);&lt;br /&gt;
		}, 20);&lt;br /&gt;
		// event cleanup&lt;br /&gt;
		storm.events.remove(isIE ? document : window, &amp;#039;mousemove&amp;#039;, doDelayedStart);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function doStart() {&lt;br /&gt;
		if ((!storm.excludeMobile || !isMobile)) {&lt;br /&gt;
			doDelayedStart();&lt;br /&gt;
		}&lt;br /&gt;
		// event cleanup&lt;br /&gt;
		storm.events.remove(window, &amp;#039;load&amp;#039;, doStart);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// hooks for starting the snow&lt;br /&gt;
	if (storm.autoStart) {&lt;br /&gt;
		if (document.readyState === &amp;#039;complete&amp;#039;) {&lt;br /&gt;
			doStart();&lt;br /&gt;
		} else {&lt;br /&gt;
			storm.events.add(window, &amp;#039;load&amp;#039;, doStart, false);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>imported&gt;UnalivedLoafff</name></author>
	</entry>
</feed>