{"version":3,"sources":["jsdelivr-header.js","/npm/canvg-fixed@1.0.0/canvg.js"],"names":[],"mappings":"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","file":"/npm/canvg-fixed@1.0.0/canvg.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/canvg-fixed@1.0.0/canvg.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\n * canvg.js - Javascript SVG parser and renderer on Canvas\r\n * MIT Licensed\r\n * Gabe Lerner (gabelerner@gmail.com)\r\n * http://code.google.com/p/canvg/\r\n *\r\n * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\r\n */\r\n (function ( global, factory ) {\r\n\r\n\t'use strict';\r\n\r\n\t// export as AMD...\r\n\tif ( typeof define !== 'undefined' && define.amd ) {\r\n\t\tdefine('canvgModule', [ 'rgbcolor', 'stackblur' ], factory );\r\n\t}\r\n\r\n\t// ...or as browserify\r\n\telse if ( typeof module !== 'undefined' && module.exports ) {\r\n\t\tmodule.exports = factory( require( 'rgbcolor' ), require( 'stackblur' ) );\r\n\t}\r\n\r\n\tglobal.canvg = factory( global.RGBColor, global.stackBlur );\r\n\r\n}( typeof window !== 'undefined' ? window : this, function ( RGBColor, stackBlur ) {\r\n \r\n\t// canvg(target, s)\r\n\t// empty parameters: replace all 'svg' elements on page with 'canvas' elements\r\n\t// target: canvas element or the id of a canvas element\r\n\t// s: svg string, url to svg file, or xml document\r\n\t// opts: optional hash of options\r\n\t//\t\t ignoreMouse: true => ignore mouse events\r\n\t//\t\t ignoreAnimation: true => ignore animations\r\n\t//\t\t ignoreDimensions: true => does not try to resize canvas\r\n\t//\t\t ignoreClear: true => does not clear canvas\r\n\t//\t\t offsetX: int => draws at a x offset\r\n\t//\t\t offsetY: int => draws at a y offset\r\n\t//\t\t scaleWidth: int => scales horizontally to width\r\n\t//\t\t scaleHeight: int => scales vertically to height\r\n\t//\t\t renderCallback: function => will call the function after the first render is completed\r\n\t//\t\t forceRedraw: function => will call the function on every frame, if it returns true, will redraw\r\n\tvar canvg = function (target, s, opts) {\r\n\t\t// no parameters\r\n\t\tif (target == null && s == null && opts == null) {\r\n\t\t\tvar svgTags = document.querySelectorAll('svg');\r\n\t\t\tfor (var i=0; i<svgTags.length; i++) {\r\n\t\t\t\tvar svgTag = svgTags[i];\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = svgTag.clientWidth;\r\n\t\t\t\tc.height = svgTag.clientHeight;\r\n\t\t\t\tsvgTag.parentNode.insertBefore(c, svgTag);\r\n\t\t\t\tsvgTag.parentNode.removeChild(svgTag);\r\n\t\t\t\tvar div = document.createElement('div');\r\n\t\t\t\tdiv.appendChild(svgTag);\r\n\t\t\t\tcanvg(c, div.innerHTML);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof target == 'string') {\r\n\t\t\ttarget = document.getElementById(target);\r\n\t\t}\r\n\r\n\t\t// store class on canvas\r\n\t\tif (target.svg != null) target.svg.stop();\r\n\t\tvar svg = build(opts || {});\r\n\t\t// on i.e. 8 for flash canvas, we can't assign the property so check for it\r\n\t\tif (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == 'OBJECT')) target.svg = svg;\r\n\r\n\t\tvar ctx = target.getContext('2d');\r\n\t\tif (typeof(s.documentElement) != 'undefined') {\r\n\t\t\t// load from xml doc\r\n\t\t\tsvg.loadXmlDoc(ctx, s);\r\n\t\t}\r\n\t\telse if (s.substr(0,1) == '<') {\r\n\t\t\t// load from xml string\r\n\t\t\tsvg.loadXml(ctx, s);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// load from url\r\n\t\t\tsvg.load(ctx, s);\r\n\t\t}\r\n\t}\r\n\r\n\t// see https://developer.mozilla.org/en-US/docs/Web/API/Element.matches\r\n\tvar matchesSelector;\r\n\tif (typeof(Element.prototype.matches) != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.matches(selector);\r\n\t\t};\r\n\t} else if (typeof(Element.prototype.webkitMatchesSelector) != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.webkitMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof(Element.prototype.mozMatchesSelector) != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.mozMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof(Element.prototype.msMatchesSelector) != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.msMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof(Element.prototype.oMatchesSelector) != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.oMatchesSelector(selector);\r\n\t\t};\r\n\t} else {\r\n\t\t// requires Sizzle: https://github.com/jquery/sizzle/wiki/Sizzle-Documentation\r\n\t\t// or jQuery: http://jquery.com/download/\r\n\t\t// or Zepto: http://zeptojs.com/#\r\n\t\t// without it, this is a ReferenceError\r\n\r\n\t\tif (typeof jQuery === 'function' || typeof Zepto === 'function') {\r\n\t\t\tmatchesSelector = function (node, selector) {\r\n\t\t\t\treturn $(node).is(selector);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (typeof matchesSelector === 'undefined') {\r\n\t\t\tmatchesSelector = Sizzle.matchesSelector;\r\n\t\t}\r\n\t}\r\n\r\n\t// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\r\n\tvar attributeRegex = /(\\[[^\\]]+\\])/g;\r\n\tvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\r\n\tvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\r\n\tvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\r\n\tfunction getSelectorSpecificity(selector) {\r\n\t\tvar typeCount = [0, 0, 0];\r\n\t\tvar findMatch = function(regex, type) {\r\n\t\t\tvar matches = selector.match(regex);\r\n\t\t\tif (matches == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttypeCount[type] += matches.length;\r\n\t\t\tselector = selector.replace(regex, ' ');\r\n\t\t};\r\n\r\n\t\tselector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ');\r\n\t\tselector = selector.replace(/{[^]*/gm, ' ');\r\n\t\tfindMatch(attributeRegex, 1);\r\n\t\tfindMatch(idRegex, 0);\r\n\t\tfindMatch(classRegex, 1);\r\n\t\tfindMatch(pseudoElementRegex, 2);\r\n\t\tfindMatch(pseudoClassWithBracketsRegex, 1);\r\n\t\tfindMatch(pseudoClassRegex, 1);\r\n\t\tselector = selector.replace(/[\\*\\s\\+>~]/g, ' ');\r\n\t\tselector = selector.replace(/[#\\.]/g, ' ');\r\n\t\tfindMatch(elementRegex, 2);\r\n\t\treturn typeCount.join('');\r\n\t}\r\n\r\n\tfunction build(opts) {\r\n\t\tvar svg = { opts: opts };\r\n\r\n\t\tsvg.FRAMERATE = 30;\r\n\t\tsvg.MAX_VIRTUAL_PIXELS = 30000;\r\n\r\n\t\tsvg.log = function(msg) {};\r\n\t\tif (svg.opts['log'] == true && typeof(console) != 'undefined') {\r\n\t\t\tsvg.log = function(msg) { console.log(msg); };\r\n\t\t};\r\n\r\n\t\t// globals\r\n\t\tsvg.init = function(ctx) {\r\n\t\t\tvar uniqueId = 0;\r\n\t\t\tsvg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId;\t};\r\n\t\t\tsvg.Definitions = {};\r\n\t\t\tsvg.Styles = {};\r\n\t\t\tsvg.StylesSpecificity = {};\r\n\t\t\tsvg.Animations = [];\r\n\t\t\tsvg.Images = [];\r\n\t\t\tsvg.ctx = ctx;\r\n\t\t\tsvg.ViewPort = new (function () {\r\n\t\t\t\tthis.viewPorts = [];\r\n\t\t\t\tthis.Clear = function() { this.viewPorts = []; }\r\n\t\t\t\tthis.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }\r\n\t\t\t\tthis.RemoveCurrent = function() { this.viewPorts.pop(); }\r\n\t\t\t\tthis.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }\r\n\t\t\t\tthis.width = function() { return this.Current().width; }\r\n\t\t\t\tthis.height = function() { return this.Current().height; }\r\n\t\t\t\tthis.ComputeSize = function(d) {\r\n\t\t\t\t\tif (d != null && typeof(d) == 'number') return d;\r\n\t\t\t\t\tif (d == 'x') return this.width();\r\n\t\t\t\t\tif (d == 'y') return this.height();\r\n\t\t\t\t\treturn Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tsvg.init();\r\n\r\n\t\t// images loaded\r\n\t\tsvg.ImagesLoaded = function() {\r\n\t\t\tfor (var i=0; i<svg.Images.length; i++) {\r\n\t\t\t\tif (!svg.Images[i].loaded) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// trim\r\n\t\tsvg.trim = function(s) { return s.replace(/^\\s+|\\s+$/g, ''); }\r\n\r\n\t\t// compress spaces\r\n\t\tsvg.compressSpaces = function(s) { return s.replace(/[\\s\\r\\t\\n]+/gm,' '); }\r\n\r\n\t\t// ajax\r\n\t\tsvg.ajax = function(url) {\r\n\t\t\tvar AJAX;\r\n\t\t\tif(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}\r\n\t\t\telse{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}\r\n\t\t\tif(AJAX){\r\n\t\t\t   AJAX.open('GET',url,false);\r\n\t\t\t   AJAX.send(null);\r\n\t\t\t   return AJAX.responseText;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// parse xml\r\n\t\tsvg.parseXml = function(xml) {\r\n\t\t\tif (typeof(Windows) != 'undefined' && typeof(Windows.Data) != 'undefined' && typeof(Windows.Data.Xml) != 'undefined') {\r\n\t\t\t\tvar xmlDoc = new Windows.Data.Xml.Dom.XmlDocument();\r\n\t\t\t\tvar settings = new Windows.Data.Xml.Dom.XmlLoadSettings();\r\n\t\t\t\tsettings.prohibitDtd = false;\r\n\t\t\t\txmlDoc.loadXml(xml, settings);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t\telse if (window.DOMParser)\r\n\t\t\t{\r\n\t\t\t\tvar parser = new DOMParser();\r\n\t\t\t\treturn parser.parseFromString(xml, 'text/xml');\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\txml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\r\n\t\t\t\tvar xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\r\n\t\t\t\txmlDoc.async = 'false';\r\n\t\t\t\txmlDoc.loadXML(xml);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Property = function(name, value) {\r\n\t\t\tthis.name = name;\r\n\t\t\tthis.value = value;\r\n\t\t}\r\n\t\t\tsvg.Property.prototype.getValue = function() {\r\n\t\t\t\treturn this.value;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.hasValue = function() {\r\n\t\t\t\treturn (this.value != null && this.value !== '');\r\n\t\t\t}\r\n\r\n\t\t\t// return the numerical value of the property\r\n\t\t\tsvg.Property.prototype.numValue = function() {\r\n\t\t\t\tif (!this.hasValue()) return 0;\r\n\r\n\t\t\t\tvar n = parseFloat(this.value);\r\n\t\t\t\tif ((this.value + '').match(/%$/)) {\r\n\t\t\t\t\tn = n / 100.0;\r\n\t\t\t\t}\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.valueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.value;\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.numValueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.numValue();\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\t// color extensions\r\n\t\t\t\t// augment the current color value with the opacity\r\n\t\t\t\tsvg.Property.prototype.addOpacity = function(opacityProp) {\r\n\t\t\t\t\tvar newValue = this.value;\r\n\t\t\t\t\tif (opacityProp.value != null && opacityProp.value != '' && typeof(this.value)=='string') { // can only add opacity to colors, not patterns\r\n\t\t\t\t\t\tvar color = new RGBColor(this.value);\r\n\t\t\t\t\t\tif (color.ok) {\r\n\t\t\t\t\t\t\tnewValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new svg.Property(this.name, newValue);\r\n\t\t\t\t}\r\n\r\n\t\t\t// definition extensions\r\n\t\t\t\t// get the definition from the definitions table\r\n\t\t\t\tsvg.Property.prototype.getDefinition = function() {\r\n\t\t\t\t\tvar name = this.value.match(/#([^\\)'\"]+)/);\r\n\t\t\t\t\tif (name) { name = name[1]; }\r\n\t\t\t\t\tif (!name) { name = this.value; }\r\n\t\t\t\t\treturn svg.Definitions[name];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.isUrlDefinition = function() {\r\n\t\t\t\t\treturn this.value.indexOf('url(') == 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {\r\n\t\t\t\t\tvar def = this.getDefinition();\r\n\r\n\t\t\t\t\t// gradient\r\n\t\t\t\t\tif (def != null && def.createGradient) {\r\n\t\t\t\t\t\treturn def.createGradient(svg.ctx, e, opacityProp);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// pattern\r\n\t\t\t\t\tif (def != null && def.createPattern) {\r\n\t\t\t\t\t\tif (def.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\t\t\tvar pt = def.attribute('patternTransform');\r\n\t\t\t\t\t\t\tdef = def.getHrefAttribute().getDefinition();\r\n\t\t\t\t\t\t\tif (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn def.createPattern(svg.ctx, e);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t// length extensions\r\n\t\t\t\tsvg.Property.prototype.getDPI = function(viewPort) {\r\n\t\t\t\t\treturn 96.0; // TODO: compute?\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getEM = function(viewPort) {\r\n\t\t\t\t\tvar em = 12;\r\n\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tif (fontSize.hasValue()) em = fontSize.toPixels(viewPort);\r\n\r\n\t\t\t\t\treturn em;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getUnits = function() {\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\treturn s.replace(/[0-9\\.\\-]/g,'');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get the length as pixels\r\n\t\t\t\tsvg.Property.prototype.toPixels = function(viewPort, processPercent) {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);\r\n\t\t\t\t\tif (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0;\r\n\t\t\t\t\tif (s.match(/px$/)) return this.numValue();\r\n\t\t\t\t\tif (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);\r\n\t\t\t\t\tif (s.match(/pc$/)) return this.numValue() * 15;\r\n\t\t\t\t\tif (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;\r\n\t\t\t\t\tif (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;\r\n\t\t\t\t\tif (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);\r\n\t\t\t\t\tif (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\tvar n = this.numValue();\r\n\t\t\t\t\tif (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\treturn n;\r\n\t\t\t\t}\r\n\r\n\t\t\t// time extensions\r\n\t\t\t\t// get the time as milliseconds\r\n\t\t\t\tsvg.Property.prototype.toMilliseconds = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/s$/)) return this.numValue() * 1000;\r\n\t\t\t\t\tif (s.match(/ms$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue();\r\n\t\t\t\t}\r\n\r\n\t\t\t// angle extensions\r\n\t\t\t\t// get the angle as radians\r\n\t\t\t\tsvg.Property.prototype.toRadians = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t\tif (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0);\r\n\t\t\t\t\tif (s.match(/rad$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t}\r\n\r\n\t\t\t// text extensions\r\n\t\t\t\t// get the text baseline\r\n\t\t\t\tvar textBaselineMapping = {\r\n\t\t\t\t\t'baseline': 'alphabetic',\r\n\t\t\t\t\t'before-edge': 'top',\r\n\t\t\t\t\t'text-before-edge': 'top',\r\n\t\t\t\t\t'middle': 'middle',\r\n\t\t\t\t\t'central': 'middle',\r\n\t\t\t\t\t'after-edge': 'bottom',\r\n\t\t\t\t\t'text-after-edge': 'bottom',\r\n\t\t\t\t\t'ideographic': 'ideographic',\r\n\t\t\t\t\t'alphabetic': 'alphabetic',\r\n\t\t\t\t\t'hanging': 'hanging',\r\n\t\t\t\t\t'mathematical': 'alphabetic'\r\n\t\t\t\t};\r\n\t\t\t\tsvg.Property.prototype.toTextBaseline = function () {\r\n\t\t\t\t\tif (!this.hasValue()) return null;\r\n\t\t\t\t\treturn textBaselineMapping[this.value];\r\n\t\t\t\t}\r\n\r\n\t\t// fonts\r\n\t\tsvg.Font = new (function() {\r\n\t\t\tthis.Styles = 'normal|italic|oblique|inherit';\r\n\t\t\tthis.Variants = 'normal|small-caps|inherit';\r\n\t\t\tthis.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\r\n\r\n\t\t\tthis.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\r\n\t\t\t\tvar f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tfontFamily: fontFamily || f.fontFamily,\r\n\t\t\t\t\tfontSize: fontSize || f.fontSize,\r\n\t\t\t\t\tfontStyle: fontStyle || f.fontStyle,\r\n\t\t\t\t\tfontWeight: fontWeight || f.fontWeight,\r\n\t\t\t\t\tfontVariant: fontVariant || f.fontVariant,\r\n\t\t\t\t\ttoString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Parse = function(s) {\r\n\t\t\t\tvar f = {};\r\n\t\t\t\tvar d = svg.trim(svg.compressSpaces(s || '')).split(' ');\r\n\t\t\t\tvar set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }\r\n\t\t\t\tvar ff = '';\r\n\t\t\t\tfor (var i=0; i<d.length; i++) {\r\n\t\t\t\t\tif (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }\r\n\t\t\t\t\telse if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;\t}\r\n\t\t\t\t\telse if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {\tif (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }\r\n\t\t\t\t\telse if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }\r\n\t\t\t\t\telse { if (d[i] != 'inherit') ff += d[i]; }\r\n\t\t\t\t} if (ff != '') f.fontFamily = ff;\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// points and paths\r\n\t\tsvg.ToNumberArray = function(s) {\r\n\t\t\tvar a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\r\n\t\t\tfor (var i=0; i<a.length; i++) {\r\n\t\t\t\ta[i] = parseFloat(a[i]);\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\t\tsvg.Point = function(x, y) {\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t}\r\n\t\t\tsvg.Point.prototype.angleTo = function(p) {\r\n\t\t\t\treturn Math.atan2(p.y - this.y, p.x - this.x);\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Point.prototype.applyTransform = function(v) {\r\n\t\t\t\tvar xp = this.x * v[0] + this.y * v[2] + v[4];\r\n\t\t\t\tvar yp = this.x * v[1] + this.y * v[3] + v[5];\r\n\t\t\t\tthis.x = xp;\r\n\t\t\t\tthis.y = yp;\r\n\t\t\t}\r\n\r\n\t\tsvg.CreatePoint = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\treturn new svg.Point(a[0], a[1]);\r\n\t\t}\r\n\t\tsvg.CreatePath = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\tvar path = [];\r\n\t\t\tfor (var i=0; i<a.length; i+=2) {\r\n\t\t\t\tpath.push(new svg.Point(a[i], a[i+1]));\r\n\t\t\t}\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t// bounding box\r\n\t\tsvg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want\r\n\t\t\tthis.x1 = Number.NaN;\r\n\t\t\tthis.y1 = Number.NaN;\r\n\t\t\tthis.x2 = Number.NaN;\r\n\t\t\tthis.y2 = Number.NaN;\r\n\r\n\t\t\tthis.x = function() { return this.x1; }\r\n\t\t\tthis.y = function() { return this.y1; }\r\n\t\t\tthis.width = function() { return this.x2 - this.x1; }\r\n\t\t\tthis.height = function() { return this.y2 - this.y1; }\r\n\r\n\t\t\tthis.addPoint = function(x, y) {\r\n\t\t\t\tif (x != null) {\r\n\t\t\t\t\tif (isNaN(this.x1) || isNaN(this.x2)) {\r\n\t\t\t\t\t\tthis.x1 = x;\r\n\t\t\t\t\t\tthis.x2 = x;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x < this.x1) this.x1 = x;\r\n\t\t\t\t\tif (x > this.x2) this.x2 = x;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (y != null) {\r\n\t\t\t\t\tif (isNaN(this.y1) || isNaN(this.y2)) {\r\n\t\t\t\t\t\tthis.y1 = y;\r\n\t\t\t\t\t\tthis.y2 = y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y < this.y1) this.y1 = y;\r\n\t\t\t\t\tif (y > this.y2) this.y2 = y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.addX = function(x) { this.addPoint(x, null); }\r\n\t\t\tthis.addY = function(y) { this.addPoint(null, y); }\r\n\r\n\t\t\tthis.addBoundingBox = function(bb) {\r\n\t\t\t\tthis.addPoint(bb.x1, bb.y1);\r\n\t\t\t\tthis.addPoint(bb.x2, bb.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {\r\n\t\t\t\tvar cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tvar cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tthis.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,\tcp2y, p2x, p2y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\r\n\t\t\t\t// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\r\n\t\t\t\tvar p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\r\n\t\t\t\tthis.addPoint(p0[0], p0[1]);\r\n\t\t\t\tthis.addPoint(p3[0], p3[1]);\r\n\r\n\t\t\t\tfor (i=0; i<=1; i++) {\r\n\t\t\t\t\tvar f = function(t) {\r\n\t\t\t\t\t\treturn Math.pow(1-t, 3) * p0[i]\r\n\t\t\t\t\t\t+ 3 * Math.pow(1-t, 2) * t * p1[i]\r\n\t\t\t\t\t\t+ 3 * (1-t) * Math.pow(t, 2) * p2[i]\r\n\t\t\t\t\t\t+ Math.pow(t, 3) * p3[i];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\r\n\t\t\t\t\tvar a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\r\n\t\t\t\t\tvar c = 3 * p1[i] - 3 * p0[i];\r\n\r\n\t\t\t\t\tif (a == 0) {\r\n\t\t\t\t\t\tif (b == 0) continue;\r\n\t\t\t\t\t\tvar t = -c / b;\r\n\t\t\t\t\t\tif (0 < t && t < 1) {\r\n\t\t\t\t\t\t\tif (i == 0) this.addX(f(t));\r\n\t\t\t\t\t\t\tif (i == 1) this.addY(f(t));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b2ac = Math.pow(b, 2) - 4 * c * a;\r\n\t\t\t\t\tif (b2ac < 0) continue;\r\n\t\t\t\t\tvar t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t1 && t1 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t1));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t1));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t2 && t2 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t2));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t2));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.isPointInBox = function(x, y) {\r\n\t\t\t\treturn (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addPoint(x1, y1);\r\n\t\t\tthis.addPoint(x2, y2);\r\n\t\t}\r\n\r\n\t\t// transforms\r\n\t\tsvg.Transform = function(v) {\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Type = {}\r\n\r\n\t\t\t// translate\r\n\t\t\tthis.Type.translate = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.p.x || 0.0, this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// rotate\r\n\t\t\tthis.Type.rotate = function(s) {\r\n\t\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', a[0]);\r\n\t\t\t\tthis.cx = a[1] || 0;\r\n\t\t\t\tthis.cy = a[2] || 0;\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(-1.0 * this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tvar a = this.angle.toRadians();\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t\tp.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.scale = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.matrix = function(s) {\r\n\t\t\t\tthis.m = svg.ToNumberArray(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tvar a = this.m[0];\r\n\t\t\t\t\tvar b = this.m[2];\r\n\t\t\t\t\tvar c = this.m[4];\r\n\t\t\t\t\tvar d = this.m[1];\r\n\t\t\t\t\tvar e = this.m[3];\r\n\t\t\t\t\tvar f = this.m[5];\r\n\t\t\t\t\tvar g = 0.0;\r\n\t\t\t\t\tvar h = 0.0;\r\n\t\t\t\t\tvar i = 1.0;\r\n\t\t\t\t\tvar det = 1 / (a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g));\r\n\t\t\t\t\tctx.transform(\r\n\t\t\t\t\t\tdet*(e*i-f*h),\r\n\t\t\t\t\t\tdet*(f*g-d*i),\r\n\t\t\t\t\t\tdet*(c*h-b*i),\r\n\t\t\t\t\t\tdet*(a*i-c*g),\r\n\t\t\t\t\t\tdet*(b*f-c*e),\r\n\t\t\t\t\t\tdet*(c*d-a*f)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform(this.m);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.SkewBase = function(s) {\r\n\t\t\t\tthis.base = that.Type.matrix;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', s);\r\n\t\t\t}\r\n\t\t\tthis.Type.SkewBase.prototype = new this.Type.matrix;\r\n\r\n\t\t\tthis.Type.skewX = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewX.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.Type.skewY = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewY.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.transforms = [];\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].apply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\tfor (var i=this.transforms.length-1; i>=0; i--) {\r\n\t\t\t\t\tthis.transforms[i].unapply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].applyToPoint(p);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar data = svg.trim(svg.compressSpaces(v)).replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g,') ').split(/\\s(?=[a-z])/);\r\n\t\t\tfor (var i=0; i<data.length; i++) {\r\n\t\t\t\tvar type = svg.trim(data[i].split('(')[0]);\r\n\t\t\t\tvar s = data[i].split('(')[1].replace(')','');\r\n\t\t\t\tvar transform = new this.Type[type](s);\r\n\t\t\t\ttransform.type = type;\r\n\t\t\t\tthis.transforms.push(transform);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// aspect ratio\r\n\t\tsvg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\r\n\t\t\t// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\r\n\t\t\taspectRatio = svg.compressSpaces(aspectRatio);\r\n\t\t\taspectRatio = aspectRatio.replace(/^defer\\s/,''); // ignore defer\r\n\t\t\tvar align = aspectRatio.split(' ')[0] || 'xMidYMid';\r\n\t\t\tvar meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\r\n\r\n\t\t\t// calculate scale\r\n\t\t\tvar scaleX = width / desiredWidth;\r\n\t\t\tvar scaleY = height / desiredHeight;\r\n\t\t\tvar scaleMin = Math.min(scaleX, scaleY);\r\n\t\t\tvar scaleMax = Math.max(scaleX, scaleY);\r\n\t\t\tif (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\r\n\t\t\tif (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\r\n\r\n\t\t\trefX = new svg.Property('refX', refX);\r\n\t\t\trefY = new svg.Property('refY', refY);\r\n\t\t\tif (refX.hasValue() && refY.hasValue()) {\r\n\t\t\t\tctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// align\r\n\t\t\t\tif (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0);\r\n\t\t\t\tif (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0);\r\n\t\t\t\tif (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0);\r\n\t\t\t\tif (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight);\r\n\t\t\t}\r\n\r\n\t\t\t// scale\r\n\t\t\tif (align == 'none') ctx.scale(scaleX, scaleY);\r\n\t\t\telse if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin);\r\n\t\t\telse if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax);\r\n\r\n\t\t\t// translate\r\n\t\t\tctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);\r\n\t\t}\r\n\r\n\t\t// elements\r\n\t\tsvg.Element = {}\r\n\r\n\t\tsvg.EmptyProperty = new svg.Property('EMPTY', '');\r\n\r\n\t\tsvg.Element.ElementBase = function(node) {\r\n\t\t\tthis.attributes = {};\r\n\t\t\tthis.styles = {};\r\n\t\t\tthis.stylesSpecificity = {};\r\n\t\t\tthis.children = [];\r\n\r\n\t\t\t// get or create attribute\r\n\t\t\tthis.attribute = function(name, createIfNotExists) {\r\n\t\t\t\tvar a = this.attributes[name];\r\n\t\t\t\tif (a != null) return a;\r\n\r\n\t\t\t\tif (createIfNotExists == true) { a = new svg.Property(name, ''); this.attributes[name] = a; }\r\n\t\t\t\treturn a || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getHrefAttribute = function() {\r\n\t\t\t\tfor (var a in this.attributes) {\r\n\t\t\t\t\tif (a == 'href' || a.match(/:href$/)) {\r\n\t\t\t\t\t\treturn this.attributes[a];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// get or create style, crawls up node tree\r\n\t\t\tthis.style = function(name, createIfNotExists, skipAncestors) {\r\n\t\t\t\tvar s = this.styles[name];\r\n\t\t\t\tif (s != null) return s;\r\n\r\n\t\t\t\tvar a = this.attribute(name);\r\n\t\t\t\tif (a != null && a.hasValue()) {\r\n\t\t\t\t\tthis.styles[name] = a; // move up to me to cache\r\n\t\t\t\t\treturn a;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (skipAncestors != true) {\r\n\t\t\t\t\tvar p = this.parent;\r\n\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\tvar ps = p.style(name);\r\n\t\t\t\t\t\tif (ps != null && ps.hasValue()) {\r\n\t\t\t\t\t\t\treturn ps;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (createIfNotExists == true) { s = new svg.Property(name, ''); this.styles[name] = s; }\r\n\t\t\t\treturn s || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// base render\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// don't render display=none\r\n\t\t\t\tif (this.style('display').value == 'none') return;\r\n\r\n\t\t\t\t// don't render visibility=hidden\r\n\t\t\t\tif (this.style('visibility').value == 'hidden') return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (this.style('mask').hasValue()) { // mask\r\n\t\t\t\t\tvar mask = this.style('mask').getDefinition();\r\n\t\t\t\t\tif (mask != null) mask.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('filter').hasValue()) { // filter\r\n\t\t\t\t\tvar filter = this.style('filter').getDefinition();\r\n\t\t\t\t\tif (filter != null) filter.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\t\tthis.renderChildren(ctx);\r\n\t\t\t\t\tthis.clearContext(ctx);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\t// base set context\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base clear context\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base render children\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.children[i].render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addChild = function(childNode, create) {\r\n\t\t\t\tvar child = childNode;\r\n\t\t\t\tif (create) child = svg.CreateElement(childNode);\r\n\t\t\t\tchild.parent = this;\r\n\t\t\t\tif (child.type != 'title') { this.children.push(child);\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.addStylesFromStyleDefinition = function () {\r\n\t\t\t\t// add styles\r\n\t\t\t\tfor (var selector in svg.Styles) {\r\n\t\t\t\t\tif (selector[0] != '@' && matchesSelector(node, selector)) {\r\n\t\t\t\t\t\tvar styles = svg.Styles[selector];\r\n\t\t\t\t\t\tvar specificity = svg.StylesSpecificity[selector];\r\n\t\t\t\t\t\tif (styles != null) {\r\n\t\t\t\t\t\t\tfor (var name in styles) {\r\n\t\t\t\t\t\t\t\tvar existingSpecificity = this.stylesSpecificity[name];\r\n\t\t\t\t\t\t\t\tif (typeof(existingSpecificity) == 'undefined') {\r\n\t\t\t\t\t\t\t\t\texistingSpecificity = '000';\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (specificity > existingSpecificity) {\r\n\t\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\r\n\t\t\t\t\t\t\t\t\tthis.stylesSpecificity[name] = specificity;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tif (node != null && node.nodeType == 1) { //ELEMENT_NODE\r\n\t\t\t\t// add attributes\r\n\t\t\t\tfor (var i=0; i<node.attributes.length; i++) {\r\n\t\t\t\t\tvar attribute = node.attributes[i];\r\n\t\t\t\t\tthis.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.value);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tthis.addStylesFromStyleDefinition();\r\n\r\n\t\t\t\t// add inline styles\r\n\t\t\t\tif (this.attribute('style').hasValue()) {\r\n\t\t\t\t\tvar styles = this.attribute('style').value.split(';');\r\n\t\t\t\t\tfor (var i=0; i<styles.length; i++) {\r\n\t\t\t\t\t\tif (svg.trim(styles[i]) != '') {\r\n\t\t\t\t\t\t\tvar style = styles[i].split(':');\r\n\t\t\t\t\t\t\tvar name = svg.trim(style[0]);\r\n\t\t\t\t\t\t\tvar value = svg.trim(style[1]);\r\n\t\t\t\t\t\t\tthis.styles[name] = new svg.Property(name, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add id\r\n\t\t\t\tif (this.attribute('id').hasValue()) {\r\n\t\t\t\t\tif (svg.Definitions[this.attribute('id').value] == null) {\r\n\t\t\t\t\t\tsvg.Definitions[this.attribute('id').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add children\r\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\t\tvar childNode = node.childNodes[i];\r\n\t\t\t\t\tif (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE\r\n\t\t\t\t\tif (this.captureTextNodes && (childNode.nodeType == 3 || childNode.nodeType == 4)) {\r\n\t\t\t\t\t\tvar text = childNode.value || childNode.text || childNode.textContent || '';\r\n\t\t\t\t\t\tif (svg.compressSpaces(text) != '') {\r\n\t\t\t\t\t\t\tthis.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Element.RenderedElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// fill\r\n\t\t\t\tif (this.style('fill').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.fillStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('fill').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = this.style('fill');\r\n\t\t\t\t\tif (fillStyle.value == 'currentColor') fillStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (fillStyle.value != 'inherit') ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('fill-opacity').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = new svg.Property('fill', ctx.fillStyle);\r\n\t\t\t\t\tfillStyle = fillStyle.addOpacity(this.style('fill-opacity'));\r\n\t\t\t\t\tctx.fillStyle = fillStyle.value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// stroke\r\n\t\t\t\tif (this.style('stroke').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.strokeStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('stroke').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = this.style('stroke');\r\n\t\t\t\t\tif (strokeStyle.value == 'currentColor') strokeStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (strokeStyle.value != 'inherit') ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-opacity').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = new svg.Property('stroke', ctx.strokeStyle);\r\n\t\t\t\t\tstrokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));\r\n\t\t\t\t\tctx.strokeStyle = strokeStyle.value;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-width').hasValue()) {\r\n\t\t\t\t\tvar newLineWidth = this.style('stroke-width').toPixels();\r\n\t\t\t\t\tctx.lineWidth = newLineWidth == 0 ? 0.001 : newLineWidth; // browsers don't respect 0\r\n\t\t\t    }\r\n\t\t\t\tif (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\r\n\t\t\t\tif (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\r\n\t\t\t\tif (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\r\n\t\t\t\tif (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value != 'none') {\r\n\t\t\t\t\tvar gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);\r\n\t\t\t\t\tif (typeof(ctx.setLineDash) != 'undefined') { ctx.setLineDash(gaps); }\r\n\t\t\t\t\telse if (typeof(ctx.webkitLineDash) != 'undefined') { ctx.webkitLineDash = gaps; }\r\n\t\t\t\t\telse if (typeof(ctx.mozDash) != 'undefined' && !(gaps.length==1 && gaps[0]==0)) { ctx.mozDash = gaps; }\r\n\r\n\t\t\t\t\tvar offset = this.style('stroke-dashoffset').numValueOrDefault(1);\r\n\t\t\t\t\tif (typeof(ctx.lineDashOffset) != 'undefined') { ctx.lineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof(ctx.webkitLineDashOffset) != 'undefined') { ctx.webkitLineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof(ctx.mozDashOffset) != 'undefined') { ctx.mozDashOffset = offset; }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// font\r\n\t\t\t\tif (typeof(ctx.font) != 'undefined') {\r\n\t\t\t\t\tctx.font = svg.Font.CreateFont(\r\n\t\t\t\t\t\tthis.style('font-style').value,\r\n\t\t\t\t\t\tthis.style('font-variant').value,\r\n\t\t\t\t\t\tthis.style('font-weight').value,\r\n\t\t\t\t\t\tthis.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '',\r\n\t\t\t\t\t\tthis.style('font-family').value).toString();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// transform\r\n\t\t\t\tif (this.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\tvar transform = new svg.Transform(this.style('transform', false, true).value);\r\n\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clip\r\n\t\t\t\tif (this.style('clip-path', false, true).hasValue()) {\r\n\t\t\t\t\tvar clip = this.style('clip-path', false, true).getDefinition();\r\n\t\t\t\t\tif (clip != null) clip.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// opacity\r\n\t\t\t\tif (this.style('opacity').hasValue()) {\r\n\t\t\t\t\tctx.globalAlpha = this.style('opacity').numValue();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.PathElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\treturn new svg.BoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.path(ctx);\r\n\t\t\t\tsvg.Mouse.checkPath(this, ctx);\r\n\t\t\t\tif (ctx.fillStyle != '') {\r\n\t\t\t\t\tif (this.style('fill-rule').valueOrDefault('inherit') != 'inherit') { ctx.fill(this.style('fill-rule').value); }\r\n\t\t\t\t\telse { ctx.fill(); }\r\n\t\t\t\t}\r\n\t\t\t\tif (ctx.strokeStyle != '') ctx.stroke();\r\n\r\n\t\t\t\tvar markers = this.getMarkers();\r\n\t\t\t\tif (markers != null) {\r\n\t\t\t\t\tif (this.style('marker-start').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-start').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[0][0], markers[0][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-mid').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-mid').getDefinition();\r\n\t\t\t\t\t\tfor (var i=1;i<markers.length-1;i++) {\r\n\t\t\t\t\t\t\tmarker.render(ctx, markers[i][0], markers[i][1]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-end').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-end').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\treturn this.path();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// svg element\r\n\t\tsvg.Element.svg = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseClearContext = this.clearContext;\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\tthis.baseClearContext(ctx);\r\n\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// initial values and defaults\r\n\t\t\t\tctx.strokeStyle = 'rgba(0,0,0,0)';\r\n\t\t\t\tctx.lineCap = 'butt';\r\n\t\t\t\tctx.lineJoin = 'miter';\r\n\t\t\t\tctx.miterLimit = 4;\r\n\t\t\t\tif (typeof(ctx.font) != 'undefined' && typeof(window.getComputedStyle) != 'undefined') {\r\n\t\t\t\t\tctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\t// create new view port\r\n\t\t\t\tif (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;\r\n\t\t\t\tif (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;\r\n\t\t\t\tctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));\r\n\r\n\t\t\t\tvar width = svg.ViewPort.width();\r\n\t\t\t\tvar height = svg.ViewPort.height();\r\n\r\n\t\t\t\tif (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';\r\n\t\t\t\tif (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';\r\n\t\t\t\tif (typeof(this.root) == 'undefined') {\r\n\t\t\t\t\twidth = this.attribute('width').toPixels('x');\r\n\t\t\t\t\theight = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\t\tvar x = 0;\r\n\t\t\t\t\tvar y = 0;\r\n\t\t\t\t\tif (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\r\n\t\t\t\t\t\tx = -this.attribute('refX').toPixels('x');\r\n\t\t\t\t\t\ty = -this.attribute('refY').toPixels('y');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.attribute('overflow').valueOrDefault('hidden') != 'visible') {\r\n\t\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\t\tctx.moveTo(x, y);\r\n\t\t\t\t\t\tctx.lineTo(width, y);\r\n\t\t\t\t\t\tctx.lineTo(width, height);\r\n\t\t\t\t\t\tctx.lineTo(x, height);\r\n\t\t\t\t\t\tctx.closePath();\r\n\t\t\t\t\t\tctx.clip();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(width, height);\r\n\r\n\t\t\t\t// viewbox\r\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\r\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\r\n\t\t\t\t\tvar minX = viewBox[0];\r\n\t\t\t\t\tvar minY = viewBox[1];\r\n\t\t\t\t\twidth = viewBox[2];\r\n\t\t\t\t\theight = viewBox[3];\r\n\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.width(),\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.height(),\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tminX,\r\n\t\t\t\t\t\t\t\t\tminY,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refX').value,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refY').value);\r\n\r\n\t\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.svg.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// rect element\r\n\t\tsvg.Element.rect = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tif (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\r\n\t\t\t\tif (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\r\n\t\t\t\trx = Math.min(rx, width / 2.0);\r\n\t\t\t\try = Math.min(ry, height / 2.0);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(x + rx, y);\r\n\t\t\t\t\tctx.lineTo(x + width - rx, y);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\r\n\t\t\t\t\tctx.lineTo(x + width, y + height - ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\r\n\t\t\t\t\tctx.lineTo(x + rx, y + height);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\r\n\t\t\t\t\tctx.lineTo(x, y + ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + rx, y)\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.rect.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// circle element\r\n\t\tsvg.Element.circle = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\t\t\t\tvar r = this.attribute('r').toPixels();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.arc(cx, cy, r, 0, Math.PI * 2, true);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.circle.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// ellipse element\r\n\t\tsvg.Element.ellipse = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(cx, cy - ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.ellipse.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// line element\r\n\t\tsvg.Element.line = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getPoints = function() {\r\n\t\t\t\treturn [\r\n\t\t\t\t\tnew svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),\r\n\t\t\t\t\tnew svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))];\r\n\t\t\t}\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar points = this.getPoints();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\r\n\t\t\t\t\tctx.lineTo(points[1].x, points[1].y);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.getPoints();\r\n\t\t\t\tvar a = points[0].angleTo(points[1]);\r\n\t\t\t\treturn [[points[0], a], [points[1], a]];\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.line.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polyline element\r\n\t\tsvg.Element.polyline = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.points = svg.CreatePath(this.attribute('points').value);\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i=1; i<this.points.length; i++) {\r\n\t\t\t\t\tbb.addPoint(this.points[i].x, this.points[i].y);\r\n\t\t\t\t\tif (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<this.points.length - 1; i++) {\r\n\t\t\t\t\tmarkers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);\r\n\t\t\t\t}\r\n\t\t\t\tmarkers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polyline.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polygon element\r\n\t\tsvg.Element.polygon = function(node) {\r\n\t\t\tthis.base = svg.Element.polyline;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.basePath = this.path;\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = this.basePath(ctx);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.lineTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polygon.prototype = new svg.Element.polyline;\r\n\r\n\t\t// path element\r\n\t\tsvg.Element.path = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar d = this.attribute('d').value;\r\n\t\t\t// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF\r\n\t\t\td = d.replace(/,/gm,' '); // get rid of all commas\r\n\t\t\t// As the end of a match can also be the start of the next match, we need to run this replace twice.\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,'$1 $2'); // suffix commands with spaces\r\n\t\t\td = d.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // prefix commands with spaces\r\n\t\t\td = d.replace(/([0-9])([+\\-])/gm,'$1 $2'); // separate digits on +- signs\r\n\t\t\t// Again, we need to run this twice to find all occurances\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/(\\.[0-9]*)(\\.)/gm,'$1 $2'); // separate digits when they start with a comma\r\n\t\t\td = d.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax\r\n\t\t\td = svg.compressSpaces(d); // compress multiple spaces\r\n\t\t\td = svg.trim(d);\r\n\t\t\tthis.PathParser = new (function(d) {\r\n\t\t\t\tthis.tokens = d.split(' ');\r\n\r\n\t\t\t\tthis.reset = function() {\r\n\t\t\t\t\tthis.i = -1;\r\n\t\t\t\t\tthis.command = '';\r\n\t\t\t\t\tthis.previousCommand = '';\r\n\t\t\t\t\tthis.start = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.control = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.current = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.points = [];\r\n\t\t\t\t\tthis.angles = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isEnd = function() {\r\n\t\t\t\t\treturn this.i >= this.tokens.length - 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isCommandOrEnd = function() {\r\n\t\t\t\t\tif (this.isEnd()) return true;\r\n\t\t\t\t\treturn this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isRelativeCommand = function() {\r\n\t\t\t\t\tswitch(this.command)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getToken = function() {\r\n\t\t\t\t\tthis.i++;\r\n\t\t\t\t\treturn this.tokens[this.i];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getScalar = function() {\r\n\t\t\t\t\treturn parseFloat(this.getToken());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.nextCommand = function() {\r\n\t\t\t\t\tthis.previousCommand = this.command;\r\n\t\t\t\t\tthis.command = this.getToken();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getPoint = function() {\r\n\t\t\t\t\tvar p = new svg.Point(this.getScalar(), this.getScalar());\r\n\t\t\t\t\treturn this.makeAbsolute(p);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsControlPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.control = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsCurrentPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.current = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getReflectedControlPoint = function() {\r\n\t\t\t\t\tif (this.previousCommand.toLowerCase() != 'c' &&\r\n\t\t\t\t\t    this.previousCommand.toLowerCase() != 's' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 'q' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 't' ){\r\n\t\t\t\t\t\treturn this.current;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// reflect point\r\n\t\t\t\t\tvar p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.makeAbsolute = function(p) {\r\n\t\t\t\t\tif (this.isRelativeCommand()) {\r\n\t\t\t\t\t\tp.x += this.current.x;\r\n\t\t\t\t\t\tp.y += this.current.y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarker = function(p, from, priorTo) {\r\n\t\t\t\t\t// if the last angle isn't filled in because we didn't have this point yet ...\r\n\t\t\t\t\tif (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {\r\n\t\t\t\t\t\tthis.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.addMarkerAngle(p, from == null ? null : from.angleTo(p));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarkerAngle = function(p, a) {\r\n\t\t\t\t\tthis.points.push(p);\r\n\t\t\t\t\tthis.angles.push(a);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getMarkerPoints = function() { return this.points; }\r\n\t\t\t\tthis.getMarkerAngles = function() {\r\n\t\t\t\t\tfor (var i=0; i<this.angles.length; i++) {\r\n\t\t\t\t\t\tif (this.angles[i] == null) {\r\n\t\t\t\t\t\t\tfor (var j=i+1; j<this.angles.length; j++) {\r\n\t\t\t\t\t\t\t\tif (this.angles[j] != null) {\r\n\t\t\t\t\t\t\t\t\tthis.angles[i] = this.angles[j];\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.angles;\r\n\t\t\t\t}\r\n\t\t\t})(d);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar pp = this.PathParser;\r\n\t\t\t\tpp.reset();\r\n\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\twhile (!pp.isEnd()) {\r\n\t\t\t\t\tpp.nextCommand();\r\n\t\t\t\t\tswitch (pp.command) {\r\n\t\t\t\t\tcase 'M':\r\n\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\tpp.addMarker(p);\r\n\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\tif (ctx != null) ctx.moveTo(p.x, p.y);\r\n\t\t\t\t\t\tpp.start = pp.current;\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, pp.start);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'L':\r\n\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar c = pp.current;\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, c);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'H':\r\n\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'V':\r\n\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'C':\r\n\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'S':\r\n\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Q':\r\n\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'T':\r\n\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tpp.control = cntrl;\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'A':\r\n\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t    var curr = pp.current;\r\n\t\t\t\t\t\t\tvar rx = pp.getScalar();\r\n\t\t\t\t\t\t\tvar ry = pp.getScalar();\r\n\t\t\t\t\t\t\tvar xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\r\n\t\t\t\t\t\t\tvar largeArcFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar sweepFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\r\n\t\t\t\t\t\t\t// Conversion from endpoint to center parameterization\r\n\t\t\t\t\t\t\t// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\r\n\t\t\t\t\t\t\t// x1', y1'\r\n\t\t\t\t\t\t\tvar currp = new svg.Point(\r\n\t\t\t\t\t\t\t\tMath.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\r\n\t\t\t\t\t\t\t\t-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// adjust radii\r\n\t\t\t\t\t\t\tvar l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);\r\n\t\t\t\t\t\t\tif (l > 1) {\r\n\t\t\t\t\t\t\t\trx *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t\try *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// cx', cy'\r\n\t\t\t\t\t\t\tvar s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(\r\n\t\t\t\t\t\t\t\t((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /\r\n\t\t\t\t\t\t\t\t(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tif (isNaN(s)) s = 0;\r\n\t\t\t\t\t\t\tvar cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\r\n\t\t\t\t\t\t\t// cx, cy\r\n\t\t\t\t\t\t\tvar centp = new svg.Point(\r\n\t\t\t\t\t\t\t\t(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\r\n\t\t\t\t\t\t\t\t(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// vector magnitude\r\n\t\t\t\t\t\t\tvar m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }\r\n\t\t\t\t\t\t\t// ratio between two vectors\r\n\t\t\t\t\t\t\tvar r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }\r\n\t\t\t\t\t\t\t// angle between two vectors\r\n\t\t\t\t\t\t\tvar a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }\r\n\t\t\t\t\t\t\t// initial angle\r\n\t\t\t\t\t\t\tvar a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);\r\n\t\t\t\t\t\t\t// angle delta\r\n\t\t\t\t\t\t\tvar u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar ad = a(u, v);\r\n\t\t\t\t\t\t\tif (r(u,v) <= -1) ad = Math.PI;\r\n\t\t\t\t\t\t\tif (r(u,v) >= 1) ad = 0;\r\n\r\n\t\t\t\t\t\t\t// for markers\r\n\t\t\t\t\t\t\tvar dir = 1 - sweepFlag ? 1.0 : -1.0;\r\n\t\t\t\t\t\t\tvar ah = a1 + dir * (ad / 2.0);\r\n\t\t\t\t\t\t\tvar halfWay = new svg.Point(\r\n\t\t\t\t\t\t\t\tcentp.x + rx * Math.cos(ah),\r\n\t\t\t\t\t\t\t\tcentp.y + ry * Math.sin(ah)\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(cp, ah - dir * Math.PI);\r\n\r\n\t\t\t\t\t\t\tbb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\r\n\t\t\t\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\t\t\t\tvar r = rx > ry ? rx : ry;\r\n\t\t\t\t\t\t\t\tvar sx = rx > ry ? 1 : rx / ry;\r\n\t\t\t\t\t\t\t\tvar sy = rx > ry ? ry / rx : 1;\r\n\r\n\t\t\t\t\t\t\t\tctx.translate(centp.x, centp.y);\r\n\t\t\t\t\t\t\t\tctx.rotate(xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.scale(sx, sy);\r\n\t\t\t\t\t\t\t\tctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);\r\n\t\t\t\t\t\t\t\tctx.scale(1/sx, 1/sy);\r\n\t\t\t\t\t\t\t\tctx.rotate(-xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.translate(-centp.x, -centp.y);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Z':\r\n\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\tif (ctx != null) ctx.closePath();\r\n\t\t\t\t\t\tpp.current = pp.start;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.PathParser.getMarkerPoints();\r\n\t\t\t\tvar angles = this.PathParser.getMarkerAngles();\r\n\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<points.length; i++) {\r\n\t\t\t\t\tmarkers.push([points[i], angles[i]]);\r\n\t\t\t\t}\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.path.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// pattern element\r\n\t\tsvg.Element.pattern = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.createPattern = function(ctx, element) {\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x', true);\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y', true);\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', width + 'px');\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', height + 'px');\r\n\t\t\t\ttempSvg.attributes['transform'] = new svg.Property('transform', this.attribute('patternTransform').value);\r\n\t\t\t\ttempSvg.children = this.children;\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width;\r\n\t\t\t\tc.height = height;\r\n\t\t\t\tvar cctx = c.getContext('2d');\r\n\t\t\t\tif (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\r\n\t\t\t\t\tcctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));\r\n\t\t\t\t}\r\n\t\t\t\t// render 3x3 grid so when we transform there's no white space on edges\r\n\t\t\t\tfor (var x=-1; x<=1; x++) {\r\n\t\t\t\t\tfor (var y=-1; y<=1; y++) {\r\n\t\t\t\t\t\tcctx.save();\r\n\t\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', x * c.width);\r\n\t\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', y * c.height);\r\n\t\t\t\t\t\ttempSvg.render(cctx);\r\n\t\t\t\t\t\tcctx.restore();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar pattern = ctx.createPattern(c, 'repeat');\r\n\t\t\t\treturn pattern;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.pattern.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// marker element\r\n\t\tsvg.Element.marker = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseRender = this.render;\r\n\t\t\tthis.render = function(ctx, point, angle) {\r\n\t\t\t\tctx.translate(point.x, point.y);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\r\n\t\t\t\tctx.save();\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);\r\n\t\t\t\ttempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);\r\n\t\t\t\ttempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));\r\n\t\t\t\ttempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));\r\n\t\t\t\ttempSvg.children = this.children;\r\n\t\t\t\ttempSvg.render(ctx);\r\n\r\n\t\t\t\tctx.restore();\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);\r\n\t\t\t\tctx.translate(-point.x, -point.y);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.marker.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// definitions element\r\n\t\tsvg.Element.defs = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NOOP\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.defs.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// base for gradients\r\n\t\tsvg.Element.GradientBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.stops = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'stop') this.stops.push(child);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getGradient = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.gradientUnits = function () {\r\n\t\t\t\treturn this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.attributesToInherit = ['gradientUnits'];\r\n\t\t\t\r\n\t\t\tthis.inheritStopContainer = function (stopsContainer) {\r\n\t\t\t\tfor (var i=0; i<this.attributesToInherit.length; i++) {\r\n\t\t\t\t\tvar attributeToInherit = this.attributesToInherit[i];\r\n\t\t\t\t\tif (!this.attribute(attributeToInherit).hasValue() && stopsContainer.attribute(attributeToInherit).hasValue()) {\r\n\t\t\t\t\t\tthis.attribute(attributeToInherit, true).value = stopsContainer.attribute(attributeToInherit).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.createGradient = function(ctx, element, parentOpacityProp) {\r\n\t\t\t\tvar stopsContainer = this;\r\n\t\t\t\tif (this.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\tstopsContainer = this.getHrefAttribute().getDefinition();\r\n\t\t\t\t\tthis.inheritStopContainer(stopsContainer);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar addParentOpacity = function (color) {\r\n\t\t\t\t\tif (parentOpacityProp.hasValue()) {\r\n\t\t\t\t\t\tvar p = new svg.Property('color', color);\r\n\t\t\t\t\t\treturn p.addOpacity(parentOpacityProp).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn color;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar g = this.getGradient(ctx, element);\r\n\t\t\t\tif (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);\r\n\t\t\t\tfor (var i=0; i<stopsContainer.stops.length; i++) {\r\n\t\t\t\t\tg.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.attribute('gradientTransform').hasValue()) {\r\n\t\t\t\t\t// render as transformed pattern on temporary canvas\r\n\t\t\t\t\tvar rootView = svg.ViewPort.viewPorts[0];\r\n\r\n\t\t\t\t\tvar rect = new svg.Element.rect();\r\n\t\t\t\t\trect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\r\n\t\t\t\t\trect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\r\n\r\n\t\t\t\t\tvar group = new svg.Element.g();\r\n\t\t\t\t\tgroup.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);\r\n\t\t\t\t\tgroup.children = [ rect ];\r\n\r\n\t\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', 0);\r\n\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', 0);\r\n\t\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', rootView.width);\r\n\t\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', rootView.height);\r\n\t\t\t\t\ttempSvg.children = [ group ];\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = rootView.width;\r\n\t\t\t\t\tc.height = rootView.height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\ttempCtx.fillStyle = g;\r\n\t\t\t\t\ttempSvg.render(tempCtx);\r\n\t\t\t\t\treturn tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn g;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.GradientBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// linear gradient element\r\n\t\tsvg.Element.linearGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\t\t\t\r\n\t\t\tthis.attributesToInherit.push('x1');\r\n\t\t\tthis.attributesToInherit.push('y1');\r\n\t\t\tthis.attributesToInherit.push('x2');\r\n\t\t\tthis.attributesToInherit.push('y2');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = this.gradientUnits() == 'objectBoundingBox' ? element.getBoundingBox() : null;\r\n\r\n\t\t\t\tif (!this.attribute('x1').hasValue()\r\n\t\t\t\t && !this.attribute('y1').hasValue()\r\n\t\t\t\t && !this.attribute('x2').hasValue()\r\n\t\t\t\t && !this.attribute('y2').hasValue()) {\r\n\t\t\t\t\tthis.attribute('x1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('y1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('x2', true).value = 1;\r\n\t\t\t\t\tthis.attribute('y2', true).value = 0;\r\n\t\t\t\t }\r\n\r\n\t\t\t\tvar x1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x1').numValue()\r\n\t\t\t\t\t: this.attribute('x1').toPixels('x'));\r\n\t\t\t\tvar y1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y1').numValue()\r\n\t\t\t\t\t: this.attribute('y1').toPixels('y'));\r\n\t\t\t\tvar x2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x2').numValue()\r\n\t\t\t\t\t: this.attribute('x2').toPixels('x'));\r\n\t\t\t\tvar y2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y2').numValue()\r\n\t\t\t\t\t: this.attribute('y2').toPixels('y'));\r\n\r\n\t\t\t\tif (x1 == x2 && y1 == y2) return null;\r\n\t\t\t\treturn ctx.createLinearGradient(x1, y1, x2, y2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.linearGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// radial gradient element\r\n\t\tsvg.Element.radialGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\t\t\t\r\n\t\t\tthis.attributesToInherit.push('cx');\r\n\t\t\tthis.attributesToInherit.push('cy');\r\n\t\t\tthis.attributesToInherit.push('r');\r\n\t\t\tthis.attributesToInherit.push('fx');\r\n\t\t\tthis.attributesToInherit.push('fy');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\r\n\t\t\t\tif (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';\r\n\r\n\t\t\t\tvar cx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('cx').numValue()\r\n\t\t\t\t\t: this.attribute('cx').toPixels('x'));\r\n\t\t\t\tvar cy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('cy').numValue()\r\n\t\t\t\t\t: this.attribute('cy').toPixels('y'));\r\n\r\n\t\t\t\tvar fx = cx;\r\n\t\t\t\tvar fy = cy;\r\n\t\t\t\tif (this.attribute('fx').hasValue()) {\r\n\t\t\t\t\tfx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('fx').numValue()\r\n\t\t\t\t\t: this.attribute('fx').toPixels('x'));\r\n\t\t\t\t}\r\n\t\t\t\tif (this.attribute('fy').hasValue()) {\r\n\t\t\t\t\tfy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('fy').numValue()\r\n\t\t\t\t\t: this.attribute('fy').toPixels('y'));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar r = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\r\n\t\t\t\t\t: this.attribute('r').toPixels());\r\n\r\n\t\t\t\treturn ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.radialGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// gradient stop element\r\n\t\tsvg.Element.stop = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.offset = this.attribute('offset').numValue();\r\n\t\t\tif (this.offset < 0) this.offset = 0;\r\n\t\t\tif (this.offset > 1) this.offset = 1;\r\n\r\n\t\t\tvar stopColor = this.style('stop-color', true);\r\n\t\t\tif (stopColor.value === '') stopColor.value = '#000';\r\n\t\t\tif (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity'));\r\n\t\t\tthis.color = stopColor.value;\r\n\t\t}\r\n\t\tsvg.Element.stop.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animation base element\r\n\t\tsvg.Element.AnimateBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tsvg.Animations.push(this);\r\n\r\n\t\t\tthis.duration = 0.0;\r\n\t\t\tthis.begin = this.attribute('begin').toMilliseconds();\r\n\t\t\tthis.maxDuration = this.begin + this.attribute('dur').toMilliseconds();\r\n\r\n\t\t\tthis.getProperty = function() {\r\n\t\t\t\tvar attributeType = this.attribute('attributeType').value;\r\n\t\t\t\tvar attributeName = this.attribute('attributeName').value;\r\n\r\n\t\t\t\tif (attributeType == 'CSS') {\r\n\t\t\t\t\treturn this.parent.style(attributeName, true);\r\n\t\t\t\t}\r\n\t\t\t\treturn this.parent.attribute(attributeName, true);\r\n\t\t\t};\r\n\r\n\t\t\tthis.initialValue = null;\r\n\t\t\tthis.initialUnits = '';\r\n\t\t\tthis.removed = false;\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t\treturn '';\r\n\t\t\t}\r\n\r\n\t\t\tthis.update = function(delta) {\r\n\t\t\t\t// set initial value\r\n\t\t\t\tif (this.initialValue == null) {\r\n\t\t\t\t\tthis.initialValue = this.getProperty().value;\r\n\t\t\t\t\tthis.initialUnits = this.getProperty().getUnits();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if we're past the end time\r\n\t\t\t\tif (this.duration > this.maxDuration) {\r\n\t\t\t\t\t// loop for indefinitely repeating animations\r\n\t\t\t\t\tif (this.attribute('repeatCount').value == 'indefinite'\r\n\t\t\t\t\t || this.attribute('repeatDur').value == 'indefinite') {\r\n\t\t\t\t\t\tthis.duration = 0.0\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) {\r\n\t\t\t\t\t\tthis.frozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozenValue = this.getProperty().value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {\r\n\t\t\t\t\t\tthis.removed = true;\r\n\t\t\t\t\t\tthis.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.duration = this.duration + delta;\r\n\r\n\t\t\t\t// if we're past the begin time\r\n\t\t\t\tvar updated = false;\r\n\t\t\t\tif (this.begin < this.duration) {\r\n\t\t\t\t\tvar newValue = this.calcValue(); // tween\r\n\r\n\t\t\t\t\tif (this.attribute('type').hasValue()) {\r\n\t\t\t\t\t\t// for transform, etc.\r\n\t\t\t\t\t\tvar type = this.attribute('type').value;\r\n\t\t\t\t\t\tnewValue = type + '(' + newValue + ')';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.getProperty().value = newValue;\r\n\t\t\t\t\tupdated = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn updated;\r\n\t\t\t}\r\n\r\n\t\t\tthis.from = this.attribute('from');\r\n\t\t\tthis.to = this.attribute('to');\r\n\t\t\tthis.values = this.attribute('values');\r\n\t\t\tif (this.values.hasValue()) this.values.value = this.values.value.split(';');\r\n\r\n\t\t\t// fraction of duration we've covered\r\n\t\t\tthis.progress = function() {\r\n\t\t\t\tvar ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) };\r\n\t\t\t\tif (this.values.hasValue()) {\r\n\t\t\t\t\tvar p = ret.progress * (this.values.value.length - 1);\r\n\t\t\t\t\tvar lb = Math.floor(p), ub = Math.ceil(p);\r\n\t\t\t\t\tret.from = new svg.Property('from', parseFloat(this.values.value[lb]));\r\n\t\t\t\t\tret.to = new svg.Property('to', parseFloat(this.values.value[ub]));\r\n\t\t\t\t\tret.progress = (p - lb) / (ub - lb);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tret.from = this.from;\r\n\t\t\t\t\tret.to = this.to;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.AnimateBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animate element\r\n\t\tsvg.Element.animate = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;\r\n\t\t\t\treturn newValue + this.initialUnits;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animate.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate color element\r\n\t\tsvg.Element.animateColor = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\t\t\t\tvar from = new RGBColor(p.from.value);\r\n\t\t\t\tvar to = new RGBColor(p.to.value);\r\n\r\n\t\t\t\tif (from.ok && to.ok) {\r\n\t\t\t\t\t// tween color linearly\r\n\t\t\t\t\tvar r = from.r + (to.r - from.r) * p.progress;\r\n\t\t\t\t\tvar g = from.g + (to.g - from.g) * p.progress;\r\n\t\t\t\t\tvar b = from.b + (to.b - from.b) * p.progress;\r\n\t\t\t\t\treturn 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';\r\n\t\t\t\t}\r\n\t\t\t\treturn this.attribute('from').value;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateColor.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate transform element\r\n\t\tsvg.Element.animateTransform = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar from = svg.ToNumberArray(p.from.value);\r\n\t\t\t\tvar to = svg.ToNumberArray(p.to.value);\r\n\t\t\t\tvar newValue = '';\r\n\t\t\t\tfor (var i=0; i<from.length; i++) {\r\n\t\t\t\t\tnewValue += from[i] + (to[i] - from[i]) * p.progress + ' ';\r\n\t\t\t\t}\r\n\t\t\t\treturn newValue;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateTransform.prototype = new svg.Element.animate;\r\n\r\n\t\t// font element\r\n\t\tsvg.Element.font = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\r\n\t\t\tthis.isRTL = false;\r\n\t\t\tthis.isArabic = false;\r\n\t\t\tthis.fontFace = null;\r\n\t\t\tthis.missingGlyph = null;\r\n\t\t\tthis.glyphs = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'font-face') {\r\n\t\t\t\t\tthis.fontFace = child;\r\n\t\t\t\t\tif (child.style('font-family').hasValue()) {\r\n\t\t\t\t\t\tsvg.Definitions[child.style('font-family').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (child.type == 'missing-glyph') this.missingGlyph = child;\r\n\t\t\t\telse if (child.type == 'glyph') {\r\n\t\t\t\t\tif (child.arabicForm != '') {\r\n\t\t\t\t\t\tthis.isRTL = true;\r\n\t\t\t\t\t\tthis.isArabic = true;\r\n\t\t\t\t\t\tif (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];\r\n\t\t\t\t\t\tthis.glyphs[child.unicode][child.arabicForm] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.glyphs[child.unicode] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.font.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// font-face element\r\n\t\tsvg.Element.fontface = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.ascent = this.attribute('ascent').value;\r\n\t\t\tthis.descent = this.attribute('descent').value;\r\n\t\t\tthis.unitsPerEm = this.attribute('units-per-em').numValue();\r\n\t\t}\r\n\t\tsvg.Element.fontface.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// missing-glyph element\r\n\t\tsvg.Element.missingglyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = 0;\r\n\t\t}\r\n\t\tsvg.Element.missingglyph.prototype = new svg.Element.path;\r\n\r\n\t\t// glyph element\r\n\t\tsvg.Element.glyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\t\t\tthis.unicode = this.attribute('unicode').value;\r\n\t\t\tthis.arabicForm = this.attribute('arabic-form').value;\r\n\t\t}\r\n\t\tsvg.Element.glyph.prototype = new svg.Element.path;\r\n\r\n\t\t// text element\r\n\t\tsvg.Element.text = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\tvar textBaseline = this.style('dominant-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline == null) textBaseline = this.style('alignment-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline != null) ctx.textBaseline = textBaseline;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function () {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\treturn new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.x = this.attribute('x').toPixels('x');\r\n\t\t\t\tthis.y = this.attribute('y').toPixels('y');\r\n\t\t\t\tif (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');\r\n\t\t\t\tif (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');\r\n\t\t\t\tthis.x += this.getAnchorDelta(ctx, this, 0);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.renderChild(ctx, this, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getAnchorDelta = function (ctx, parent, startI) {\r\n\t\t\t\tvar textAnchor = this.style('text-anchor').valueOrDefault('start');\r\n\t\t\t\tif (textAnchor != 'start') {\r\n\t\t\t\t\tvar width = 0;\r\n\t\t\t\t\tfor (var i=startI; i<parent.children.length; i++) {\r\n\t\t\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\t\t\tif (i > startI && child.attribute('x').hasValue()) break; // new group\r\n\t\t\t\t\t\twidth += child.measureTextRecursive(ctx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn -1 * (textAnchor == 'end' ? width : width / 2.0);\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChild = function(ctx, parent, i) {\r\n\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\tif (child.attribute('x').hasValue()) {\r\n\t\t\t\t\tchild.x = child.attribute('x').toPixels('x') + parent.getAnchorDelta(ctx, parent, i);\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) parent.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t\tchild.x = parent.x;\r\n\t\t\t\t}\r\n\t\t\t\tparent.x = child.x + child.measureText(ctx);\r\n\r\n\t\t\t\tif (child.attribute('y').hasValue()) {\r\n\t\t\t\t\tchild.y = child.attribute('y').toPixels('y');\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) parent.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t\tchild.y = parent.y;\r\n\t\t\t\t}\r\n\t\t\t\tparent.y = child.y;\r\n\r\n\t\t\t\tchild.render(ctx);\r\n\r\n\t\t\t\tfor (var i=0; i<child.children.length; i++) {\r\n\t\t\t\t\tparent.renderChild(ctx, child, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.text.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// text base\r\n\t\tsvg.Element.TextElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getGlyph = function(font, text, i) {\r\n\t\t\t\tvar c = text[i];\r\n\t\t\t\tvar glyph = null;\r\n\t\t\t\tif (font.isArabic) {\r\n\t\t\t\t\tvar arabicForm = 'isolated';\r\n\t\t\t\t\tif ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';\r\n\t\t\t\t\tif (typeof(font.glyphs[c]) != 'undefined') {\r\n\t\t\t\t\t\tglyph = font.glyphs[c][arabicForm];\r\n\t\t\t\t\t\tif (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tglyph = font.glyphs[c];\r\n\t\t\t\t}\r\n\t\t\t\tif (glyph == null) glyph = font.missingGlyph;\r\n\t\t\t\treturn glyph;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tvar scale = fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tctx.translate(this.x, this.y);\r\n\t\t\t\t\t\tctx.scale(scale, -scale);\r\n\t\t\t\t\t\tvar lw = ctx.lineWidth;\r\n\t\t\t\t\t\tctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);\r\n\t\t\t\t\t\tglyph.render(ctx);\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);\r\n\t\t\t\t\t\tctx.lineWidth = lw;\r\n\t\t\t\t\t\tctx.scale(1/scale, -1/scale);\r\n\t\t\t\t\t\tctx.translate(-this.x, -this.y);\r\n\r\n\t\t\t\t\t\tthis.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tthis.x += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// OVERRIDE ME\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureTextRecursive = function(ctx) {\r\n\t\t\t\tvar width = this.measureText(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\twidth += this.children[i].measureTextRecursive(ctx);\r\n\t\t\t\t}\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureText = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar measure = 0;\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tmeasure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tmeasure += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn measure;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar textToMeasure = svg.compressSpaces(this.getText());\r\n\t\t\t\tif (!ctx.measureText) return textToMeasure.length * 10;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\tvar width = ctx.measureText(textToMeasure).width;\r\n\t\t\t\tctx.restore();\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// tspan\r\n\t\tsvg.Element.tspan = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.text = svg.compressSpaces(node.value || node.text || node.textContent || '');\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// if this node has children, then they own the text\r\n\t\t\t\tif (this.children.length > 0) { return ''; }\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tspan.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// tref\r\n\t\tsvg.Element.tref = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\t\t\t\tif (element != null) return element.children[0].getText();\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tref.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// a element\r\n\t\tsvg.Element.a = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.hasText = node.childNodes.length > 0;\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\tif (node.childNodes[i].nodeType != 3) this.hasText = false;\r\n\t\t\t}\r\n\r\n\t\t\t// this might contain text\r\n\t\t\tthis.text = this.hasText ? node.childNodes[0].value : '';\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseRenderChildren = this.renderChildren;\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (this.hasText) {\r\n\t\t\t\t\t// render as text element\r\n\t\t\t\t\tthis.baseRenderChildren(ctx);\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tsvg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y));\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.children.length > 0) {\r\n\t\t\t\t\t// render as temporary group\r\n\t\t\t\t\tvar g = new svg.Element.g();\r\n\t\t\t\t\tg.children = this.children;\r\n\t\t\t\t\tg.parent = this;\r\n\t\t\t\t\tg.render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.onclick = function() {\r\n\t\t\t\twindow.open(this.getHrefAttribute().value);\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = 'pointer';\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.a.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// image element\r\n\t\tsvg.Element.image = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar href = this.getHrefAttribute().value;\r\n\t\t\tif (href == '') { return; }\r\n\t\t\tvar isSvg = href.match(/\\.svg$/)\r\n\r\n\t\t\tsvg.Images.push(this);\r\n\t\t\tthis.loaded = false;\r\n\t\t\tif (!isSvg) {\r\n\t\t\t\tthis.img = document.createElement('img');\r\n\t\t\t\tif (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; }\r\n\t\t\t\tvar self = this;\r\n\t\t\t\tthis.img.onload = function() { self.loaded = true; }\r\n\t\t\t\tthis.img.onerror = function() { svg.log('ERROR: image \"' + href + '\" not found'); self.loaded = true; }\r\n\t\t\t\tthis.img.src = href;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.img = svg.ajax(href);\r\n\t\t\t\tthis.loaded = true;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tif (width == 0 || height == 0) return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (isSvg) {\r\n\t\t\t\t\tctx.drawSvg(this.img, x, y, width, height);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tctx.translate(x, y);\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tthis.img.width,\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tthis.img.height,\r\n\t\t\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\t\t\t0);\r\n\t\t\t\t\tctx.drawImage(this.img, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.image.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// group element\r\n\t\tsvg.Element.g = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.g.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// symbol element\r\n\t\tsvg.Element.symbol = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.symbol.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// style element\r\n\t\tsvg.Element.style = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\t// text, or spaces then CDATA\r\n\t\t\tvar css = ''\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t  css += node.childNodes[i].data;\r\n\t\t\t}\r\n\t\t\tcss = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, ''); // remove comments\r\n\t\t\tcss = svg.compressSpaces(css); // replace whitespace\r\n\t\t\tvar cssDefs = css.split('}');\r\n\t\t\tfor (var i=0; i<cssDefs.length; i++) {\r\n\t\t\t\tif (svg.trim(cssDefs[i]) != '') {\r\n\t\t\t\t\tvar cssDef = cssDefs[i].split('{');\r\n\t\t\t\t\tvar cssClasses = cssDef[0].split(',');\r\n\t\t\t\t\tvar cssProps = cssDef[1].split(';');\r\n\t\t\t\t\tfor (var j=0; j<cssClasses.length; j++) {\r\n\t\t\t\t\t\tvar cssClass = svg.trim(cssClasses[j]);\r\n\t\t\t\t\t\tif (cssClass != '') {\r\n\t\t\t\t\t\t\tvar props = svg.Styles[cssClass] || {};\r\n\t\t\t\t\t\t\tfor (var k=0; k<cssProps.length; k++) {\r\n\t\t\t\t\t\t\t\tvar prop = cssProps[k].indexOf(':');\r\n\t\t\t\t\t\t\t\tvar name = cssProps[k].substr(0, prop);\r\n\t\t\t\t\t\t\t\tvar value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);\r\n\t\t\t\t\t\t\t\tif (name != null && value != null) {\r\n\t\t\t\t\t\t\t\t\tprops[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsvg.Styles[cssClass] = props;\r\n\t\t\t\t\t\t\tsvg.StylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\r\n\t\t\t\t\t\t\tif (cssClass == '@font-face') {\r\n\t\t\t\t\t\t\t\tvar fontFamily = props['font-family'].value.replace(/\"/g,'');\r\n\t\t\t\t\t\t\t\tvar srcs = props['src'].value.split(',');\r\n\t\t\t\t\t\t\t\tfor (var s=0; s<srcs.length; s++) {\r\n\t\t\t\t\t\t\t\t\tif (srcs[s].indexOf('format(\"svg\")') > 0) {\r\n\t\t\t\t\t\t\t\t\t\tvar urlStart = srcs[s].indexOf('url');\r\n\t\t\t\t\t\t\t\t\t\tvar urlEnd = srcs[s].indexOf(')', urlStart);\r\n\t\t\t\t\t\t\t\t\t\tvar url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);\r\n\t\t\t\t\t\t\t\t\t\tvar doc = svg.parseXml(svg.ajax(url));\r\n\t\t\t\t\t\t\t\t\t\tvar fonts = doc.getElementsByTagName('font');\r\n\t\t\t\t\t\t\t\t\t\tfor (var f=0; f<fonts.length; f++) {\r\n\t\t\t\t\t\t\t\t\t\t\tvar font = svg.CreateElement(fonts[f]);\r\n\t\t\t\t\t\t\t\t\t\t\tsvg.Definitions[fontFamily] = font;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.style.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// use element\r\n\t\tsvg.Element.use = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\t\t\t\tif (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);\r\n\t\t\t\tif (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));\r\n\t\t\t}\r\n\r\n\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (element != null) element.path(ctx);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tif (element != null) return element.getBoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (element != null) {\r\n\t\t\t\t\tvar tempSvg = element;\r\n\t\t\t\t\tif (element.type == 'symbol') {\r\n\t\t\t\t\t\t// render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\r\n\t\t\t\t\t\ttempSvg = new svg.Element.svg();\r\n\t\t\t\t\t\ttempSvg.type = 'svg';\r\n\t\t\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', element.attribute('viewBox').value);\r\n\t\t\t\t\t\ttempSvg.attributes['preserveAspectRatio'] = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value);\r\n\t\t\t\t\t\ttempSvg.attributes['overflow'] = new svg.Property('overflow', element.attribute('overflow').value);\r\n\t\t\t\t\t\ttempSvg.children = element.children;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tempSvg.type == 'svg') {\r\n\t\t\t\t\t\t// if symbol or svg, inherit width/height from me\r\n\t\t\t\t\t\tif (this.attribute('width').hasValue()) tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);\r\n\t\t\t\t\t\tif (this.attribute('height').hasValue()) tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar oldParent = tempSvg.parent;\r\n\t\t\t\t\ttempSvg.parent = null;\r\n\t\t\t\t\ttempSvg.render(ctx);\r\n\t\t\t\t\ttempSvg.parent = oldParent;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.use.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// mask element\r\n\t\tsvg.Element.mask = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\tif (width == 0 && height == 0) {\r\n\t\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// temporarily remove mask to avoid recursion\r\n\t\t\t\tvar mask = element.attribute('mask').value;\r\n\t\t\t\telement.attribute('mask').value = '';\r\n\r\n\t\t\t\t\tvar cMask = document.createElement('canvas');\r\n\t\t\t\t\tcMask.width = x + width;\r\n\t\t\t\t\tcMask.height = y + height;\r\n\t\t\t\t\tvar maskCtx = cMask.getContext('2d');\r\n\t\t\t\t\tthis.renderChildren(maskCtx);\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = x + width;\r\n\t\t\t\t\tc.height = y + height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\telement.render(tempCtx);\r\n\t\t\t\t\ttempCtx.globalCompositeOperation = 'destination-in';\r\n\t\t\t\t\ttempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\r\n\t\t\t\t\ttempCtx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t\tctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t\tctx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t// reassign mask\r\n\t\t\t\telement.attribute('mask').value = mask;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.mask.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// clip element\r\n\t\tsvg.Element.clipPath = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tvar oldBeginPath = CanvasRenderingContext2D.prototype.beginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = function () { };\r\n\r\n\t\t\t\tvar oldClosePath = CanvasRenderingContext2D.prototype.closePath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = function () { };\r\n\r\n\t\t\t\toldBeginPath.call(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar child = this.children[i];\r\n\t\t\t\t\tif (typeof(child.path) != 'undefined') {\r\n\t\t\t\t\t\tvar transform = null;\r\n\t\t\t\t\t\tif (child.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\t\t\ttransform = new svg.Transform(child.style('transform', false, true).value);\r\n\t\t\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tchild.path(ctx);\r\n\t\t\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t\t\t\tif (transform) { transform.unapply(ctx); }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\toldClosePath.call(ctx);\r\n\t\t\t\tctx.clip();\r\n\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = oldBeginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.clipPath.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// filters\r\n\t\tsvg.Element.filter = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\r\n\t\t\t\t// temporarily remove filter to avoid recursion\r\n\t\t\t\tvar filter = element.style('filter').value;\r\n\t\t\t\telement.style('filter').value = '';\r\n\r\n\t\t\t\tvar px = 0, py = 0;\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar efd = this.children[i].extraFilterDistance || 0;\r\n\t\t\t\t\tpx = Math.max(px, efd);\r\n\t\t\t\t\tpy = Math.max(py, efd);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width + 2*px;\r\n\t\t\t\tc.height = height + 2*py;\r\n\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\ttempCtx.translate(-x + px, -y + py);\r\n\t\t\t\telement.render(tempCtx);\r\n\r\n\t\t\t\t// apply filters\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tif (typeof(this.children[i].apply) === 'function') {\r\n\t\t\t\t\t\tthis.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render on me\r\n\t\t\t\tctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);\r\n\r\n\t\t\t\t// reassign filter\r\n\t\t\t\telement.style('filter', true).value = filter;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.filter.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feMorphology = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feMorphology.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feComposite = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feComposite.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feColorMatrix = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar matrix = svg.ToNumberArray(this.attribute('values').value);\r\n\t\t\tswitch (this.attribute('type').valueOrDefault('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\r\n\t\t\t\tcase 'saturate':\r\n\t\t\t\t\tvar s = matrix[0];\r\n\t\t\t\t\tmatrix = [0.213+0.787*s,0.715-0.715*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715+0.285*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715-0.715*s,0.072+0.928*s,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'hueRotate':\r\n\t\t\t\t\tvar a = matrix[0] * Math.PI / 180.0;\r\n\t\t\t\t\tvar c = function (m1,m2,m3) { return m1 + Math.cos(a)*m2 + Math.sin(a)*m3; };\r\n\t\t\t\t\tmatrix = [c(0.213,0.787,-0.213),c(0.715,-0.715,-0.715),c(0.072,-0.072,0.928),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,0.143),c(0.715,0.285,0.140),c(0.072,-0.072,-0.283),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,-0.787),c(0.715,-0.715,0.715),c(0.072,0.928,0.072),0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'luminanceToAlpha':\r\n\t\t\t\t\tmatrix = [0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0.2125,0.7154,0.0721,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tfunction imGet(img, x, y, width, height, rgba) {\r\n\t\t\t\treturn img[y*width*4 + x*4 + rgba];\r\n\t\t\t}\r\n\r\n\t\t\tfunction imSet(img, x, y, width, height, rgba, val) {\r\n\t\t\t\timg[y*width*4 + x*4 + rgba] = val;\r\n\t\t\t}\r\n\r\n\t\t\tfunction m(i, v) {\r\n\t\t\t\tvar mi = matrix[i];\r\n\t\t\t\treturn mi * (mi < 0 ? v - 255 : v);\r\n\t\t\t}\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// assuming x==0 && y==0 for now\r\n\t\t\t\tvar srcData = ctx.getImageData(0, 0, width, height);\r\n\t\t\t\tfor (var y = 0; y < height; y++) {\r\n\t\t\t\t\tfor (var x = 0; x < width; x++) {\r\n\t\t\t\t\t\tvar r = imGet(srcData.data, x, y, width, height, 0);\r\n\t\t\t\t\t\tvar g = imGet(srcData.data, x, y, width, height, 1);\r\n\t\t\t\t\t\tvar b = imGet(srcData.data, x, y, width, height, 2);\r\n\t\t\t\t\t\tvar a = imGet(srcData.data, x, y, width, height, 3);\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 0, m(0,r)+m(1,g)+m(2,b)+m(3,a)+m(4,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 1, m(5,r)+m(6,g)+m(7,b)+m(8,a)+m(9,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 2, m(10,r)+m(11,g)+m(12,b)+m(13,a)+m(14,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 3, m(15,r)+m(16,g)+m(17,b)+m(18,a)+m(19,1));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tctx.clearRect(0, 0, width, height);\r\n\t\t\t\tctx.putImageData(srcData, 0, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feColorMatrix.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feGaussianBlur = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());\r\n\t\t\tthis.extraFilterDistance = this.blurRadius;\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\tif (typeof(stackBlur.canvasRGBA) == 'undefined') {\r\n\t\t\t\t\tsvg.log('ERROR: StackBlur.js must be included for blur to work');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// StackBlur requires canvas be on document\r\n\t\t\t\tctx.canvas.id = svg.UniqueId();\r\n\t\t\t\tctx.canvas.style.display = 'none';\r\n\t\t\t\tdocument.body.appendChild(ctx.canvas);\r\n\t\t\t\tstackBlur.canvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);\r\n\t\t\t\tdocument.body.removeChild(ctx.canvas);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// title element, do nothing\r\n\t\tsvg.Element.title = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.title.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// desc element, do nothing\r\n\t\tsvg.Element.desc = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.desc.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.MISSING = function(node) {\r\n\t\t\tsvg.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\r\n\t\t}\r\n\t\tsvg.Element.MISSING.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// element factory\r\n\t\tsvg.CreateElement = function(node) {\r\n\t\t\tvar className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace\r\n\t\t\tclassName = className.replace(/\\-/g,''); // remove dashes\r\n\t\t\tvar e = null;\r\n\t\t\tif (typeof(svg.Element[className]) != 'undefined') {\r\n\t\t\t\te = new svg.Element[className](node);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\te = new svg.Element.MISSING(node);\r\n\t\t\t}\r\n\r\n\t\t\te.type = node.nodeName;\r\n\t\t\treturn e;\r\n\t\t}\r\n\r\n\t\t// load from url\r\n\t\tsvg.load = function(ctx, url) {\r\n\t\t\tsvg.loadXml(ctx, svg.ajax(url));\r\n\t\t}\r\n\r\n\t\t// load from xml\r\n\t\tsvg.loadXml = function(ctx, xml) {\r\n\t\t\tsvg.loadXmlDoc(ctx, svg.parseXml(xml));\r\n\t\t}\r\n\r\n\t\tsvg.loadXmlDoc = function(ctx, dom) {\r\n\t\t\tsvg.init(ctx);\r\n\r\n\t\t\tvar mapXY = function(p) {\r\n\t\t\t\tvar e = ctx.canvas;\r\n\t\t\t\twhile (e) {\r\n\t\t\t\t\tp.x -= e.offsetLeft;\r\n\t\t\t\t\tp.y -= e.offsetTop;\r\n\t\t\t\t\te = e.offsetParent;\r\n\t\t\t\t}\r\n\t\t\t\tif (window.scrollX) p.x += window.scrollX;\r\n\t\t\t\tif (window.scrollY) p.y += window.scrollY;\r\n\t\t\t\treturn p;\r\n\t\t\t}\r\n\r\n\t\t\t// bind mouse\r\n\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\tctx.canvas.onclick = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onclick(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t\tctx.canvas.onmousemove = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onmousemove(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar e = svg.CreateElement(dom.documentElement);\r\n\t\t\te.root = true;\r\n\t\t\te.addStylesFromStyleDefinition();\r\n\r\n\t\t\t// render loop\r\n\t\t\tvar isFirstRender = true;\r\n\t\t\tvar draw = function() {\r\n\t\t\t\tsvg.ViewPort.Clear();\r\n\t\t\t\tif (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);\r\n\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] != true) {\r\n\t\t\t\t\t// set canvas size\r\n\t\t\t\t\tif (e.style('width').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.width = e.style('width').toPixels('x');\r\n\t\t\t\t\t\tctx.canvas.style.width = ctx.canvas.width + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.style('height').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.height = e.style('height').toPixels('y');\r\n\t\t\t\t\t\tctx.canvas.style.height = ctx.canvas.height + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\r\n\t\t\t\tvar cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] == true && e.style('width').hasValue() && e.style('height').hasValue()) {\r\n\t\t\t\t\tcWidth = e.style('width').toPixels('x');\r\n\t\t\t\t\tcHeight = e.style('height').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(cWidth, cHeight);\r\n\r\n\t\t\t\tif (svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];\r\n\t\t\t\tif (svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];\r\n\t\t\t\tif (svg.opts['scaleWidth'] != null || svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\tvar xRatio = null, yRatio = null, viewBox = svg.ToNumberArray(e.attribute('viewBox').value);\r\n\r\n\t\t\t\t\tif (svg.opts['scaleWidth'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('width').hasValue()) xRatio = e.attribute('width').toPixels('x') / svg.opts['scaleWidth'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts['scaleWidth'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('height').hasValue()) yRatio = e.attribute('height').toPixels('y') / svg.opts['scaleHeight'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts['scaleHeight'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (xRatio == null) { xRatio = yRatio; }\r\n\t\t\t\t\tif (yRatio == null) { yRatio = xRatio; }\r\n\r\n\t\t\t\t\te.attribute('width', true).value = svg.opts['scaleWidth'];\r\n\t\t\t\t\te.attribute('height', true).value = svg.opts['scaleHeight'];\r\n\t\t\t\t\te.style('transform', true, true).value += ' scale('+(1.0/xRatio)+','+(1.0/yRatio)+')';\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clear and render\r\n\t\t\t\tif (svg.opts['ignoreClear'] != true) {\r\n\t\t\t\t\tctx.clearRect(0, 0, cWidth, cHeight);\r\n\t\t\t\t}\r\n\t\t\t\te.render(ctx);\r\n\t\t\t\tif (isFirstRender) {\r\n\t\t\t\t\tisFirstRender = false;\r\n\t\t\t\t\tif (typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback'](dom);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar waitingForImages = true;\r\n\t\t\tif (svg.ImagesLoaded()) {\r\n\t\t\t\twaitingForImages = false;\r\n\t\t\t\tdraw();\r\n\t\t\t}\r\n\t\t\tsvg.intervalID = setInterval(function() {\r\n\t\t\t\tvar needUpdate = false;\r\n\r\n\t\t\t\tif (waitingForImages && svg.ImagesLoaded()) {\r\n\t\t\t\t\twaitingForImages = false;\r\n\t\t\t\t\tneedUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from mouse events?\r\n\t\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\t\tneedUpdate = needUpdate | svg.Mouse.hasEvents();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from animations?\r\n\t\t\t\tif (svg.opts['ignoreAnimation'] != true) {\r\n\t\t\t\t\tfor (var i=0; i<svg.Animations.length; i++) {\r\n\t\t\t\t\t\tneedUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from redraw?\r\n\t\t\t\tif (typeof(svg.opts['forceRedraw']) == 'function') {\r\n\t\t\t\t\tif (svg.opts['forceRedraw']() == true) needUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render if needed\r\n\t\t\t\tif (needUpdate) {\r\n\t\t\t\t\tdraw();\r\n\t\t\t\t\tsvg.Mouse.runEvents(); // run and clear our events\r\n\t\t\t\t}\r\n\t\t\t}, 1000 / svg.FRAMERATE);\r\n\t\t}\r\n\r\n\t\tsvg.stop = function() {\r\n\t\t\tif (svg.intervalID) {\r\n\t\t\t\tclearInterval(svg.intervalID);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Mouse = new (function() {\r\n\t\t\tthis.events = [];\r\n\t\t\tthis.hasEvents = function() { return this.events.length != 0; }\r\n\r\n\t\t\tthis.onclick = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onclick', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onclick) e.onclick(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onmousemove', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onmousemove) e.onmousemove(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.eventElements = [];\r\n\r\n\t\t\tthis.checkPath = function(element, ctx) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkBoundingBox = function(element, bb) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.runEvents = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = '';\r\n\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tvar element = this.eventElements[i];\r\n\t\t\t\t\twhile (element) {\r\n\t\t\t\t\t\te.run(element);\r\n\t\t\t\t\t\telement = element.parent;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// done running, clear\r\n\t\t\t\tthis.events = [];\r\n\t\t\t\tthis.eventElements = [];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn svg;\r\n\t};\r\n\r\n\tif (typeof(CanvasRenderingContext2D) != 'undefined') {\r\n\t\tCanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {\r\n\t\t\tcanvg(this.canvas, s, {\r\n\t\t\t\tignoreMouse: true,\r\n\t\t\t\tignoreAnimation: true,\r\n\t\t\t\tignoreDimensions: true,\r\n\t\t\t\tignoreClear: true,\r\n\t\t\t\toffsetX: dx,\r\n\t\t\t\toffsetY: dy,\r\n\t\t\t\tscaleWidth: dw,\r\n\t\t\t\tscaleHeight: dh\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\treturn canvg;\r\n\r\n}));\r\n"]}