diff --git a/js/canvg/flashcanvas.js b/js/canvg/flashcanvas.js
deleted file mode 100644
index 6ecaa942ae..0000000000
--- a/js/canvg/flashcanvas.js
+++ /dev/null
@@ -1,1093 +0,0 @@
-/*
- * FlashCanvas
- *
- * Copyright (c) 2009 Tim Cameron Ryan
- * Copyright (c) 2009-2011 FlashCanvas Project
- * Released under the MIT/X License
- */
-
-// Reference:
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html
-// http://dev.w3.org/html5/spec/the-canvas-element.html
-
-// If the browser is IE and does not support HTML5 Canvas
-if (window["ActiveXObject"] && !window["CanvasRenderingContext2D"]) {
-
-(function(window, document, undefined) {
-
-/*
- * Constant
- */
-
-var NULL = null;
-var CANVAS = "canvas";
-var CANVAS_RENDERING_CONTEXT_2D = "CanvasRenderingContext2D";
-var CANVAS_GRADIENT = "CanvasGradient";
-var CANVAS_PATTERN = "CanvasPattern";
-var FLASH_CANVAS = "FlashCanvas";
-var G_VML_CANVAS_MANAGER = "G_vmlCanvasManager";
-var OBJECT_ID_PREFIX = "external";
-var ON_FOCUS = "onfocus";
-var ON_PROPERTY_CHANGE = "onpropertychange";
-var ON_READY_STATE_CHANGE = "onreadystatechange";
-var ON_UNLOAD = "onunload";
-
-var config = window[FLASH_CANVAS + "Options"] || {};
-var BASE_URL = config["swfPath"] || getScriptUrl().replace(/[^\/]+$/, "");
-var SWF_URL = BASE_URL + "flashcanvas.swf";
-
-// DOMException code
-var INDEX_SIZE_ERR = 1;
-var NOT_SUPPORTED_ERR = 9;
-var INVALID_STATE_ERR = 11;
-var SYNTAX_ERR = 12;
-var TYPE_MISMATCH_ERR = 17;
-var SECURITY_ERR = 18;
-
-/**
- * @constructor
- */
-function Lookup(array) {
- for (var i = 0, n = array.length; i < n; i++)
- this[array[i]] = i;
-}
-
-var properties = new Lookup([
- // Canvas element
- "toDataURL",
-
- // CanvasRenderingContext2D
- "save",
- "restore",
- "scale",
- "rotate",
- "translate",
- "transform",
- "setTransform",
- "globalAlpha",
- "globalCompositeOperation",
- "strokeStyle",
- "fillStyle",
- "createLinearGradient",
- "createRadialGradient",
- "createPattern",
- "lineWidth",
- "lineCap",
- "lineJoin",
- "miterLimit",
- "shadowOffsetX",
- "shadowOffsetY",
- "shadowBlur",
- "shadowColor",
- "clearRect",
- "fillRect",
- "strokeRect",
- "beginPath",
- "closePath",
- "moveTo",
- "lineTo",
- "quadraticCurveTo",
- "bezierCurveTo",
- "arcTo",
- "rect",
- "arc",
- "fill",
- "stroke",
- "clip",
- "isPointInPath",
-// "drawFocusRing",
- "font",
- "textAlign",
- "textBaseline",
- "fillText",
- "strokeText",
- "measureText",
- "drawImage",
- "createImageData",
- "getImageData",
- "putImageData",
-
- // CanvasGradient
- "addColorStop",
-
- // Internal use
- "direction",
- "resize"
-]);
-
-// Whether swf is ready for use
-var isReady = {};
-
-// Monitor the number of loading files
-var lock = {};
-
-// Canvas elements
-var canvases = {};
-
-// SPAN element embedded in the canvas
-var spans = {};
-
-/**
- * 2D context
- * @constructor
- */
-var CanvasRenderingContext2D = function(canvas, swf) {
- // back-reference to the canvas
- this.canvas = canvas;
-
- // back-reference to the swf
- this._swf = swf;
-
- // unique ID of canvas
- this._canvasId = swf.id.slice(8);
-
- // initialize drawing states
- this._initialize();
-
- // Count CanvasGradient and CanvasPattern objects
- this._gradientPatternId = 0;
-
- // Directionality of the canvas element
- this._direction = "";
-
- // frame update interval
- var self = this;
- setInterval(function() {
- if (lock[self._canvasId] === 0) {
- self._executeCommand();
- }
- }, 30);
-};
-
-CanvasRenderingContext2D.prototype = {
- /*
- * state
- */
-
- save: function() {
- // write all properties
- this._setCompositing();
- this._setShadows();
- this._setStrokeStyle();
- this._setFillStyle();
- this._setLineStyles();
- this._setFontStyles();
-
- // push state
- this._stateStack.push([
- this._globalAlpha,
- this._globalCompositeOperation,
- this._strokeStyle,
- this._fillStyle,
- this._lineWidth,
- this._lineCap,
- this._lineJoin,
- this._miterLimit,
- this._shadowOffsetX,
- this._shadowOffsetY,
- this._shadowBlur,
- this._shadowColor,
- this._font,
- this._textAlign,
- this._textBaseline
- ]);
-
- this._queue.push(properties.save);
- },
-
- restore: function() {
- // pop state
- var stateStack = this._stateStack;
- if (stateStack.length) {
- var state = stateStack.pop();
- this.globalAlpha = state[0];
- this.globalCompositeOperation = state[1];
- this.strokeStyle = state[2];
- this.fillStyle = state[3];
- this.lineWidth = state[4];
- this.lineCap = state[5];
- this.lineJoin = state[6];
- this.miterLimit = state[7];
- this.shadowOffsetX = state[8];
- this.shadowOffsetY = state[9];
- this.shadowBlur = state[10];
- this.shadowColor = state[11];
- this.font = state[12];
- this.textAlign = state[13];
- this.textBaseline = state[14];
- }
-
- this._queue.push(properties.restore);
- },
-
- /*
- * transformations
- */
-
- scale: function(x, y) {
- this._queue.push(properties.scale, x, y);
- },
-
- rotate: function(angle) {
- this._queue.push(properties.rotate, angle);
- },
-
- translate: function(x, y) {
- this._queue.push(properties.translate, x, y);
- },
-
- transform: function(m11, m12, m21, m22, dx, dy) {
- this._queue.push(properties.transform, m11, m12, m21, m22, dx, dy);
- },
-
- setTransform: function(m11, m12, m21, m22, dx, dy) {
- this._queue.push(properties.setTransform, m11, m12, m21, m22, dx, dy);
- },
-
- /*
- * compositing
- */
-
- _setCompositing: function() {
- var queue = this._queue;
- if (this._globalAlpha !== this.globalAlpha) {
- this._globalAlpha = this.globalAlpha;
- queue.push(properties.globalAlpha, this._globalAlpha);
- }
- if (this._globalCompositeOperation !== this.globalCompositeOperation) {
- this._globalCompositeOperation = this.globalCompositeOperation;
- queue.push(properties.globalCompositeOperation, this._globalCompositeOperation);
- }
- },
-
- /*
- * colors and styles
- */
-
- _setStrokeStyle: function() {
- if (this._strokeStyle !== this.strokeStyle) {
- var style = this._strokeStyle = this.strokeStyle;
- this._queue.push(properties.strokeStyle, (typeof style === "object") ? style.id : style);
- }
- },
-
- _setFillStyle: function() {
- if (this._fillStyle !== this.fillStyle) {
- var style = this._fillStyle = this.fillStyle;
- this._queue.push(properties.fillStyle, (typeof style === "object") ? style.id : style);
- }
- },
-
- createLinearGradient: function(x0, y0, x1, y1) {
- // If any of the arguments are not finite numbers, throws a
- // NOT_SUPPORTED_ERR exception.
- if (!(isFinite(x0) && isFinite(y0) && isFinite(x1) && isFinite(y1))) {
- throwException(NOT_SUPPORTED_ERR);
- }
-
- this._queue.push(properties.createLinearGradient, x0, y0, x1, y1);
- return new CanvasGradient(this);
- },
-
- createRadialGradient: function(x0, y0, r0, x1, y1, r1) {
- // If any of the arguments are not finite numbers, throws a
- // NOT_SUPPORTED_ERR exception.
- if (!(isFinite(x0) && isFinite(y0) && isFinite(r0) &&
- isFinite(x1) && isFinite(y1) && isFinite(r1))) {
- throwException(NOT_SUPPORTED_ERR);
- }
-
- // If either of the radii are negative, throws an INDEX_SIZE_ERR
- // exception.
- if (r0 < 0 || r1 < 0) {
- throwException(INDEX_SIZE_ERR);
- }
-
- this._queue.push(properties.createRadialGradient, x0, y0, r0, x1, y1, r1);
- return new CanvasGradient(this);
- },
-
- createPattern: function(image, repetition) {
- // If the image is null, the implementation must raise a
- // TYPE_MISMATCH_ERR exception.
- if (!image) {
- throwException(TYPE_MISMATCH_ERR);
- }
-
- var tagName = image.tagName, src;
- var canvasId = this._canvasId;
-
- // If the first argument isn't an img, canvas, or video element,
- // throws a TYPE_MISMATCH_ERR exception.
- if (tagName) {
- tagName = tagName.toLowerCase();
- if (tagName === "img") {
- src = image.getAttribute("src", 2);
- } else if (tagName === CANVAS || tagName === "video") {
- // For now, only HTMLImageElement is supported.
- return;
- } else {
- throwException(TYPE_MISMATCH_ERR);
- }
- }
-
- // Additionally, we accept any object that has a src property.
- // This is useful when you'd like to specify a long data URI.
- else if (image.src) {
- src = image.src;
- } else {
- throwException(TYPE_MISMATCH_ERR);
- }
-
- // If the second argument isn't one of the allowed values, throws a
- // SYNTAX_ERR exception.
- if (!(repetition === "repeat" || repetition === "no-repeat" ||
- repetition === "repeat-x" || repetition === "repeat-y" ||
- repetition === "" || repetition === NULL)) {
- throwException(SYNTAX_ERR);
- }
-
- // Special characters in the filename need escaping.
- this._queue.push(properties.createPattern, encodeXML(src), repetition);
-
- if (isReady[canvasId]) {
- this._executeCommand();
- ++lock[canvasId];
- }
-
- return new CanvasPattern(this);
- },
-
- /*
- * line caps/joins
- */
-
- _setLineStyles: function() {
- var queue = this._queue;
- if (this._lineWidth !== this.lineWidth) {
- this._lineWidth = this.lineWidth;
- queue.push(properties.lineWidth, this._lineWidth);
- }
- if (this._lineCap !== this.lineCap) {
- this._lineCap = this.lineCap;
- queue.push(properties.lineCap, this._lineCap);
- }
- if (this._lineJoin !== this.lineJoin) {
- this._lineJoin = this.lineJoin;
- queue.push(properties.lineJoin, this._lineJoin);
- }
- if (this._miterLimit !== this.miterLimit) {
- this._miterLimit = this.miterLimit;
- queue.push(properties.miterLimit, this._miterLimit);
- }
- },
-
- /*
- * shadows
- */
-
- _setShadows: function() {
- var queue = this._queue;
- if (this._shadowOffsetX !== this.shadowOffsetX) {
- this._shadowOffsetX = this.shadowOffsetX;
- queue.push(properties.shadowOffsetX, this._shadowOffsetX);
- }
- if (this._shadowOffsetY !== this.shadowOffsetY) {
- this._shadowOffsetY = this.shadowOffsetY;
- queue.push(properties.shadowOffsetY, this._shadowOffsetY);
- }
- if (this._shadowBlur !== this.shadowBlur) {
- this._shadowBlur = this.shadowBlur;
- queue.push(properties.shadowBlur, this._shadowBlur);
- }
- if (this._shadowColor !== this.shadowColor) {
- this._shadowColor = this.shadowColor;
- queue.push(properties.shadowColor, this._shadowColor);
- }
- },
-
- /*
- * rects
- */
-
- clearRect: function(x, y, w, h) {
- this._queue.push(properties.clearRect, x, y, w, h);
- },
-
- fillRect: function(x, y, w, h) {
- this._setCompositing();
- this._setShadows();
- this._setFillStyle();
- this._queue.push(properties.fillRect, x, y, w, h);
- },
-
- strokeRect: function(x, y, w, h) {
- this._setCompositing();
- this._setShadows();
- this._setStrokeStyle();
- this._setLineStyles();
- this._queue.push(properties.strokeRect, x, y, w, h);
- },
-
- /*
- * path API
- */
-
- beginPath: function() {
- this._queue.push(properties.beginPath);
- },
-
- closePath: function() {
- this._queue.push(properties.closePath);
- },
-
- moveTo: function(x, y) {
- this._queue.push(properties.moveTo, x, y);
- },
-
- lineTo: function(x, y) {
- this._queue.push(properties.lineTo, x, y);
- },
-
- quadraticCurveTo: function(cpx, cpy, x, y) {
- this._queue.push(properties.quadraticCurveTo, cpx, cpy, x, y);
- },
-
- bezierCurveTo: function(cp1x, cp1y, cp2x, cp2y, x, y) {
- this._queue.push(properties.bezierCurveTo, cp1x, cp1y, cp2x, cp2y, x, y);
- },
-
- arcTo: function(x1, y1, x2, y2, radius) {
- // Throws an INDEX_SIZE_ERR exception if the given radius is negative.
- if (radius < 0 && isFinite(radius)) {
- throwException(INDEX_SIZE_ERR);
- }
-
- this._queue.push(properties.arcTo, x1, y1, x2, y2, radius);
- },
-
- rect: function(x, y, w, h) {
- this._queue.push(properties.rect, x, y, w, h);
- },
-
- arc: function(x, y, radius, startAngle, endAngle, anticlockwise) {
- // Throws an INDEX_SIZE_ERR exception if the given radius is negative.
- if (radius < 0 && isFinite(radius)) {
- throwException(INDEX_SIZE_ERR);
- }
-
- this._queue.push(properties.arc, x, y, radius, startAngle, endAngle, anticlockwise ? 1 : 0);
- },
-
- fill: function() {
- this._setCompositing();
- this._setShadows();
- this._setFillStyle();
- this._queue.push(properties.fill);
- },
-
- stroke: function() {
- this._setCompositing();
- this._setShadows();
- this._setStrokeStyle();
- this._setLineStyles();
- this._queue.push(properties.stroke);
- },
-
- clip: function() {
- this._queue.push(properties.clip);
- },
-
- isPointInPath: function(x, y) {
- // TODO: Implement
- },
-
- /*
- * text
- */
-
- _setFontStyles: function() {
- var queue = this._queue;
- if (this._font !== this.font) {
- try {
- var span = spans[this._canvasId];
- span.style.font = this._font = this.font;
-
- var style = span.currentStyle;
- var fontSize = span.offsetHeight;
- var font = [style.fontStyle, style.fontWeight, fontSize, style.fontFamily].join(" ");
- queue.push(properties.font, font);
- } catch(e) {
- // If this.font cannot be parsed as a CSS font value, then it
- // must be ignored.
- }
- }
- if (this._textAlign !== this.textAlign) {
- this._textAlign = this.textAlign;
- queue.push(properties.textAlign, this._textAlign);
- }
- if (this._textBaseline !== this.textBaseline) {
- this._textBaseline = this.textBaseline;
- queue.push(properties.textBaseline, this._textBaseline);
- }
- if (this._direction !== this.canvas.currentStyle.direction) {
- this._direction = this.canvas.currentStyle.direction;
- queue.push(properties.direction, this._direction);
- }
- },
-
- fillText: function(text, x, y, maxWidth) {
- this._setCompositing();
- this._setFillStyle();
- this._setShadows();
- this._setFontStyles();
- this._queue.push(properties.fillText, encodeXML(text), x, y,
- maxWidth === undefined ? Infinity : maxWidth);
- },
-
- strokeText: function(text, x, y, maxWidth) {
- this._setCompositing();
- this._setStrokeStyle();
- this._setShadows();
- this._setFontStyles();
- this._queue.push(properties.strokeText, encodeXML(text), x, y,
- maxWidth === undefined ? Infinity : maxWidth);
- },
-
- measureText: function(text) {
- var span = spans[this._canvasId];
- try {
- span.style.font = this.font;
- } catch(e) {
- // If this.font cannot be parsed as a CSS font value, then it must
- // be ignored.
- }
-
- // Replace space characters with tab characters because innerText
- // removes trailing white spaces.
- span.innerText = text.replace(/[ \n\f\r]/g, "\t");
-
- return new TextMetrics(span.offsetWidth);
- },
-
- /*
- * drawing images
- */
-
- drawImage: function(image, x1, y1, w1, h1, x2, y2, w2, h2) {
- // If the image is null, the implementation must raise a
- // TYPE_MISMATCH_ERR exception.
- if (!image) {
- throwException(TYPE_MISMATCH_ERR);
- }
-
- var tagName = image.tagName, src, argc = arguments.length;
- var canvasId = this._canvasId;
-
- // If the first argument isn't an img, canvas, or video element,
- // throws a TYPE_MISMATCH_ERR exception.
- if (tagName) {
- tagName = tagName.toLowerCase();
- if (tagName === "img") {
- src = image.getAttribute("src", 2);
- } else if (tagName === CANVAS || tagName === "video") {
- // For now, only HTMLImageElement is supported.
- return;
- } else {
- throwException(TYPE_MISMATCH_ERR);
- }
- }
-
- // Additionally, we accept any object that has a src property.
- // This is useful when you'd like to specify a long data URI.
- else if (image.src) {
- src = image.src;
- } else {
- throwException(TYPE_MISMATCH_ERR);
- }
-
- this._setCompositing();
- this._setShadows();
-
- // Special characters in the filename need escaping.
- src = encodeXML(src);
-
- if (argc === 3) {
- this._queue.push(properties.drawImage, argc, src, x1, y1);
- } else if (argc === 5) {
- this._queue.push(properties.drawImage, argc, src, x1, y1, w1, h1);
- } else if (argc === 9) {
- // If one of the sw or sh arguments is zero, the implementation
- // must raise an INDEX_SIZE_ERR exception.
- if (w1 === 0 || h1 === 0) {
- throwException(INDEX_SIZE_ERR);
- }
-
- this._queue.push(properties.drawImage, argc, src, x1, y1, w1, h1, x2, y2, w2, h2);
- } else {
- return;
- }
-
- if (isReady[canvasId]) {
- this._executeCommand();
- ++lock[canvasId];
- }
- },
-
- /*
- * pixel manipulation
- */
-
- // ImageData createImageData(in float sw, in float sh);
- // ImageData createImageData(in ImageData imagedata);
- createImageData: function() {
- // TODO: Implement
- },
-
- // ImageData getImageData(in float sx, in float sy, in float sw, in float sh);
- getImageData: function(sx, sy, sw, sh) {
- // TODO: Implement
- },
-
- // void putImageData(in ImageData imagedata, in float dx, in float dy, [Optional] in float dirtyX, in float dirtyY, in float dirtyWidth, in float dirtyHeight);
- putImageData: function(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
- // TODO: Implement
- },
-
- /*
- * private methods
- */
-
- _initialize: function() {
- // compositing
- this.globalAlpha = this._globalAlpha = 1.0;
- this.globalCompositeOperation = this._globalCompositeOperation = "source-over";
-
- // colors and styles
- this.strokeStyle = this._strokeStyle = "#000000";
- this.fillStyle = this._fillStyle = "#000000";
-
- // line caps/joins
- this.lineWidth = this._lineWidth = 1.0;
- this.lineCap = this._lineCap = "butt";
- this.lineJoin = this._lineJoin = "miter";
- this.miterLimit = this._miterLimit = 10.0;
-
- // shadows
- this.shadowOffsetX = this._shadowOffsetX = 0;
- this.shadowOffsetY = this._shadowOffsetY = 0;
- this.shadowBlur = this._shadowBlur = 0;
- this.shadowColor = this._shadowColor = "rgba(0, 0, 0, 0.0)";
-
- // text
- this.font = this._font = "10px sans-serif";
- this.textAlign = this._textAlign = "start";
- this.textBaseline = this._textBaseline = "alphabetic";
-
- // command queue
- this._queue = [];
-
- // stack of drawing states
- this._stateStack = [];
- },
-
- _flush: function() {
- var queue = this._queue;
- this._queue = [];
- return queue;
- },
-
- _executeCommand: function() {
- // execute commands
- var commands = this._flush();
- if (commands.length > 0) {
- return eval(this._swf.CallFunction(
- ''
- + commands.join("") + ""
- ));
- }
- },
-
- _resize: function(width, height) {
- // Flush commands in the queue
- this._executeCommand();
-
- // Clear back to the initial state
- this._initialize();
-
- // Adjust the size of Flash to that of the canvas
- if (width > 0) {
- this._swf.width = width;
- }
- if (height > 0) {
- this._swf.height = height;
- }
-
- // Execute a resize command at the start of the next frame
- this._queue.push(properties.resize, width, height);
- }
-};
-
-/**
- * CanvasGradient stub
- * @constructor
- */
-var CanvasGradient = function(ctx) {
- this._ctx = ctx;
- this.id = ctx._gradientPatternId++;
-};
-
-CanvasGradient.prototype = {
- addColorStop: function(offset, color) {
- // Throws an INDEX_SIZE_ERR exception if the offset is out of range.
- if (isNaN(offset) || offset < 0 || offset > 1) {
- throwException(INDEX_SIZE_ERR);
- }
-
- this._ctx._queue.push(properties.addColorStop, this.id, offset, color);
- }
-};
-
-/**
- * CanvasPattern stub
- * @constructor
- */
-var CanvasPattern = function(ctx) {
- this.id = ctx._gradientPatternId++;
-};
-
-/**
- * TextMetrics stub
- * @constructor
- */
-var TextMetrics = function(width) {
- this.width = width;
-};
-
-/**
- * DOMException
- * @constructor
- */
-var DOMException = function(code) {
- this.code = code;
- this.message = DOMExceptionNames[code];
-};
-
-DOMException.prototype = new Error;
-
-var DOMExceptionNames = {
- 1: "INDEX_SIZE_ERR",
- 9: "NOT_SUPPORTED_ERR",
- 11: "INVALID_STATE_ERR",
- 12: "SYNTAX_ERR",
- 17: "TYPE_MISMATCH_ERR",
- 18: "SECURITY_ERR"
-};
-
-/*
- * Event handlers
- */
-
-function onReadyStateChange() {
- if (document.readyState === "complete") {
- document.detachEvent(ON_READY_STATE_CHANGE, onReadyStateChange);
-
- var canvases = document.getElementsByTagName(CANVAS);
- for (var i = 0, n = canvases.length; i < n; ++i) {
- FlashCanvas.initElement(canvases[i]);
- }
- }
-}
-
-function onFocus() {
- // forward the event to the parent
- var swf = event.srcElement, canvas = swf.parentNode;
- swf.blur();
- canvas.focus();
-}
-
-function onPropertyChange() {
- var prop = event.propertyName;
- if (prop === "width" || prop === "height") {
- var canvas = event.srcElement;
- var value = canvas[prop];
- var number = parseInt(value, 10);
-
- if (isNaN(number) || number < 0) {
- number = (prop === "width") ? 300 : 150;
- }
-
- if (value === number) {
- canvas.style[prop] = number + "px";
- canvas.getContext("2d")._resize(canvas.width, canvas.height);
- } else {
- canvas[prop] = number;
- }
- }
-}
-
-function onUnload() {
- window.detachEvent(ON_UNLOAD, onUnload);
-
- for (var canvasId in canvases) {
- var canvas = canvases[canvasId], swf = canvas.firstChild, prop;
-
- // clean up the references of swf.executeCommand and swf.resize
- for (prop in swf) {
- if (typeof swf[prop] === "function") {
- swf[prop] = NULL;
- }
- }
-
- // clean up the references of canvas.getContext and canvas.toDataURL
- for (prop in canvas) {
- if (typeof canvas[prop] === "function") {
- canvas[prop] = NULL;
- }
- }
-
- // remove event listeners
- swf.detachEvent(ON_FOCUS, onFocus);
- canvas.detachEvent(ON_PROPERTY_CHANGE, onPropertyChange);
- }
-
- // delete exported symbols
- window[CANVAS_RENDERING_CONTEXT_2D] = NULL;
- window[CANVAS_GRADIENT] = NULL;
- window[CANVAS_PATTERN] = NULL;
- window[FLASH_CANVAS] = NULL;
- window[G_VML_CANVAS_MANAGER] = NULL;
-}
-
-/*
- * FlashCanvas API
- */
-
-var FlashCanvas = {
- initElement: function(canvas) {
- // Check whether the initialization is required or not.
- if (canvas.getContext) {
- return canvas;
- }
-
- // initialize lock
- var canvasId = getUniqueId();
- var objectId = OBJECT_ID_PREFIX + canvasId;
- isReady[canvasId] = false;
- lock[canvasId] = 1;
-
- // Set the width and height attributes.
- setCanvasSize(canvas);
-
- // embed swf and SPAN element
- canvas.innerHTML =
- '' +
- '' +
- '';
-
- canvases[canvasId] = canvas;
- var swf = canvas.firstChild;
- spans[canvasId] = canvas.lastChild;
-
- // Check whether the canvas element is in the DOM tree
- var documentContains = document.body.contains;
- if (documentContains(canvas)) {
- // Load swf file immediately
- swf["movie"] = SWF_URL;
- } else {
- // Wait until the element is added to the DOM tree
- var intervalId = setInterval(function() {
- if (documentContains(canvas)) {
- clearInterval(intervalId);
- swf["movie"] = SWF_URL;
- }
- }, 0);
- }
-
- // If the browser is IE6 or in quirks mode
- if (document.compatMode === "BackCompat" || !window.XMLHttpRequest) {
- spans[canvasId].style.overflow = "hidden";
- }
-
- // initialize context
- var ctx = new CanvasRenderingContext2D(canvas, swf);
-
- // canvas API
- canvas.getContext = function(contextId) {
- return contextId === "2d" ? ctx : NULL;
- };
-
- canvas.toDataURL = function(type, quality) {
- if (("" + type).replace(/[A-Z]+/g, toLowerCase) === "image/jpeg") {
- ctx._queue.push(properties.toDataURL, type,
- typeof quality === "number" ? quality : "");
- } else {
- ctx._queue.push(properties.toDataURL, type);
- }
- return ctx._executeCommand();
- };
-
- // add event listener
- swf.attachEvent(ON_FOCUS, onFocus);
-
- return canvas;
- },
-
- saveImage: function(canvas) {
- var swf = canvas.firstChild;
- swf.saveImage();
- },
-
- setOptions: function(options) {
- // TODO: Implement
- },
-
- trigger: function(canvasId, type) {
- var canvas = canvases[canvasId];
- canvas.fireEvent("on" + type);
- },
-
- unlock: function(canvasId, ready) {
- if (lock[canvasId]) {
- --lock[canvasId];
- }
- if (ready) {
- var canvas = canvases[canvasId];
- var swf = canvas.firstChild;
- var width;
- var height;
-
- // Set the width and height attributes of the canvas element.
- setCanvasSize(canvas);
- width = canvas.width;
- height = canvas.height;
-
- canvas.style.width = width + "px";
- canvas.style.height = height + "px";
-
- // Adjust the size of Flash to that of the canvas
- if (width > 0) {
- swf.width = width;
- }
- if (height > 0) {
- swf.height = height;
- }
- swf.resize(width, height);
-
- // Add event listener
- canvas.attachEvent(ON_PROPERTY_CHANGE, onPropertyChange);
-
- // ExternalInterface is now ready for use
- isReady[canvasId] = true;
- }
- }
-};
-
-/*
- * Utility methods
- */
-
-// Get the absolute URL of flashcanvas.js
-function getScriptUrl() {
- var scripts = document.getElementsByTagName("script");
- var script = scripts[scripts.length - 1];
-
- // @see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx
- if (document.documentMode >= 8) {
- return script.src;
- } else {
- return script.getAttribute("src", 4);
- }
-}
-
-// Get a unique ID composed of alphanumeric characters.
-function getUniqueId() {
- return Math.random().toString(36).slice(2) || "0";
-}
-
-// Escape characters not permitted in XML.
-function encodeXML(str) {
- return ("" + str).replace(/&/g, "&").replace(/getHeader();
$scripts = $header->getScripts();
- /* < IE 9 doesn't support canvas natively */
- if (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER < 9) {
- $scripts->addFile('canvg/flashcanvas.js');
- }
$scripts->addFile('jqplot/jquery.jqplot.js');
$scripts->addFile('jqplot/plugins/jqplot.pieRenderer.js');
$scripts->addFile('jqplot/plugins/jqplot.highlighter.js');
diff --git a/tbl_chart.php b/tbl_chart.php
index e06114f30c..f9e5e54b0d 100644
--- a/tbl_chart.php
+++ b/tbl_chart.php
@@ -76,10 +76,6 @@ $scripts->addFile('jqplot/plugins/jqplot.dateAxisRenderer.js');
$scripts->addFile('jqplot/plugins/jqplot.pointLabels.js');
$scripts->addFile('jqplot/plugins/jqplot.pieRenderer.js');
$scripts->addFile('jqplot/plugins/jqplot.highlighter.js');
-/* < IE 9 doesn't support canvas natively */
-if (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER < 9) {
- $scripts->addFile('canvg/flashcanvas.js');
-}
/**
* Runs common work
diff --git a/tbl_zoom_select.php b/tbl_zoom_select.php
index 6bbf9bc72b..7f4ceea329 100644
--- a/tbl_zoom_select.php
+++ b/tbl_zoom_select.php
@@ -21,10 +21,6 @@ $header = $response->getHeader();
$scripts = $header->getScripts();
$scripts->addFile('makegrid.js');
$scripts->addFile('sql.js');
-/* < IE 9 doesn't support canvas natively */
-if (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER < 9) {
- $scripts->addFile('canvg/flashcanvas.js');
-}
$scripts->addFile('jqplot/jquery.jqplot.js');
$scripts->addFile('jqplot/plugins/jqplot.canvasTextRenderer.js');
$scripts->addFile('jqplot/plugins/jqplot.canvasAxisLabelRenderer.js');