{"version":3,"sources":["html2canvas.js"],"names":["window","document","undefined","toPX","element","attribute","value","left","rsLeft","runtimeStyle","style","test","currentStyle","pixelLeft","Math","round","parseFloat","asInt","val","parseInt","parseBackgroundSizePosition","index","split","_html2canvas","Util","trimText","match","indexOf","backgroundBoundsFactory","prop","el","bounds","image","imageIndex","backgroundSize","topPos","percentage","bgposition","getCSS","length","toString","width","resized","resizeBounds","height","h2cRenderContext","storage","clip","push","type","name","arguments","translate","fill","save","restore","fillRect","createPattern","drawShape","shape","moveTo","lineTo","arcTo","bezierCurveTo","quadraticCurveTo","drawImage","fillText","setVariable","variable","h2czContext","zindex","children","previousElement","computedCSS","log","a","logging","console","isNative","input","apply","replace","String","prototype","trim","asFloat","v","TEXT_SHADOW_PROPERTY","TEXT_SHADOW_VALUES","parseTextShadows","shadows","results","i","s","color","offsetX","offsetY","blur","parseBackgroundImage","method","definition","prefix","prefix_i","block","c","quote","args","whitespace","mode","numParen","appendResult","substr","toLowerCase","ii","Bounds","clientRect","getBoundingClientRect","top","bottom","offsetWidth","offsetHeight","OffsetBounds","parent","offsetParent","offsetTop","offsetLeft","defaultView","getComputedStyle","arr","map","current_width","current_height","target_width","target_height","stretch_mode","output_width","output_height","target_ratio","current_ratio","BackgroundPosition","result","BackgroundSize","Extend","options","defaults","key","hasOwnProperty","Children","elem","nodeName","toUpperCase","contentDocument","contentWindow","array","ret","first","second","j","l","childNodes","ex","message","isTransparent","backgroundColor","Font","fontData","font","fontSize","doc","baseline","middle","metricsObj","container","createElement","img","span","sampleText","visibility","fontFamily","margin","padding","body","appendChild","src","verticalAlign","createTextNode","removeChild","lineHeight","lineWidth","addScrollStops","grad","colorStop","addColorStop","stop","e","Generate","reGradients","parseGradient","css","gradient","m1","m2","m2Len","step","m3","tl","tr","br","bl","len","x0","y0","x1","y1","colorStops","max","cx","cy","rx","ry","sqrt","pow","min","Gradient","canvas","ctx","getContext","createLinearGradient","forEach","fillStyle","createRadialGradient","canvasRadial","ctxRadial","ri","di","ListAlpha","number","modulus","tmp","fromCharCode","ListRoman","romanArray","decimal","roman","Parse","images","documentWidth","scrollWidth","documentElement","clientWidth","documentHeight","scrollHeight","clientHeight","getCSSInt","isNaN","renderRect","x","y","w","h","bgcolor","numDraws","capitalize","m","p1","p2","textTransform","text","transform","noLetterSpacing","letter_spacing","drawText","currentText","setTextVariables","text_decoration","align","bold","family","size","join","renderTextDecoration","metrics","ceil","getTextBounds","state","textDecoration","isLast","support","rangeBounds","textRangeBounds","node","textOffset","nodeValue","newTextNode","splitText","textWrapperBounds","textNode","range","createRange","setStart","setEnd","oldTextNode","parentNode","wrapElement","backupText","cloneNode","replaceChild","renderText","stack","textList","textAlign","letterRendering","chinese","word","unshift","splice","matrix","listPosition","originalType","boundElement","display","listStyleType","insertBefore","firstChild","elementIndex","count","childs","nodeType","listItemText","currentIndex","renderListItem","elBounds","listBounds","loadImage","succeeded","clipBounds","dst","x2","y2","setZ","parentStack","newContext","isPositioned","cssPosition","zIndex","opacity","isFloated","ownStacking","renderImage","borders","paddingLeft","paddingTop","paddingRight","paddingBottom","getBorderData","side","getBorderRadiusData","bezierCurve","start","startControl","endControl","end","lerp","b","t","subdivide","ab","bc","cd","abbc","bccd","dest","curveTo","borderArgs","curveToReversed","parseCorner","radius1","radius2","corner1","corner2","drawSide","borderData","outer1","inner1","outer2","inner2","c1","c2","c3","c4","calculateCurvePoints","borderRadius","tlh","tlv","trh","trv","brh","brv","blh","blv","topWidth","rightHeight","bottomWidth","leftHeight","topLeftOuter","getCurvePoints","topLeft","topLeftInner","topRightOuter","topRight","topRightInner","bottomRightOuter","bottomRight","bottomRightInner","bottomLeftOuter","bottomLeft","bottomLeftInner","getBorderClip","borderPoints","radius","backgroundClip","parseBorders","borderSide","bx","by","bw","bh","createShape","border","slice","renderBorders","renderFormValue","textValue","valueWrap","cssPropertyArray","property","borderColor","borderStyle","position","selectedIndex","placeholder","Array","call","getPseudoElement","which","elStyle","content","isImage","elps","className","pseudoHide","Object","keys","filter","indexedProperty","innerHTML","injectPseudoElements","before","after","parseElement","renderBackgroundRepeat","backgroundPosition","backgroundRepeatShape","renderBackgroundColor","backgroundBounds","renderBackgroundRepeating","backgroundRepeat","resizeImage","renderBackgroundImage","backgroundImage","backgroundImages","setOpacity","removePx","str","getTransform","transformOrigin","transformRegExp","origin","createStack","useOverflow","getBackgroundBounds","getBounds","renderElement","pseudoElement","ignoreBackground","ignoreElementsRegExp","getAttribute","isElementVisible","hasAttribute","parseChildren","ELEMENT_NODE","TEXT_NODE","init","background","transparentBackground","hidePseudoElements","scroll","elements","ownerDocument","Support","RegExp","ignoreElements","kappa","r1","r2","ox","oy","xm","ym","Preload","isSameOrigin","url","link","href","protocol","host","pageOrigin","numLoaded","numTotal","numFailed","firstRun","complete","proxyGetImage","imageObj","callback_name","script","scriptUrl","proxy","callbackname","encodeURIComponent","substring","setImageLoadHandlers","setAttribute","loadPseudoElement","methods","loadBackgroundImages","loadPseudoElementImages","loadGradientImage","invalidBackgrounds","background_image","getImages","elNodeType","onload","timer","clearTimeout","onerror","crossOrigin","Image","timeoutTimer","cleanupDone","domImages","getElementsByTagName","imgLen","supportCORS","location","allowTaint","useCORS","cleanupDOM","cause","timeout","execCommand","close","renderingDone","setTimeout","Renderer","parseQueue","createRenderQueue","sortZ","context","sort","zi","nonPositioned","floated","positioned","list","walk","concat","queue","rootContext","rootNode","insert","specialParent","Number","contextForChildren","stub","childrenDest","!","childNode","getRenderer","rendererName","renderer","Error","supportSVGRendering","toDataURL","supportRangeBounds","r","testElement","rangeHeight","selectNode","svgRendering","html2canvas","opts","taintTest","onpreloaded","onparsed","onrendered","render","parse","preload","Canvas","beginPath","arg","closePath","safeImage","item","safeImages","testctx","getImageData","testCanvas","renderItem","parsedData","newCanvas","fstyle","zStack","storageContext","textBaseline","rect"],"mappings":"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","file":"../html2canvas.min.js","sourcesContent":["/*\n html2canvas 0.4.1 \n Copyright (c) 2013 Niklas von Hertzen\n\n Released under MIT License\n*/\n\n(function(window, document, undefined){\n\n\"use strict\";\n\nvar _html2canvas = {},\npreviousElement,\ncomputedCSS,\nhtml2canvas;\n\n_html2canvas.Util = {};\n\n_html2canvas.Util.log = function(a) {\n if (_html2canvas.logging && window.console && window.console.log) {\n window.console.log(a);\n }\n};\n\n_html2canvas.Util.trimText = (function(isNative){\n return function(input) {\n return isNative ? isNative.apply(input) : ((input || '') + '').replace( /^\\s+|\\s+$/g , '' );\n };\n})(String.prototype.trim);\n\n_html2canvas.Util.asFloat = function(v) {\n return parseFloat(v);\n};\n\n(function() {\n // TODO: support all possible length values\n var TEXT_SHADOW_PROPERTY = /((rgba|rgb)\\([^\\)]+\\)(\\s-?\\d+px){0,})/g;\n var TEXT_SHADOW_VALUES = /(-?\\d+px)|(#.+)|(rgb\\(.+\\))|(rgba\\(.+\\))/g;\n _html2canvas.Util.parseTextShadows = function (value) {\n if (!value || value === 'none') {\n return [];\n }\n\n // find multiple shadow declarations\n var shadows = value.match(TEXT_SHADOW_PROPERTY),\n results = [];\n for (var i = 0; shadows && (i < shadows.length); i++) {\n var s = shadows[i].match(TEXT_SHADOW_VALUES);\n results.push({\n color: s[0],\n offsetX: s[1] ? s[1].replace('px', '') : 0,\n offsetY: s[2] ? s[2].replace('px', '') : 0,\n blur: s[3] ? s[3].replace('px', '') : 0\n });\n }\n return results;\n };\n})();\n\n\n_html2canvas.Util.parseBackgroundImage = function (value) {\n var whitespace = ' \\r\\n\\t',\n method, definition, prefix, prefix_i, block, results = [],\n c, mode = 0, numParen = 0, quote, args;\n\n var appendResult = function(){\n if(method) {\n if(definition.substr( 0, 1 ) === '\"') {\n definition = definition.substr( 1, definition.length - 2 );\n }\n if(definition) {\n args.push(definition);\n }\n if(method.substr( 0, 1 ) === '-' &&\n (prefix_i = method.indexOf( '-', 1 ) + 1) > 0) {\n prefix = method.substr( 0, prefix_i);\n method = method.substr( prefix_i );\n }\n results.push({\n prefix: prefix,\n method: method.toLowerCase(),\n value: block,\n args: args\n });\n }\n args = []; //for some odd reason, setting .length = 0 didn't work in safari\n method =\n prefix =\n definition =\n block = '';\n };\n\n appendResult();\n for(var i = 0, ii = value.length; i -1){\n continue;\n }\n switch(c) {\n case '\"':\n if(!quote) {\n quote = c;\n }\n else if(quote === c) {\n quote = null;\n }\n break;\n\n case '(':\n if(quote) { break; }\n else if(mode === 0) {\n mode = 1;\n block += c;\n continue;\n } else {\n numParen++;\n }\n break;\n\n case ')':\n if(quote) { break; }\n else if(mode === 1) {\n if(numParen === 0) {\n mode = 0;\n block += c;\n appendResult();\n continue;\n } else {\n numParen--;\n }\n }\n break;\n\n case ',':\n if(quote) { break; }\n else if(mode === 0) {\n appendResult();\n continue;\n }\n else if (mode === 1) {\n if(numParen === 0 && !method.match(/^url$/i)) {\n args.push(definition);\n definition = '';\n block += c;\n continue;\n }\n }\n break;\n }\n\n block += c;\n if(mode === 0) { method += c; }\n else { definition += c; }\n }\n appendResult();\n\n return results;\n};\n\n_html2canvas.Util.Bounds = function (element) {\n var clientRect, bounds = {};\n\n if (element.getBoundingClientRect){\n clientRect = element.getBoundingClientRect();\n\n // TODO add scroll position to bounds, so no scrolling of window necessary\n bounds.top = clientRect.top;\n bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height);\n bounds.left = clientRect.left;\n\n bounds.width = element.offsetWidth;\n bounds.height = element.offsetHeight;\n }\n\n return bounds;\n};\n\n// TODO ideally, we'd want everything to go through this function instead of Util.Bounds,\n// but would require further work to calculate the correct positions for elements with offsetParents\n_html2canvas.Util.OffsetBounds = function (element) {\n var parent = element.offsetParent ? _html2canvas.Util.OffsetBounds(element.offsetParent) : {top: 0, left: 0};\n\n return {\n top: element.offsetTop + parent.top,\n bottom: element.offsetTop + element.offsetHeight + parent.top,\n left: element.offsetLeft + parent.left,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n};\n\nfunction toPX(element, attribute, value ) {\n var rsLeft = element.runtimeStyle && element.runtimeStyle[attribute],\n left,\n style = element.style;\n\n // Check if we are not dealing with pixels, (Opera has issues with this)\n // Ported from jQuery css.js\n // From the awesome hack by Dean Edwards\n // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n // If we're not dealing with a regular pixel number\n // but a number that has a weird ending, we need to convert it to pixels\n\n if ( !/^-?[0-9]+\\.?[0-9]*(?:px)?$/i.test( value ) && /^-?\\d/.test(value) ) {\n // Remember the original values\n left = style.left;\n\n // Put in the new values to get a computed value out\n if (rsLeft) {\n element.runtimeStyle.left = element.currentStyle.left;\n }\n style.left = attribute === \"fontSize\" ? \"1em\" : (value || 0);\n value = style.pixelLeft + \"px\";\n\n // Revert the changed values\n style.left = left;\n if (rsLeft) {\n element.runtimeStyle.left = rsLeft;\n }\n }\n\n if (!/^(thin|medium|thick)$/i.test(value)) {\n return Math.round(parseFloat(value)) + \"px\";\n }\n\n return value;\n}\n\nfunction asInt(val) {\n return parseInt(val, 10);\n}\n\nfunction parseBackgroundSizePosition(value, element, attribute, index) {\n value = (value || '').split(',');\n value = value[index || 0] || value[0] || 'auto';\n value = _html2canvas.Util.trimText(value).split(' ');\n\n if(attribute === 'backgroundSize' && (!value[0] || value[0].match(/cover|contain|auto/))) {\n //these values will be handled in the parent function\n } else {\n value[0] = (value[0].indexOf( \"%\" ) === -1) ? toPX(element, attribute + \"X\", value[0]) : value[0];\n if(value[1] === undefined) {\n if(attribute === 'backgroundSize') {\n value[1] = 'auto';\n return value;\n } else {\n // IE 9 doesn't return double digit always\n value[1] = value[0];\n }\n }\n value[1] = (value[1].indexOf(\"%\") === -1) ? toPX(element, attribute + \"Y\", value[1]) : value[1];\n }\n return value;\n}\n\n_html2canvas.Util.getCSS = function (element, attribute, index) {\n if (previousElement !== element) {\n computedCSS = document.defaultView.getComputedStyle(element, null);\n }\n\n var value = computedCSS[attribute];\n\n if (/^background(Size|Position)$/.test(attribute)) {\n return parseBackgroundSizePosition(value, element, attribute, index);\n } else if (/border(Top|Bottom)(Left|Right)Radius/.test(attribute)) {\n var arr = value.split(\" \");\n if (arr.length <= 1) {\n arr[1] = arr[0];\n }\n return arr.map(asInt);\n }\n\n return value;\n};\n\n_html2canvas.Util.resizeBounds = function( current_width, current_height, target_width, target_height, stretch_mode ){\n var target_ratio = target_width / target_height,\n current_ratio = current_width / current_height,\n output_width, output_height;\n\n if(!stretch_mode || stretch_mode === 'auto') {\n output_width = target_width;\n output_height = target_height;\n } else if(target_ratio < current_ratio ^ stretch_mode === 'contain') {\n output_height = target_height;\n output_width = target_height * current_ratio;\n } else {\n output_width = target_width;\n output_height = target_width / current_ratio;\n }\n\n return {\n width: output_width,\n height: output_height\n };\n};\n\nfunction backgroundBoundsFactory( prop, el, bounds, image, imageIndex, backgroundSize ) {\n var bgposition = _html2canvas.Util.getCSS( el, prop, imageIndex ) ,\n topPos,\n left,\n percentage,\n val;\n\n if (bgposition.length === 1){\n val = bgposition[0];\n\n bgposition = [];\n\n bgposition[0] = val;\n bgposition[1] = val;\n }\n\n if (bgposition[0].toString().indexOf(\"%\") !== -1){\n percentage = (parseFloat(bgposition[0])/100);\n left = bounds.width * percentage;\n if(prop !== 'backgroundSize') {\n left -= (backgroundSize || image).width*percentage;\n }\n } else {\n if(prop === 'backgroundSize') {\n if(bgposition[0] === 'auto') {\n left = image.width;\n } else {\n if (/contain|cover/.test(bgposition[0])) {\n var resized = _html2canvas.Util.resizeBounds(image.width, image.height, bounds.width, bounds.height, bgposition[0]);\n left = resized.width;\n topPos = resized.height;\n } else {\n left = parseInt(bgposition[0], 10);\n }\n }\n } else {\n left = parseInt( bgposition[0], 10);\n }\n }\n\n\n if(bgposition[1] === 'auto') {\n topPos = left / image.width * image.height;\n } else if (bgposition[1].toString().indexOf(\"%\") !== -1){\n percentage = (parseFloat(bgposition[1])/100);\n topPos = bounds.height * percentage;\n if(prop !== 'backgroundSize') {\n topPos -= (backgroundSize || image).height * percentage;\n }\n\n } else {\n topPos = parseInt(bgposition[1],10);\n }\n\n return [left, topPos];\n}\n\n_html2canvas.Util.BackgroundPosition = function( el, bounds, image, imageIndex, backgroundSize ) {\n var result = backgroundBoundsFactory( 'backgroundPosition', el, bounds, image, imageIndex, backgroundSize );\n return { left: result[0], top: result[1] };\n};\n\n_html2canvas.Util.BackgroundSize = function( el, bounds, image, imageIndex ) {\n var result = backgroundBoundsFactory( 'backgroundSize', el, bounds, image, imageIndex );\n return { width: result[0], height: result[1] };\n};\n\n_html2canvas.Util.Extend = function (options, defaults) {\n for (var key in options) {\n if (options.hasOwnProperty(key)) {\n defaults[key] = options[key];\n }\n }\n return defaults;\n};\n\n\n/*\n * Derived from jQuery.contents()\n * Copyright 2010, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n */\n_html2canvas.Util.Children = function( elem ) {\n var children;\n try {\n children = (elem.nodeName && elem.nodeName.toUpperCase() === \"IFRAME\") ? elem.contentDocument || elem.contentWindow.document : (function(array) {\n var ret = [];\n if (array !== null) {\n (function(first, second ) {\n var i = first.length,\n j = 0;\n\n if (typeof second.length === \"number\") {\n for (var l = second.length; j < l; j++) {\n first[i++] = second[j];\n }\n } else {\n while (second[j] !== undefined) {\n first[i++] = second[j++];\n }\n }\n\n first.length = i;\n\n return first;\n })(ret, array);\n }\n return ret;\n })(elem.childNodes);\n\n } catch (ex) {\n _html2canvas.Util.log(\"html2canvas.Util.Children failed with exception: \" + ex.message);\n children = [];\n }\n return children;\n};\n\n_html2canvas.Util.isTransparent = function(backgroundColor) {\n return (backgroundColor === \"transparent\" || backgroundColor === \"rgba(0, 0, 0, 0)\");\n};\n_html2canvas.Util.Font = (function () {\n\n var fontData = {};\n\n return function(font, fontSize, doc) {\n if (fontData[font + \"-\" + fontSize] !== undefined) {\n return fontData[font + \"-\" + fontSize];\n }\n\n var container = doc.createElement('div'),\n img = doc.createElement('img'),\n span = doc.createElement('span'),\n sampleText = 'Hidden Text',\n baseline,\n middle,\n metricsObj;\n\n container.style.visibility = \"hidden\";\n container.style.fontFamily = font;\n container.style.fontSize = fontSize;\n container.style.margin = 0;\n container.style.padding = 0;\n\n doc.body.appendChild(container);\n\n // http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever (handtinywhite.gif)\n img.src = \"data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=\";\n img.width = 1;\n img.height = 1;\n\n img.style.margin = 0;\n img.style.padding = 0;\n img.style.verticalAlign = \"baseline\";\n\n span.style.fontFamily = font;\n span.style.fontSize = fontSize;\n span.style.margin = 0;\n span.style.padding = 0;\n\n span.appendChild(doc.createTextNode(sampleText));\n container.appendChild(span);\n container.appendChild(img);\n baseline = (img.offsetTop - span.offsetTop) + 1;\n\n container.removeChild(span);\n container.appendChild(doc.createTextNode(sampleText));\n\n container.style.lineHeight = \"normal\";\n img.style.verticalAlign = \"super\";\n\n middle = (img.offsetTop-container.offsetTop) + 1;\n metricsObj = {\n baseline: baseline,\n lineWidth: 1,\n middle: middle\n };\n\n fontData[font + \"-\" + fontSize] = metricsObj;\n\n doc.body.removeChild(container);\n\n return metricsObj;\n };\n})();\n\n(function(){\n var Util = _html2canvas.Util,\n Generate = {};\n\n _html2canvas.Generate = Generate;\n\n var reGradients = [\n /^(-webkit-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\n /^(-o-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\n /^(-webkit-gradient)\\((linear|radial),\\s((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?),\\s(?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)\\-]+)\\)$/,\n /^(-moz-linear-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\n /^(-webkit-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z\\-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\n /^(-moz-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s?([a-z\\-]*)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\n /^(-o-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z\\-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/\n ];\n\n /*\n * TODO: Add IE10 vendor prefix (-ms) support\n * TODO: Add W3C gradient (linear-gradient) support\n * TODO: Add old Webkit -webkit-gradient(radial, ...) support\n * TODO: Maybe some RegExp optimizations are possible ;o)\n */\n Generate.parseGradient = function(css, bounds) {\n var gradient, i, len = reGradients.length, m1, stop, m2, m2Len, step, m3, tl,tr,br,bl;\n\n for(i = 0; i < len; i+=1){\n m1 = css.match(reGradients[i]);\n if(m1) {\n break;\n }\n }\n\n if(m1) {\n switch(m1[1]) {\n case '-webkit-linear-gradient':\n case '-o-linear-gradient':\n\n gradient = {\n type: 'linear',\n x0: null,\n y0: null,\n x1: null,\n y1: null,\n colorStops: []\n };\n\n // get coordinates\n m2 = m1[2].match(/\\w+/g);\n if(m2){\n m2Len = m2.length;\n for(i = 0; i < m2Len; i+=1){\n switch(m2[i]) {\n case 'top':\n gradient.y0 = 0;\n gradient.y1 = bounds.height;\n break;\n\n case 'right':\n gradient.x0 = bounds.width;\n gradient.x1 = 0;\n break;\n\n case 'bottom':\n gradient.y0 = bounds.height;\n gradient.y1 = 0;\n break;\n\n case 'left':\n gradient.x0 = 0;\n gradient.x1 = bounds.width;\n break;\n }\n }\n }\n if(gradient.x0 === null && gradient.x1 === null){ // center\n gradient.x0 = gradient.x1 = bounds.width / 2;\n }\n if(gradient.y0 === null && gradient.y1 === null){ // center\n gradient.y0 = gradient.y1 = bounds.height / 2;\n }\n\n // get colors and stops\n m2 = m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);\n if(m2){\n m2Len = m2.length;\n step = 1 / Math.max(m2Len - 1, 1);\n for(i = 0; i < m2Len; i+=1){\n m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);\n if(m3[2]){\n stop = parseFloat(m3[2]);\n if(m3[3] === '%'){\n stop /= 100;\n } else { // px - stupid opera\n stop /= bounds.width;\n }\n } else {\n stop = i * step;\n }\n gradient.colorStops.push({\n color: m3[1],\n stop: stop\n });\n }\n }\n break;\n\n case '-webkit-gradient':\n\n gradient = {\n type: m1[2] === 'radial' ? 'circle' : m1[2], // TODO: Add radial gradient support for older mozilla definitions\n x0: 0,\n y0: 0,\n x1: 0,\n y1: 0,\n colorStops: []\n };\n\n // get coordinates\n m2 = m1[3].match(/(\\d{1,3})%?\\s(\\d{1,3})%?,\\s(\\d{1,3})%?\\s(\\d{1,3})%?/);\n if(m2){\n gradient.x0 = (m2[1] * bounds.width) / 100;\n gradient.y0 = (m2[2] * bounds.height) / 100;\n gradient.x1 = (m2[3] * bounds.width) / 100;\n gradient.y1 = (m2[4] * bounds.height) / 100;\n }\n\n // get colors and stops\n m2 = m1[4].match(/((?:from|to|color-stop)\\((?:[0-9\\.]+,\\s)?(?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)\\))+/g);\n if(m2){\n m2Len = m2.length;\n for(i = 0; i < m2Len; i+=1){\n m3 = m2[i].match(/(from|to|color-stop)\\(([0-9\\.]+)?(?:,\\s)?((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\)/);\n stop = parseFloat(m3[2]);\n if(m3[1] === 'from') {\n stop = 0.0;\n }\n if(m3[1] === 'to') {\n stop = 1.0;\n }\n gradient.colorStops.push({\n color: m3[3],\n stop: stop\n });\n }\n }\n break;\n\n case '-moz-linear-gradient':\n\n gradient = {\n type: 'linear',\n x0: 0,\n y0: 0,\n x1: 0,\n y1: 0,\n colorStops: []\n };\n\n // get coordinates\n m2 = m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);\n\n // m2[1] == 0% -> left\n // m2[1] == 50% -> center\n // m2[1] == 100% -> right\n\n // m2[2] == 0% -> top\n // m2[2] == 50% -> center\n // m2[2] == 100% -> bottom\n\n if(m2){\n gradient.x0 = (m2[1] * bounds.width) / 100;\n gradient.y0 = (m2[2] * bounds.height) / 100;\n gradient.x1 = bounds.width - gradient.x0;\n gradient.y1 = bounds.height - gradient.y0;\n }\n\n // get colors and stops\n m2 = m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}%)?)+/g);\n if(m2){\n m2Len = m2.length;\n step = 1 / Math.max(m2Len - 1, 1);\n for(i = 0; i < m2Len; i+=1){\n m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%)?/);\n if(m3[2]){\n stop = parseFloat(m3[2]);\n if(m3[3]){ // percentage\n stop /= 100;\n }\n } else {\n stop = i * step;\n }\n gradient.colorStops.push({\n color: m3[1],\n stop: stop\n });\n }\n }\n break;\n\n case '-webkit-radial-gradient':\n case '-moz-radial-gradient':\n case '-o-radial-gradient':\n\n gradient = {\n type: 'circle',\n x0: 0,\n y0: 0,\n x1: bounds.width,\n y1: bounds.height,\n cx: 0,\n cy: 0,\n rx: 0,\n ry: 0,\n colorStops: []\n };\n\n // center\n m2 = m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);\n if(m2){\n gradient.cx = (m2[1] * bounds.width) / 100;\n gradient.cy = (m2[2] * bounds.height) / 100;\n }\n\n // size\n m2 = m1[3].match(/\\w+/);\n m3 = m1[4].match(/[a-z\\-]*/);\n if(m2 && m3){\n switch(m3[0]){\n case 'farthest-corner':\n case 'cover': // is equivalent to farthest-corner\n case '': // mozilla removes \"cover\" from definition :(\n tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));\n tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\n br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\n bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));\n gradient.rx = gradient.ry = Math.max(tl, tr, br, bl);\n break;\n case 'closest-corner':\n tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));\n tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\n br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\n bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));\n gradient.rx = gradient.ry = Math.min(tl, tr, br, bl);\n break;\n case 'farthest-side':\n if(m2[0] === 'circle'){\n gradient.rx = gradient.ry = Math.max(\n gradient.cx,\n gradient.cy,\n gradient.x1 - gradient.cx,\n gradient.y1 - gradient.cy\n );\n } else { // ellipse\n\n gradient.type = m2[0];\n\n gradient.rx = Math.max(\n gradient.cx,\n gradient.x1 - gradient.cx\n );\n gradient.ry = Math.max(\n gradient.cy,\n gradient.y1 - gradient.cy\n );\n }\n break;\n case 'closest-side':\n case 'contain': // is equivalent to closest-side\n if(m2[0] === 'circle'){\n gradient.rx = gradient.ry = Math.min(\n gradient.cx,\n gradient.cy,\n gradient.x1 - gradient.cx,\n gradient.y1 - gradient.cy\n );\n } else { // ellipse\n\n gradient.type = m2[0];\n\n gradient.rx = Math.min(\n gradient.cx,\n gradient.x1 - gradient.cx\n );\n gradient.ry = Math.min(\n gradient.cy,\n gradient.y1 - gradient.cy\n );\n }\n break;\n\n // TODO: add support for \"30px 40px\" sizes (webkit only)\n }\n }\n\n // color stops\n m2 = m1[5].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);\n if(m2){\n m2Len = m2.length;\n step = 1 / Math.max(m2Len - 1, 1);\n for(i = 0; i < m2Len; i+=1){\n m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);\n if(m3[2]){\n stop = parseFloat(m3[2]);\n if(m3[3] === '%'){\n stop /= 100;\n } else { // px - stupid opera\n stop /= bounds.width;\n }\n } else {\n stop = i * step;\n }\n gradient.colorStops.push({\n color: m3[1],\n stop: stop\n });\n }\n }\n break;\n }\n }\n\n return gradient;\n };\n\n function addScrollStops(grad) {\n return function(colorStop) {\n try {\n grad.addColorStop(colorStop.stop, colorStop.color);\n }\n catch(e) {\n Util.log(['failed to add color stop: ', e, '; tried to add: ', colorStop]);\n }\n };\n }\n\n Generate.Gradient = function(src, bounds) {\n if(bounds.width === 0 || bounds.height === 0) {\n return;\n }\n\n var canvas = document.createElement('canvas'),\n ctx = canvas.getContext('2d'),\n gradient, grad;\n\n canvas.width = bounds.width;\n canvas.height = bounds.height;\n\n // TODO: add support for multi defined background gradients\n gradient = _html2canvas.Generate.parseGradient(src, bounds);\n\n if(gradient) {\n switch(gradient.type) {\n case 'linear':\n grad = ctx.createLinearGradient(gradient.x0, gradient.y0, gradient.x1, gradient.y1);\n gradient.colorStops.forEach(addScrollStops(grad));\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, bounds.width, bounds.height);\n break;\n\n case 'circle':\n grad = ctx.createRadialGradient(gradient.cx, gradient.cy, 0, gradient.cx, gradient.cy, gradient.rx);\n gradient.colorStops.forEach(addScrollStops(grad));\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, bounds.width, bounds.height);\n break;\n\n case 'ellipse':\n var canvasRadial = document.createElement('canvas'),\n ctxRadial = canvasRadial.getContext('2d'),\n ri = Math.max(gradient.rx, gradient.ry),\n di = ri * 2;\n\n canvasRadial.width = canvasRadial.height = di;\n\n grad = ctxRadial.createRadialGradient(gradient.rx, gradient.ry, 0, gradient.rx, gradient.ry, ri);\n gradient.colorStops.forEach(addScrollStops(grad));\n\n ctxRadial.fillStyle = grad;\n ctxRadial.fillRect(0, 0, di, di);\n\n ctx.fillStyle = gradient.colorStops[gradient.colorStops.length - 1].color;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(canvasRadial, gradient.cx - gradient.rx, gradient.cy - gradient.ry, 2 * gradient.rx, 2 * gradient.ry);\n break;\n }\n }\n\n return canvas;\n };\n\n Generate.ListAlpha = function(number) {\n var tmp = \"\",\n modulus;\n\n do {\n modulus = number % 26;\n tmp = String.fromCharCode((modulus) + 64) + tmp;\n number = number / 26;\n }while((number*26) > 26);\n\n return tmp;\n };\n\n Generate.ListRoman = function(number) {\n var romanArray = [\"M\", \"CM\", \"D\", \"CD\", \"C\", \"XC\", \"L\", \"XL\", \"X\", \"IX\", \"V\", \"IV\", \"I\"],\n decimal = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],\n roman = \"\",\n v,\n len = romanArray.length;\n\n if (number <= 0 || number >= 4000) {\n return number;\n }\n\n for (v=0; v < len; v+=1) {\n while (number >= decimal[v]) {\n number -= decimal[v];\n roman += romanArray[v];\n }\n }\n\n return roman;\n };\n})();\nfunction h2cRenderContext(width, height) {\n var storage = [];\n return {\n storage: storage,\n width: width,\n height: height,\n clip: function() {\n storage.push({\n type: \"function\",\n name: \"clip\",\n 'arguments': arguments\n });\n },\n translate: function() {\n storage.push({\n type: \"function\",\n name: \"translate\",\n 'arguments': arguments\n });\n },\n fill: function() {\n storage.push({\n type: \"function\",\n name: \"fill\",\n 'arguments': arguments\n });\n },\n save: function() {\n storage.push({\n type: \"function\",\n name: \"save\",\n 'arguments': arguments\n });\n },\n restore: function() {\n storage.push({\n type: \"function\",\n name: \"restore\",\n 'arguments': arguments\n });\n },\n fillRect: function () {\n storage.push({\n type: \"function\",\n name: \"fillRect\",\n 'arguments': arguments\n });\n },\n createPattern: function() {\n storage.push({\n type: \"function\",\n name: \"createPattern\",\n 'arguments': arguments\n });\n },\n drawShape: function() {\n\n var shape = [];\n\n storage.push({\n type: \"function\",\n name: \"drawShape\",\n 'arguments': shape\n });\n\n return {\n moveTo: function() {\n shape.push({\n name: \"moveTo\",\n 'arguments': arguments\n });\n },\n lineTo: function() {\n shape.push({\n name: \"lineTo\",\n 'arguments': arguments\n });\n },\n arcTo: function() {\n shape.push({\n name: \"arcTo\",\n 'arguments': arguments\n });\n },\n bezierCurveTo: function() {\n shape.push({\n name: \"bezierCurveTo\",\n 'arguments': arguments\n });\n },\n quadraticCurveTo: function() {\n shape.push({\n name: \"quadraticCurveTo\",\n 'arguments': arguments\n });\n }\n };\n\n },\n drawImage: function () {\n storage.push({\n type: \"function\",\n name: \"drawImage\",\n 'arguments': arguments\n });\n },\n fillText: function () {\n storage.push({\n type: \"function\",\n name: \"fillText\",\n 'arguments': arguments\n });\n },\n setVariable: function (variable, value) {\n storage.push({\n type: \"variable\",\n name: variable,\n 'arguments': value\n });\n return value;\n }\n };\n}\n_html2canvas.Parse = function (images, options) {\n window.scroll(0,0);\n\n var element = (( options.elements === undefined ) ? document.body : options.elements[0]), // select body by default\n numDraws = 0,\n doc = element.ownerDocument,\n Util = _html2canvas.Util,\n support = Util.Support(options, doc),\n ignoreElementsRegExp = new RegExp(\"(\" + options.ignoreElements + \")\"),\n body = doc.body,\n getCSS = Util.getCSS,\n pseudoHide = \"___html2canvas___pseudoelement\",\n hidePseudoElements = doc.createElement('style');\n\n hidePseudoElements.innerHTML = '.' + pseudoHide + '-before:before { content: \"\" !important; display: none !important; }' +\n '.' + pseudoHide + '-after:after { content: \"\" !important; display: none !important; }';\n\n body.appendChild(hidePseudoElements);\n\n images = images || {};\n\n function documentWidth () {\n return Math.max(\n Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),\n Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),\n Math.max(doc.body.clientWidth, doc.documentElement.clientWidth)\n );\n }\n\n function documentHeight () {\n return Math.max(\n Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),\n Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),\n Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)\n );\n }\n\n function getCSSInt(element, attribute) {\n var val = parseInt(getCSS(element, attribute), 10);\n return (isNaN(val)) ? 0 : val; // borders in old IE are throwing 'medium' for demo.html\n }\n\n function renderRect (ctx, x, y, w, h, bgcolor) {\n if (bgcolor !== \"transparent\"){\n ctx.setVariable(\"fillStyle\", bgcolor);\n ctx.fillRect(x, y, w, h);\n numDraws+=1;\n }\n }\n\n function capitalize(m, p1, p2) {\n if (m.length > 0) {\n return p1 + p2.toUpperCase();\n }\n }\n\n function textTransform (text, transform) {\n switch(transform){\n case \"lowercase\":\n return text.toLowerCase();\n case \"capitalize\":\n return text.replace( /(^|\\s|:|-|\\(|\\))([a-z])/g, capitalize);\n case \"uppercase\":\n return text.toUpperCase();\n default:\n return text;\n }\n }\n\n function noLetterSpacing(letter_spacing) {\n return (/^(normal|none|0px)$/.test(letter_spacing));\n }\n\n function drawText(currentText, x, y, ctx){\n if (currentText !== null && Util.trimText(currentText).length > 0) {\n ctx.fillText(currentText, x, y);\n numDraws+=1;\n }\n }\n\n function setTextVariables(ctx, el, text_decoration, color) {\n var align = false,\n bold = getCSS(el, \"fontWeight\"),\n family = getCSS(el, \"fontFamily\"),\n size = getCSS(el, \"fontSize\"),\n shadows = Util.parseTextShadows(getCSS(el, \"textShadow\"));\n\n switch(parseInt(bold, 10)){\n case 401:\n bold = \"bold\";\n break;\n case 400:\n bold = \"normal\";\n break;\n }\n\n ctx.setVariable(\"fillStyle\", color);\n ctx.setVariable(\"font\", [getCSS(el, \"fontStyle\"), getCSS(el, \"fontVariant\"), bold, size, family].join(\" \"));\n ctx.setVariable(\"textAlign\", (align) ? \"right\" : \"left\");\n\n if (shadows.length) {\n // TODO: support multiple text shadows\n // apply the first text shadow\n ctx.setVariable(\"shadowColor\", shadows[0].color);\n ctx.setVariable(\"shadowOffsetX\", shadows[0].offsetX);\n ctx.setVariable(\"shadowOffsetY\", shadows[0].offsetY);\n ctx.setVariable(\"shadowBlur\", shadows[0].blur);\n }\n\n if (text_decoration !== \"none\"){\n return Util.Font(family, size, doc);\n }\n }\n\n function renderTextDecoration(ctx, text_decoration, bounds, metrics, color) {\n switch(text_decoration) {\n case \"underline\":\n // Draws a line at the baseline of the font\n // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size\n renderRect(ctx, bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, color);\n break;\n case \"overline\":\n renderRect(ctx, bounds.left, Math.round(bounds.top), bounds.width, 1, color);\n break;\n case \"line-through\":\n // TODO try and find exact position for line-through\n renderRect(ctx, bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, color);\n break;\n }\n }\n\n function getTextBounds(state, text, textDecoration, isLast, transform) {\n var bounds;\n if (support.rangeBounds && !transform) {\n if (textDecoration !== \"none\" || Util.trimText(text).length !== 0) {\n bounds = textRangeBounds(text, state.node, state.textOffset);\n }\n state.textOffset += text.length;\n } else if (state.node && typeof state.node.nodeValue === \"string\" ){\n var newTextNode = (isLast) ? state.node.splitText(text.length) : null;\n bounds = textWrapperBounds(state.node, transform);\n state.node = newTextNode;\n }\n return bounds;\n }\n\n function textRangeBounds(text, textNode, textOffset) {\n var range = doc.createRange();\n range.setStart(textNode, textOffset);\n range.setEnd(textNode, textOffset + text.length);\n return range.getBoundingClientRect();\n }\n\n function textWrapperBounds(oldTextNode, transform) {\n var parent = oldTextNode.parentNode,\n wrapElement = doc.createElement('wrapper'),\n backupText = oldTextNode.cloneNode(true);\n\n wrapElement.appendChild(oldTextNode.cloneNode(true));\n parent.replaceChild(wrapElement, oldTextNode);\n\n var bounds = transform ? Util.OffsetBounds(wrapElement) : Util.Bounds(wrapElement);\n parent.replaceChild(backupText, wrapElement);\n return bounds;\n }\n\n function renderText(el, textNode, stack) {\n var ctx = stack.ctx,\n color = getCSS(el, \"color\"),\n textDecoration = getCSS(el, \"textDecoration\"),\n textAlign = getCSS(el, \"textAlign\"),\n metrics,\n textList,\n state = {\n node: textNode,\n textOffset: 0\n };\n\n if (Util.trimText(textNode.nodeValue).length > 0) {\n textNode.nodeValue = textTransform(textNode.nodeValue, getCSS(el, \"textTransform\"));\n textAlign = textAlign.replace([\"-webkit-auto\"],[\"auto\"]);\n\n textList = (!options.letterRendering && /^(left|right|justify|auto)$/.test(textAlign) && noLetterSpacing(getCSS(el, \"letterSpacing\"))) ?\n textNode.nodeValue.split(/(\\b| )/)\n : textNode.nodeValue.split(\"\");\n\n metrics = setTextVariables(ctx, el, textDecoration, color);\n\n if (options.chinese) {\n textList.forEach(function(word, index) {\n if (/.*[\\u4E00-\\u9FA5].*$/.test(word)) {\n word = word.split(\"\");\n word.unshift(index, 1);\n textList.splice.apply(textList, word);\n }\n });\n }\n\n textList.forEach(function(text, index) {\n var bounds = getTextBounds(state, text, textDecoration, (index < textList.length - 1), stack.transform.matrix);\n if (bounds) {\n drawText(text, bounds.left, bounds.bottom, ctx);\n renderTextDecoration(ctx, textDecoration, bounds, metrics, color);\n }\n });\n }\n }\n\n function listPosition (element, val) {\n var boundElement = doc.createElement( \"boundelement\" ),\n originalType,\n bounds;\n\n boundElement.style.display = \"inline\";\n\n originalType = element.style.listStyleType;\n element.style.listStyleType = \"none\";\n\n boundElement.appendChild(doc.createTextNode(val));\n\n element.insertBefore(boundElement, element.firstChild);\n\n bounds = Util.Bounds(boundElement);\n element.removeChild(boundElement);\n element.style.listStyleType = originalType;\n return bounds;\n }\n\n function elementIndex(el) {\n var i = -1,\n count = 1,\n childs = el.parentNode.childNodes;\n\n if (el.parentNode) {\n while(childs[++i] !== el) {\n if (childs[i].nodeType === 1) {\n count++;\n }\n }\n return count;\n } else {\n return -1;\n }\n }\n\n function listItemText(element, type) {\n var currentIndex = elementIndex(element), text;\n switch(type){\n case \"decimal\":\n text = currentIndex;\n break;\n case \"decimal-leading-zero\":\n text = (currentIndex.toString().length === 1) ? currentIndex = \"0\" + currentIndex.toString() : currentIndex.toString();\n break;\n case \"upper-roman\":\n text = _html2canvas.Generate.ListRoman( currentIndex );\n break;\n case \"lower-roman\":\n text = _html2canvas.Generate.ListRoman( currentIndex ).toLowerCase();\n break;\n case \"lower-alpha\":\n text = _html2canvas.Generate.ListAlpha( currentIndex ).toLowerCase();\n break;\n case \"upper-alpha\":\n text = _html2canvas.Generate.ListAlpha( currentIndex );\n break;\n }\n\n return text + \". \";\n }\n\n function renderListItem(element, stack, elBounds) {\n var x,\n text,\n ctx = stack.ctx,\n type = getCSS(element, \"listStyleType\"),\n listBounds;\n\n if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {\n text = listItemText(element, type);\n listBounds = listPosition(element, text);\n setTextVariables(ctx, element, \"none\", getCSS(element, \"color\"));\n\n if (getCSS(element, \"listStylePosition\") === \"inside\") {\n ctx.setVariable(\"textAlign\", \"left\");\n x = elBounds.left;\n } else {\n return;\n }\n\n drawText(text, x, listBounds.bottom, ctx);\n }\n }\n\n function loadImage (src){\n var img = images[src];\n return (img && img.succeeded === true) ? img.img : false;\n }\n\n function clipBounds(src, dst){\n var x = Math.max(src.left, dst.left),\n y = Math.max(src.top, dst.top),\n x2 = Math.min((src.left + src.width), (dst.left + dst.width)),\n y2 = Math.min((src.top + src.height), (dst.top + dst.height));\n\n return {\n left:x,\n top:y,\n width:x2-x,\n height:y2-y\n };\n }\n\n function setZ(element, stack, parentStack){\n var newContext,\n isPositioned = stack.cssPosition !== 'static',\n zIndex = isPositioned ? getCSS(element, 'zIndex') : 'auto',\n opacity = getCSS(element, 'opacity'),\n isFloated = getCSS(element, 'cssFloat') !== 'none';\n\n // https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\n // When a new stacking context should be created:\n // the root element (HTML),\n // positioned (absolutely or relatively) with a z-index value other than \"auto\",\n // elements with an opacity value less than 1. (See the specification for opacity),\n // on mobile WebKit and Chrome 22+, position: fixed always creates a new stacking context, even when z-index is \"auto\" (See this post)\n\n stack.zIndex = newContext = h2czContext(zIndex);\n newContext.isPositioned = isPositioned;\n newContext.isFloated = isFloated;\n newContext.opacity = opacity;\n newContext.ownStacking = (zIndex !== 'auto' || opacity < 1);\n\n if (parentStack) {\n parentStack.zIndex.children.push(stack);\n }\n }\n\n function renderImage(ctx, element, image, bounds, borders) {\n\n var paddingLeft = getCSSInt(element, 'paddingLeft'),\n paddingTop = getCSSInt(element, 'paddingTop'),\n paddingRight = getCSSInt(element, 'paddingRight'),\n paddingBottom = getCSSInt(element, 'paddingBottom');\n\n drawImage(\n ctx,\n image,\n 0, //sx\n 0, //sy\n image.width, //sw\n image.height, //sh\n bounds.left + paddingLeft + borders[3].width, //dx\n bounds.top + paddingTop + borders[0].width, // dy\n bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight), //dw\n bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom) //dh\n );\n }\n\n function getBorderData(element) {\n return [\"Top\", \"Right\", \"Bottom\", \"Left\"].map(function(side) {\n return {\n width: getCSSInt(element, 'border' + side + 'Width'),\n color: getCSS(element, 'border' + side + 'Color')\n };\n });\n }\n\n function getBorderRadiusData(element) {\n return [\"TopLeft\", \"TopRight\", \"BottomRight\", \"BottomLeft\"].map(function(side) {\n return getCSS(element, 'border' + side + 'Radius');\n });\n }\n\n var getCurvePoints = (function(kappa) {\n\n return function(x, y, r1, r2) {\n var ox = (r1) * kappa, // control point offset horizontal\n oy = (r2) * kappa, // control point offset vertical\n xm = x + r1, // x-middle\n ym = y + r2; // y-middle\n return {\n topLeft: bezierCurve({\n x:x,\n y:ym\n }, {\n x:x,\n y:ym - oy\n }, {\n x:xm - ox,\n y:y\n }, {\n x:xm,\n y:y\n }),\n topRight: bezierCurve({\n x:x,\n y:y\n }, {\n x:x + ox,\n y:y\n }, {\n x:xm,\n y:ym - oy\n }, {\n x:xm,\n y:ym\n }),\n bottomRight: bezierCurve({\n x:xm,\n y:y\n }, {\n x:xm,\n y:y + oy\n }, {\n x:x + ox,\n y:ym\n }, {\n x:x,\n y:ym\n }),\n bottomLeft: bezierCurve({\n x:xm,\n y:ym\n }, {\n x:xm - ox,\n y:ym\n }, {\n x:x,\n y:y + oy\n }, {\n x:x,\n y:y\n })\n };\n };\n })(4 * ((Math.sqrt(2) - 1) / 3));\n\n function bezierCurve(start, startControl, endControl, end) {\n\n var lerp = function (a, b, t) {\n return {\n x:a.x + (b.x - a.x) * t,\n y:a.y + (b.y - a.y) * t\n };\n };\n\n return {\n start: start,\n startControl: startControl,\n endControl: endControl,\n end: end,\n subdivide: function(t) {\n var ab = lerp(start, startControl, t),\n bc = lerp(startControl, endControl, t),\n cd = lerp(endControl, end, t),\n abbc = lerp(ab, bc, t),\n bccd = lerp(bc, cd, t),\n dest = lerp(abbc, bccd, t);\n return [bezierCurve(start, ab, abbc, dest), bezierCurve(dest, bccd, cd, end)];\n },\n curveTo: function(borderArgs) {\n borderArgs.push([\"bezierCurve\", startControl.x, startControl.y, endControl.x, endControl.y, end.x, end.y]);\n },\n curveToReversed: function(borderArgs) {\n borderArgs.push([\"bezierCurve\", endControl.x, endControl.y, startControl.x, startControl.y, start.x, start.y]);\n }\n };\n }\n\n function parseCorner(borderArgs, radius1, radius2, corner1, corner2, x, y) {\n if (radius1[0] > 0 || radius1[1] > 0) {\n borderArgs.push([\"line\", corner1[0].start.x, corner1[0].start.y]);\n corner1[0].curveTo(borderArgs);\n corner1[1].curveTo(borderArgs);\n } else {\n borderArgs.push([\"line\", x, y]);\n }\n\n if (radius2[0] > 0 || radius2[1] > 0) {\n borderArgs.push([\"line\", corner2[0].start.x, corner2[0].start.y]);\n }\n }\n\n function drawSide(borderData, radius1, radius2, outer1, inner1, outer2, inner2) {\n var borderArgs = [];\n\n if (radius1[0] > 0 || radius1[1] > 0) {\n borderArgs.push([\"line\", outer1[1].start.x, outer1[1].start.y]);\n outer1[1].curveTo(borderArgs);\n } else {\n borderArgs.push([ \"line\", borderData.c1[0], borderData.c1[1]]);\n }\n\n if (radius2[0] > 0 || radius2[1] > 0) {\n borderArgs.push([\"line\", outer2[0].start.x, outer2[0].start.y]);\n outer2[0].curveTo(borderArgs);\n borderArgs.push([\"line\", inner2[0].end.x, inner2[0].end.y]);\n inner2[0].curveToReversed(borderArgs);\n } else {\n borderArgs.push([ \"line\", borderData.c2[0], borderData.c2[1]]);\n borderArgs.push([ \"line\", borderData.c3[0], borderData.c3[1]]);\n }\n\n if (radius1[0] > 0 || radius1[1] > 0) {\n borderArgs.push([\"line\", inner1[1].end.x, inner1[1].end.y]);\n inner1[1].curveToReversed(borderArgs);\n } else {\n borderArgs.push([ \"line\", borderData.c4[0], borderData.c4[1]]);\n }\n\n return borderArgs;\n }\n\n function calculateCurvePoints(bounds, borderRadius, borders) {\n\n var x = bounds.left,\n y = bounds.top,\n width = bounds.width,\n height = bounds.height,\n\n tlh = borderRadius[0][0],\n tlv = borderRadius[0][1],\n trh = borderRadius[1][0],\n trv = borderRadius[1][1],\n brh = borderRadius[2][0],\n brv = borderRadius[2][1],\n blh = borderRadius[3][0],\n blv = borderRadius[3][1],\n\n topWidth = width - trh,\n rightHeight = height - brv,\n bottomWidth = width - brh,\n leftHeight = height - blv;\n\n return {\n topLeftOuter: getCurvePoints(\n x,\n y,\n tlh,\n tlv\n ).topLeft.subdivide(0.5),\n\n topLeftInner: getCurvePoints(\n x + borders[3].width,\n y + borders[0].width,\n Math.max(0, tlh - borders[3].width),\n Math.max(0, tlv - borders[0].width)\n ).topLeft.subdivide(0.5),\n\n topRightOuter: getCurvePoints(\n x + topWidth,\n y,\n trh,\n trv\n ).topRight.subdivide(0.5),\n\n topRightInner: getCurvePoints(\n x + Math.min(topWidth, width + borders[3].width),\n y + borders[0].width,\n (topWidth > width + borders[3].width) ? 0 :trh - borders[3].width,\n trv - borders[0].width\n ).topRight.subdivide(0.5),\n\n bottomRightOuter: getCurvePoints(\n x + bottomWidth,\n y + rightHeight,\n brh,\n brv\n ).bottomRight.subdivide(0.5),\n\n bottomRightInner: getCurvePoints(\n x + Math.min(bottomWidth, width + borders[3].width),\n y + Math.min(rightHeight, height + borders[0].width),\n Math.max(0, brh - borders[1].width),\n Math.max(0, brv - borders[2].width)\n ).bottomRight.subdivide(0.5),\n\n bottomLeftOuter: getCurvePoints(\n x,\n y + leftHeight,\n blh,\n blv\n ).bottomLeft.subdivide(0.5),\n\n bottomLeftInner: getCurvePoints(\n x + borders[3].width,\n y + leftHeight,\n Math.max(0, blh - borders[3].width),\n Math.max(0, blv - borders[2].width)\n ).bottomLeft.subdivide(0.5)\n };\n }\n\n function getBorderClip(element, borderPoints, borders, radius, bounds) {\n var backgroundClip = getCSS(element, 'backgroundClip'),\n borderArgs = [];\n\n switch(backgroundClip) {\n case \"content-box\":\n case \"padding-box\":\n parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftInner, borderPoints.topRightInner, bounds.left + borders[3].width, bounds.top + borders[0].width);\n parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightInner, borderPoints.bottomRightInner, bounds.left + bounds.width - borders[1].width, bounds.top + borders[0].width);\n parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightInner, borderPoints.bottomLeftInner, bounds.left + bounds.width - borders[1].width, bounds.top + bounds.height - borders[2].width);\n parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftInner, borderPoints.topLeftInner, bounds.left + borders[3].width, bounds.top + bounds.height - borders[2].width);\n break;\n\n default:\n parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftOuter, borderPoints.topRightOuter, bounds.left, bounds.top);\n parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightOuter, borderPoints.bottomRightOuter, bounds.left + bounds.width, bounds.top);\n parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightOuter, borderPoints.bottomLeftOuter, bounds.left + bounds.width, bounds.top + bounds.height);\n parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftOuter, borderPoints.topLeftOuter, bounds.left, bounds.top + bounds.height);\n break;\n }\n\n return borderArgs;\n }\n\n function parseBorders(element, bounds, borders){\n var x = bounds.left,\n y = bounds.top,\n width = bounds.width,\n height = bounds.height,\n borderSide,\n bx,\n by,\n bw,\n bh,\n borderArgs,\n // http://www.w3.org/TR/css3-background/#the-border-radius\n borderRadius = getBorderRadiusData(element),\n borderPoints = calculateCurvePoints(bounds, borderRadius, borders),\n borderData = {\n clip: getBorderClip(element, borderPoints, borders, borderRadius, bounds),\n borders: []\n };\n\n for (borderSide = 0; borderSide < 4; borderSide++) {\n\n if (borders[borderSide].width > 0) {\n bx = x;\n by = y;\n bw = width;\n bh = height - (borders[2].width);\n\n switch(borderSide) {\n case 0:\n // top border\n bh = borders[0].width;\n\n borderArgs = drawSide({\n c1: [bx, by],\n c2: [bx + bw, by],\n c3: [bx + bw - borders[1].width, by + bh],\n c4: [bx + borders[3].width, by + bh]\n }, borderRadius[0], borderRadius[1],\n borderPoints.topLeftOuter, borderPoints.topLeftInner, borderPoints.topRightOuter, borderPoints.topRightInner);\n break;\n case 1:\n // right border\n bx = x + width - (borders[1].width);\n bw = borders[1].width;\n\n borderArgs = drawSide({\n c1: [bx + bw, by],\n c2: [bx + bw, by + bh + borders[2].width],\n c3: [bx, by + bh],\n c4: [bx, by + borders[0].width]\n }, borderRadius[1], borderRadius[2],\n borderPoints.topRightOuter, borderPoints.topRightInner, borderPoints.bottomRightOuter, borderPoints.bottomRightInner);\n break;\n case 2:\n // bottom border\n by = (by + height) - (borders[2].width);\n bh = borders[2].width;\n\n borderArgs = drawSide({\n c1: [bx + bw, by + bh],\n c2: [bx, by + bh],\n c3: [bx + borders[3].width, by],\n c4: [bx + bw - borders[3].width, by]\n }, borderRadius[2], borderRadius[3],\n borderPoints.bottomRightOuter, borderPoints.bottomRightInner, borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner);\n break;\n case 3:\n // left border\n bw = borders[3].width;\n\n borderArgs = drawSide({\n c1: [bx, by + bh + borders[2].width],\n c2: [bx, by],\n c3: [bx + bw, by + borders[0].width],\n c4: [bx + bw, by + bh]\n }, borderRadius[3], borderRadius[0],\n borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner, borderPoints.topLeftOuter, borderPoints.topLeftInner);\n break;\n }\n\n borderData.borders.push({\n args: borderArgs,\n color: borders[borderSide].color\n });\n\n }\n }\n\n return borderData;\n }\n\n function createShape(ctx, args) {\n var shape = ctx.drawShape();\n args.forEach(function(border, index) {\n shape[(index === 0) ? \"moveTo\" : border[0] + \"To\" ].apply(null, border.slice(1));\n });\n return shape;\n }\n\n function renderBorders(ctx, borderArgs, color) {\n if (color !== \"transparent\") {\n ctx.setVariable( \"fillStyle\", color);\n createShape(ctx, borderArgs);\n ctx.fill();\n numDraws+=1;\n }\n }\n\n function renderFormValue (el, bounds, stack){\n\n var valueWrap = doc.createElement('valuewrap'),\n cssPropertyArray = ['lineHeight','textAlign','fontFamily','color','fontSize','paddingLeft','paddingTop','width','height','border','borderLeftWidth','borderTopWidth'],\n textValue,\n textNode;\n\n cssPropertyArray.forEach(function(property) {\n try {\n valueWrap.style[property] = getCSS(el, property);\n } catch(e) {\n // Older IE has issues with \"border\"\n Util.log(\"html2canvas: Parse: Exception caught in renderFormValue: \" + e.message);\n }\n });\n\n valueWrap.style.borderColor = \"black\";\n valueWrap.style.borderStyle = \"solid\";\n valueWrap.style.display = \"block\";\n valueWrap.style.position = \"absolute\";\n\n if (/^(submit|reset|button|text|password)$/.test(el.type) || el.nodeName === \"SELECT\"){\n valueWrap.style.lineHeight = getCSS(el, \"height\");\n }\n\n valueWrap.style.top = bounds.top + \"px\";\n valueWrap.style.left = bounds.left + \"px\";\n\n textValue = (el.nodeName === \"SELECT\") ? (el.options[el.selectedIndex] || 0).text : el.value;\n if(!textValue) {\n textValue = el.placeholder;\n }\n\n textNode = doc.createTextNode(textValue);\n\n valueWrap.appendChild(textNode);\n body.appendChild(valueWrap);\n\n renderText(el, textNode, stack);\n body.removeChild(valueWrap);\n }\n\n function drawImage (ctx) {\n ctx.drawImage.apply(ctx, Array.prototype.slice.call(arguments, 1));\n numDraws+=1;\n }\n\n function getPseudoElement(el, which) {\n var elStyle = window.getComputedStyle(el, which);\n if(!elStyle || !elStyle.content || elStyle.content === \"none\" || elStyle.content === \"-moz-alt-content\" || elStyle.display === \"none\") {\n return;\n }\n var content = elStyle.content + '',\n first = content.substr( 0, 1 );\n //strips quotes\n if(first === content.substr( content.length - 1 ) && first.match(/'|\"/)) {\n content = content.substr( 1, content.length - 2 );\n }\n\n var isImage = content.substr( 0, 3 ) === 'url',\n elps = document.createElement( isImage ? 'img' : 'span' );\n\n elps.className = pseudoHide + \"-before \" + pseudoHide + \"-after\";\n\n Object.keys(elStyle).filter(indexedProperty).forEach(function(prop) {\n // Prevent assigning of read only CSS Rules, ex. length, parentRule\n try {\n elps.style[prop] = elStyle[prop];\n } catch (e) {\n Util.log(['Tried to assign readonly property ', prop, 'Error:', e]);\n }\n });\n\n if(isImage) {\n elps.src = Util.parseBackgroundImage(content)[0].args[0];\n } else {\n elps.innerHTML = content;\n }\n return elps;\n }\n\n function indexedProperty(property) {\n return (isNaN(window.parseInt(property, 10)));\n }\n\n function injectPseudoElements(el, stack) {\n var before = getPseudoElement(el, ':before'),\n after = getPseudoElement(el, ':after');\n if(!before && !after) {\n return;\n }\n\n if(before) {\n el.className += \" \" + pseudoHide + \"-before\";\n el.parentNode.insertBefore(before, el);\n parseElement(before, stack, true);\n el.parentNode.removeChild(before);\n el.className = el.className.replace(pseudoHide + \"-before\", \"\").trim();\n }\n\n if (after) {\n el.className += \" \" + pseudoHide + \"-after\";\n el.appendChild(after);\n parseElement(after, stack, true);\n el.removeChild(after);\n el.className = el.className.replace(pseudoHide + \"-after\", \"\").trim();\n }\n\n }\n\n function renderBackgroundRepeat(ctx, image, backgroundPosition, bounds) {\n var offsetX = Math.round(bounds.left + backgroundPosition.left),\n offsetY = Math.round(bounds.top + backgroundPosition.top);\n\n ctx.createPattern(image);\n ctx.translate(offsetX, offsetY);\n ctx.fill();\n ctx.translate(-offsetX, -offsetY);\n }\n\n function backgroundRepeatShape(ctx, image, backgroundPosition, bounds, left, top, width, height) {\n var args = [];\n args.push([\"line\", Math.round(left), Math.round(top)]);\n args.push([\"line\", Math.round(left + width), Math.round(top)]);\n args.push([\"line\", Math.round(left + width), Math.round(height + top)]);\n args.push([\"line\", Math.round(left), Math.round(height + top)]);\n createShape(ctx, args);\n ctx.save();\n ctx.clip();\n renderBackgroundRepeat(ctx, image, backgroundPosition, bounds);\n ctx.restore();\n }\n\n function renderBackgroundColor(ctx, backgroundBounds, bgcolor) {\n renderRect(\n ctx,\n backgroundBounds.left,\n backgroundBounds.top,\n backgroundBounds.width,\n backgroundBounds.height,\n bgcolor\n );\n }\n\n function renderBackgroundRepeating(el, bounds, ctx, image, imageIndex) {\n var backgroundSize = Util.BackgroundSize(el, bounds, image, imageIndex),\n backgroundPosition = Util.BackgroundPosition(el, bounds, image, imageIndex, backgroundSize),\n backgroundRepeat = getCSS(el, \"backgroundRepeat\").split(\",\").map(Util.trimText);\n\n image = resizeImage(image, backgroundSize);\n\n backgroundRepeat = backgroundRepeat[imageIndex] || backgroundRepeat[0];\n\n switch (backgroundRepeat) {\n case \"repeat-x\":\n backgroundRepeatShape(ctx, image, backgroundPosition, bounds,\n bounds.left, bounds.top + backgroundPosition.top, 99999, image.height);\n break;\n\n case \"repeat-y\":\n backgroundRepeatShape(ctx, image, backgroundPosition, bounds,\n bounds.left + backgroundPosition.left, bounds.top, image.width, 99999);\n break;\n\n case \"no-repeat\":\n backgroundRepeatShape(ctx, image, backgroundPosition, bounds,\n bounds.left + backgroundPosition.left, bounds.top + backgroundPosition.top, image.width, image.height);\n break;\n\n default:\n renderBackgroundRepeat(ctx, image, backgroundPosition, {\n top: bounds.top,\n left: bounds.left,\n width: image.width,\n height: image.height\n });\n break;\n }\n }\n\n function renderBackgroundImage(element, bounds, ctx) {\n var backgroundImage = getCSS(element, \"backgroundImage\"),\n backgroundImages = Util.parseBackgroundImage(backgroundImage),\n image,\n imageIndex = backgroundImages.length;\n\n while(imageIndex--) {\n backgroundImage = backgroundImages[imageIndex];\n\n if (!backgroundImage.args || backgroundImage.args.length === 0) {\n continue;\n }\n\n var key = backgroundImage.method === 'url' ?\n backgroundImage.args[0] :\n backgroundImage.value;\n\n image = loadImage(key);\n\n // TODO add support for background-origin\n if (image) {\n renderBackgroundRepeating(element, bounds, ctx, image, imageIndex);\n } else {\n Util.log(\"html2canvas: Error loading background:\", backgroundImage);\n }\n }\n }\n\n function resizeImage(image, bounds) {\n if(image.width === bounds.width && image.height === bounds.height) {\n return image;\n }\n\n var ctx, canvas = doc.createElement('canvas');\n canvas.width = bounds.width;\n canvas.height = bounds.height;\n ctx = canvas.getContext(\"2d\");\n drawImage(ctx, image, 0, 0, image.width, image.height, 0, 0, bounds.width, bounds.height );\n return canvas;\n }\n\n function setOpacity(ctx, element, parentStack) {\n return ctx.setVariable(\"globalAlpha\", getCSS(element, \"opacity\") * ((parentStack) ? parentStack.opacity : 1));\n }\n\n function removePx(str) {\n return str.replace(\"px\", \"\");\n }\n\n var transformRegExp = /(matrix)\\((.+)\\)/;\n\n function getTransform(element, parentStack) {\n var transform = getCSS(element, \"transform\") || getCSS(element, \"-webkit-transform\") || getCSS(element, \"-moz-transform\") || getCSS(element, \"-ms-transform\") || getCSS(element, \"-o-transform\");\n var transformOrigin = getCSS(element, \"transform-origin\") || getCSS(element, \"-webkit-transform-origin\") || getCSS(element, \"-moz-transform-origin\") || getCSS(element, \"-ms-transform-origin\") || getCSS(element, \"-o-transform-origin\") || \"0px 0px\";\n\n transformOrigin = transformOrigin.split(\" \").map(removePx).map(Util.asFloat);\n\n var matrix;\n if (transform && transform !== \"none\") {\n var match = transform.match(transformRegExp);\n if (match) {\n switch(match[1]) {\n case \"matrix\":\n matrix = match[2].split(\",\").map(Util.trimText).map(Util.asFloat);\n break;\n }\n }\n }\n\n return {\n origin: transformOrigin,\n matrix: matrix\n };\n }\n\n function createStack(element, parentStack, bounds, transform) {\n var ctx = h2cRenderContext((!parentStack) ? documentWidth() : bounds.width , (!parentStack) ? documentHeight() : bounds.height),\n stack = {\n ctx: ctx,\n opacity: setOpacity(ctx, element, parentStack),\n cssPosition: getCSS(element, \"position\"),\n borders: getBorderData(element),\n transform: transform,\n clip: (parentStack && parentStack.clip) ? Util.Extend( {}, parentStack.clip ) : null\n };\n\n setZ(element, stack, parentStack);\n\n // TODO correct overflow for absolute content residing under a static position\n if (options.useOverflow === true && /(hidden|scroll|auto)/.test(getCSS(element, \"overflow\")) === true && /(BODY)/i.test(element.nodeName) === false){\n stack.clip = (stack.clip) ? clipBounds(stack.clip, bounds) : bounds;\n }\n\n return stack;\n }\n\n function getBackgroundBounds(borders, bounds, clip) {\n var backgroundBounds = {\n left: bounds.left + borders[3].width,\n top: bounds.top + borders[0].width,\n width: bounds.width - (borders[1].width + borders[3].width),\n height: bounds.height - (borders[0].width + borders[2].width)\n };\n\n if (clip) {\n backgroundBounds = clipBounds(backgroundBounds, clip);\n }\n\n return backgroundBounds;\n }\n\n function getBounds(element, transform) {\n var bounds = (transform.matrix) ? Util.OffsetBounds(element) : Util.Bounds(element);\n transform.origin[0] += bounds.left;\n transform.origin[1] += bounds.top;\n return bounds;\n }\n\n function renderElement(element, parentStack, pseudoElement, ignoreBackground) {\n var transform = getTransform(element, parentStack),\n bounds = getBounds(element, transform),\n image,\n stack = createStack(element, parentStack, bounds, transform),\n borders = stack.borders,\n ctx = stack.ctx,\n backgroundBounds = getBackgroundBounds(borders, bounds, stack.clip),\n borderData = parseBorders(element, bounds, borders),\n backgroundColor = (ignoreElementsRegExp.test(element.nodeName)) ? \"#efefef\" : getCSS(element, \"backgroundColor\");\n\n\n createShape(ctx, borderData.clip);\n\n ctx.save();\n ctx.clip();\n\n if (backgroundBounds.height > 0 && backgroundBounds.width > 0 && !ignoreBackground) {\n renderBackgroundColor(ctx, bounds, backgroundColor);\n renderBackgroundImage(element, backgroundBounds, ctx);\n } else if (ignoreBackground) {\n stack.backgroundColor = backgroundColor;\n }\n\n ctx.restore();\n\n borderData.borders.forEach(function(border) {\n renderBorders(ctx, border.args, border.color);\n });\n\n if (!pseudoElement) {\n injectPseudoElements(element, stack);\n }\n\n switch(element.nodeName){\n case \"IMG\":\n if ((image = loadImage(element.getAttribute('src')))) {\n renderImage(ctx, element, image, bounds, borders);\n } else {\n Util.log(\"html2canvas: Error loading :\" + element.getAttribute('src'));\n }\n break;\n case \"INPUT\":\n // TODO add all relevant type's, i.e. HTML5 new stuff\n // todo add support for placeholder attribute for browsers which support it\n if (/^(text|url|email|submit|button|reset)$/.test(element.type) && (element.value || element.placeholder || \"\").length > 0){\n renderFormValue(element, bounds, stack);\n }\n break;\n case \"TEXTAREA\":\n if ((element.value || element.placeholder || \"\").length > 0){\n renderFormValue(element, bounds, stack);\n }\n break;\n case \"SELECT\":\n if ((element.options||element.placeholder || \"\").length > 0){\n renderFormValue(element, bounds, stack);\n }\n break;\n case \"LI\":\n renderListItem(element, stack, backgroundBounds);\n break;\n case \"CANVAS\":\n renderImage(ctx, element, element, bounds, borders);\n break;\n }\n\n return stack;\n }\n\n function isElementVisible(element) {\n return (getCSS(element, 'display') !== \"none\" && getCSS(element, 'visibility') !== \"hidden\" && !element.hasAttribute(\"data-html2canvas-ignore\"));\n }\n\n function parseElement (element, stack, pseudoElement) {\n if (isElementVisible(element)) {\n stack = renderElement(element, stack, pseudoElement, false) || stack;\n if (!ignoreElementsRegExp.test(element.nodeName)) {\n parseChildren(element, stack, pseudoElement);\n }\n }\n }\n\n function parseChildren(element, stack, pseudoElement) {\n Util.Children(element).forEach(function(node) {\n if (node.nodeType === node.ELEMENT_NODE) {\n parseElement(node, stack, pseudoElement);\n } else if (node.nodeType === node.TEXT_NODE) {\n renderText(element, node, stack);\n }\n });\n }\n\n function init() {\n var background = getCSS(document.documentElement, \"backgroundColor\"),\n transparentBackground = (Util.isTransparent(background) && element === document.body),\n stack = renderElement(element, null, false, transparentBackground);\n parseChildren(element, stack);\n\n if (transparentBackground) {\n background = stack.backgroundColor;\n }\n\n body.removeChild(hidePseudoElements);\n return {\n backgroundColor: background,\n stack: stack\n };\n }\n\n return init();\n};\n\nfunction h2czContext(zindex) {\n return {\n zindex: zindex,\n children: []\n };\n}\n\n_html2canvas.Preload = function( options ) {\n\n var images = {\n numLoaded: 0, // also failed are counted here\n numFailed: 0,\n numTotal: 0,\n cleanupDone: false\n },\n pageOrigin,\n Util = _html2canvas.Util,\n methods,\n i,\n count = 0,\n element = options.elements[0] || document.body,\n doc = element.ownerDocument,\n domImages = element.getElementsByTagName('img'), // Fetch images of the present element only\n imgLen = domImages.length,\n link = doc.createElement(\"a\"),\n supportCORS = (function( img ){\n return (img.crossOrigin !== undefined);\n })(new Image()),\n timeoutTimer;\n\n link.href = window.location.href;\n pageOrigin = link.protocol + link.host;\n\n function isSameOrigin(url){\n link.href = url;\n link.href = link.href; // YES, BELIEVE IT OR NOT, that is required for IE9 - http://jsfiddle.net/niklasvh/2e48b/\n var origin = link.protocol + link.host;\n return (origin === pageOrigin);\n }\n\n function start(){\n Util.log(\"html2canvas: start: images: \" + images.numLoaded + \" / \" + images.numTotal + \" (failed: \" + images.numFailed + \")\");\n if (!images.firstRun && images.numLoaded >= images.numTotal){\n Util.log(\"Finished loading images: # \" + images.numTotal + \" (failed: \" + images.numFailed + \")\");\n\n if (typeof options.complete === \"function\"){\n options.complete(images);\n }\n\n }\n }\n\n // TODO modify proxy to serve images with CORS enabled, where available\n function proxyGetImage(url, img, imageObj){\n var callback_name,\n scriptUrl = options.proxy,\n script;\n\n link.href = url;\n url = link.href; // work around for pages with base href=\"\" set - WARNING: this may change the url\n\n callback_name = 'html2canvas_' + (count++);\n imageObj.callbackname = callback_name;\n\n if (scriptUrl.indexOf(\"?\") > -1) {\n scriptUrl += \"&\";\n } else {\n scriptUrl += \"?\";\n }\n scriptUrl += 'url=' + encodeURIComponent(url) + '&callback=' + callback_name;\n script = doc.createElement(\"script\");\n\n window[callback_name] = function(a){\n if (a.substring(0,6) === \"error:\"){\n imageObj.succeeded = false;\n images.numLoaded++;\n images.numFailed++;\n start();\n } else {\n setImageLoadHandlers(img, imageObj);\n img.src = a;\n }\n window[callback_name] = undefined; // to work with IE<9 // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)\n try {\n delete window[callback_name]; // for all browser that support this\n } catch(ex) {}\n script.parentNode.removeChild(script);\n script = null;\n delete imageObj.script;\n delete imageObj.callbackname;\n };\n\n script.setAttribute(\"type\", \"text/javascript\");\n script.setAttribute(\"src\", scriptUrl);\n imageObj.script = script;\n window.document.body.appendChild(script);\n\n }\n\n function loadPseudoElement(element, type) {\n var style = window.getComputedStyle(element, type),\n content = style.content;\n if (content.substr(0, 3) === 'url') {\n methods.loadImage(_html2canvas.Util.parseBackgroundImage(content)[0].args[0]);\n }\n loadBackgroundImages(style.backgroundImage, element);\n }\n\n function loadPseudoElementImages(element) {\n loadPseudoElement(element, \":before\");\n loadPseudoElement(element, \":after\");\n }\n\n function loadGradientImage(backgroundImage, bounds) {\n var img = _html2canvas.Generate.Gradient(backgroundImage, bounds);\n\n if (img !== undefined){\n images[backgroundImage] = {\n img: img,\n succeeded: true\n };\n images.numTotal++;\n images.numLoaded++;\n start();\n }\n }\n\n function invalidBackgrounds(background_image) {\n return (background_image && background_image.method && background_image.args && background_image.args.length > 0 );\n }\n\n function loadBackgroundImages(background_image, el) {\n var bounds;\n\n _html2canvas.Util.parseBackgroundImage(background_image).filter(invalidBackgrounds).forEach(function(background_image) {\n if (background_image.method === 'url') {\n methods.loadImage(background_image.args[0]);\n } else if(background_image.method.match(/\\-?gradient$/)) {\n if(bounds === undefined) {\n bounds = _html2canvas.Util.Bounds(el);\n }\n loadGradientImage(background_image.value, bounds);\n }\n });\n }\n\n function getImages (el) {\n var elNodeType = false;\n\n // Firefox fails with permission denied on pages with iframes\n try {\n Util.Children(el).forEach(getImages);\n }\n catch( e ) {}\n\n try {\n elNodeType = el.nodeType;\n } catch (ex) {\n elNodeType = false;\n Util.log(\"html2canvas: failed to access some element's nodeType - Exception: \" + ex.message);\n }\n\n if (elNodeType === 1 || elNodeType === undefined) {\n loadPseudoElementImages(el);\n try {\n loadBackgroundImages(Util.getCSS(el, 'backgroundImage'), el);\n } catch(e) {\n Util.log(\"html2canvas: failed to get background-image - Exception: \" + e.message);\n }\n loadBackgroundImages(el);\n }\n }\n\n function setImageLoadHandlers(img, imageObj) {\n img.onload = function() {\n if ( imageObj.timer !== undefined ) {\n // CORS succeeded\n window.clearTimeout( imageObj.timer );\n }\n\n images.numLoaded++;\n imageObj.succeeded = true;\n img.onerror = img.onload = null;\n start();\n };\n img.onerror = function() {\n if (img.crossOrigin === \"anonymous\") {\n // CORS failed\n window.clearTimeout( imageObj.timer );\n\n // let's try with proxy instead\n if ( options.proxy ) {\n var src = img.src;\n img = new Image();\n imageObj.img = img;\n img.src = src;\n\n proxyGetImage( img.src, img, imageObj );\n return;\n }\n }\n\n images.numLoaded++;\n images.numFailed++;\n imageObj.succeeded = false;\n img.onerror = img.onload = null;\n start();\n };\n }\n\n methods = {\n loadImage: function( src ) {\n var img, imageObj;\n if ( src && images[src] === undefined ) {\n img = new Image();\n if ( src.match(/data:image\\/.*;base64,/i) ) {\n img.src = src.replace(/url\\(['\"]{0,}|['\"]{0,}\\)$/ig, '');\n imageObj = images[src] = {\n img: img\n };\n images.numTotal++;\n setImageLoadHandlers(img, imageObj);\n } else if ( isSameOrigin( src ) || options.allowTaint === true ) {\n imageObj = images[src] = {\n img: img\n };\n images.numTotal++;\n setImageLoadHandlers(img, imageObj);\n img.src = src;\n } else if ( supportCORS && !options.allowTaint && options.useCORS ) {\n // attempt to load with CORS\n\n img.crossOrigin = \"anonymous\";\n imageObj = images[src] = {\n img: img\n };\n images.numTotal++;\n setImageLoadHandlers(img, imageObj);\n img.src = src;\n } else if ( options.proxy ) {\n imageObj = images[src] = {\n img: img\n };\n images.numTotal++;\n proxyGetImage( src, img, imageObj );\n }\n }\n\n },\n cleanupDOM: function(cause) {\n var img, src;\n if (!images.cleanupDone) {\n if (cause && typeof cause === \"string\") {\n Util.log(\"html2canvas: Cleanup because: \" + cause);\n } else {\n Util.log(\"html2canvas: Cleanup after timeout: \" + options.timeout + \" ms.\");\n }\n\n for (src in images) {\n if (images.hasOwnProperty(src)) {\n img = images[src];\n if (typeof img === \"object\" && img.callbackname && img.succeeded === undefined) {\n // cancel proxy image request\n window[img.callbackname] = undefined; // to work with IE<9 // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)\n try {\n delete window[img.callbackname]; // for all browser that support this\n } catch(ex) {}\n if (img.script && img.script.parentNode) {\n img.script.setAttribute(\"src\", \"about:blank\"); // try to cancel running request\n img.script.parentNode.removeChild(img.script);\n }\n images.numLoaded++;\n images.numFailed++;\n Util.log(\"html2canvas: Cleaned up failed img: '\" + src + \"' Steps: \" + images.numLoaded + \" / \" + images.numTotal);\n }\n }\n }\n\n // cancel any pending requests\n if(window.stop !== undefined) {\n window.stop();\n } else if(document.execCommand !== undefined) {\n document.execCommand(\"Stop\", false);\n }\n if (document.close !== undefined) {\n document.close();\n }\n images.cleanupDone = true;\n if (!(cause && typeof cause === \"string\")) {\n start();\n }\n }\n },\n\n renderingDone: function() {\n if (timeoutTimer) {\n window.clearTimeout(timeoutTimer);\n }\n }\n };\n\n if (options.timeout > 0) {\n timeoutTimer = window.setTimeout(methods.cleanupDOM, options.timeout);\n }\n\n Util.log('html2canvas: Preload starts: finding background-images');\n images.firstRun = true;\n\n getImages(element);\n\n Util.log('html2canvas: Preload: Finding images');\n // load images\n for (i = 0; i < imgLen; i+=1){\n methods.loadImage( domImages[i].getAttribute( \"src\" ) );\n }\n\n images.firstRun = false;\n Util.log('html2canvas: Preload: Done.');\n if (images.numTotal === images.numLoaded) {\n start();\n }\n\n return methods;\n};\n\n_html2canvas.Renderer = function(parseQueue, options){\n\n // http://www.w3.org/TR/CSS21/zindex.html\n function createRenderQueue(parseQueue) {\n var queue = [],\n rootContext;\n\n rootContext = (function buildStackingContext(rootNode) {\n var rootContext = {};\n function insert(context, node, specialParent) {\n var zi = (node.zIndex.zindex === 'auto') ? 0 : Number(node.zIndex.zindex),\n contextForChildren = context, // the stacking context for children\n isPositioned = node.zIndex.isPositioned,\n isFloated = node.zIndex.isFloated,\n stub = {node: node},\n childrenDest = specialParent; // where children without z-index should be pushed into\n\n if (node.zIndex.ownStacking) {\n // '!' comes before numbers in sorted array\n contextForChildren = stub.context = { '!': [{node:node, children: []}]};\n childrenDest = undefined;\n } else if (isPositioned || isFloated) {\n childrenDest = stub.children = [];\n }\n\n if (zi === 0 && specialParent) {\n specialParent.push(stub);\n } else {\n if (!context[zi]) { context[zi] = []; }\n context[zi].push(stub);\n }\n\n node.zIndex.children.forEach(function(childNode) {\n insert(contextForChildren, childNode, childrenDest);\n });\n }\n insert(rootContext, rootNode);\n return rootContext;\n })(parseQueue);\n\n function sortZ(context) {\n Object.keys(context).sort().forEach(function(zi) {\n var nonPositioned = [],\n floated = [],\n positioned = [],\n list = [];\n\n // positioned after static\n context[zi].forEach(function(v) {\n if (v.node.zIndex.isPositioned || v.node.zIndex.opacity < 1) {\n // http://www.w3.org/TR/css3-color/#transparency\n // non-positioned element with opactiy < 1 should be stacked as if it were a positioned element with ‘z-index: 0’ and ‘opacity: 1’.\n positioned.push(v);\n } else if (v.node.zIndex.isFloated) {\n floated.push(v);\n } else {\n nonPositioned.push(v);\n }\n });\n\n (function walk(arr) {\n arr.forEach(function(v) {\n list.push(v);\n if (v.children) { walk(v.children); }\n });\n })(nonPositioned.concat(floated, positioned));\n\n list.forEach(function(v) {\n if (v.context) {\n sortZ(v.context);\n } else {\n queue.push(v.node);\n }\n });\n });\n }\n\n sortZ(rootContext);\n\n return queue;\n }\n\n function getRenderer(rendererName) {\n var renderer;\n\n if (typeof options.renderer === \"string\" && _html2canvas.Renderer[rendererName] !== undefined) {\n renderer = _html2canvas.Renderer[rendererName](options);\n } else if (typeof rendererName === \"function\") {\n renderer = rendererName(options);\n } else {\n throw new Error(\"Unknown renderer\");\n }\n\n if ( typeof renderer !== \"function\" ) {\n throw new Error(\"Invalid renderer defined\");\n }\n return renderer;\n }\n\n return getRenderer(options.renderer)(parseQueue, options, document, createRenderQueue(parseQueue.stack), _html2canvas);\n};\n\n_html2canvas.Util.Support = function (options, doc) {\n\n function supportSVGRendering() {\n var img = new Image(),\n canvas = doc.createElement(\"canvas\"),\n ctx = (canvas.getContext === undefined) ? false : canvas.getContext(\"2d\");\n if (ctx === false) {\n return false;\n }\n canvas.width = canvas.height = 10;\n img.src = [\n \"data:image/svg+xml,\",\n \"\",\n \"\",\n \"
\",\n \"sup\",\n \"
\",\n \"
\",\n \"
\"\n ].join(\"\");\n try {\n ctx.drawImage(img, 0, 0);\n canvas.toDataURL();\n } catch(e) {\n return false;\n }\n _html2canvas.Util.log('html2canvas: Parse: SVG powered rendering available');\n return true;\n }\n\n // Test whether we can use ranges to measure bounding boxes\n // Opera doesn't provide valid bounds.height/bottom even though it supports the method.\n\n function supportRangeBounds() {\n var r, testElement, rangeBounds, rangeHeight, support = false;\n\n if (doc.createRange) {\n r = doc.createRange();\n if (r.getBoundingClientRect) {\n testElement = doc.createElement('boundtest');\n testElement.style.height = \"123px\";\n testElement.style.display = \"block\";\n doc.body.appendChild(testElement);\n\n r.selectNode(testElement);\n rangeBounds = r.getBoundingClientRect();\n rangeHeight = rangeBounds.height;\n\n if (rangeHeight === 123) {\n support = true;\n }\n doc.body.removeChild(testElement);\n }\n }\n\n return support;\n }\n\n return {\n rangeBounds: supportRangeBounds(),\n svgRendering: options.svgRendering && supportSVGRendering()\n };\n};\nwindow.html2canvas = function(elements, opts) {\n elements = (elements.length) ? elements : [elements];\n var queue,\n canvas,\n options = {\n // general\n logging: false,\n elements: elements,\n background: \"#fff\",\n\n // preload options\n proxy: null,\n timeout: 0, // no timeout\n useCORS: false, // try to load images as CORS (where available), before falling back to proxy\n allowTaint: false, // whether to allow images to taint the canvas, won't need proxy if set to true\n\n // parse options\n svgRendering: false, // use svg powered rendering where available (FF11+)\n ignoreElements: \"IFRAME|OBJECT|PARAM\",\n useOverflow: true,\n letterRendering: false,\n chinese: false,\n\n // render options\n\n width: null,\n height: null,\n taintTest: true, // do a taint test with all images before applying to canvas\n renderer: \"Canvas\"\n };\n\n options = _html2canvas.Util.Extend(opts, options);\n\n _html2canvas.logging = options.logging;\n options.complete = function( images ) {\n\n if (typeof options.onpreloaded === \"function\") {\n if ( options.onpreloaded( images ) === false ) {\n return;\n }\n }\n queue = _html2canvas.Parse( images, options );\n\n if (typeof options.onparsed === \"function\") {\n if ( options.onparsed( queue ) === false ) {\n return;\n }\n }\n\n canvas = _html2canvas.Renderer( queue, options );\n\n if (typeof options.onrendered === \"function\") {\n options.onrendered( canvas );\n }\n\n\n };\n\n // for pages without images, we still want this to be async, i.e. return methods before executing\n window.setTimeout( function(){\n _html2canvas.Preload( options );\n }, 0 );\n\n return {\n render: function( queue, opts ) {\n return _html2canvas.Renderer( queue, _html2canvas.Util.Extend(opts, options) );\n },\n parse: function( images, opts ) {\n return _html2canvas.Parse( images, _html2canvas.Util.Extend(opts, options) );\n },\n preload: function( opts ) {\n return _html2canvas.Preload( _html2canvas.Util.Extend(opts, options) );\n },\n log: _html2canvas.Util.log\n };\n};\n\nwindow.html2canvas.log = _html2canvas.Util.log; // for renderers\nwindow.html2canvas.Renderer = {\n Canvas: undefined // We are assuming this will be used\n};\n_html2canvas.Renderer.Canvas = function(options) {\n options = options || {};\n\n var doc = document,\n safeImages = [],\n testCanvas = document.createElement(\"canvas\"),\n testctx = testCanvas.getContext(\"2d\"),\n Util = _html2canvas.Util,\n canvas = options.canvas || doc.createElement('canvas');\n\n function createShape(ctx, args) {\n ctx.beginPath();\n args.forEach(function(arg) {\n ctx[arg.name].apply(ctx, arg['arguments']);\n });\n ctx.closePath();\n }\n\n function safeImage(item) {\n if (safeImages.indexOf(item['arguments'][0].src ) === -1) {\n testctx.drawImage(item['arguments'][0], 0, 0);\n try {\n testctx.getImageData(0, 0, 1, 1);\n } catch(e) {\n testCanvas = doc.createElement(\"canvas\");\n testctx = testCanvas.getContext(\"2d\");\n return false;\n }\n safeImages.push(item['arguments'][0].src);\n }\n return true;\n }\n\n function renderItem(ctx, item) {\n switch(item.type){\n case \"variable\":\n ctx[item.name] = item['arguments'];\n break;\n case \"function\":\n switch(item.name) {\n case \"createPattern\":\n if (item['arguments'][0].width > 0 && item['arguments'][0].height > 0) {\n try {\n ctx.fillStyle = ctx.createPattern(item['arguments'][0], \"repeat\");\n }\n catch(e) {\n Util.log(\"html2canvas: Renderer: Error creating pattern\", e.message);\n }\n }\n break;\n case \"drawShape\":\n createShape(ctx, item['arguments']);\n break;\n case \"drawImage\":\n if (item['arguments'][8] > 0 && item['arguments'][7] > 0) {\n if (!options.taintTest || (options.taintTest && safeImage(item))) {\n ctx.drawImage.apply( ctx, item['arguments'] );\n }\n }\n break;\n default:\n ctx[item.name].apply(ctx, item['arguments']);\n }\n break;\n }\n }\n\n return function(parsedData, options, document, queue, _html2canvas) {\n var ctx = canvas.getContext(\"2d\"),\n newCanvas,\n bounds,\n fstyle,\n zStack = parsedData.stack;\n\n canvas.width = canvas.style.width = options.width || zStack.ctx.width;\n canvas.height = canvas.style.height = options.height || zStack.ctx.height;\n\n fstyle = ctx.fillStyle;\n ctx.fillStyle = (Util.isTransparent(zStack.backgroundColor) && options.background !== undefined) ? options.background : parsedData.backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = fstyle;\n\n queue.forEach(function(storageContext) {\n // set common settings for canvas\n ctx.textBaseline = \"bottom\";\n ctx.save();\n\n if (storageContext.transform.matrix) {\n ctx.translate(storageContext.transform.origin[0], storageContext.transform.origin[1]);\n ctx.transform.apply(ctx, storageContext.transform.matrix);\n ctx.translate(-storageContext.transform.origin[0], -storageContext.transform.origin[1]);\n }\n\n if (storageContext.clip){\n ctx.beginPath();\n ctx.rect(storageContext.clip.left, storageContext.clip.top, storageContext.clip.width, storageContext.clip.height);\n ctx.clip();\n }\n\n if (storageContext.ctx.storage) {\n storageContext.ctx.storage.forEach(function(item) {\n renderItem(ctx, item);\n });\n }\n\n ctx.restore();\n });\n\n Util.log(\"html2canvas: Renderer: Canvas renderer done - returning canvas obj\");\n\n if (options.elements.length === 1) {\n if (typeof options.elements[0] === \"object\" && options.elements[0].nodeName !== \"BODY\") {\n // crop image to the bounds of selected (single) element\n bounds = _html2canvas.Util.Bounds(options.elements[0]);\n newCanvas = document.createElement('canvas');\n newCanvas.width = Math.ceil(bounds.width);\n newCanvas.height = Math.ceil(bounds.height);\n ctx = newCanvas.getContext(\"2d\");\n\n ctx.drawImage(canvas, bounds.left, bounds.top, bounds.width, bounds.height, 0, 0, bounds.width, bounds.height);\n canvas = null;\n return newCanvas;\n }\n }\n\n return canvas;\n };\n};\n})(window,document);"]}