Commits

hideki nara committed 05dc180

Snowflaks ....

Comments (0)

Files changed (34)

source/backends.pipeline.rst

 
 
 associate_by_email:  指定されたメールアドレスに対応するソーシャルユーザーを渡す
---------------------------------------------------------
+---------------------------------------------------------------------------------------------------------
 
 .. autofunction:: social_auth.backends.pipeline.associate.associate_by_email
 

themes/talks/layout.html

 #}
 
 {% extends "basic/layout.html" %}
-{% set script_files = script_files + ['_static/fancybox/jquery.fancybox.pack.js','_static/talks.js', ] %}
+{% set script_files = script_files + ['_static/fancybox/jquery.fancybox.pack.js','_static/talks.js', '_static/snow/snowstorm.js',] %}
 {% set css_files = css_files + ['_static/print.css','_static/fancybox/jquery.fancybox.css',] %}
 
 {# do not display relbars #}

themes/talks/static/snow/.gitignore

+build.*
+.DS_Store
+*.zip

themes/talks/static/snow/README

+/**
+ * DHTML Snowstorm! JavaScript-based Snow for web pages
+ * --------------------------------------------------------
+ * Version 1.43.20111201 (Previous rev: 1.42.20111120)
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/snowstorm/license.txt
+ */
+
+Homepage, demo, downloads etc.:
+http://www.schillmania.com/projects/snowstorm/
+

themes/talks/static/snow/basic-example-customized.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+<title>DHTML SnowStorm: Basic Example</title>
+<script type="text/javascript" src="snowstorm.js"></script>
+<script type="text/javascript">
+snowStorm.snowColor = '#99ccff'; // blue-ish snow!?
+snowStorm.flakesMaxActive = 96;  // show more snow on screen at once
+snowStorm.useTwinkleEffect = true; // let the snow flicker in and out of view
+</script>
+</head>
+
+<body style="background:#336699">
+
+<h1 style="font-size:1em;color:#fff">Example SnowStorm page</h1>
+
+<p style="font-size:1em;color:#fff">
+ A single Javascript reference in the &lt;head&gt; tag is required for SnowStorm to work.<br />
+ As well, some customized options are specified which override the SnowStorm defaults.<br />
+ View the source of this page for reference.
+</p>
+
+<pre style="color:#99ccff">
+&lt;!-- required snowstorm JS, default behaviour --&gt;
+&lt;script type="text/javascript" src="snowstorm.js"&gt;&lt;/script&gt;
+
+&lt;!-- now, we'll customize the snowStorm object --&gt;
+&lt;script type="text/javascript"&gt;
+snowStorm.snowColor = '#99ccff'; // blue-ish snow!?
+snowStorm.flakesMaxActive = 96;  // show more snow on screen at once
+snowStorm.useTwinkleEffect = true; // let the snow flicker in and out of view
+&lt;/script&gt;
+</pre>
+
+</body>
+</html>

themes/talks/static/snow/basic-example.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+<title>DHTML SnowStorm: Basic Example</title>
+<script type="text/javascript" src="snowstorm.js"></script>
+</head>
+
+<body style="background:#6699cc">
+
+<h1 style="font-size:1em;color:#fff">Example SnowStorm page</h1>
+
+<p style="font-size:1em;color:#fff">
+ A single Javascript reference in the &lt;head&gt; tag is required for SnowStorm to work.<br />
+ View the source of this page for reference.
+</p>
+
+
+</body>
+</html>

themes/talks/static/snow/demo/basic-html4-example.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>DHTML SnowStorm: Basic Example (HTML4 DTD)</title>
+<meta name="robots" content="noindex" />
+<script src="snowstorm-min.js"></script>
+</head>
+
+<body style="background:#6699cc">
+
+<h1 style="font-size:1em;color:#fff">Example SnowStorm page</h1>
+
+<p style="font-size:1em;color:#fff">
+ A single Javascript reference in the &lt;head&gt; tag is required for SnowStorm to work.<br />
+ View the source of this page for reference.
+</p>
+
+<p style="font-size:1em;color:#fff">This page uses a HTML 4.01 transitional DTD, and thus Internet Explorer doesn't support position:fixed in "backCompat" rendering mode. The script should handle this case properly.</p>
+
+
+</body>
+</html>

themes/talks/static/snow/demo/basic-html5-example.html

+<!DOCTYPE html>
+<html>
+<head>
+<title>DHTML SnowStorm: Basic Example (HTML5 DTD)</title>
+<meta name="robots" content="noindex" />
+<script src="snowstorm-min.js"></script>
+</head>
+
+<body style="background:#6699cc">
+
+<h1 style="font-size:1em;color:#fff">Example SnowStorm page</h1>
+
+<p style="font-size:1em;color:#fff">
+ A single Javascript reference in the &lt;head&gt; tag is required for SnowStorm to work.<br />
+ View the source of this page for reference.
+</p>
+
+<p style="font-size:1em;color:#fff">This page uses a HTML 5 DTD. Older versions of IE should render this page in standards mode, where supported.</p>
+
+
+</body>
+</html>

themes/talks/static/snow/demo/demo_background.gif

Added
New image

themes/talks/static/snow/demo/demo_default.css

+/*
+
+ SnowStorm demo page CSS
+ -----------------------
+
+ None of this is needed for the snow effect to work - it's strictly to make the demo/documentation look pretty.
+
+*/
+
+body {
+ margin:0px;
+ padding:0px;
+ background:#333 url(../lights/image/bg-strip-dark.png);
+ color:#eeeeee;
+ font-family:"helvetica neue",helvetica,verdana,arial,tahoma,"sans serif";
+ font-size:85%;
+ text-shadow: 0 0 0 #000; /* safari is lame. */
+}
+
+a {
+ color:#aaaa00;
+ text-decoration:none;
+}
+
+a:hover {
+ color:#ffff33;
+}
+
+h1, h2, h3 {
+ margin:0px;
+ color:#fff;
+ letter-spacing:-0.02em;
+}
+
+h1 {
+ font-size:2.2em;
+}
+
+h2 {
+ font-size:1.8em;
+ margin-top:1em;
+ color:#fff;
+}
+
+h3 {
+ font-size:1.4em;
+ margin-top:1em;
+ margin-bottom:0.5em;
+ color:#99ccff;
+}
+
+h2 + h3,
+h3 + p {
+ margin-top:0px;
+}
+
+p {
+ margin:1em 0px 0px 0px;
+}
+
+dd,
+p {
+ line-height:1.6em;
+}
+
+p.first {
+ margin-top:0.25em;
+}
+
+.noTop {
+ margin-top:0px !important;
+ padding-top:0px !important;
+ line-height:1em;
+}
+
+pre {
+ font-size:1.2em;
+ *font-size:1em;
+ color:#33cc33;
+}
+
+pre span {
+ color: #999;
+}
+
+pre {
+ font-size:1.25em;
+}
+
+ul {
+ margin-left:16px;
+ padding-left:0px;
+ margin-top:5px;
+ margin-bottom:5px;
+}
+
+.bright {
+ color:#ff6666;
+}
+
+dl {
+ margin-left:1em;
+}
+
+dl dt {
+ font-weight:bold;
+ border-bottom:1px dotted #555;
+ padding-bottom:4px;
+ margin-top:1.5em;
+ margin-right:2%;
+}
+
+dl dd {
+ margin-top:4px;
+ margin-left:0px;
+ margin-bottom:0.5em;
+}
+
+code,
+dl dt code {
+ color:#33cc33;
+ font-weight:normal;
+}
+
+dl dd code {
+ color:#ccc;
+}
+
+dl em {
+ color:#fff;
+ font-weight:normal;
+ padding-top:2px;
+ padding-bottom:0.5em;
+}
+
+code {
+ font-family:monaco,"VT-100","lucida console",terminal,monospace,courier,system,sans-serif;
+ font-size:1em;
+ font-weight:light;
+}
+
+#container {
+ position:relative;
+ background-color:#222;
+ padding:32px 16px 16px 16px;
+ border:1px solid #111;
+ max-width:50em;
+ _width:50em;
+ margin:0px auto;
+}
+
+#content {
+ position:relative;
+ z-index:2;
+}
+
+.alt {
+ color:#ccc;
+}
+
+/* seasonal decorations */
+
+#lights {
+ position:absolute;
+ border-top:1px solid #006600;
+ left:0px;
+ top:0px;
+ width:100%;
+ height:275px;
+ overflow:hidden;
+ z-index:1;
+ display:none;
+}
+
+.xlsf-light {
+ position:absolute;
+ margin-top:-1px;
+}
+
+.xlsf-fragment {
+ position:absolute;
+ background:transparent url(../lights/image/bulbs-50x50-fragments.png) no-repeat 0px 0px;
+ width:50px;
+ height:50px;
+}
+
+.xlsf-fragment-box {
+ position:absolute;
+ left:0px;
+ top:0px;
+ width:50px;
+ height:50px;
+ *width:100%;
+ *height:100%;
+ display:none;
+}
+
+.xlsf-cover {
+ position:fixed;
+ left:0px;
+ top:0px;
+ width:100%;
+ height:100%;
+ background:#fff;
+ opacity:1;
+ z-index:999;
+ display:none;
+}
+
+.special {
+ display:none;
+ font-size:x-small;
+ color:#999;
+}
+
+ul li {
+ line-height:1.75em;
+}

themes/talks/static/snow/index.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+<title>JavaScript Snow: DHTML Snowstorm</title>
+<meta name="robots" content="noindex" />
+<meta name="robots" content="noindex" />
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
+<meta name="description" content="Realistic JavaScript snow effect for your web site. Free for any use. Includes wind, velocity, &quot;sticky&quot; snow and fading effects. Single file, easy to set up and customize." />
+<meta name="keywords" content="DHTML Snowstorm, DHTML snow, javascript snow, snow effect, Scott Schiller, Schill, Schillmania" />
+<meta name="author" content="Scott Schiller" />
+<meta name="copyright" content="Copyright (C) 2003 Scott Schiller" />
+<meta name="language" content="en-us" />
+<link type="text/css" rel="stylesheet" href="demo/demo_default.css" />
+
+<!-- Copy the <script> tag into your own page(s) for the snow effect. That is all! (No CSS etc. is needed) -->
+<script src="snowstorm.js"></script>
+
+<!-- for the Snowstorm homepage, allow the demo to run on iPhone and mobile devices. -->
+<script>snowStorm.excludeMobile = false;</script>
+
+<!-- bonus christmas light stuff, not required for snowstorm -->
+<script src="lights/soundmanager2-nodebug-jsmin.js"></script>
+<script src="http://yui.yahooapis.com/combo?2.6.0/build/yahoo-dom-event/yahoo-dom-event.js&2.6.0/build/animation/animation-min.js"></script>
+<script src="lights/christmaslights.js"></script>
+
+</head>
+
+<body>
+
+<div id="lights">
+ <!-- lights go here -->
+</div>
+
+<div id="container">
+
+ <div id="content">
+
+ <h1>Snowstorm: A JavaScript Snow Effect for HTML</h1>
+ <p class="alt noTop">Bringing snow to the web since 2003. This version: 1.43.20111201</p>
+
+ <p>
+  <a href="#" onclick="snowStorm.randomizeWind();return false">Change Wind</a> | <a href="#" onclick="snowStorm.stop();return false">Stop Snowing</a> | Bonus widget: <a href="lights/" onclick="if (document.location.protocol != 'http') this.href=this.href+'index.html'">Smash Christmas Lights</a>
+ </p>
+ <p id="special" class="special">(Note: Christmas Lights are incompatible with IE 6 because of PNG images.)</p>
+
+ <h2>Let It Snow.</h2>
+
+ <h3>So, you want JavaScript snow on your web site, eh?</h3>
+ 
+ <p class="first">Snowstorm is a JavaScript-driven snow effect that can be easily added to web pages. It is free for use, and easy to set up. A single JavaScript file provides the functionality required. No images are used for the snow effect.</p>
+
+ <h3>I'd like to use this on my site.</h3>
+
+ <p>This is all you need to get started:</p>
+
+ <p>
+  <pre>&lt;script src="snowstorm.js"&gt;&lt;/script&gt;</pre>
+ </p>
+
+ <p>See this <a href="basic-example.html" title="Simple Snowstorm demo">basic example</a> for reference.</p>
+
+ <h3>What kind of things can I customize?</h3>
+
+ <p>You can adjust the snow speed, the amount of snow, the "wind", if and where it should stick (and if it should "melt"), and finally, whether the snow can react to the mouse moving (ie., "wind changes.") See <a href="#customizing" title="Customizing snow storm behaviour">Customizing Snowstorm</a> for more.</p>
+
+ <h3>And the Christmas Lights?</h3>
+
+ <p>The christmas lights are a separate experimental script which also has an <a href="lights/" onclick="if (document.location.protocol != 'http') this.href=this.href+'index.html'">example</a>. It is undocumented, but the script can be modified to taste if you're the adventurous type.</p>
+
+ <h2 id="download">Download</h2>
+ <p class="first">ZIP file, includes this demo page and source code.</p>
+
+ <ul>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv143_20111201.zip">Snowstorm v1.43.20111201</a></li>
+ </ul>
+
+ <p>Also on Github: <a href="http://github.com/scottschiller/snowstorm/">github.com/scottschiller/snowstorm/</a></p>
+
+ <h2 id="license">License</h2>
+ <p class="first">Snowstorm is provided under a <a href="license.txt" title="Snowstorm BSD license">BSD license</a>.</p>
+
+ <h2 id="technotes">Technical Notes</h2>
+
+ <p class="first">Snowstorm works under most of the old major browsers (IE 5.x+, Netscape 6+) as well as IE 6, 7, 8, Firefox, Safari and Opera, and the iPhone. If you are seeing snow as you read this, then the script is working as expected.</p>
+
+ <h3>CPU Use</h3>
+
+ <p class="first">Snowstorm will eat up a lot of CPU, even on modern computers, because of the number of elements being moved around the screen at once. The <a href="basic-example.html" title="Simple Snowstorm demo">basic example</a> may have notably lower CPU use as it doesn't include the christmas lights, and the page layout is much simpler. Consider raising the animation interval, and lowering the amount of snowflakes (active and max) to help reduce CPU use.</p>
+
+ <p>By default, mobile phones are excluded from the snow effect to be nice to their CPUs (and batteries), but you can set <code>snowStorm.excludeMobile = false;</code> to enable Snowstorm on devices like the iPhone, iPad and Android cell phones etc. This demo page has the effect enabled for mobile devices.</p>
+
+ <h2 id="howto">Implementation</h2>
+
+ <p class="first">One JavaScript reference is required. Aside from customization, that's it!</p>
+
+<pre>
+&lt;script src="snowstorm.js"&gt;&lt;/script&gt;
+</pre>
+
+ <p>Once you have snowstorm configured, you can use the optimized, minified version of the code (~40% smaller):</p>
+
+ <p>
+  <pre>&lt;script src="snowstorm-min.js"&gt;&lt;/script&gt;</pre>
+ </p>
+
+ <h2 id="customizing">Customizing Snowstorm</h2>
+
+ <p>Once you have Snowstorm running in your page, you can customize its properties either by editing the snowstorm.js file directly, or assigning new values to the snowStorm object after snowstorm.js has loaded.</p>
+
+ <p>For example:</p>
+
+<pre>
+<span>&lt;!-- required snowstorm JS, default behaviour --&gt;</span>
+&lt;script src="snowstorm.js"&gt;&lt;/script&gt;
+
+<span>&lt;!-- now, we'll customize the snowStorm object --&gt;</span>
+&lt;script&gt;
+snowStorm.snowColor = '#99ccff'; <span>// blue-ish snow!?</span>
+snowStorm.flakesMaxActive = 96;  <span>// show more snow on screen at once</span>
+snowStorm.useTwinkleEffect = true; <span>// let the snow flicker in and out of view</span>
+&lt;/script&gt;
+</pre>
+
+ <p>See this <a href="basic-example-customized.html" title="Snowstorm with custom options">customized example</a> in action.</p>
+
+ <h2 id="properties">Configurable Properties</h2>
+
+ <p class="first">Snowstorm can be fairly easily customized; some of the major properties are listed below.</p>
+
+ <dl>
+
+  <dt><code>snowStorm.autoStart = true;</code></dt>
+  <dd>Whether the snow should start automatically or not.</dd>
+
+  <dt><code>snowStorm.animationInterval = 33;</code></dt>
+  <dd>Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower</dd>
+
+  <dt><code>snowStorm.flakeBottom = null;</code></dt>
+  <dd>Limits the "floor" (pixels) of the snow. If unspecified, snow will "stick" to the bottom of the browser window and persists through browser resize/scrolling.</dd>
+
+  <dt><code>snowStorm.flakesMax = 128;</code></dt>
+  <dd>Sets the maximum number of snowflakes that can exist on the screen at any given time.</dd>
+
+  <dt><code>snowStorm.flakesMaxActive = 64;</code></dt>
+  <dd>Sets the limit of "falling" snowflakes (ie. moving on the screen, thus considered to be active.)</dd>
+
+  <dt><code>snowStorm.followMouse = true;</code></dt>
+  <dd>Allows snow to move dynamically with the "wind", relative to the mouse's X (left/right) coordinates.</dd>
+
+  <dt><code>snowStorm.freezeOnBlur = true;</code></dt>
+  <dd>Stops the snow effect when the browser window goes out of focus, eg., user is in another tab. Saves CPU, nicer to user.</dd>
+
+  <dt><code>snowStorm.snowColor = '#fff';</code></dt>
+  <dd>Don't eat (or use?) yellow snow.</dd>
+
+  <dt><code>snowStorm.snowCharacter = '&bull;';</code></dt>
+  <dd>&amp;bull; (&bull;) = bullet. &amp;middot; entity (&middot;) is not used as it's square on some systems etc. Changing this may result in cropping of the character and may require flakeWidth/flakeHeight changes, so be careful.</dd>
+
+  <dt><code>snowStorm.snowStick = true;</code></dt>
+  <dd>Allows the snow to "stick" to the bottom of the window. When off, snow will never sit at the bottom.</dd>
+
+  <dt><code>snowStorm.targetElement = null;</code></dt>
+  <dd>Element which snow will be appended to (default: document body) - can be an element ID string eg. 'myDiv', or a DOM node reference.</dd>
+
+  <dt><code>snowStorm.useMeltEffect = true;</code></dt>
+  <dd>When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it</dd>
+
+  <dt><code>snowStorm.useTwinkleEffect = true;</code></dt>
+  <dd>Allow snow to randomly "flicker" in and out of view while falling</dd>
+
+  <dt><code>snowStorm.usePositionFixed = false;</code></dt>
+  <dd>true = snow not affected by window scroll. may increase CPU load, disabled by default - if enabled, used only where supported.</dd>
+
+  <dt><code>snowStorm.vMaxX = 8;<br />snowStorm.vMaxY = 5;</code></dt>
+  <dd>Defines maximum X and Y velocities for the storm; a random value in this range is selected for each snowflake.</dd>
+
+ </dl>
+
+ <h2 id="methods">Methods</h2>
+
+ <p>Snowstorm has a few basic methods for controlling the snow effect.</p>
+
+ <dl>
+
+  <dt><code>snowStorm.randomizeWind()</code></dt>
+  <dd>Sets the wind speed with a random value relative to vMaxX and vMaxY properties.</dd>
+
+  <dt><code>snowStorm.freeze()</code></dt>
+  <dd>Stops the snow effect in place.</dd>
+
+  <dt><code>snowStorm.resume()</code></dt>
+  <dd>Continues snowing from a "frozen" state.</dd>
+
+  <dt><code>snowStorm.toggleSnow()</code></dt>
+  <dd>Enables or disables the snow effect depending on state, same as calling freeze() or resume().</dd>
+
+  <dt><code>snowStorm.stop()</code></dt>
+  <dd>Freezes and kills the snowstorm effect, and removes related event handlers. Snowstorm will not work properly if other methods are called after stop().</dd>
+
+ </dl>
+
+ <h2 id="versionhistory">Version History</h2>
+
+ <h3 id="oldversions">Older versions</h3>
+ <ul>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv142_20111120.zip">Snowstorm v1.42.20111120</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv141_20101113.zip">Snowstorm v1.41.20101113</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv14_20091115.zip">Snowstorm v1.4.20091115</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv13_20081215.zip">Snowstorm v1.3.20081215</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstormv13_20081208.zip">Snowstorm v1.3.20081208</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstorm_20041121a.zip">Snowstorm v1.2.20041121a</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstorm_20031218a.zip">Snowstorm v1.2.20031218a</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstorm_20031213a.zip">Snowstorm v1.2.20031213a</a></li>
+  <li><a href="http://www.schillmania.com/projects/snowstorm/snowstorm_20031206c.zip">Snowstorm v1.1.20031206c</a></li>
+ </ul>
+
+ <h3>1.43.20111201</h3>
+ <ul>
+  <li>ImageOptim-optimized image files (byte savings)</li>
+  <li>Added snowStorm.autoStart, for those who want to start snow at their own leisure</li>
+  <li>Additional Mobile check: Opera Mobile</li>
+  <li>cursor:default over snow (instead of text I-beam cursor)</li>
+  <li>meltFrame animation counter correction (possible JS error fix)</li>
+ </ul>
+
+ <h3>1.42.20111120</h3>
+ <ul>
+  <li>Tweaked right margin for IE 9 under Windows 7, fixing horizontal scrollbar issue</li>
+  <li>Re-appeased the jslint gods</li>
+ </ul>
+
+ <h3>1.41.20101113</h3>
+ <ul>
+  <li>Added formal BSD license (project was previously "free for any use.")</li>
+  <li>Modernized event add/remove handlers, wait for window.onload() before starting</li>
+  <li>New excludeMobile option, ignore iPhone etc. by default (high CPU use on mobile is evil for both CPU, and batteries.)</li>
+  <li>New freezeOnBlur option, allow control of previously-hardcoded behaviour</li>
+  <li>Focus-based freezeOnBlur now works under IE 6, too</li>
+  <li>Code cleanup, now passes updated (more-strict) jslint validation</li>
+ </ul>
+
+ <h3>1.4.20091115</h3>
+ <ul>
+  <li>Text-based snow (and color options) using "bullet" HTML entity &bull; .. no more images!</li>
+  <li>New snowMelt effect, resize + fade where supported</li>
+  <li>New twinkle effect (like stars)</li>
+  <li>New animationInterval, usePositionFixed, snowColor attributes, common attributes now public on snowStorm object eg. snowStorm.stick = true;</li>
+  <li>Code passes jslint validation (2009-10-04 edition, default settings)</li>
+  <li>Removed "collect" feature, somewhat-buggy and nobody used it</li>
+  <li>Fixed sticky/recycle behaviour</li>
+ </ul>
+
+ <h3>1.3.20081215</h3>
+ <ul>
+  <li>IE doctype rendering tweak: position:absolute used for "BackCompat" (HTML 4 transitional) DOCTYPE in IE.</li>
+  <li>Fixed an annoying horizontal scrollbar positioning-related bug with wind affecting snow near the right edge.</li>
+ </ul>
+
+ <h3>1.3.20081208</h3>
+ <ul>
+  <li>New snowStick (snow stickiness) and followMouse (dynamic wind) options.</li>
+  <li>Four years later, we still have IE 6 and can't use position:fixed globally for "sticky" snow, but we're really close.</li>
+  <li>Position:fixed used for all more modern browsers.</li>
+  <li>Improved distribution of initial snow dump, new recycling.</li>
+  <li>Focus/blur events (minus IE) for graceful pausing of snow, sparing user's CPU when window not in focus.</li>
+  <li>Bonus smashable christmas lights demo, using <a href="http://schillmania.com/projects/soundmanager2/" title="JavaScript Sound api, play mp3s with JavaScript">SoundManager 2</a> and <a href="http://developer.yahoo.com/yui/" title="Yahoo! User Interface Library">YUI</a> DOM/Event libraries</li>
+  <li>Cleaner, simplified event code, removal of old PNG wrapper stuff.</li>
+ </ul>
+
+ <h3>1.2.20041121a</h3>
+ <ul>
+  <li>Script moved into one file (snowstorm.js) for simplicity</li>
+  <li>addEventHandler and PNG support functions updated</li>
+ </ul>
+
+ <h3>1.2.20031218a</h3>
+ <ul>
+  <li>Opera 7 ("O7") support added.. I think.</li>
+  <li>Improved initialization speed (less snowflake objects on startup)</li>
+  <li>Err.. That's about it.</li>
+ </ul>
+
+ <h3>1.2.20031213a</h3>
+ <ul>
+  <li>Netscape 6.x "sticky" snow behavior fixed (now works)</li>
+  <li>IE:mac bug event handler bug fixed (script should now work)</li>
+  <li>Snow collection feature added</li>
+  <li>Snowflake speed is relative to size (Cheap pseudo-3D effect)</li>
+ </ul>
+
+ <h3>1.1.20031206c</h3>
+ <ul>
+  <li>Initial release</li>
+ </ul>
+
+ <h2 id="feedback">Feedback</h2>
+ <h3>Comments, suggestions, questions, criticism?</h3>
+ <p class="first">
+   A few contact options are available. <a href="http://schillmania.com/content/react/contact/" title="Scott Schiller's contact information">Get in touch</a> via email or IM.
+ </p>
+
+ <h2 id="elsewhere">Elsewhere On The Internets</h2>
+ <p class="first">
+  This is a side project by Scott Schiller. Wacky DHTML/JavaScript experiments and other nonsense can be found at <a href="http://www.schillmania.com/" title="Scott's personal experimental DHTML site">schillmania.com</a>.
+ </p>
+
+ </div>
+
+</div>
+
+<!-- stats/counter stuff for my web site. You don't need this for the snow effect to work. -->
+<script>if (navigator.userAgent.match(/msie 6/i)) $('special').style.display = 'inline';</script>
+<script type="text/javascript" src="http://include.reinvigorate.net/re_.js"></script>
+<script type="text/javascript">
+try {
+reinvigorate.track("vq4zg-s08a9v69iv");
+} catch(err) {}
+</script>
+
+</body>
+</html>

themes/talks/static/snow/license.txt

+Software License Agreement (BSD License)
+
+Copyright (c) 2003, Scott Schiller (schillmania.com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this 
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+  list of conditions and the following disclaimer in the documentation and/or
+  other materials provided with the distribution.
+
+* Neither the name of schillmania.com nor the names of its contributors may be
+  used to endorse or promote products derived from this software without
+  specific prior written permission from schillmania.com.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

themes/talks/static/snow/lights/christmaslights.css

+/* XLSF 2007 */
+
+body {
+ background:#333 url(image/bg-strip-dark.png) 0px 0px;
+ font-family:normal,"Century Gothic","Helvetica Neue Light","Helvetica Neue",georgia,"times new roman","Arial Rounded MT Bold",helvetica,verdana,tahoma,arial,"sans serif";
+ font-size:75%;
+ color:#666;
+}
+
+h1, h1 a {
+ color:#999;
+ text-decoration:none;
+}
+
+h1 {
+ color:#999;
+ margin-bottom:0;
+ margin-left:-5px;
+ margin-top:0;
+ padding-left:5px;
+ padding-right:5px;
+}
+
+h1, h2, h3 {
+ clear:both;
+ float:left;
+ font-family:normal,"Century Gothic","Helvetica Neue Light","Helvetica Neue",georgia,"times new roman","Arial Rounded MT Bold",helvetica,verdana,tahoma,arial,"sans serif";
+ font-size:3em;
+ font-size-adjust:none;
+ margin-bottom:0.25em;
+ padding-bottom:1px;
+}
+
+h1, h2 {
+ letter-spacing:-1px;
+ margin-bottom:0;
+ margin-left:-5px;
+ margin-top:0;
+ padding-left:5px;
+ padding-right:5px;
+}
+
+a {
+ color:#6699cc;
+ padding:0px 2px;
+ text-decoration:none;
+}
+
+a:hover {
+ background:#6699cc;
+ color:#fff;
+}
+
+#lights {
+ position:absolute;
+ left:0px;
+ top:0px;
+ width:100%;
+ height:100%;
+ overflow:hidden;
+}
+
+.xlsf-light {
+ position:absolute;
+}
+
+body.fast .xlsf-light {
+ opacity:0.9;
+}
+
+.xlsf-fragment {
+ position:absolute;
+ background:transparent url(image/bulbs-50x50-fragments.png) no-repeat 0px 0px;
+ width:50px;
+ height:50px;
+}
+
+.xlsf-fragment-box {
+ position:absolute;
+ left:0px;
+ top:0px;
+ width:50px;
+ height:50px;
+ *width:100%;
+ *height:100%;
+ display:none;
+}
+
+.xlsf-cover {
+ position:fixed;
+ left:0px;
+ top:0px;
+ width:100%;
+ height:100%;
+ background:#fff;
+ opacity:1;
+ z-index:999;
+ display:none;
+}
+
+/*
+.xlsf-light.bottom {
+ height:49px;
+ border-bottom:1px solid #006600;
+}
+
+.xlsf-light.top {
+ height:49px;
+ border-top:1px solid #009900;
+}
+*/

themes/talks/static/snow/lights/christmaslights.js

+// Christmas Light Smashfest
+// Adapted from XLSF 2007 as originally used on http://schillmania.com/?theme=2007&christmas=1
+
+soundManager.url = 'lights/';
+
+function $(sID) {
+  return document.getElementById(sID);
+}
+
+var Y = {
+ // shortcuts
+ A: YAHOO.util.Anim,
+ D: YAHOO.util.Dom,
+ E: YAHOO.util.Event,
+ UE: YAHOO.util.Easing,
+ CA: YAHOO.util.ColorAnim,
+ BG: YAHOO.util.BgPosAnim
+}
+
+function XLSF(oTarget,urlBase) {
+  var writeDebug = soundManager._wD;
+  var urlBase = (urlBase?urlBase:'lights/');
+  writeDebug('XLSF()');
+  var IS_MOON_COMPUTER = false;
+  var isIE = navigator.userAgent.match(/msie/i);
+  var self = this;
+  var xlsf = self;
+  var animDuration = 1;
+  this.oFrag = document.createDocumentFragment();
+  this.oTarget = (oTarget?oTarget:document.documentElement);
+  this.oExplosionBox = document.createElement('div');
+  this.oExplosionBox.className = 'xlsf-fragment-box';
+  this.oExplosionFrag = document.createElement('div');
+  this.oExplosionFrag.className = 'xlsf-fragment';
+  this.lights = [];
+  this.lightClasses = {
+    pico: 32,
+    tiny: 50,
+    small: 64,
+    medium: 72,
+    large: 96	
+  }
+
+  if (window.innerWidth || window.innerHeight) {
+    var screenX = window.innerWidth; // -(!isIE?24:2);
+    var screenY = window.innerHeight;
+  } else {
+    var screenX = (document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth); // -(!isIE?8:0);
+    var screenY = (document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight);
+  }
+
+  this.lightClass = (screenX>1280?'small':'pico'); // kind of light to show (32px to 96px square)
+
+  if (window.location.href.match(/size=/i)) {
+    this.lightClass = window.location.href.substr(window.location.href.indexOf('size=')+5);
+  }
+
+  this.lightXY = this.lightClasses[this.lightClass]; // shortcut to w/h
+
+  this.lightGroups = {
+    left: [],
+    top: [],
+    right: [],
+    bottom: []
+  }
+  this.lightSmashCounter = 0;
+  this.lightIndex = 0;
+  this.lightInterval = 500;
+  this.timer = null;
+  this.bgBaseX = 0;
+  this.bgBaseY = 0;
+  this.soundIDs = 0;
+  this.soundPan = {
+    panValue: 75,
+    left: 0,
+    mid: 481,
+    right: 962
+  }
+
+  this.cover = document.createElement('div');
+  this.cover.className = 'xlsf-cover';
+  document.documentElement.appendChild(this.cover);
+
+  this.initSounds = function() {
+	for (var i=0; i<6; i++) {
+	  soundManager.createSound({
+	    id: 'smash'+i,
+	    url: urlBase+'sound/glass'+i+'.mp3',
+	    autoLoad: true,
+	    multiShot: true,
+		volume:50
+	  });
+	}
+    self.initSounds = function() {} // safety net
+  }
+
+  this.appendLights = function() {
+	writeDebug('xlsf.appendLights()');
+    self.oTarget.appendChild(self.oFrag);
+    self.oFrag = document.createDocumentFragment();
+  }
+
+  function ExplosionFragment(nType,sClass,x,y,vX,vY) {
+    var self = this;
+    this.o = xlsf.oExplosionFrag.cloneNode(true);
+    this.nType = nType;
+    this.sClass = sClass;
+    this.x = x;
+    this.y = y;
+    this.w = 50;
+    this.h = 50;
+    this.bgBaseX = 0;
+    this.bgBaseY = this.h*this.nType;
+    this.vX = vX*(1.5+Math.random());
+    this.vY = vY*(1.5+Math.random());
+    this.oA = null;
+    this.oA2 = null;
+    this.burstPhase = 3; // starting background offset point
+    this.burstPhases = 4; // 1+offset (ignore large size)
+    this.o.style.backgroundPosition = ((this.w*-this.burstPhase)+'px '+(this.h*-nType)+'px');
+
+    // boundary checks
+    if (self.sClass == 'left') {
+      this.vX = Math.abs(this.vX);
+    } else if (self.sClass == 'right') {
+      this.vX = Math.abs(this.vX)*-1;
+    }
+
+    this.burstTween = function() {
+      // determine frame to show
+      var phase = 1+Math.floor((this.currentFrame/this.totalFrames)*self.burstPhases);
+      if (phase != self.burstPhase) {
+        self.burstPhase = phase;
+        self.o.style.backgroundPosition = ((self.w*-self.burstPhase)+'px '+(self.h*-nType)+'px');
+      }
+    }
+
+    this.burst = function() {
+      self.oA = new Y.A(self.o,{marginLeft:{to:(self.vX*8)},marginTop:{to:(self.vY*8)}},animDuration,Y.UE.easeOutStrong);
+      self.oA.onTween.subscribe(self.burstTween);
+      self.oA.animate();
+    }
+
+    this.hide = function() {
+      if (!isIE) self.o.style.opacity = 0;
+    }
+
+    this.reset = function() {
+      self.o.style.left = '0px';
+      self.o.style.top = '0px';
+      self.o.style.marginLeft = '0px';
+      self.o.style.marginTop = '0px';
+      if (!isIE) self.o.style.opacity = 1;
+    }
+
+    this.animate = function() {
+      self.reset();
+      self.burst();
+    }
+
+  }
+
+  function Explosion(nType,sClass,x,y) {
+    var oParent = this;
+    var self = this;
+    this.o = null;
+    this.nType = nType;
+    this.sClass = sClass;
+    this.x = x;
+    this.y = y;
+    this.boxVX = 0;
+    this.boxVY = 0;
+    this.o = xlsf.oExplosionBox.cloneNode(true);
+    this.o.style.left = x+'px';
+    this.o.style.top = y+'px';
+    this.fragments = [];
+
+    var mX = x;
+    var mY = y;
+
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,-5,-5));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,0,-5));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,5,-5));
+
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,-5,0));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,0,0));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,5,0));
+
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,5,-5));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,5,0));
+    this.fragments.push(new ExplosionFragment(nType,sClass,mX,mY,5,5));
+
+    this.init = function() {
+      for (var i=self.fragments.length; i--;) {
+        self.o.appendChild(self.fragments[i].o);
+      }
+      if (!IS_MOON_COMPUTER) {
+        // faster rendering, particles get cropped
+        xlsf.oFrag.appendChild(self.o);
+      } else {
+        // slower rendering, can overlay body
+        xlsf.oFrag.appendChild(self.o);
+      }
+    }
+
+    this.reset = function() {
+      // clean-up
+      // self.o.parentNode.removeChild(self.o);
+      self.o.style.display = 'none';
+      self.o.style.marginLeft = '0px';
+      self.o.style.marginTop = '0px';
+      self.o.style.left = self.x+'px';
+      self.o.style.top = self.y+'px';
+      if (!isIE) self.o.style.opacity = 1;
+      for (var i=self.fragments.length; i--;) {
+        self.fragments[i].reset();
+      }
+    }
+
+    this.trigger = function(boxVX,boxVY) {
+      self.o.style.display = 'block';
+      self.boxVX = boxVX;
+      self.boxVY = boxVY;
+      // boundary checks
+      if (self.sClass == 'right') {
+        self.boxVX = Math.abs(self.boxVX)*-1;
+      } else if (self.sClass == 'left') {
+        self.boxVX = Math.abs(self.boxVX);
+      }
+      for (var i=self.fragments.length; i--;) {
+        self.fragments[i].animate();
+      }
+      if (!isIE && (IS_MOON_COMPUTER)) {
+        var oAExplode = new Y.A(self.o,{marginLeft:{to:100*self.boxVX},marginTop:{to:150*self.boxVY},opacity:{to:0.01}},animDuration,Y.UE.easeInStrong);
+      } else {
+        // even IE 7 sucks w/alpha-transparent PNG + CSS opacity. Boo urns.
+        var oAExplode = new Y.A(self.o,{marginLeft:{to:100*self.boxVX},marginTop:{to:150*self.boxVY}},animDuration,Y.UE.easeInStrong);
+      }
+      oAExplode.onComplete.subscribe(self.reset);
+      oAExplode.animate();
+    }
+
+    this.init();
+
+  }
+
+  function Light(sSizeClass,sClass,nType,x,y) {
+    var self = this;
+    this.o = document.createElement('div');
+    this.sClass = sClass;
+    this.sSizeClass = sSizeClass;
+    this.nType = (nType||0);
+    this.useY = (sClass == 'left' || sClass == 'right');
+    this.state = null;
+    this.broken = 0;
+    this.w = xlsf.lightClasses[sSizeClass];
+    this.h = xlsf.lightClasses[sSizeClass];
+    this.x = x;
+    this.y = y;
+    this.bg = urlBase+'image/bulbs-'+this.w+'x'+this.h+'-'+this.sClass+'.png';
+    this.o.style.width = this.w+'px';
+    this.o.style.height = this.h+'px';
+    this.o.style.background = 'url('+this.bg+') no-repeat 0px 0px';
+    this.bgBaseX = (self.useY?-self.w*this.nType:0);
+    this.bgBaseY = (!self.useY?-self.h*this.nType:0);
+    this.glassType = parseInt(Math.random()*6);
+    this.oExplosion = null;
+    this.soundID = 'smash'+this.glassType;
+    var panValue = xlsf.soundPan.panValue; // eg. +/- 80%
+    this.pan = parseInt(this.x<=xlsf.soundPan.mid?-panValue+((this.x/xlsf.soundPan.mid)*panValue):(this.x-xlsf.soundPan.mid)/(xlsf.soundPan.right-xlsf.soundPan.mid)*panValue);
+
+    this.initSound = function() {
+    }
+
+    this.setBGPos = function(x,y) {
+      self.o.style.backgroundPosition = ((self.bgBaseX+x)+'px '+(self.bgBaseY+y)+'px');
+    }
+
+    this.setLight = function(bOn) {
+      if (self.broken || self.state == bOn) return false;
+      if (!self.w || !self.h) self.getDimensions();
+      self.state = bOn;
+      if (self.useY) {
+        self.setBGPos(0,-this.h*(bOn?0:1));
+      } else {
+        self.setBGPos(-this.w*(bOn?0:1),0);
+      }
+    }
+
+    this.getDimensions = function() {
+      self.w = self.o.offsetWidth;
+      self.h = self.o.offsetHeight;
+      self.bgBaseX = (self.useY?-self.w*self.nType:0);
+      self.bgBaseY = (!self.useY?-self.h*self.nType:0);
+    }
+
+    this.on = function() {
+      self.setLight(1);
+    }
+
+    this.off = function() {
+      self.setLight(0);
+    }
+
+    this.flickr = function() {
+      self.setLight(Math.random()>=0.5?1:0);
+    }
+
+    this.toggle = function() {
+      self.setLight(!self.state?1:0);
+    }
+
+    this.explode = function(e) {
+      self.oExplosion.trigger(0,1); // boooom!
+    }
+
+    this.smash = function(e) {
+      if (self.broken) return false;
+      self.broken = true;
+      if (soundManager && soundManager._didInit && !soundManager._disabled) {
+        soundManager.play(self.soundID,{pan:self.pan});
+        // soundManager.sounds[self.soundID].play({pan:self.pan});
+        // if (self.bonusSound != null) window.setTimeout(self.smashBonus,1000);
+      }
+      self.explode(e);
+      var rndFrame = 2; // +parseInt(Math.random()*3);
+      if (self.useY) {
+        self.setBGPos(0,self.h*-rndFrame);
+      } else {
+        self.setBGPos(self.w*-rndFrame,0);
+      }
+      xlsf.lightSmashCounter++;
+    }
+
+    this.smashBonus = function() {
+      // soundManager.play(self.bonusSounds[self.bonusSound],urlBase+'sound/'+self.bonusSounds[self.bonusSound]+'.mp3');
+    }
+
+    this.reset = function() {
+      if (!self.broken) return false;
+      self.broken = false;
+      self.state = null;
+      xlsf.lightSmashCounter--;
+      self.flickr();
+    }
+
+    this.init = function() {
+      self.o.className = 'xlsf-light '+this.sizeClass+' '+this.sClass;
+      self.o.style.left = self.x+'px';
+      self.o.style.top = self.y+'px';
+      self.o.style.width = self.w+'px';
+      self.o.style.height = self.h+'px';
+      self.o.onmouseover = self.smash;
+      self.o.onclick = self.smash;
+      self.flickr();
+      xlsf.oFrag.appendChild(self.o);
+      self.oExplosion = new Explosion(self.nType,self.sClass,self.x,self.y);
+    }
+
+    this.init();
+    
+  } // Light()
+
+  this.createLight = function(sClass,nType,x,y) {
+    var oLight = new Light(self.lightClass,sClass,nType,x,y);
+    self.lightGroups[sClass].push(oLight);
+    self.lights.push(oLight);
+    return oLight;
+  }
+
+  this.rotateLights = function() {
+    self.lights[self.lightIndex==self.lights.length?self.lights.length-1:self.lightIndex].off();
+    self.lightIndex++;
+    if (self.lightIndex == self.lights.length) {
+      self.lightIndex = 0;
+    }
+    self.lights[self.lightIndex].on();
+  }
+
+  this.randomLights = function() {
+    self.lights[parseInt(Math.random()*self.lights.length)].toggle();
+  }
+
+  
+  this.destroyLights = function() {
+    self.startSequence(self.destroyLight,20);    
+  }
+
+  this.destroyLight = function() {
+    var groupSize = 2; // # to smash at a time
+    if (self.lightSmashCounter<self.lights.length) {
+      var limit = Math.min(self.lightSmashCounter+groupSize,self.lights.length);
+      for (var i=self.lightSmashCounter; i<limit; i++) {
+        self.lights[self.lightSmashCounter].smash();
+      }
+    } else {
+      self.stopSequence();
+    }
+
+  }
+
+  this.uberSmash = function() {
+    // make everything explode - including your CPU.
+    self.stopSequence();
+    var ebCN = Y.D.getElementsByClassName;
+  }
+
+  this.smashGroup = function(oGroup) {
+    for (var i=oGroup.length; i--;) {
+      oGroup[i].smash();
+    }
+  }
+
+  this.startSequence = function(fSequence,nInterval) {
+    if (self.timer) self.stopSequence();
+    self.timer = window.setInterval(fSequence,(typeof nInterval != 'undefined'?nInterval:self.lightInterval));
+  }
+
+  this.stopSequence = function() {
+    if (self.timer) {
+      window.clearInterval(self.timer);
+      self.timer = null;
+    }
+  }
+
+  var i=0;
+  var j=0;
+
+  $('lights').style.display = 'block';
+
+  // start lights to the right of <h1>
+  var offset = 0; // parseInt(document.getElementsByTagName('h1')[0].offsetWidth)+16;
+
+  var jMax = Math.floor((screenX-offset-16)/self.lightXY);
+  var iMax = Math.floor((screenY-offset-16)/self.lightXY);
+
+  for (j=0; j<jMax; j++) {
+    this.createLight('top',parseInt(j/3)%4,offset+j*self.lightXY,0);
+  }
+
+  this.appendLights();
+  this.startSequence(self.randomLights);
+  
+}
+
+var xlsf = null;
+var urlBase = null;
+
+function smashInit() {
+  if (navigator.userAgent.match(/msie 6/i)) {
+    return false;
+  }
+  xlsf = new XLSF(document.getElementById('lights'),urlBase?urlBase:null);
+  if ($('loading')) {
+    $('loading').style.display = 'none';	
+  }
+  xlsf.initSounds();
+}
+
+soundManager.flashVersion = 9;
+soundManager.debugMode = false;
+
+soundManager.onload = function() {
+  setTimeout(smashInit,20);
+}
+
+soundManager.onerror = function() {
+  setTimeout(smashInit,20);
+}

themes/talks/static/snow/lights/image/bg-strip-dark.png

Added
New image

themes/talks/static/snow/lights/image/blank.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-32x32-top.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-50x50-fragments.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-50x50-top.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-64x64-top.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-72x72-top.png

Added
New image

themes/talks/static/snow/lights/image/bulbs-96x96-top.png

Added
New image

themes/talks/static/snow/lights/index.html

+<html>
+<head>
+<title>Smashable Christmas Lights</title>
+<link rel="stylesheet" media="screen" href="christmaslights.css" />
+<script type="text/javascript" src="soundmanager2-nodebug-jsmin.js"></script>
+<script type="text/javascript" src="http://yui.yahooapis.com/combo?2.6.0/build/yahoo-dom-event/yahoo-dom-event.js&2.6.0/build/animation/animation-min.js"></script>
+<script type="text/javascript" src="christmaslights.js"></script>
+<script type="text/javascript">
+var urlBase = './';
+soundManager.url = './';
+</script>
+</head>
+
+<body>
+
+<div>
+
+ <div id="loading">
+  <h1>Christmas Light Smashfest 2008: Prototype</h1>
+  <h2>Rendering...</h2>
+ </div>
+
+ <div id="lights">
+  <!-- lights go here -->
+ </div>
+
+ <div style="position:absolute;bottom:3px;left:3px">
+  <a href="?size=pico">pico</a> | <a href="?size=tiny">tiny</a> | <a href="?size=small">small</a> | <a href="?size=medium">medium</a> | <a href="?size=large">large</a>
+ </div>
+
+</div>
+
+
+
+</body>
+</html>

themes/talks/static/snow/lights/sound/glass0.mp3

Binary file added.

themes/talks/static/snow/lights/sound/glass1.mp3

Binary file added.

themes/talks/static/snow/lights/sound/glass2.mp3

Binary file added.

themes/talks/static/snow/lights/sound/glass3.mp3

Binary file added.

themes/talks/static/snow/lights/sound/glass4.mp3

Binary file added.

themes/talks/static/snow/lights/sound/glass5.mp3

Binary file added.

themes/talks/static/snow/lights/soundmanager2-nodebug-jsmin.js

+/*
+   SoundManager 2: Javascript Sound for the Web
+   --------------------------------------------
+   http://schillmania.com/projects/soundmanager2/
+
+   Copyright (c) 2008, Scott Schiller. All rights reserved.
+   Code licensed under the BSD License:
+   http://schillmania.com/projects/soundmanager2/license.txt
+
+   V2.91a.20081205
+*/
+var soundManager=null;function SoundManager(b,a){this.flashVersion=8;this.debugMode=false;this.useConsole=true;this.consoleOnly=false;this.waitForWindowLoad=false;this.nullURL="null.mp3";this.allowPolling=true;this.useMovieStar=false;this.useHighPerformance=true;this.bgColor="#ffffff";this.defaultOptions={autoLoad:false,stream:true,autoPlay:false,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onstop:null,onfinish:null,onbeforefinish:null,onbeforefinishtime:5000,onbeforefinishcomplete:null,onjustbeforefinish:null,onjustbeforefinishtime:200,multiShot:true,position:null,pan:0,volume:100};this.flash9Options={isMovieStar:null,usePeakData:false,useWaveformData:false,useEQData:false};this.movieStarOptions={onmetadata:null,useVideo:false};var e=null;var d=this;this.version=null;this.versionNumber="V2.91a.20081205";this.movieURL=null;this.url=null;this.altURL=null;this.swfLoaded=false;this.enabled=false;this.o=null;this.id=(a||"sm2movie");this.oMC=null;this.sounds={};this.soundIDs=[];this.muted=false;this.isIE=(navigator.userAgent.match(/MSIE/i));this.isSafari=(navigator.userAgent.match(/safari/i));this.isGecko=(navigator.userAgent.match(/gecko/i));this.debugID="soundmanager-debug";this._debugOpen=true;this._didAppend=false;this._appendSuccess=false;this._didInit=false;this._disabled=false;this._windowLoaded=false;this._hasConsole=(typeof console!="undefined"&&typeof console.log!="undefined");this._debugLevels=["log","info","warn","error"];this._defaultFlashVersion=8;this.filePatterns={flash8:/.mp3/i,flash9:/.mp3/i};this.netStreamTypes=["aac","flv","mov","mp4","m4v","f4v","m4a","mp4v","3gp","3g2"];this.netStreamPattern=new RegExp(".("+this.netStreamTypes.join("|")+")","i");this.filePattern=null;this.features={peakData:false,waveformData:false,eqData:false};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local + internet access)"},description:null,noRemote:null,noLocal:null};this._setVersionInfo=function(){if(d.flashVersion!=8&&d.flashVersion!=9){alert('soundManager.flashVersion must be 8 or 9. "'+d.flashVersion+'" is invalid. Reverting to '+d._defaultFlashVersion+".");d.flashVersion=d._defaultFlashVersion}d.version=d.versionNumber+(d.flashVersion==9?" (AS3/Flash 9)":" (AS2/Flash 8)");if(d.flashVersion>8){d.defaultOptions=d._mergeObjects(d.defaultOptions,d.flash9Options)}if(d.flashVersion>8&&d.useMovieStar){d.defaultOptions=d._mergeObjects(d.defaultOptions,d.movieStarOptions);d.filePatterns.flash9=new RegExp(".(mp3|"+d.netStreamTypes.join("|")+")","i")}else{d.useMovieStar=false}d.filePattern=d.filePatterns[(d.flashVersion!=8?"flash9":"flash8")];d.movieURL=(d.flashVersion==8?"soundmanager2.swf":"soundmanager2_flash9.swf");d.features.peakData=d.features.waveformData=d.features.eqData=(d.flashVersion==9)};this._overHTTP=(document.location?document.location.protocol.match(/http/i):null);this._waitingforEI=false;this._initPending=false;this._tryInitOnFocus=(this.isSafari&&typeof document.hasFocus=="undefined");this._isFocused=(typeof document.hasFocus!="undefined"?document.hasFocus():null);this._okToDisable=!this._tryInitOnFocus;this.useAltURL=!this._overHTTP;this.supported=function(){return(d._didInit&&!d._disabled)};this.getMovie=function(f){return d.isIE?window[f]:(d.isSafari?document.getElementById(f)||document[f]:document.getElementById(f))};this.loadFromXML=function(f){try{d.o._loadFromXML(f)}catch(g){d._failSafely();return true}};this.createSound=function(g){if(!d._didInit){throw new Error("soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods")}if(arguments.length==2){g={id:arguments[0],url:arguments[1]}}var h=d._mergeObjects(g);var f=h;if(d._idCheck(f.id,true)){return d.sounds[f.id]}if(d.flashVersion>8&&d.useMovieStar){if(f.isMovieStar===null){f.isMovieStar=(f.url.match(d.netStreamPattern)?true:false)}if(f.isMovieStar&&(f.usePeakData||f.useWaveformData||f.useEQData)){f.usePeakData=false;f.useWaveformData=false;f.useEQData=false}}d.sounds[f.id]=new e(f);d.soundIDs[d.soundIDs.length]=f.id;if(d.flashVersion==8){d.o._createSound(f.id,f.onjustbeforefinishtime)}else{d.o._createSound(f.id,f.url,f.onjustbeforefinishtime,f.usePeakData,f.useWaveformData,f.useEQData,f.isMovieStar,(f.isMovieStar?f.useVideo:false))}if(f.autoLoad||f.autoPlay){window.setTimeout(function(){if(d.sounds[f.id]){d.sounds[f.id].load(f)}},20)}if(f.autoPlay){if(d.flashVersion==8){d.sounds[f.id].playState=1}else{d.sounds[f.id].play()}}return d.sounds[f.id]};this.createVideo=function(f){if(arguments.length==2){f={id:arguments[0],url:arguments[1]}}if(d.flashVersion>=9){f.isMovieStar=true;f.useVideo=true}else{return false}return d.createSound(f)};this.destroySound=function(g,f){if(!d._idCheck(g)){return false}for(var h=0;h<d.soundIDs.length;h++){if(d.soundIDs[h]==g){d.soundIDs.splice(h,1);continue}}d.sounds[g].unload();if(!f){d.sounds[g].destruct()}delete d.sounds[g]};this.destroyVideo=this.destroySound;this.load=function(f,g){if(!d._idCheck(f)){return false}d.sounds[f].load(g)};this.unload=function(f){if(!d._idCheck(f)){return false}d.sounds[f].unload()};this.play=function(f,g){if(!d._idCheck(f)){if(typeof g!="Object"){g={url:g}}if(g&&g.url){g.id=f;d.createSound(g)}else{return false}}d.sounds[f].play(g)};this.start=this.play;this.setPosition=function(f,g){if(!d._idCheck(f)){return false}d.sounds[f].setPosition(g)};this.stop=function(f){if(!d._idCheck(f)){return false}d.sounds[f].stop()};this.stopAll=function(){for(var f in d.sounds){if(d.sounds[f] instanceof e){d.sounds[f].stop()}}};this.pause=function(f){if(!d._idCheck(f)){return false}d.sounds[f].pause()};this.pauseAll=function(){for(var f=d.soundIDs.length;f--;){d.sounds[d.soundIDs[f]].pause()}};this.resume=function(f){if(!d._idCheck(f)){return false}d.sounds[f].resume()};this.resumeAll=function(){for(var f=d.soundIDs.length;f--;){d.sounds[d.soundIDs[f]].resume()}};this.togglePause=function(f){if(!d._idCheck(f)){return false}d.sounds[f].togglePause()};this.setPan=function(f,g){if(!d._idCheck(f)){return false}d.sounds[f].setPan(g)};this.setVolume=function(g,f){if(!d._idCheck(g)){return false}d.sounds[g].setVolume(f)};this.mute=function(f){if(typeof f!="string"){f=null}if(!f){for(var g=d.soundIDs.length;g--;){d.sounds[d.soundIDs[g]].mute()}d.muted=true}else{if(!d._idCheck(f)){return false}d.sounds[f].mute()}};this.muteAll=function(){d.mute()};this.unmute=function(f){if(typeof f!="string"){f=null}if(!f){for(var g=d.soundIDs.length;g--;){d.sounds[d.soundIDs[g]].unmute()}d.muted=false}else{if(!d._idCheck(f)){return false}d.sounds[f].unmute()}};this.unmuteAll=function(){d.unmute()};this.setPolling=function(f){if(!d.o||!d.allowPolling){return false}d.o._setPolling(f)};this.disable=function(f){if(d._disabled){return false}d._disabled=true;for(var g=d.soundIDs.length;g--;){d._disableObject(d.sounds[d.soundIDs[g]])}d.initComplete();d._disableObject(d)};this.canPlayURL=function(f){return(f?(f.match(d.filePattern)?true:false):null)};this.getSoundById=function(g,h){if(!g){throw new Error("SoundManager.getSoundById(): sID is null/undefined")}var f=d.sounds[g];return f};this.onload=function(){soundManager._wD("<em>Warning</em>: soundManager.onload() is undefined.",2)};this.onerror=function(){};this._idCheck=this.getSoundById;var c=function(){return false};c._protected=true;this._disableObject=function(g){for(var f in g){if(typeof g[f]=="function"&&typeof g[f]._protected=="undefined"){g[f]=c}}f=null};this._failSafely=function(){if(!d._disabled){d.disable()}};this._normalizeMovieURL=function(f){if(f){if(f.match(/.swf/)){f=f.substr(0,f.lastIndexOf(".swf"))}if(f.lastIndexOf("/")!=f.length-1){f=f+"/"}}return(f&&f.lastIndexOf("/")!=-1?f.substr(0,f.lastIndexOf("/")+1):"./")+d.movieURL};this._getDocument=function(){return(document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName("div")[0]))};this._getDocument._protected=true;this._createMovie=function(l,j){if(d._didAppend&&d._appendSuccess){return false}if(window.location.href.indexOf("debug=1")+1){d.debugMode=true}d._didAppend=true;d._setVersionInfo();var q=(j?j:d.url);var i=(d.altURL?d.altURL:q);d.url=d._normalizeMovieURL(d._overHTTP?q:i);j=d.url;var k=null;if(d.useHighPerformance&&navigator.userAgent.match(/firefox\/2/i)){k="Warning: disabling highPerformance, incompatible with Firefox 2.x";d.useHighPerformance=false}if(d.useHighPerformance&&d.useMovieStar){k="Warning: disabling highPerformance, not applicable with movieStar mode on";d.useHighPerformance=false}var p={name:l,id:l,src:j,width:"100%",height:"100%",quality:"high",allowScriptAccess:"always",bgcolor:d.bgColor,pluginspage:"http://www.macromedia.com/go/getflashplayer",type:"application/x-shockwave-flash"};var t={id:l,data:j,type:"application/x-shockwave-flash",width:"100%",height:"100%"};var m={movie:j,AllowScriptAccess:"always",quality:"high",bgcolor:d.bgColor};if(d.useHighPerformance&&!d.useMovieStar){p.wmode="transparent";m.wmode="transparent"}var h=null;var o=null;if(d.isIE){h=document.createElement("div");var f='<object id="'+l+'" data="'+j+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+j+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(d.useHighPerformance&&!d.useMovieStar?'<param name="wmode" value="transparent" /> ':"")+'<param name="bgcolor" value="'+d.bgColor+'" /><!-- --></object>'}else{h=document.createElement("embed");for(o in p){if(p.hasOwnProperty(o)){h.setAttribute(o,p[o])}}}var n="soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.";var g=d._getDocument();if(g){d.oMC=document.getElementById("sm2-container")?document.getElementById("sm2-container"):document.createElement("div");if(!d.oMC.id){d.oMC.id="sm2-container";d.oMC.className="movieContainer";var v=null;if(d.useHighPerformance){v={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",zIndex:-1}}else{v={position:"absolute",width:"1px",height:"1px",bottom:"0px",left:"0px"}}var u=null;for(u in v){if(v.hasOwnProperty(u)){d.oMC.style[u]=v[u]}}try{if(!d.isIE){d.oMC.appendChild(h)}g.appendChild(d.oMC);if(d.isIE){d.oMC.innerHTML=f}d._appendSuccess=true}catch(r){throw new Error(n)}}else{d.oMC.appendChild(h);if(d.isIE){d.oMC.innerHTML=f}d._appendSuccess=true}g=null}};this._writeDebug=function(f,h,g){};this._writeDebug._protected=true;this._wD=this._writeDebug;this._toggleDebug=function(){};this._toggleDebug._protected=true;this._debug=function(){};this._mergeObjects=function(g,f){var k={};for(var h in g){if(g.hasOwnProperty(h)){k[h]=g[h]}}var j=(typeof f=="undefined"?d.defaultOptions:f);for(var l in j){if(j.hasOwnProperty(l)&&typeof k[l]=="undefined"){k[l]=j[l]}}return k};this.createMovie=function(f){if(f){d.url=f}d._initMovie()};this.go=this.createMovie;this._initMovie=function(){if(d.o){return false}d.o=d.getMovie(d.id);if(!d.o){d._createMovie(d.id,d.url);d.o=d.getMovie(d.id)}};this.waitForExternalInterface=function(){if(d._waitingForEI){return false}d._waitingForEI=true;if(d._tryInitOnFocus&&!d._isFocused){return false}setTimeout(function(){if(!d._didInit&&d._okToDisable){d._failSafely()}},750)};this.handleFocus=function(){if(d._isFocused||!d._tryInitOnFocus){return true}d._okToDisable=true;d._isFocused=true;if(d._tryInitOnFocus){window.removeEventListener("mousemove",d.handleFocus,false)}d._waitingForEI=false;setTimeout(d.waitForExternalInterface,500);if(window.removeEventListener){window.removeEventListener("focus",d.handleFocus,false)}else{if(window.detachEvent){window.detachEvent("onfocus",d.handleFocus)}}};this.initComplete=function(){if(d._didInit){return false}d._didInit=true;if(d._disabled){d.onerror.apply(window);return false}if(d.waitForWindowLoad&&!d._windowLoaded){if(window.addEventListener){window.addEventListener("load",d.initUserOnload,false)}else{if(window.attachEvent){window.attachEvent("onload",d.initUserOnload)}}return false}else{d.initUserOnload()}};this.initUserOnload=function(){d.onload.apply(window)};this.init=function(){d._initMovie();if(d._didInit){return false}if(window.removeEventListener){window.removeEventListener("load",d.beginDelayedInit,false)}else{if(window.detachEvent){window.detachEvent("onload",d.beginDelayedInit)}}try{d.o._externalInterfaceTest(false);d.setPolling(true);d.enabled=true}catch(f){d._failSafely();d.initComplete();return false}d.initComplete()};this.beginDelayedInit=function(){d._windowLoaded=true;setTimeout(d.waitForExternalInterface,500);setTimeout(d.beginInit,20)};this.beginInit=function(){if(d._initPending){return false}d.createMovie();d._initMovie();d._initPending=true;return true};this.domContentLoaded=function(){if(document.removeEventListener){document.removeEventListener("DOMContentLoaded",d.domContentLoaded,false)}d.go()};this._externalInterfaceOK=function(){if(d.swfLoaded){return false}d.swfLoaded=true;d._tryInitOnFocus=false;if(d.isIE){setTimeout(d.init,100)}else{d.init()}};this._setSandboxType=function(f){var g=d.sandbox;g.type=f;g.description=g.types[(typeof g.types[f]!="undefined"?f:"unknown")];if(g.type=="localWithFile"){g.noRemote=true;g.noLocal=false}else{if(g.type=="localWithNetwork"){g.noRemote=false;g.noLocal=true}else{if(g.type=="localTrusted"){g.noRemote=false;g.noLocal=false}}}};this.destruct=function(){d.disable(true)};e=function(f){var g=this;this.sID=f.id;this.url=f.url;this.options=d._mergeObjects(f);this.instanceOptions=this.options;this._iO=this.instanceOptions;this._debug=function(){};this._debug();this.id3={};this.resetProperties=function(h){g.bytesLoaded=null;g.bytesTotal=null;g.position=null;g.duration=null;g.durationEstimate=null;g.loaded=false;g.playState=0;g.paused=false;g.readyState=0;g.muted=false;g.didBeforeFinish=false;g.didJustBeforeFinish=false;g.instanceOptions={};g.instanceCount=0;g.peakData={left:0,right:0};g.waveformData=[];g.eqData=[]};g.resetProperties();this.load=function(h){if(typeof h!="undefined"){g._iO=d._mergeObjects(h);g.instanceOptions=g._iO}else{h=g.options;g._iO=h;g.instanceOptions=g._iO}if(typeof g._iO.url=="undefined"){g._iO.url=g.url}if(g._iO.url==g.url&&g.readyState!==0&&g.readyState!=2){return false}g.loaded=false;g.readyState=1;g.playState=(h.autoPlay?1:0);try{if(d.flashVersion==8){d.o._load(g.sID,g._iO.url,g._iO.stream,g._iO.autoPlay,(g._iO.whileloading?1:0))}else{d.o._load(g.sID,g._iO.url,g._iO.stream?true:false,g._iO.autoPlay?true:false);if(g._iO.isMovieStar&&g._iO.autoLoad&&!g._iO.autoPlay){g.pause()}}}catch(i){d.onerror();d.disable()}};this.unload=function(){if(g.readyState!==0){if(g.readyState!=2){g.setPosition(0)}d.o._unload(g.sID,d.nullURL);g.resetProperties()}};this.destruct=function(){d.o._destroySound(g.sID);d.destroySound(g.sID,true)};this.play=function(i){if(!i){i={}}g._iO=d._mergeObjects(i,g._iO);g._iO=d._mergeObjects(g._iO,g.options);g.instanceOptions=g._iO;if(g.playState==1){var h=g._iO.multiShot;if(!h){return false}}if(!g.loaded){if(g.readyState===0){g._iO.stream=true;g._iO.autoPlay=true;g.load(g._iO)}else{if(g.readyState==2){return false}}}if(g.paused){g.resume()}else{g.playState=1;if(!g.instanceCount||d.flashVersion==9){g.instanceCount++}g.position=(typeof g._iO.position!="undefined"&&!isNaN(g._iO.position)?g._iO.position:0);if(g._iO.onplay){g._iO.onplay.apply(g)}g.setVolume(g._iO.volume);g.setPan(g._iO.pan);d.o._start(g.sID,g._iO.loop||1,(d.flashVersion==9?g.position:g.position/1000))}};this.start=this.play;this.stop=function(h){if(g.playState==1){g.playState=0;g.paused=false;if(g._iO.onstop){g._iO.onstop.apply(g)}d.o._stop(g.sID,h);g.instanceCount=0;g._iO={}}};this.setPosition=function(h){if(typeof h=="undefined"){h=0}g._iO.position=h;d.o._setPosition(g.sID,(d.flashVersion==9?g._iO.position:g._iO.position/1000),(g.paused||!g.playState))};this.pause=function(){if(g.paused||g.playState===0){return false}g.paused=true;d.o._pause(g.sID);if(g._iO.onpause){g._iO.onpause.apply(g)}};this.resume=function(){if(!g.paused||g.playState===0){return false}g.paused=false;d.o._pause(g.sID);if(g._iO.onresume){g._iO.onresume.apply(g)}};this.togglePause=function(){if(!g.playState){g.play({position:(d.flashVersion==9?g.position:g.position/1000)});return false}if(g.paused){g.resume()}else{g.pause()}};this.setPan=function(h){if(typeof h=="undefined"){h=0}d.o._setPan(g.sID,h);g._iO.pan=h};this.setVolume=function(h){if(typeof h=="undefined"){h=100}d.o._setVolume(g.sID,(d.muted&&!g.muted)||g.muted?0:h);g._iO.volume=h};this.mute=function(){g.muted=true;d.o._setVolume(g.sID,0)};this.unmute=function(){g.muted=false;d.o._setVolume(g.sID,typeof g._iO.volume!="undefined"?g._iO.volume:g.options.volume)};this._whileloading=function(h,i,j){if(!g._iO.isMovieStar){g.bytesLoaded=h;g.bytesTotal=i;g.duration=Math.floor(j);g.durationEstimate=parseInt((g.bytesTotal/g.bytesLoaded)*g.duration,10);if(g.readyState!=3&&g._iO.whileloading){g._iO.whileloading.apply(g)}}else{g.bytesLoaded=h;g.bytesTotal=i;g.duration=Math.floor(j);g.durationEstimate=g.duration;if(g.readyState!=3&&g._iO.whileloading){g._iO.whileloading.apply(g)}}};this._onid3=function(m,h){var n=[];for(var l=0,k=m.length;l<k;l++){n[m[l]]=h[l]}g.id3=d._mergeObjects(g.id3,n);if(g._iO.onid3){g._iO.onid3.apply(g)}};this._whileplaying=function(i,j,h,k){if(isNaN(i)||i===null){return false}g.position=i;if(g._iO.usePeakData&&typeof j!="undefined"&&j){g.peakData={left:j.leftPeak,right:j.rightPeak}}if(g._iO.useWaveformData&&typeof h!="undefined"&&h){g.waveformData=h}if(g._iO.useEQData&&typeof k!="undefined"&&k){g.eqData=k}if(g.playState==1){if(g._iO.whileplaying){g._iO.whileplaying.apply(g)}if(g.loaded&&g._iO.onbeforefinish&&g._iO.onbeforefinishtime&&!g.didBeforeFinish&&g.duration-g.position<=g._iO.onbeforefinishtime){g._onbeforefinish()}}};this._onload=function(h){h=(h==1?true:false);g.loaded=h;g.readyState=h?3:2;if(g._iO.onload){g._iO.onload.apply(g)}};this._onbeforefinish=function(){if(!g.didBeforeFinish){g.didBeforeFinish=true;if(g._iO.onbeforefinish){g._iO.onbeforefinish.apply(g)}}};this._onjustbeforefinish=function(h){if(!g.didJustBeforeFinish){g.didJustBeforeFinish=true;if(g._iO.onjustbeforefinish){g._iO.onjustbeforefinish.apply(g)}}};this._onfinish=function(){g.playState=0;g.paused=false;if(g._iO.onfinish){g._iO.onfinish.apply(g)}if(g._iO.onbeforefinishcomplete){g._iO.onbeforefinishcomplete.apply(g)}g.didBeforeFinish=false;g.didJustBeforeFinish=false;if(g.instanceCount){g.instanceCount--;if(!g.instanceCount){g.setPosition(0);g.instanceCount=0;g.instanceOptions={}}}else{g.setPosition(0)}};this._onmetadata=function(h){if(!h.width&&!h.height){h.width=320;h.height=240}g.metadata=h;g.width=h.width;g.height=h.height;if(g._iO.onmetadata){g._iO.onmetadata.apply(g)}d.wD("SMSound.onmetadata() complete")}};if(window.addEventListener){window.addEventListener("focus",d.handleFocus,false);window.addEventListener("load",d.beginDelayedInit,false);window.addEventListener("unload",d.destruct,false);if(d._tryInitOnFocus){window.addEventListener("mousemove",d.handleFocus,false)}}else{if(window.attachEvent){window.attachEvent("onfocus",d.handleFocus);window.attachEvent("onload",d.beginDelayedInit);window.attachEvent("unload",d.destruct)}else{soundManager.onerror();soundManager.disable()}}if(document.addEventListener){document.addEventListener("DOMContentLoaded",d.domContentLoaded,false)}}soundManager=new SoundManager();

themes/talks/static/snow/lights/soundmanager2.swf

Binary file added.

themes/talks/static/snow/lights/soundmanager2_flash9.swf

Binary file added.

themes/talks/static/snow/snowstorm-min.js

+/** @license
+
+ DHTML Snowstorm! JavaScript-based Snow for web pages
+ --------------------------------------------------------
+ Version 1.43.20111201 (Previous rev: 1.42.20111120)
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License:
+ http://schillmania.com/projects/snowstorm/license.txt
+*/
+var snowStorm=function(e,d){function g(a,d){isNaN(d)&&(d=0);return Math.random()*a+d}function o(){e.setTimeout(function(){a.start(true)},20);a.events.remove(i?d:e,"mousemove",o)}function r(){if(!a.excludeMobile||!s)a.freezeOnBlur?a.events.add(i?d:e,"mousemove",o):o();a.events.remove(e,"load",r)}this.autoStart=true;this.flakesMax=128;this.flakesMaxActive=64;this.animationInterval=33;this.excludeMobile=true;this.flakeBottom=null;this.followMouse=true;this.snowColor="#fff";this.snowCharacter="&bull;";
+this.snowStick=true;this.targetElement=null;this.useMeltEffect=true;this.usePositionFixed=this.useTwinkleEffect=false;this.freezeOnBlur=true;this.flakeRightOffset=this.flakeLeftOffset=0;this.flakeHeight=this.flakeWidth=8;this.vMaxX=5;this.vMaxY=4;this.zIndex=0;var a=this,y=this,i=navigator.userAgent.match(/msie/i),z=navigator.userAgent.match(/msie 6/i),A=navigator.appVersion.match(/windows 98/i),s=navigator.userAgent.match(/mobile|opera m(ob|in)/i),B=i&&d.compatMode==="BackCompat",t=s||B||z,h=null,
+k=null,j=null,m=null,u=null,v=null,p=1,n=false,q;a:{try{d.createElement("div").style.opacity="0.5"}catch(C){q=false;break a}q=true}var w=false,x=d.createDocumentFragment();this.timers=[];this.flakes=[];this.active=this.disabled=false;this.meltFrameCount=20;this.meltFrames=[];this.events=function(){function a(b){var b=f.call(b),c=b.length;l?(b[1]="on"+b[1],c>3&&b.pop()):c===3&&b.push(false);return b}function d(a,c){var e=a.shift(),f=[b[c]];if(l)e[f](a[0],a[1]);else e[f].apply(e,a)}var l=!e.addEventListener&&
+e.attachEvent,f=Array.prototype.slice,b={add:l?"attachEvent":"addEventListener",remove:l?"detachEvent":"removeEventListener"};return{add:function(){d(a(arguments),"add")},remove:function(){d(a(arguments),"remove")}}}();this.randomizeWind=function(){var c;c=g(a.vMaxX,0.2);u=parseInt(g(2),10)===1?c*-1:c;v=g(a.vMaxY,0.2);if(this.flakes)for(c=0;c<this.flakes.length;c++)this.flakes[c].active&&this.flakes[c].setVelocities()};this.scrollHandler=function(){var c;m=a.flakeBottom?0:parseInt(e.scrollY||d.documentElement.scrollTop||
+d.body.scrollTop,10);isNaN(m)&&(m=0);if(!n&&!a.flakeBottom&&a.flakes)for(c=a.flakes.length;c--;)a.flakes[c].active===0&&a.flakes[c].stick()};this.resizeHandler=function(){e.innerWidth||e.innerHeight?(h=e.innerWidth-16-a.flakeRightOffset,j=a.flakeBottom?a.flakeBottom:e.innerHeight):(h=(d.documentElement.clientWidth||d.body.clientWidth||d.body.scrollWidth)-(!i?8:0)-a.flakeRightOffset,j=a.flakeBottom?a.flakeBottom:d.documentElement.clientHeight||d.body.clientHeight||d.body.scrollHeight);k=parseInt(h/
+2,10)};this.resizeHandlerAlt=function(){h=a.targetElement.offsetLeft+a.targetElement.offsetWidth-a.flakeRightOffset;j=a.flakeBottom?a.flakeBottom:a.targetElement.offsetTop+a.targetElement.offsetHeight;k=parseInt(h/2,10)};this.freeze=function(){var c;if(a.disabled)return false;else a.disabled=1;for(c=a.timers.length;c--;)clearInterval(a.timers[c])};this.resume=function(){if(a.disabled)a.disabled=0;else return false;a.timerInit()};this.toggleSnow=function(){a.flakes.length?(a.active=!a.active,a.active?
+(a.show(),a.resume()):(a.stop(),a.freeze())):a.start()};this.stop=function(){var c;this.freeze();for(c=this.flakes.length;c--;)this.flakes[c].o.style.display="none";a.events.remove(e,"scroll",a.scrollHandler);a.events.remove(e,"resize",a.resizeHandler);a.freezeOnBlur&&(i?(a.events.remove(d,"focusout",a.freeze),a.events.remove(d,"focusin",a.resume)):(a.events.remove(e,"blur",a.freeze),a.events.remove(e,"focus",a.resume)))};this.show=function(){var a;for(a=this.flakes.length;a--;)this.flakes[a].o.style.display=
+"block"};this.SnowFlake=function(a,e,l,f){var b=this;this.type=e;this.x=l||parseInt(g(h-20),10);this.y=!isNaN(f)?f:-g(j)-12;this.vY=this.vX=null;this.vAmpTypes=[1,1.2,1.4,1.6,1.8];this.vAmp=this.vAmpTypes[this.type];this.melting=false;this.meltFrameCount=a.meltFrameCount;this.meltFrames=a.meltFrames;this.twinkleFrame=this.meltFrame=0;this.active=1;this.fontSize=10+this.type/5*10;this.o=d.createElement("div");this.o.innerHTML=a.snowCharacter;this.o.style.color=a.snowColor;this.o.style.position=n?"fixed":
+"absolute";this.o.style.width=a.flakeWidth+"px";this.o.style.height=a.flakeHeight+"px";this.o.style.fontFamily="arial,verdana";this.o.style.cursor="default";this.o.style.overflow="hidden";this.o.style.fontWeight="normal";this.o.style.zIndex=a.zIndex;x.appendChild(this.o);this.refresh=function(){if(isNaN(b.x)||isNaN(b.y))return false;b.o.style.left=b.x+"px";b.o.style.top=b.y+"px"};this.stick=function(){t||a.targetElement!==d.documentElement&&a.targetElement!==d.body?b.o.style.top=j+m-a.flakeHeight+
+"px":a.flakeBottom?b.o.style.top=a.flakeBottom+"px":(b.o.style.display="none",b.o.style.top="auto",b.o.style.bottom="0px",b.o.style.position="fixed",b.o.style.display="block")};this.vCheck=function(){if(b.vX>=0&&b.vX<0.2)b.vX=0.2;else if(b.vX<0&&b.vX>-0.2)b.vX=-0.2;if(b.vY>=0&&b.vY<0.2)b.vY=0.2};this.move=function(){var d=b.vX*p;b.x+=d;b.y+=b.vY*b.vAmp;if(b.x>=h||h-b.x<a.flakeWidth)b.x=0;else if(d<0&&b.x-a.flakeLeftOffset<-a.flakeWidth)b.x=h-a.flakeWidth-1;b.refresh();if(j+m-b.y<a.flakeHeight)b.active=
+0,a.snowStick?b.stick():b.recycle();else{if(a.useMeltEffect&&b.active&&b.type<3&&!b.melting&&Math.random()>0.998)b.melting=true,b.melt();if(a.useTwinkleEffect)if(b.twinkleFrame)b.twinkleFrame--,b.o.style.visibility=b.twinkleFrame&&b.twinkleFrame%2===0?"hidden":"visible";else if(Math.random()>0.9)b.twinkleFrame=parseInt(Math.random()*20,10)}};this.animate=function(){b.move()};this.setVelocities=function(){b.vX=u+g(a.vMaxX*0.12,0.1);b.vY=v+g(a.vMaxY*0.12,0.1)};this.setOpacity=function(a,b){if(!q)return false;
+a.style.opacity=b};this.melt=function(){!a.useMeltEffect||!b.melting?b.recycle():b.meltFrame<b.meltFrameCount?(b.setOpacity(b.o,b.meltFrames[b.meltFrame]),b.o.style.fontSize=b.fontSize-b.fontSize*(b.meltFrame/b.meltFrameCount)+"px",b.o.style.lineHeight=a.flakeHeight+2+a.flakeHeight*0.75*(b.meltFrame/b.meltFrameCount)+"px",b.meltFrame++):b.recycle()};this.recycle=function(){b.o.style.display="none";b.o.style.position=n?"fixed":"absolute";b.o.style.bottom="auto";b.setVelocities();b.vCheck();b.meltFrame=
+0;b.melting=false;b.setOpacity(b.o,1);b.o.style.padding="0px";b.o.style.margin="0px";b.o.style.fontSize=b.fontSize+"px";b.o.style.lineHeight=a.flakeHeight+2+"px";b.o.style.textAlign="center";b.o.style.verticalAlign="baseline";b.x=parseInt(g(h-a.flakeWidth-20),10);b.y=parseInt(g(j)*-1,10)-a.flakeHeight;b.refresh();b.o.style.display="block";b.active=1};this.recycle();this.refresh()};this.snow=function(){for(var c=0,d=0,e=0,f=null,f=a.flakes.length;f--;)a.flakes[f].active===1?(a.flakes[f].move(),c++):
+a.flakes[f].active===0?d++:e++,a.flakes[f].melting&&a.flakes[f].melt();if(c<a.flakesMaxActive&&(f=a.flakes[parseInt(g(a.flakes.length),10)],f.active===0))f.melting=true};this.mouseMove=function(c){if(!a.followMouse)return true;c=parseInt(c.clientX,10);c<k?p=-2+c/k*2:(c-=k,p=c/k*2)};this.createSnow=function(c,d){var e;for(e=0;e<c;e++)if(a.flakes[a.flakes.length]=new a.SnowFlake(a,parseInt(g(6),10)),d||e>a.flakesMaxActive)a.flakes[a.flakes.length-1].active=-1;y.targetElement.appendChild(x)};this.timerInit=
+function(){a.timers=!A?[setInterval(a.snow,a.animationInterval)]:[setInterval(a.snow,a.animationInterval*3),setInterval(a.snow,a.animationInterval)]};this.init=function(){var c;for(c=0;c<a.meltFrameCount;c++)a.meltFrames.push(1-c/a.meltFrameCount);a.randomizeWind();a.createSnow(a.flakesMax);a.events.add(e,"resize",a.resizeHandler);a.events.add(e,"scroll",a.scrollHandler);a.freezeOnBlur&&(i?(a.events.add(d,"focusout",a.freeze),a.events.add(d,"focusin",a.resume)):(a.events.add(e,"blur",a.freeze),a.events.add(e,
+"focus",a.resume)));a.resizeHandler();a.scrollHandler();a.followMouse&&a.events.add(i?d:e,"mousemove",a.mouseMove);a.animationInterval=Math.max(20,a.animationInterval);a.timerInit()};this.start=function(c){if(w){if(c)return true}else w=true;if(typeof a.targetElement==="string"&&(c=a.targetElement,a.targetElement=d.getElementById(c),!a.targetElement))throw Error('Snowstorm: Unable to get targetElement "'+c+'"');if(!a.targetElement)a.targetElement=!i?d.documentElement?d.documentElement:d.body:d.body;
+if(a.targetElement!==d.documentElement&&a.targetElement!==d.body)a.resizeHandler=a.resizeHandlerAlt;a.resizeHandler();a.usePositionFixed=a.usePositionFixed&&!t;n=a.usePositionFixed;if(h&&j&&!a.disabled)a.init(),a.active=true};a.autoStart&&a.events.add(e,"load",r,false);return this}(window,document);

themes/talks/static/snow/snowstorm.js

+/** @license
+ * DHTML Snowstorm! JavaScript-based Snow for web pages
+ * --------------------------------------------------------
+ * Version 1.43.20111201 (Previous rev: 1.42.20111120)
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/snowstorm/license.txt
+ */
+
+/*global window, document, navigator, clearInterval, setInterval */
+/*jslint white: false, onevar: true, plusplus: false, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */
+
+var snowStorm = (function(window, document) {
+
+  // --- common properties ---
+
+  this.autoStart = true;          // Whether the snow should start automatically or not.
+  this.flakesMax = 128;           // Limit total amount of snow made (falling + sticking)
+  this.flakesMaxActive = 64;      // Limit amount of snow falling at once (less = lower CPU use)
+  this.animationInterval = 33;    // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower
+  this.excludeMobile = true;      // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) By default, be nice.
+  this.flakeBottom = null;        // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect
+  this.followMouse = true;        // Snow movement can respond to the user's mouse
+  this.snowColor = '#fff';        // Don't eat (or use?) yellow snow.
+  this.snowCharacter = '&bull;';  // &bull; = bullet, &middot; is square on some systems etc.
+  this.snowStick = true;          // Whether or not snow should "stick" at the bottom. When off, will never collect.
+  this.targetElement = null;      // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference
+  this.useMeltEffect = true;      // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it
+  this.useTwinkleEffect = false;  // Allow snow to randomly "flicker" in and out of view while falling
+  this.usePositionFixed = false;  // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported
+
+  // --- less-used bits ---
+
+  this.freezeOnBlur = true;       // Only snow when the window is in focus (foreground.) Saves CPU.
+  this.flakeLeftOffset = 0;       // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars.
+  this.flakeRightOffset = 0;      // Right margin/gutter space on edge of container
+  this.flakeWidth = 8;            // Max pixel width reserved for snow element
+  this.flakeHeight = 8;           // Max pixel height reserved for snow element
+  this.vMaxX = 5;                 // Maximum X velocity range for snow
+  this.vMaxY = 4;                 // Maximum Y velocity range for snow
+  this.zIndex = 0;                // CSS stacking order applied to each snowflake
+
+  // --- End of user section ---
+
+  var s = this, storm = this, i,
+  // UA sniffing and backCompat rendering mode checks for fixed position, etc.
+  isIE = navigator.userAgent.match(/msie/i),
+  isIE6 = navigator.userAgent.match(/msie 6/i),
+  isWin98 = navigator.appVersion.match(/windows 98/i),
+  isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i),
+  isBackCompatIE = (isIE && document.compatMode === 'BackCompat'),
+  noFixed = (isMobile || isBackCompatIE || isIE6),
+  screenX = null, screenX2 = null, screenY = null, scrollY = null, vRndX = null, vRndY = null,
+  windOffset = 1,
+  windMultiplier = 2,
+  flakeTypes = 6,
+  fixedForEverything = false,
+  opacitySupported = (function(){
+    try {
+      document.createElement('div').style.opacity = '0.5';
+    } catch(e) {
+      return false;
+    }
+    return true;
+  }()),
+  didInit = false,
+  docFrag = document.createDocumentFragment();
+
+  this.timers = [];
+  this.flakes = [];
+  this.disabled = false;
+  this.active = false;
+  this.meltFrameCount = 20;
+  this.meltFrames = [];
+
+  this.events = (function() {
+
+    var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice,
+    evt = {
+      add: (old?'attachEvent':'addEventListener'),
+      remove: (old?'detachEvent':'removeEventListener')
+    };
+
+    function getArgs(oArgs) {
+      var args = slice.call(oArgs), len = args.length;
+      if (old) {
+        args[1] = 'on' + args[1]; // prefix
+        if (len > 3) {
+          args.pop(); // no capture
+        }
+      } else if (len === 3) {
+        args.push(false);
+      }
+      return args;
+    }
+
+    function apply(args, sType) {
+      var element = args.shift(),
+          method = [evt[sType]];
+      if (old) {
+        element[method](args[0], args[1]);
+      } else {
+        element[method].apply(element, args);
+      }
+    }
+
+    function addEvent() {
+      apply(getArgs(arguments), 'add');
+    }
+
+    function removeEvent() {
+      apply(getArgs(arguments), 'remove');
+    }
+
+    return {
+      add: addEvent,
+      remove: removeEvent
+    };
+
+  }());
+
+  function rnd(n,min) {
+    if (isNaN(min)) {
+      min = 0;
+    }
+    return (Math.random()*n)+min;
+  }
+
+  function plusMinus(n) {
+    return (parseInt(rnd(2),10)===1?n*-1:n);
+  }
+
+  this.randomizeWind = function() {
+    var i;
+    vRndX = plusMinus(rnd(s.vMaxX,0.2));
+    vRndY = rnd(s.vMaxY,0.2);
+    if (this.flakes) {
+      for (i=0; i<this.flakes.length; i++) {
+        if (this.flakes[i].active) {
+          this.flakes[i].setVelocities();
+        }
+      }
+    }
+  };
+
+  this.scrollHandler = function() {
+    var i;
+    // "attach" snowflakes to bottom of window if no absolute bottom value was given
+    scrollY = (s.flakeBottom?0:parseInt(window.scrollY||document.documentElement.scrollTop||document.body.scrollTop,10));
+    if (isNaN(scrollY)) {
+      scrollY = 0; // Netscape 6 scroll fix
+    }
+    if (!fixedForEverything && !s.flakeBottom && s.flakes) {
+      for (i=s.flakes.length; i--;) {
+        if (s.flakes[i].active === 0) {
+          s.flakes[i].stick();
+        }
+      }
+    }
+  };
+
+  this.resizeHandler = function() {
+    if (window.innerWidth || window.innerHeight) {
+      screenX = window.innerWidth-16-s.flakeRightOffset;
+      screenY = (s.flakeBottom?s.flakeBottom:window.innerHeight);
+    } else {
+      screenX = (document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth)-(!isIE?8:0)-s.flakeRightOffset;
+      screenY = s.flakeBottom?s.flakeBottom:(document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight);
+    }
+    screenX2 = parseInt(screenX/2,10);
+  };
+
+  this.resizeHandlerAlt = function() {
+    screenX = s.targetElement.offsetLeft+s.targetElement.offsetWidth-s.flakeRightOffset;
+    screenY = s.flakeBottom?s.flakeBottom:s.targetElement.offsetTop+s.targetElement.offsetHeight;
+    screenX2 = parseInt(screenX/2,10);
+  };
+
+  this.freeze = function() {
+    // pause animation
+    var i;
+    if (!s.disabled) {
+      s.disabled = 1;
+    } else {
+      return false;
+    }
+    for (i=s.timers.length; i--;) {
+      clearInterval(s.timers[i]);
+    }
+  };
+
+  this.resume = function() {
+    if (s.disabled) {
+       s.disabled = 0;
+    } else {
+      return false;
+    }
+    s.timerInit();
+  };
+
+  this.toggleSnow = function() {
+    if (!s.flakes.length) {
+      // first run
+      s.start();
+    } else {
+      s.active = !s.active;
+      if (s.active) {
+        s.show();
+        s.resume();
+      } else {
+        s.stop();
+        s.freeze();
+      }
+    }
+  };
+
+  this.stop = function() {
+    var i;
+    this.freeze();
+    for (i=this.flakes.length; i--;) {
+      this.flakes[i].o.style.display = 'none';
+    }
+    s.events.remove(window,'scroll',s.scrollHandler);
+    s.events.remove(window,'resize',s.resizeHandler);
+    if (s.freezeOnBlur) {
+      if (isIE) {
+        s.events.remove(document,'focusout',s.freeze);
+        s.events.remove(document,'focusin',s.resume);
+      } else {
+        s.events.remove(window,'blur',s.freeze);
+        s.events.remove(window,'focus',s.resume);
+      }
+    }
+  };
+
+  this.show = function() {
+    var i;
+    for (i=this.flakes.length; i--;) {
+      this.flakes[i].o.style.display = 'block';
+    }
+  };
+
+  this.SnowFlake = function(parent,type,x,y) {
+    var s = this, storm = parent;
+    this.type = type;
+    this.x = x||parseInt(rnd(screenX-20),10);
+    this.y = (!isNaN(y)?y:-rnd(screenY)-12);
+    this.vX = null;
+    this.vY = null;
+    this.vAmpTypes = [1,1.2,1.4,1.6,1.8]; // "amplification" for vX/vY (based on flake size/type)
+    this.vAmp = this.vAmpTypes[this.type];
+    this.melting = false;
+    this.meltFrameCount = storm.meltFrameCount;
+    this.meltFrames = storm.meltFrames;
+    this.meltFrame = 0;
+    this.twinkleFrame = 0;
+    this.active = 1;
+    this.fontSize = (10+(this.type/5)*10);
+    this.o = document.createElement('div');
+    this.o.innerHTML = storm.snowCharacter;
+    this.o.style.color = storm.snowColor;
+    this.o.style.position = (fixedForEverything?'fixed':'absolute');
+    this.o.style.width = storm.flakeWidth+'px';
+    this.o.style.height = storm.flakeHeight+'px';
+    this.o.style.fontFamily = 'arial,verdana';
+    this.o.style.cursor = 'default';
+    this.o.style.overflow = 'hidden';
+    this.o.style.fontWeight = 'normal';
+    this.o.style.zIndex = storm.zIndex;
+    docFrag.appendChild(this.o);
+
+    this.refresh = function() {
+      if (isNaN(s.x) || isNaN(s.y)) {
+        // safety check
+        return false;
+      }
+      s.o.style.left = s.x+'px';
+      s.o.style.top = s.y+'px';
+    };
+
+    this.stick = function() {
+      if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) {
+        s.o.style.top = (screenY+scrollY-storm.flakeHeight)+'px';
+      } else if (storm.flakeBottom) {
+        s.o.style.top = storm.flakeBottom+'px';
+      } else {
+        s.o.style.display = 'none';
+        s.o.style.top = 'auto';
+        s.o.style.bottom = '0px';
+        s.o.style.position = 'fixed';
+        s.o.style.display = 'block';
+      }
+    };
+
+    this.vCheck = function() {
+      if (s.vX>=0 && s.vX<0.2) {
+        s.vX = 0.2;
+      } else if (s.vX<0 && s.vX>-0.2) {
+        s.vX = -0.2;
+      }
+      if (s.vY>=0 && s.vY<0.2) {
+        s.vY = 0.2;
+      }
+    };
+
+    this.move = function() {
+      var vX = s.vX*windOffset, yDiff;
+      s.x += vX;
+      s.y += (s.vY*s.vAmp);
+      if (s.x >= screenX || screenX-s.x < storm.flakeWidth) { // X-axis scroll check
+        s.x = 0;
+      } else if (vX < 0 && s.x-storm.flakeLeftOffset < -storm.flakeWidth) {
+        s.x = screenX-storm.flakeWidth-1; // flakeWidth;
+      }
+      s.refresh();
+      yDiff = screenY+scrollY-s.y;
+      if (yDiff<storm.flakeHeight) {
+        s.active = 0;
+        if (storm.snowStick) {
+          s.stick();
+        } else {
+          s.recycle();
+        }
+      } else {
+        if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random()>0.998) {
+          // ~1/1000 chance of melting mid-air, with each frame
+          s.melting = true;
+          s.melt();
+          // only incrementally melt one frame
+          // s.melting = false;
+        }
+        if (storm.useTwinkleEffect) {
+          if (!s.twinkleFrame) {
+            if (Math.random()>0.9) {
+              s.twinkleFrame = parseInt(Math.random()*20,10);
+            }
+          } else {
+            s.twinkleFrame--;
+            s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame%2===0?'hidden':'visible');
+          }
+        }
+      }
+    };
+
+    this.animate = function() {
+      // main animation loop
+      // move, check status, die etc.
+      s.move();
+    };
+
+    this.setVelocities = function() {
+      s.vX = vRndX+rnd(storm.vMaxX*0.12,0.1);
+      s.vY = vRndY+rnd(storm.vMaxY*0.12,0.1);
+    };
+
+    this.setOpacity = function(o,opacity) {
+      if (!opacitySupported) {
+        return false;
+      }
+      o.style.opacity = opacity;
+    };
+
+    this.melt = function() {
+      if (!storm.useMeltEffect || !s.melting) {
+        s.recycle();
+      } else {
+        if (s.meltFrame < s.meltFrameCount) {
+          s.setOpacity(s.o,s.meltFrames[s.meltFrame]);
+          s.o.style.fontSize = s.fontSize-(s.fontSize*(s.meltFrame/s.meltFrameCount))+'px';
+          s.o.style.lineHeight = storm.flakeHeight+2+(storm.flakeHeight*0.75*(s.meltFrame/s.meltFrameCount))+'px';
+          s.meltFrame++;
+        } else {
+          s.recycle();
+        }
+      }
+    };
+
+    this.recycle = function() {
+      s.o.style.display = 'none';
+      s.o.style.position = (fixedForEverything?'fixed':'absolute');
+      s.o.style.bottom = 'auto';
+      s.setVelocities();
+      s.vCheck();
+      s.meltFrame = 0;
+      s.melting = false;
+      s.setOpacity(s.o,1);
+      s.o.style.padding = '0px';
+      s.o.style.margin = '0px';
+      s.o.style.fontSize = s.fontSize+'px';
+      s.o.style.lineHeight = (storm.flakeHeight+2)+'px';