<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wbex.ru/index.php?action=history&amp;feed=atom&amp;title=JavaScript_DHTML%2FAjax_Layer%2FAnimation_Bounse</id>
		<title>JavaScript DHTML/Ajax Layer/Animation Bounse - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wbex.ru/index.php?action=history&amp;feed=atom&amp;title=JavaScript_DHTML%2FAjax_Layer%2FAnimation_Bounse"/>
		<link rel="alternate" type="text/html" href="http://wbex.ru/index.php?title=JavaScript_DHTML/Ajax_Layer/Animation_Bounse&amp;action=history"/>
		<updated>2026-04-05T03:50:17Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wbex.ru/index.php?title=JavaScript_DHTML/Ajax_Layer/Animation_Bounse&amp;diff=1638&amp;oldid=prev</id>
		<title> в 09:58, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://wbex.ru/index.php?title=JavaScript_DHTML/Ajax_Layer/Animation_Bounse&amp;diff=1638&amp;oldid=prev"/>
				<updated>2010-05-26T09:58:48Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 09:58, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://wbex.ru/index.php?title=JavaScript_DHTML/Ajax_Layer/Animation_Bounse&amp;diff=1639&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://wbex.ru/index.php?title=JavaScript_DHTML/Ajax_Layer/Animation_Bounse&amp;diff=1639&amp;oldid=prev"/>
				<updated>2010-05-26T07:15:47Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Bounce Out and rase==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Animation Example - Easing&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc. All rights reserved.&lt;br /&gt;
Code licensed under the BSD License:&lt;br /&gt;
http://developer.yahoo.net/yui/license.txt&lt;br /&gt;
Version: 0.10.0&lt;br /&gt;
*/&lt;br /&gt;
body {&lt;br /&gt;
   margin:0;&lt;br /&gt;
   font:small arial;&lt;br /&gt;
}&lt;br /&gt;
h1 {&lt;br /&gt;
   color:#666;&lt;br /&gt;
   margin:0;&lt;br /&gt;
   font:bold 150% palatino, georgia;&lt;br /&gt;
}&lt;br /&gt;
#hd img {&lt;br /&gt;
   vertical-align:middle;&lt;br /&gt;
}&lt;br /&gt;
#hd h1 {&lt;br /&gt;
   display:inline;&lt;br /&gt;
   margin:0 0 0 20px;&lt;br /&gt;
   vertical-align:middle;&lt;br /&gt;
}&lt;br /&gt;
ul, li {&lt;br /&gt;
   margin:0;&lt;br /&gt;
   padding:0;&lt;br /&gt;
   list-style:none;&lt;br /&gt;
}&lt;br /&gt;
#doc {&lt;br /&gt;
   margin:10px;&lt;br /&gt;
}&lt;br /&gt;
#examples {&lt;br /&gt;
   margin:60px 40px;&lt;br /&gt;
}&lt;br /&gt;
#examples li {&lt;br /&gt;
   margin-bottom:1em;&lt;br /&gt;
}&lt;br /&gt;
#examples li a {&lt;br /&gt;
   color:#666;&lt;br /&gt;
   font:85% verdana;&lt;br /&gt;
}&lt;br /&gt;
#demo {&lt;br /&gt;
   background:#ccc;&lt;br /&gt;
   font:100%/1.2em arial;&lt;br /&gt;
   width:10px;&lt;br /&gt;
   height:10px;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-scroll #demo p {&lt;br /&gt;
   width:600px;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-motion #demo {&lt;br /&gt;
   color:yellow;&lt;br /&gt;
   font-size:0;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-size-plus #demo, #animation-demo-fade #demo, #animation-demo-colors #demo {&lt;br /&gt;
   background:#ccc;&lt;br /&gt;
   font:100%/1.2em arial;&lt;br /&gt;
   width:200px;&lt;br /&gt;
   height:200px;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-colors #demo {&lt;br /&gt;
   border:3px solid #c3c;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-scroll #demo {&lt;br /&gt;
   width:400px;&lt;br /&gt;
   height:200px;&lt;br /&gt;
   overflow:auto;&lt;br /&gt;
}&lt;br /&gt;
#animation-demo-colors #demo {&lt;br /&gt;
}&lt;br /&gt;
#target {&lt;br /&gt;
   background:red;&lt;br /&gt;
   font-size:0;&lt;br /&gt;
   position:absolute;&lt;br /&gt;
   left:300px;top:300px;&lt;br /&gt;
   width:10px;&lt;br /&gt;
   height:10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./build/yahoo/yahoo.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./build/event/event.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./build/dom/dom.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./build/animation/animation.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
YAHOO.example.init = function() {   &lt;br /&gt;
   var anim = new YAHOO.util.Anim(&amp;quot;demo&amp;quot;, { width: {to: 500} }, 1, YAHOO.util.Easing.bounceOut);&lt;br /&gt;
   YAHOO.util.Event.on(document, &amp;quot;click&amp;quot;, anim.animate, anim, true);&lt;br /&gt;
};&lt;br /&gt;
YAHOO.util.Event.onAvailable(&amp;quot;demo&amp;quot;, YAHOO.example.init);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body id=&amp;quot;animation-demo-easing&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;doc&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;h1&amp;gt;Animation Example - Easing&amp;lt;/h1&amp;gt;&lt;br /&gt;
   &amp;lt;p&amp;gt;This example demonstrates how to animate an element&amp;amp;apos;s width to a given value with a &lt;br /&gt;
   &amp;amp;quot;bounceOut&amp;amp;quot; easing.&amp;lt;/p&amp;gt;&lt;br /&gt;
   &amp;lt;p&amp;gt;Click anywhere to start animation.&amp;lt;/p&amp;gt;&lt;br /&gt;
   &amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&amp;lt;A href=&amp;quot;http://www.wbex.ru/Code/JavaScriptDownload/yui.zip&amp;quot;&amp;gt;yui.zip( 3,714 k)&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bouncing Balls==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
  Copyright 2006 Google Inc.&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;ExplorerCanvas Example 1&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
ExplorerCanvas&lt;br /&gt;
Copyright 2006 Google Inc.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
DESCRIPTION&lt;br /&gt;
Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based &lt;br /&gt;
drawing operations. ExplorerCanvas brings the same functionality to Internet &lt;br /&gt;
Explorer; web developers only need to include a single script tag in their &lt;br /&gt;
existing canvas webpages to enable this support.&lt;br /&gt;
&lt;br /&gt;
If you run into trouble, please look at the included example code to see how&lt;br /&gt;
to best implement this&lt;br /&gt;
ExplorerCanvas&lt;br /&gt;
Google Open Source:&lt;br /&gt;
  &amp;lt;http://code.google.ru&amp;gt;&lt;br /&gt;
  &amp;lt;opensource@google.ru&amp;gt; &lt;br /&gt;
Developers:&lt;br /&gt;
  Emil A Eklund &amp;lt;emil@eae.net&amp;gt;&lt;br /&gt;
  Erik Arvidsson &amp;lt;erik@eae.net&amp;gt;&lt;br /&gt;
  Glen Murphy &amp;lt;glen@glenmurphy.ru&amp;gt;&lt;br /&gt;
*/&lt;br /&gt;
  // Copyright 2006 Google Inc.&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
// you may not use this file except in compliance with the License.&lt;br /&gt;
// You may obtain a copy of the License at&lt;br /&gt;
//&lt;br /&gt;
//   http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
//&lt;br /&gt;
// Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
// See the License for the specific language governing permissions and&lt;br /&gt;
// limitations under the License.&lt;br /&gt;
&lt;br /&gt;
// Known Issues:&lt;br /&gt;
//&lt;br /&gt;
// * Patterns are not implemented.&lt;br /&gt;
// * Radial gradient are not implemented. The VML version of these look very&lt;br /&gt;
//   different from the canvas one.&lt;br /&gt;
// * Clipping paths are not implemented.&lt;br /&gt;
// * Coordsize. The width and height attribute have higher priority than the&lt;br /&gt;
//   width and height style values which isn&amp;quot;t correct.&lt;br /&gt;
// * Painting mode isn&amp;quot;t implemented.&lt;br /&gt;
// * Canvas width/height should is using content-box by default. IE in&lt;br /&gt;
//   Quirks mode will draw the canvas using border-box. Either change your&lt;br /&gt;
//   doctype to HTML5&lt;br /&gt;
//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)&lt;br /&gt;
//   or use Box Sizing Behavior from WebFX&lt;br /&gt;
//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)&lt;br /&gt;
// * Optimize. There is always room for speed improvements.&lt;br /&gt;
// only add this code if we do not already have a canvas implementation&lt;br /&gt;
if (!window.CanvasRenderingContext2D) {&lt;br /&gt;
(function () {&lt;br /&gt;
  // alias some functions to make (compiled) code shorter&lt;br /&gt;
  var m = Math;&lt;br /&gt;
  var mr = m.round;&lt;br /&gt;
  var ms = m.sin;&lt;br /&gt;
  var mc = m.cos;&lt;br /&gt;
  // this is used for sub pixel precision&lt;br /&gt;
  var Z = 10;&lt;br /&gt;
  var Z2 = Z / 2;&lt;br /&gt;
  var G_vmlCanvasManager_ = {&lt;br /&gt;
    init: function (opt_doc) {&lt;br /&gt;
      var doc = opt_doc || document;&lt;br /&gt;
      if (/MSIE/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.opera) {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        doc.attachEvent(&amp;quot;onreadystatechange&amp;quot;, function () {&lt;br /&gt;
          self.init_(doc);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    init_: function (doc) {&lt;br /&gt;
      if (doc.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
        // create xmlns&lt;br /&gt;
        if (!doc.namespaces[&amp;quot;g_vml_&amp;quot;]) {&lt;br /&gt;
          doc.namespaces.add(&amp;quot;g_vml_&amp;quot;, &amp;quot;urn:schemas-microsoft-com:vml&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // setup default css&lt;br /&gt;
        var ss = doc.createStyleSheet();&lt;br /&gt;
        ss.cssText = &amp;quot;canvas{display:inline-block;overflow:hidden;&amp;quot; +&lt;br /&gt;
            // default size is 300x150 in Gecko and Opera&lt;br /&gt;
            &amp;quot;text-align:left;width:300px;height:150px}&amp;quot; +&lt;br /&gt;
            &amp;quot;g_vml_\\:*{behavior:url(#default#VML)}&amp;quot;;&lt;br /&gt;
        // find all canvas elements&lt;br /&gt;
        var els = doc.getElementsByTagName(&amp;quot;canvas&amp;quot;);&lt;br /&gt;
        for (var i = 0; i &amp;lt; els.length; i++) {&lt;br /&gt;
          if (!els[i].getContext) {&lt;br /&gt;
            this.initElement(els[i]);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    fixElement_: function (el) {&lt;br /&gt;
      // in IE before version 5.5 we would need to add HTML: to the tag name&lt;br /&gt;
      // but we do not care about IE before version 6&lt;br /&gt;
      var outerHTML = el.outerHTML;&lt;br /&gt;
      var newEl = el.ownerDocument.createElement(outerHTML);&lt;br /&gt;
      // if the tag is still open IE has created the children as siblings and&lt;br /&gt;
      // it has also created a tag with the name &amp;quot;/FOO&amp;quot;&lt;br /&gt;
      if (outerHTML.slice(-2) != &amp;quot;/&amp;gt;&amp;quot;) {&lt;br /&gt;
        var tagName = &amp;quot;/&amp;quot; + el.tagName;&lt;br /&gt;
        var ns;&lt;br /&gt;
        // remove content&lt;br /&gt;
        while ((ns = el.nextSibling) &amp;amp;&amp;amp; ns.tagName != tagName) {&lt;br /&gt;
          ns.removeNode();&lt;br /&gt;
        }&lt;br /&gt;
        // remove the incorrect closing tag&lt;br /&gt;
        if (ns) {&lt;br /&gt;
          ns.removeNode();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      el.parentNode.replaceChild(newEl, el);&lt;br /&gt;
      return newEl;&lt;br /&gt;
    },&lt;br /&gt;
    /**&lt;br /&gt;
     * Public initializes a canvas element so that it can be used as canvas&lt;br /&gt;
     * element from now on. This is called automatically before the page is&lt;br /&gt;
     * loaded but if you are creating elements using createElement you need to&lt;br /&gt;
     * make sure this is called on the element.&lt;br /&gt;
     * @param {HTMLElement} el The canvas element to initialize.&lt;br /&gt;
     * @return {HTMLElement} the element that was created.&lt;br /&gt;
     */&lt;br /&gt;
    initElement: function (el) {&lt;br /&gt;
      el = this.fixElement_(el);&lt;br /&gt;
      el.getContext = function () {&lt;br /&gt;
        if (this.context_) {&lt;br /&gt;
          return this.context_;&lt;br /&gt;
        }&lt;br /&gt;
        return this.context_ = new CanvasRenderingContext2D_(this);&lt;br /&gt;
      };&lt;br /&gt;
      // do not use inline function because that will leak memory&lt;br /&gt;
      el.attachEvent(&amp;quot;onpropertychange&amp;quot;, onPropertyChange);&lt;br /&gt;
      el.attachEvent(&amp;quot;onresize&amp;quot;, onResize);&lt;br /&gt;
      var attrs = el.attributes;&lt;br /&gt;
      if (attrs.width &amp;amp;&amp;amp; attrs.width.specified) {&lt;br /&gt;
        // TODO: use runtimeStyle and coordsize&lt;br /&gt;
        // el.getContext().setWidth_(attrs.width.nodeValue);&lt;br /&gt;
        el.style.width = attrs.width.nodeValue + &amp;quot;px&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.width = el.clientWidth;&lt;br /&gt;
      }&lt;br /&gt;
      if (attrs.height &amp;amp;&amp;amp; attrs.height.specified) {&lt;br /&gt;
        // TODO: use runtimeStyle and coordsize&lt;br /&gt;
        // el.getContext().setHeight_(attrs.height.nodeValue);&lt;br /&gt;
        el.style.height = attrs.height.nodeValue + &amp;quot;px&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.height = el.clientHeight;&lt;br /&gt;
      }&lt;br /&gt;
      //el.getContext().setCoordsize_()&lt;br /&gt;
      return el;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
  function onPropertyChange(e) {&lt;br /&gt;
    var el = e.srcElement;&lt;br /&gt;
    switch (e.propertyName) {&lt;br /&gt;
      case &amp;quot;width&amp;quot;:&lt;br /&gt;
        el.style.width = el.attributes.width.nodeValue + &amp;quot;px&amp;quot;;&lt;br /&gt;
        el.getContext().clearRect();&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;quot;height&amp;quot;:&lt;br /&gt;
        el.style.height = el.attributes.height.nodeValue + &amp;quot;px&amp;quot;;&lt;br /&gt;
        el.getContext().clearRect();&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  function onResize(e) {&lt;br /&gt;
    var el = e.srcElement;&lt;br /&gt;
    if (el.firstChild) {&lt;br /&gt;
      el.firstChild.style.width =  el.clientWidth + &amp;quot;px&amp;quot;;&lt;br /&gt;
      el.firstChild.style.height = el.clientHeight + &amp;quot;px&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  G_vmlCanvasManager_.init();&lt;br /&gt;
  // precompute &amp;quot;00&amp;quot; to &amp;quot;FF&amp;quot;&lt;br /&gt;
  var dec2hex = [];&lt;br /&gt;
  for (var i = 0; i &amp;lt; 16; i++) {&lt;br /&gt;
    for (var j = 0; j &amp;lt; 16; j++) {&lt;br /&gt;
      dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  function createMatrixIdentity() {&lt;br /&gt;
    return [&lt;br /&gt;
      [1, 0, 0],&lt;br /&gt;
      [0, 1, 0],&lt;br /&gt;
      [0, 0, 1]&lt;br /&gt;
    ];&lt;br /&gt;
  }&lt;br /&gt;
  function matrixMultiply(m1, m2) {&lt;br /&gt;
    var result = createMatrixIdentity();&lt;br /&gt;
    for (var x = 0; x &amp;lt; 3; x++) {&lt;br /&gt;
      for (var y = 0; y &amp;lt; 3; y++) {&lt;br /&gt;
        var sum = 0;&lt;br /&gt;
        for (var z = 0; z &amp;lt; 3; z++) {&lt;br /&gt;
          sum += m1[x][z] * m2[z][y];&lt;br /&gt;
        }&lt;br /&gt;
        result[x][y] = sum;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  function copyState(o1, o2) {&lt;br /&gt;
    o2.fillStyle     = o1.fillStyle;&lt;br /&gt;
    o2.lineCap       = o1.lineCap;&lt;br /&gt;
    o2.lineJoin      = o1.lineJoin;&lt;br /&gt;
    o2.lineWidth     = o1.lineWidth;&lt;br /&gt;
    o2.miterLimit    = o1.miterLimit;&lt;br /&gt;
    o2.shadowBlur    = o1.shadowBlur;&lt;br /&gt;
    o2.shadowColor   = o1.shadowColor;&lt;br /&gt;
    o2.shadowOffsetX = o1.shadowOffsetX;&lt;br /&gt;
    o2.shadowOffsetY = o1.shadowOffsetY;&lt;br /&gt;
    o2.strokeStyle   = o1.strokeStyle;&lt;br /&gt;
    o2.arcScaleX_    = o1.arcScaleX_;&lt;br /&gt;
    o2.arcScaleY_    = o1.arcScaleY_;&lt;br /&gt;
  }&lt;br /&gt;
  function processStyle(styleString) {&lt;br /&gt;
    var str, alpha = 1;&lt;br /&gt;
    styleString = String(styleString);&lt;br /&gt;
    if (styleString.substring(0, 3) == &amp;quot;rgb&amp;quot;) {&lt;br /&gt;
      var start = styleString.indexOf(&amp;quot;(&amp;quot;, 3);&lt;br /&gt;
      var end = styleString.indexOf(&amp;quot;)&amp;quot;, start + 1);&lt;br /&gt;
      var guts = styleString.substring(start + 1, end).split(&amp;quot;,&amp;quot;);&lt;br /&gt;
      str = &amp;quot;#&amp;quot;;&lt;br /&gt;
      for (var i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
        str += dec2hex[Number(guts[i])];&lt;br /&gt;
      }&lt;br /&gt;
      if ((guts.length == 4) &amp;amp;&amp;amp; (styleString.substr(3, 1) == &amp;quot;a&amp;quot;)) {&lt;br /&gt;
        alpha = guts[3];&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      str = styleString;&lt;br /&gt;
    }&lt;br /&gt;
    return [str, alpha];&lt;br /&gt;
  }&lt;br /&gt;
  function processLineCap(lineCap) {&lt;br /&gt;
    switch (lineCap) {&lt;br /&gt;
      case &amp;quot;butt&amp;quot;:&lt;br /&gt;
        return &amp;quot;flat&amp;quot;;&lt;br /&gt;
      case &amp;quot;round&amp;quot;:&lt;br /&gt;
        return &amp;quot;round&amp;quot;;&lt;br /&gt;
      case &amp;quot;square&amp;quot;:&lt;br /&gt;
      default:&lt;br /&gt;
        return &amp;quot;square&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * This class implements CanvasRenderingContext2D interface as described by&lt;br /&gt;
   * the WHATWG.&lt;br /&gt;
   * @param {HTMLElement} surfaceElement The element that the 2D context should&lt;br /&gt;
   * be associated with&lt;br /&gt;
   */&lt;br /&gt;
   function CanvasRenderingContext2D_(surfaceElement) {&lt;br /&gt;
    this.m_ = createMatrixIdentity();&lt;br /&gt;
    this.mStack_ = [];&lt;br /&gt;
    this.aStack_ = [];&lt;br /&gt;
    this.currentPath_ = [];&lt;br /&gt;
    // Canvas context properties&lt;br /&gt;
    this.strokeStyle = &amp;quot;#000&amp;quot;;&lt;br /&gt;
    this.fillStyle = &amp;quot;#000&amp;quot;;&lt;br /&gt;
    this.lineWidth = 1;&lt;br /&gt;
    this.lineJoin = &amp;quot;miter&amp;quot;;&lt;br /&gt;
    this.lineCap = &amp;quot;butt&amp;quot;;&lt;br /&gt;
    this.miterLimit = Z * 1;&lt;br /&gt;
    this.globalAlpha = 1;&lt;br /&gt;
    this.canvas = surfaceElement;&lt;br /&gt;
    var el = surfaceElement.ownerDocument.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
    el.style.width =  surfaceElement.clientWidth + &amp;quot;px&amp;quot;;&lt;br /&gt;
    el.style.height = surfaceElement.clientHeight + &amp;quot;px&amp;quot;;&lt;br /&gt;
    el.style.overflow = &amp;quot;hidden&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    surfaceElement.appendChild(el);&lt;br /&gt;
    this.element_ = el;&lt;br /&gt;
    this.arcScaleX_ = 1;&lt;br /&gt;
    this.arcScaleY_ = 1;&lt;br /&gt;
  };&lt;br /&gt;
  var contextPrototype = CanvasRenderingContext2D_.prototype;&lt;br /&gt;
  contextPrototype.clearRect = function() {&lt;br /&gt;
    this.element_.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
    this.currentPath_ = [];&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.beginPath = function() {&lt;br /&gt;
    // TODO: Branch current matrix so that save/restore has no effect&lt;br /&gt;
    //       as per safari docs.&lt;br /&gt;
    this.currentPath_ = [];&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.moveTo = function(aX, aY) {&lt;br /&gt;
    this.currentPath_.push({type: &amp;quot;moveTo&amp;quot;, x: aX, y: aY});&lt;br /&gt;
    this.currentX_ = aX;&lt;br /&gt;
    this.currentY_ = aY;&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.lineTo = function(aX, aY) {&lt;br /&gt;
    this.currentPath_.push({type: &amp;quot;lineTo&amp;quot;, x: aX, y: aY});&lt;br /&gt;
    this.currentX_ = aX;&lt;br /&gt;
    this.currentY_ = aY;&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,&lt;br /&gt;
                                            aCP2x, aCP2y,&lt;br /&gt;
                                            aX, aY) {&lt;br /&gt;
    this.currentPath_.push({type: &amp;quot;bezierCurveTo&amp;quot;,&lt;br /&gt;
                           cp1x: aCP1x,&lt;br /&gt;
                           cp1y: aCP1y,&lt;br /&gt;
                           cp2x: aCP2x,&lt;br /&gt;
                           cp2y: aCP2y,&lt;br /&gt;
                           x: aX,&lt;br /&gt;
                           y: aY});&lt;br /&gt;
    this.currentX_ = aX;&lt;br /&gt;
    this.currentY_ = aY;&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {&lt;br /&gt;
    // the following is lifted almost directly from&lt;br /&gt;
    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes&lt;br /&gt;
    var cp1x = this.currentX_ + 2.0 / 3.0 * (aCPx - this.currentX_);&lt;br /&gt;
    var cp1y = this.currentY_ + 2.0 / 3.0 * (aCPy - this.currentY_);&lt;br /&gt;
    var cp2x = cp1x + (aX - this.currentX_) / 3.0;&lt;br /&gt;
    var cp2y = cp1y + (aY - this.currentY_) / 3.0;&lt;br /&gt;
    this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, aX, aY);&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.arc = function(aX, aY, aRadius,&lt;br /&gt;
                                  aStartAngle, aEndAngle, aClockwise) {&lt;br /&gt;
    aRadius *= Z;&lt;br /&gt;
    var arcType = aClockwise ? &amp;quot;at&amp;quot; : &amp;quot;wa&amp;quot;;&lt;br /&gt;
    var xStart = aX + (mc(aStartAngle) * aRadius) - Z2;&lt;br /&gt;
    var yStart = aY + (ms(aStartAngle) * aRadius) - Z2;&lt;br /&gt;
    var xEnd = aX + (mc(aEndAngle) * aRadius) - Z2;&lt;br /&gt;
    var yEnd = aY + (ms(aEndAngle) * aRadius) - Z2;&lt;br /&gt;
    // IE won&amp;quot;t render arches drawn counter clockwise if xStart == xEnd.&lt;br /&gt;
    if (xStart == xEnd &amp;amp;&amp;amp; !aClockwise) {&lt;br /&gt;
      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something&lt;br /&gt;
                       // that can be represented in binary&lt;br /&gt;
    }&lt;br /&gt;
    this.currentPath_.push({type: arcType,&lt;br /&gt;
                           x: aX,&lt;br /&gt;
                           y: aY,&lt;br /&gt;
                           radius: aRadius,&lt;br /&gt;
                           xStart: xStart,&lt;br /&gt;
                           yStart: yStart,&lt;br /&gt;
                           xEnd: xEnd,&lt;br /&gt;
                           yEnd: yEnd});&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {&lt;br /&gt;
    this.moveTo(aX, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY + aHeight);&lt;br /&gt;
    this.lineTo(aX, aY + aHeight);&lt;br /&gt;
    this.closePath();&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {&lt;br /&gt;
    // Will destroy any existing path (same as FF behaviour)&lt;br /&gt;
    this.beginPath();&lt;br /&gt;
    this.moveTo(aX, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY + aHeight);&lt;br /&gt;
    this.lineTo(aX, aY + aHeight);&lt;br /&gt;
    this.closePath();&lt;br /&gt;
    this.stroke();&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {&lt;br /&gt;
    // Will destroy any existing path (same as FF behaviour)&lt;br /&gt;
    this.beginPath();&lt;br /&gt;
    this.moveTo(aX, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY);&lt;br /&gt;
    this.lineTo(aX + aWidth, aY + aHeight);&lt;br /&gt;
    this.lineTo(aX, aY + aHeight);&lt;br /&gt;
    this.closePath();&lt;br /&gt;
    this.fill();&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {&lt;br /&gt;
    var gradient = new CanvasGradient_(&amp;quot;gradient&amp;quot;);&lt;br /&gt;
    return gradient;&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.createRadialGradient = function(aX0, aY0,&lt;br /&gt;
                                                   aR0, aX1,&lt;br /&gt;
                                                   aY1, aR1) {&lt;br /&gt;
    var gradient = new CanvasGradient_(&amp;quot;gradientradial&amp;quot;);&lt;br /&gt;
    gradient.radius1_ = aR0;&lt;br /&gt;
    gradient.radius2_ = aR1;&lt;br /&gt;
    gradient.focus_.x = aX0;&lt;br /&gt;
    gradient.focus_.y = aY0;&lt;br /&gt;
    return gradient;&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.drawImage = function (image, var_args) {&lt;br /&gt;
    var dx, dy, dw, dh, sx, sy, sw, sh;&lt;br /&gt;
    // to find the original width we overide the width and height&lt;br /&gt;
    var oldRuntimeWidth = image.runtimeStyle.width;&lt;br /&gt;
    var oldRuntimeHeight = image.runtimeStyle.height;&lt;br /&gt;
    image.runtimeStyle.width = &amp;quot;auto&amp;quot;;&lt;br /&gt;
    image.runtimeStyle.height = &amp;quot;auto&amp;quot;;&lt;br /&gt;
    // get the original size&lt;br /&gt;
    var w = image.width;&lt;br /&gt;
    var h = image.height;&lt;br /&gt;
    // and remove overides&lt;br /&gt;
    image.runtimeStyle.width = oldRuntimeWidth;&lt;br /&gt;
    image.runtimeStyle.height = oldRuntimeHeight;&lt;br /&gt;
    if (arguments.length == 3) {&lt;br /&gt;
      dx = arguments[1];&lt;br /&gt;
      dy = arguments[2];&lt;br /&gt;
      sx = sy = 0;&lt;br /&gt;
      sw = dw = w;&lt;br /&gt;
      sh = dh = h;&lt;br /&gt;
    } else if (arguments.length == 5) {&lt;br /&gt;
      dx = arguments[1];&lt;br /&gt;
      dy = arguments[2];&lt;br /&gt;
      dw = arguments[3];&lt;br /&gt;
      dh = arguments[4];&lt;br /&gt;
      sx = sy = 0;&lt;br /&gt;
      sw = w;&lt;br /&gt;
      sh = h;&lt;br /&gt;
    } else if (arguments.length == 9) {&lt;br /&gt;
      sx = arguments[1];&lt;br /&gt;
      sy = arguments[2];&lt;br /&gt;
      sw = arguments[3];&lt;br /&gt;
      sh = arguments[4];&lt;br /&gt;
      dx = arguments[5];&lt;br /&gt;
      dy = arguments[6];&lt;br /&gt;
      dw = arguments[7];&lt;br /&gt;
      dh = arguments[8];&lt;br /&gt;
    } else {&lt;br /&gt;
      throw &amp;quot;Invalid number of arguments&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    var d = this.getCoords_(dx, dy);&lt;br /&gt;
    var w2 = sw / 2;&lt;br /&gt;
    var h2 = sh / 2;&lt;br /&gt;
    var vmlStr = [];&lt;br /&gt;
    var W = 10;&lt;br /&gt;
    var H = 10;&lt;br /&gt;
    // For some reason that I&amp;quot;ve now forgotten, using divs didn&amp;quot;t work&lt;br /&gt;
    vmlStr.push(&amp;quot; &amp;lt;g_vml_:group&amp;quot;,&lt;br /&gt;
                &amp;quot; coordsize=&amp;quot;&amp;quot;, Z * W, &amp;quot;,&amp;quot;, Z * H, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; coordorigin=&amp;quot;0,0&amp;quot;&amp;quot; ,&lt;br /&gt;
                &amp;quot; style=&amp;quot;width:&amp;quot;, W, &amp;quot;;height:&amp;quot;, H, &amp;quot;;position:absolute;&amp;quot;);&lt;br /&gt;
    // If filters are necessary (rotation exists), create them&lt;br /&gt;
    // filters are bog-slow, so only create them if abbsolutely necessary&lt;br /&gt;
    // The following check doesn&amp;quot;t account for skews (which don&amp;quot;t exist&lt;br /&gt;
    // in the canvas spec (yet) anyway.&lt;br /&gt;
    if (this.m_[0][0] != 1 || this.m_[0][1]) {&lt;br /&gt;
      var filter = [];&lt;br /&gt;
      // Note the 12/21 reversal&lt;br /&gt;
      filter.push(&amp;quot;M11=&amp;quot;&amp;quot;, this.m_[0][0], &amp;quot;&amp;quot;,&amp;quot;,&lt;br /&gt;
                  &amp;quot;M12=&amp;quot;&amp;quot;, this.m_[1][0], &amp;quot;&amp;quot;,&amp;quot;,&lt;br /&gt;
                  &amp;quot;M21=&amp;quot;&amp;quot;, this.m_[0][1], &amp;quot;&amp;quot;,&amp;quot;,&lt;br /&gt;
                  &amp;quot;M22=&amp;quot;&amp;quot;, this.m_[1][1], &amp;quot;&amp;quot;,&amp;quot;,&lt;br /&gt;
                  &amp;quot;Dx=&amp;quot;&amp;quot;, mr(d.x / Z), &amp;quot;&amp;quot;,&amp;quot;,&lt;br /&gt;
                  &amp;quot;Dy=&amp;quot;&amp;quot;, mr(d.y / Z), &amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
      // Bounding box calculation (need to minimize displayed area so that&lt;br /&gt;
      // filters don&amp;quot;t waste time on unused pixels.&lt;br /&gt;
      var max = d;&lt;br /&gt;
      var c2 = this.getCoords_(dx + dw, dy);&lt;br /&gt;
      var c3 = this.getCoords_(dx, dy + dh);&lt;br /&gt;
      var c4 = this.getCoords_(dx + dw, dy + dh);&lt;br /&gt;
      max.x = Math.max(max.x, c2.x, c3.x, c4.x);&lt;br /&gt;
      max.y = Math.max(max.y, c2.y, c3.y, c4.y);&lt;br /&gt;
      vmlStr.push(&amp;quot;padding:0 &amp;quot;, mr(max.x / Z), &amp;quot;px &amp;quot;, mr(max.y / Z),&lt;br /&gt;
                  &amp;quot;px 0;filter:progid:DXImageTransform.Microsoft.Matrix(&amp;quot;,&lt;br /&gt;
                  filter.join(&amp;quot;&amp;quot;), &amp;quot;, sizingmethod=&amp;quot;clip&amp;quot;);&amp;quot;)&lt;br /&gt;
    } else {&lt;br /&gt;
      vmlStr.push(&amp;quot;top:&amp;quot;, mr(d.y / Z), &amp;quot;px;left:&amp;quot;, mr(d.x / Z), &amp;quot;px;&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
    vmlStr.push(&amp;quot; &amp;quot;&amp;gt;&amp;quot; ,&lt;br /&gt;
                &amp;quot;&amp;lt;g_vml_:image src=&amp;quot;&amp;quot;, image.src, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; style=&amp;quot;width:&amp;quot;, Z * dw, &amp;quot;;&amp;quot;,&lt;br /&gt;
                &amp;quot; height:&amp;quot;, Z * dh, &amp;quot;;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; cropleft=&amp;quot;&amp;quot;, sx / w, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; croptop=&amp;quot;&amp;quot;, sy / h, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; cropright=&amp;quot;&amp;quot;, (w - sx - sw) / w, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; cropbottom=&amp;quot;&amp;quot;, (h - sy - sh) / h, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot; /&amp;gt;&amp;quot;,&lt;br /&gt;
                &amp;quot;&amp;lt;/g_vml_:group&amp;gt;&amp;quot;);&lt;br /&gt;
    this.element_.insertAdjacentHTML(&amp;quot;BeforeEnd&amp;quot;,&lt;br /&gt;
                                    vmlStr.join(&amp;quot;&amp;quot;));&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.stroke = function(aFill) {&lt;br /&gt;
    var lineStr = [];&lt;br /&gt;
    var lineOpen = false;&lt;br /&gt;
    var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);&lt;br /&gt;
    var color = a[0];&lt;br /&gt;
    var opacity = a[1] * this.globalAlpha;&lt;br /&gt;
    var W = 10;&lt;br /&gt;
    var H = 10;&lt;br /&gt;
    lineStr.push(&amp;quot;&amp;lt;g_vml_:shape&amp;quot;,&lt;br /&gt;
                 &amp;quot; fillcolor=&amp;quot;&amp;quot;, color, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; filled=&amp;quot;&amp;quot;, Boolean(aFill), &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; style=&amp;quot;position:absolute;width:&amp;quot;, W, &amp;quot;;height:&amp;quot;, H, &amp;quot;;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; coordorigin=&amp;quot;0 0&amp;quot; coordsize=&amp;quot;&amp;quot;, Z * W, &amp;quot; &amp;quot;, Z * H, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; stroked=&amp;quot;&amp;quot;, !aFill, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; strokeweight=&amp;quot;&amp;quot;, this.lineWidth, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; strokecolor=&amp;quot;&amp;quot;, color, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                 &amp;quot; path=&amp;quot;&amp;quot;);&lt;br /&gt;
    var newSeq = false;&lt;br /&gt;
    var min = {x: null, y: null};&lt;br /&gt;
    var max = {x: null, y: null};&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.currentPath_.length; i++) {&lt;br /&gt;
      var p = this.currentPath_[i];&lt;br /&gt;
      if (p.type == &amp;quot;moveTo&amp;quot;) {&lt;br /&gt;
        lineStr.push(&amp;quot; m &amp;quot;);&lt;br /&gt;
        var c = this.getCoords_(p.x, p.y);&lt;br /&gt;
        lineStr.push(mr(c.x), &amp;quot;,&amp;quot;, mr(c.y));&lt;br /&gt;
      } else if (p.type == &amp;quot;lineTo&amp;quot;) {&lt;br /&gt;
        lineStr.push(&amp;quot; l &amp;quot;);&lt;br /&gt;
        var c = this.getCoords_(p.x, p.y);&lt;br /&gt;
        lineStr.push(mr(c.x), &amp;quot;,&amp;quot;, mr(c.y));&lt;br /&gt;
      } else if (p.type == &amp;quot;close&amp;quot;) {&lt;br /&gt;
        lineStr.push(&amp;quot; x &amp;quot;);&lt;br /&gt;
      } else if (p.type == &amp;quot;bezierCurveTo&amp;quot;) {&lt;br /&gt;
        lineStr.push(&amp;quot; c &amp;quot;);&lt;br /&gt;
        var c = this.getCoords_(p.x, p.y);&lt;br /&gt;
        var c1 = this.getCoords_(p.cp1x, p.cp1y);&lt;br /&gt;
        var c2 = this.getCoords_(p.cp2x, p.cp2y);&lt;br /&gt;
        lineStr.push(mr(c1.x), &amp;quot;,&amp;quot;, mr(c1.y), &amp;quot;,&amp;quot;,&lt;br /&gt;
                     mr(c2.x), &amp;quot;,&amp;quot;, mr(c2.y), &amp;quot;,&amp;quot;,&lt;br /&gt;
                     mr(c.x), &amp;quot;,&amp;quot;, mr(c.y));&lt;br /&gt;
      } else if (p.type == &amp;quot;at&amp;quot; || p.type == &amp;quot;wa&amp;quot;) {&lt;br /&gt;
        lineStr.push(&amp;quot; &amp;quot;, p.type, &amp;quot; &amp;quot;);&lt;br /&gt;
        var c  = this.getCoords_(p.x, p.y);&lt;br /&gt;
        var cStart = this.getCoords_(p.xStart, p.yStart);&lt;br /&gt;
        var cEnd = this.getCoords_(p.xEnd, p.yEnd);&lt;br /&gt;
        lineStr.push(mr(c.x - this.arcScaleX_ * p.radius), &amp;quot;,&amp;quot;,&lt;br /&gt;
                     mr(c.y - this.arcScaleY_ * p.radius), &amp;quot; &amp;quot;,&lt;br /&gt;
                     mr(c.x + this.arcScaleX_ * p.radius), &amp;quot;,&amp;quot;,&lt;br /&gt;
                     mr(c.y + this.arcScaleY_ * p.radius), &amp;quot; &amp;quot;,&lt;br /&gt;
                     mr(cStart.x), &amp;quot;,&amp;quot;, mr(cStart.y), &amp;quot; &amp;quot;,&lt;br /&gt;
                     mr(cEnd.x), &amp;quot;,&amp;quot;, mr(cEnd.y));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // TODO: Following is broken for curves due to&lt;br /&gt;
      //       move to proper paths.&lt;br /&gt;
      // Figure out dimensions so we can do gradient fills&lt;br /&gt;
      // properly&lt;br /&gt;
      if(c) {&lt;br /&gt;
        if (min.x == null || c.x &amp;lt; min.x) {&lt;br /&gt;
          min.x = c.x;&lt;br /&gt;
        }&lt;br /&gt;
        if (max.x == null || c.x &amp;gt; max.x) {&lt;br /&gt;
          max.x = c.x;&lt;br /&gt;
        }&lt;br /&gt;
        if (min.y == null || c.y &amp;lt; min.y) {&lt;br /&gt;
          min.y = c.y;&lt;br /&gt;
        }&lt;br /&gt;
        if (max.y == null || c.y &amp;gt; max.y) {&lt;br /&gt;
          max.y = c.y;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lineStr.push(&amp;quot; &amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
    if (typeof this.fillStyle == &amp;quot;object&amp;quot;) {&lt;br /&gt;
      var focus = {x: &amp;quot;50%&amp;quot;, y: &amp;quot;50%&amp;quot;};&lt;br /&gt;
      var width = (max.x - min.x);&lt;br /&gt;
      var height = (max.y - min.y);&lt;br /&gt;
      var dimension = (width &amp;gt; height) ? width : height;&lt;br /&gt;
      focus.x = mr((this.fillStyle.focus_.x / width) * 100 + 50) + &amp;quot;%&amp;quot;;&lt;br /&gt;
      focus.y = mr((this.fillStyle.focus_.y / height) * 100 + 50) + &amp;quot;%&amp;quot;;&lt;br /&gt;
      var colors = [];&lt;br /&gt;
      // inside radius (%)&lt;br /&gt;
      if (this.fillStyle.type_ == &amp;quot;gradientradial&amp;quot;) {&lt;br /&gt;
        var inside = (this.fillStyle.radius1_ / dimension * 100);&lt;br /&gt;
        // percentage that outside radius exceeds inside radius&lt;br /&gt;
        var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside;&lt;br /&gt;
      } else {&lt;br /&gt;
        var inside = 0;&lt;br /&gt;
        var expansion = 100;&lt;br /&gt;
      }&lt;br /&gt;
      var insidecolor = {offset: null, color: null};&lt;br /&gt;
      var outsidecolor = {offset: null, color: null};&lt;br /&gt;
      // We need to sort &amp;quot;colors&amp;quot; by percentage, from 0 &amp;gt; 100 otherwise ie&lt;br /&gt;
      // won&amp;quot;t interpret it correctly&lt;br /&gt;
      this.fillStyle.colors_.sort(function (cs1, cs2) {&lt;br /&gt;
        return cs1.offset - cs2.offset;&lt;br /&gt;
      });&lt;br /&gt;
      for (var i = 0; i &amp;lt; this.fillStyle.colors_.length; i++) {&lt;br /&gt;
        var fs = this.fillStyle.colors_[i];&lt;br /&gt;
        colors.push( (fs.offset * expansion) + inside, &amp;quot;% &amp;quot;, fs.color, &amp;quot;,&amp;quot;);&lt;br /&gt;
        if (fs.offset &amp;gt; insidecolor.offset || insidecolor.offset == null) {&lt;br /&gt;
          insidecolor.offset = fs.offset;&lt;br /&gt;
          insidecolor.color = fs.color;&lt;br /&gt;
        }&lt;br /&gt;
        if (fs.offset &amp;lt; outsidecolor.offset || outsidecolor.offset == null) {&lt;br /&gt;
          outsidecolor.offset = fs.offset;&lt;br /&gt;
          outsidecolor.color = fs.color;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      colors.pop();&lt;br /&gt;
      lineStr.push(&amp;quot;&amp;lt;g_vml_:fill&amp;quot;,&lt;br /&gt;
                   &amp;quot; color=&amp;quot;&amp;quot;, outsidecolor.color, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                   &amp;quot; color2=&amp;quot;&amp;quot;, insidecolor.color, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                   &amp;quot; type=&amp;quot;&amp;quot;, this.fillStyle.type_, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                   &amp;quot; focusposition=&amp;quot;&amp;quot;, focus.x, &amp;quot;, &amp;quot;, focus.y, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                   &amp;quot; colors=&amp;quot;&amp;quot;, colors.join(&amp;quot;&amp;quot;), &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
                   &amp;quot; opacity=&amp;quot;&amp;quot;, opacity, &amp;quot;&amp;quot; /&amp;gt;&amp;quot;);&lt;br /&gt;
    } else if (aFill) {&lt;br /&gt;
      lineStr.push(&amp;quot;&amp;lt;g_vml_:fill color=&amp;quot;&amp;quot;, color, &amp;quot;&amp;quot; opacity=&amp;quot;&amp;quot;, opacity, &amp;quot;&amp;quot; /&amp;gt;&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      lineStr.push(&lt;br /&gt;
        &amp;quot;&amp;lt;g_vml_:stroke&amp;quot;,&lt;br /&gt;
        &amp;quot; opacity=&amp;quot;&amp;quot;, opacity,&amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot; joinstyle=&amp;quot;&amp;quot;, this.lineJoin, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot; miterlimit=&amp;quot;&amp;quot;, this.miterLimit, &amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot; endcap=&amp;quot;&amp;quot;, processLineCap(this.lineCap) ,&amp;quot;&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot; weight=&amp;quot;&amp;quot;, this.lineWidth, &amp;quot;px&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot; color=&amp;quot;&amp;quot;, color,&amp;quot;&amp;quot; /&amp;gt;&amp;quot;&lt;br /&gt;
      );&lt;br /&gt;
    }&lt;br /&gt;
    lineStr.push(&amp;quot;&amp;lt;/g_vml_:shape&amp;gt;&amp;quot;);&lt;br /&gt;
    this.element_.insertAdjacentHTML(&amp;quot;beforeEnd&amp;quot;, lineStr.join(&amp;quot;&amp;quot;));&lt;br /&gt;
    this.currentPath_ = [];&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.fill = function() {&lt;br /&gt;
    this.stroke(true);&lt;br /&gt;
  }&lt;br /&gt;
  contextPrototype.closePath = function() {&lt;br /&gt;
    this.currentPath_.push({type: &amp;quot;close&amp;quot;});&lt;br /&gt;
  };&lt;br /&gt;
  /**&lt;br /&gt;
   * @private&lt;br /&gt;
   */&lt;br /&gt;
  contextPrototype.getCoords_ = function(aX, aY) {&lt;br /&gt;
    return {&lt;br /&gt;
      x: Z * (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]) - Z2,&lt;br /&gt;
      y: Z * (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1]) - Z2&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.save = function() {&lt;br /&gt;
    var o = {};&lt;br /&gt;
    copyState(this, o);&lt;br /&gt;
    this.aStack_.push(o);&lt;br /&gt;
    this.mStack_.push(this.m_);&lt;br /&gt;
    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.restore = function() {&lt;br /&gt;
    copyState(this.aStack_.pop(), this);&lt;br /&gt;
    this.m_ = this.mStack_.pop();&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.translate = function(aX, aY) {&lt;br /&gt;
    var m1 = [&lt;br /&gt;
      [1,  0,  0],&lt;br /&gt;
      [0,  1,  0],&lt;br /&gt;
      [aX, aY, 1]&lt;br /&gt;
    ];&lt;br /&gt;
    this.m_ = matrixMultiply(m1, this.m_);&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.rotate = function(aRot) {&lt;br /&gt;
    var c = mc(aRot);&lt;br /&gt;
    var s = ms(aRot);&lt;br /&gt;
    var m1 = [&lt;br /&gt;
      [c,  s, 0],&lt;br /&gt;
      [-s, c, 0],&lt;br /&gt;
      [0,  0, 1]&lt;br /&gt;
    ];&lt;br /&gt;
    this.m_ = matrixMultiply(m1, this.m_);&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.scale = function(aX, aY) {&lt;br /&gt;
    this.arcScaleX_ *= aX;&lt;br /&gt;
    this.arcScaleY_ *= aY;&lt;br /&gt;
    var m1 = [&lt;br /&gt;
      [aX, 0,  0],&lt;br /&gt;
      [0,  aY, 0],&lt;br /&gt;
      [0,  0,  1]&lt;br /&gt;
    ];&lt;br /&gt;
    this.m_ = matrixMultiply(m1, this.m_);&lt;br /&gt;
  };&lt;br /&gt;
  /******** STUBS ********/&lt;br /&gt;
  contextPrototype.clip = function() {&lt;br /&gt;
    // TODO: Implement&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.arcTo = function() {&lt;br /&gt;
    // TODO: Implement&lt;br /&gt;
  };&lt;br /&gt;
  contextPrototype.createPattern = function() {&lt;br /&gt;
    return new CanvasPattern_;&lt;br /&gt;
  };&lt;br /&gt;
  // Gradient / Pattern Stubs&lt;br /&gt;
  function CanvasGradient_(aType) {&lt;br /&gt;
    this.type_ = aType;&lt;br /&gt;
    this.radius1_ = 0;&lt;br /&gt;
    this.radius2_ = 0;&lt;br /&gt;
    this.colors_ = [];&lt;br /&gt;
    this.focus_ = {x: 0, y: 0};&lt;br /&gt;
  }&lt;br /&gt;
  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {&lt;br /&gt;
    aColor = processStyle(aColor);&lt;br /&gt;
    this.colors_.push({offset: 1-aOffset, color: aColor});&lt;br /&gt;
  };&lt;br /&gt;
  function CanvasPattern_() {}&lt;br /&gt;
  // set up externs&lt;br /&gt;
  G_vmlCanvasManager = G_vmlCanvasManager_;&lt;br /&gt;
  CanvasRenderingContext2D = CanvasRenderingContext2D_;&lt;br /&gt;
  CanvasGradient = CanvasGradient_;&lt;br /&gt;
  CanvasPattern = CanvasPattern_;&lt;br /&gt;
})();&lt;br /&gt;
} // if&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var canvas, ctx;&lt;br /&gt;
    var particles = [];&lt;br /&gt;
    var NUM_PARTICLES = 20;&lt;br /&gt;
    function Particle() {&lt;br /&gt;
      this.x = Math.random() * canvas.width;&lt;br /&gt;
      this.y = Math.random() * canvas.height;&lt;br /&gt;
      this.xvel = Math.random() * 5 - 2.5;&lt;br /&gt;
      this.yvel = Math.random() * 5 - 2.5;&lt;br /&gt;
    }&lt;br /&gt;
    Particle.prototype.update = function() {&lt;br /&gt;
      this.x += this.xvel;&lt;br /&gt;
      this.y += this.yvel;&lt;br /&gt;
      this.yvel += 0.1;&lt;br /&gt;
      if (this.x &amp;gt; canvas.width || this.x &amp;lt; 0) {&lt;br /&gt;
        this.xvel = -this.xvel;&lt;br /&gt;
      }&lt;br /&gt;
      if (this.y &amp;gt; canvas.height || this.y &amp;lt; 0) {&lt;br /&gt;
        this.yvel = -this.yvel;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    function loop() {&lt;br /&gt;
      ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
      for(var i = 0; i &amp;lt; NUM_PARTICLES; i++) {&lt;br /&gt;
        particles[i].update();&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(particles[i].x, particles[i].y);&lt;br /&gt;
        ctx.lineTo(particles[i].x - particles[i].xvel,&lt;br /&gt;
                   particles[i].y - particles[i].yvel);&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
      }&lt;br /&gt;
      setTimeout(loop, 10);&lt;br /&gt;
    }&lt;br /&gt;
    function load() {&lt;br /&gt;
      canvas = document.getElementById(&amp;quot;cv&amp;quot;);&lt;br /&gt;
      ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
      for(var i = 0; i &amp;lt; NUM_PARTICLES; i++) {&lt;br /&gt;
        particles[i] = new Particle();&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineWidth = &amp;quot;2&amp;quot;;&lt;br /&gt;
      ctx.strokeStyle = &amp;quot;rgb(255, 255, 255)&amp;quot;;&lt;br /&gt;
      loop();&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      background-color:black;&lt;br /&gt;
      margin:50px;&lt;br /&gt;
      text-align:center;&lt;br /&gt;
    }&lt;br /&gt;
    canvas {&lt;br /&gt;
      border:1px solid #444;&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;load();&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;canvas id=&amp;quot;cv&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>