Current File : /home/k/a/r/karenpetzb/www/items/category/tagcloud.zip
PK�|H[`���"�"�excanvas.jsnu&1i�// Copyright 2006 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Modifications by Graham Breach ( http://www.goat1000.com/ )
//  - apply globalAlpha in drawImage

// Known Issues:
//
// * Patterns only support repeat.
// * Radial gradient are not implemented. The VML version of these look very
//   different from the canvas one.
// * Clipping paths are not implemented.
// * Coordsize. The width and height attribute have higher priority than the
//   width and height style values which isn't correct.
// * Painting mode isn't implemented.
// * Canvas width/height should is using content-box by default. IE in
//   Quirks mode will draw the canvas using border-box. Either change your
//   doctype to HTML5
//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
//   or use Box Sizing Behavior from WebFX
//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
// * Non uniform scaling does not correctly scale strokes.
// * Optimize. There is always room for speed improvements.

// Only add this code if we do not already have a canvas implementation
if (!document.createElement('canvas').getContext) {

(function() {

  // alias some functions to make (compiled) code shorter
  var m = Math;
  var mr = m.round;
  var ms = m.sin;
  var mc = m.cos;
  var abs = m.abs;
  var sqrt = m.sqrt;

  // this is used for sub pixel precision
  var Z = 10;
  var Z2 = Z / 2;

  var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];

  /**
   * This funtion is assigned to the <canvas> elements as element.getContext().
   * @this {HTMLElement}
   * @return {CanvasRenderingContext2D_}
   */
  function getContext() {
    return this.context_ ||
        (this.context_ = new CanvasRenderingContext2D_(this));
  }

  var slice = Array.prototype.slice;

  /**
   * Binds a function to an object. The returned function will always use the
   * passed in {@code obj} as {@code this}.
   *
   * Example:
   *
   *   g = bind(f, obj, a, b)
   *   g(c, d) // will do f.call(obj, a, b, c, d)
   *
   * @param {Function} f The function to bind the object to
   * @param {Object} obj The object that should act as this when the function
   *     is called
   * @param {*} var_args Rest arguments that will be used as the initial
   *     arguments when the function is called
   * @return {Function} A new function that has bound this
   */
  function bind(f, obj, var_args) {
    var a = slice.call(arguments, 2);
    return function() {
      return f.apply(obj, a.concat(slice.call(arguments)));
    };
  }

  function encodeHtmlAttribute(s) {
    return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
  }

  function addNamespace(doc, prefix, urn) {
    if (!doc.namespaces[prefix]) {
      doc.namespaces.add(prefix, urn, '#default#VML');
    }
  }

  function addNamespacesAndStylesheet(doc) {
    addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml');
    addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office');

    // Setup default CSS.  Only add one style sheet per document
    if (!doc.styleSheets['ex_canvas_']) {
      var ss = doc.createStyleSheet();
      ss.owningElement.id = 'ex_canvas_';
      ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
          // default size is 300x150 in Gecko and Opera
          'text-align:left;width:300px;height:150px}';
    }
  }

  // Add namespaces and stylesheet at startup.
  addNamespacesAndStylesheet(document);

  var G_vmlCanvasManager_ = {
    init: function(opt_doc) {
      var doc = opt_doc || document;
      // Create a dummy element so that IE will allow canvas elements to be
      // recognized.
      doc.createElement('canvas');
      doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
    },

    init_: function(doc) {
      // find all canvas elements
      var els = doc.getElementsByTagName('canvas');
      for (var i = 0; i < els.length; i++) {
        this.initElement(els[i]);
      }
    },

    /**
     * Public initializes a canvas element so that it can be used as canvas
     * element from now on. This is called automatically before the page is
     * loaded but if you are creating elements using createElement you need to
     * make sure this is called on the element.
     * @param {HTMLElement} el The canvas element to initialize.
     * @return {HTMLElement} the element that was created.
     */
    initElement: function(el) {
      if (!el.getContext) {
        el.getContext = getContext;

        // Add namespaces and stylesheet to document of the element.
        addNamespacesAndStylesheet(el.ownerDocument);

        // Remove fallback content. There is no way to hide text nodes so we
        // just remove all childNodes. We could hide all elements and remove
        // text nodes but who really cares about the fallback content.
        el.innerHTML = '';

        // do not use inline function because that will leak memory
        el.attachEvent('onpropertychange', onPropertyChange);
        el.attachEvent('onresize', onResize);

        var attrs = el.attributes;
        if (attrs.width && attrs.width.specified) {
          // TODO: use runtimeStyle and coordsize
          // el.getContext().setWidth_(attrs.width.nodeValue);
          el.style.width = attrs.width.nodeValue + 'px';
        } else {
          el.width = el.clientWidth;
        }
        if (attrs.height && attrs.height.specified) {
          // TODO: use runtimeStyle and coordsize
          // el.getContext().setHeight_(attrs.height.nodeValue);
          el.style.height = attrs.height.nodeValue + 'px';
        } else {
          el.height = el.clientHeight;
        }
        //el.getContext().setCoordsize_()
      }
      return el;
    }
  };

  function onPropertyChange(e) {
    var el = e.srcElement;

    switch (e.propertyName) {
      case 'width':
        el.getContext().clearRect();
        el.style.width = el.attributes.width.nodeValue + 'px';
        // In IE8 this does not trigger onresize.
        el.firstChild.style.width =  el.clientWidth + 'px';
        break;
      case 'height':
        el.getContext().clearRect();
        el.style.height = el.attributes.height.nodeValue + 'px';
        el.firstChild.style.height = el.clientHeight + 'px';
        break;
    }
  }

  function onResize(e) {
    var el = e.srcElement;
    if (el.firstChild) {
      el.firstChild.style.width =  el.clientWidth + 'px';
      el.firstChild.style.height = el.clientHeight + 'px';
    }
  }

  G_vmlCanvasManager_.init();

  // precompute "00" to "FF"
  var decToHex = [];
  for (var i = 0; i < 16; i++) {
    for (var j = 0; j < 16; j++) {
      decToHex[i * 16 + j] = i.toString(16) + j.toString(16);
    }
  }

  function createMatrixIdentity() {
    return [
      [1, 0, 0],
      [0, 1, 0],
      [0, 0, 1]
    ];
  }

  function matrixMultiply(m1, m2) {
    var result = createMatrixIdentity();

    for (var x = 0; x < 3; x++) {
      for (var y = 0; y < 3; y++) {
        var sum = 0;

        for (var z = 0; z < 3; z++) {
          sum += m1[x][z] * m2[z][y];
        }

        result[x][y] = sum;
      }
    }
    return result;
  }

  function copyState(o1, o2) {
    o2.fillStyle     = o1.fillStyle;
    o2.lineCap       = o1.lineCap;
    o2.lineJoin      = o1.lineJoin;
    o2.lineWidth     = o1.lineWidth;
    o2.miterLimit    = o1.miterLimit;
    o2.shadowBlur    = o1.shadowBlur;
    o2.shadowColor   = o1.shadowColor;
    o2.shadowOffsetX = o1.shadowOffsetX;
    o2.shadowOffsetY = o1.shadowOffsetY;
    o2.strokeStyle   = o1.strokeStyle;
    o2.globalAlpha   = o1.globalAlpha;
    o2.font          = o1.font;
    o2.textAlign     = o1.textAlign;
    o2.textBaseline  = o1.textBaseline;
    o2.arcScaleX_    = o1.arcScaleX_;
    o2.arcScaleY_    = o1.arcScaleY_;
    o2.lineScale_    = o1.lineScale_;
  }

  var colorData = {
    aliceblue: '#F0F8FF',
    antiquewhite: '#FAEBD7',
    aquamarine: '#7FFFD4',
    azure: '#F0FFFF',
    beige: '#F5F5DC',
    bisque: '#FFE4C4',
    black: '#000000',
    blanchedalmond: '#FFEBCD',
    blueviolet: '#8A2BE2',
    brown: '#A52A2A',
    burlywood: '#DEB887',
    cadetblue: '#5F9EA0',
    chartreuse: '#7FFF00',
    chocolate: '#D2691E',
    coral: '#FF7F50',
    cornflowerblue: '#6495ED',
    cornsilk: '#FFF8DC',
    crimson: '#DC143C',
    cyan: '#00FFFF',
    darkblue: '#00008B',
    darkcyan: '#008B8B',
    darkgoldenrod: '#B8860B',
    darkgray: '#A9A9A9',
    darkgreen: '#006400',
    darkgrey: '#A9A9A9',
    darkkhaki: '#BDB76B',
    darkmagenta: '#8B008B',
    darkolivegreen: '#556B2F',
    darkorange: '#FF8C00',
    darkorchid: '#9932CC',
    darkred: '#8B0000',
    darksalmon: '#E9967A',
    darkseagreen: '#8FBC8F',
    darkslateblue: '#483D8B',
    darkslategray: '#2F4F4F',
    darkslategrey: '#2F4F4F',
    darkturquoise: '#00CED1',
    darkviolet: '#9400D3',
    deeppink: '#FF1493',
    deepskyblue: '#00BFFF',
    dimgray: '#696969',
    dimgrey: '#696969',
    dodgerblue: '#1E90FF',
    firebrick: '#B22222',
    floralwhite: '#FFFAF0',
    forestgreen: '#228B22',
    gainsboro: '#DCDCDC',
    ghostwhite: '#F8F8FF',
    gold: '#FFD700',
    goldenrod: '#DAA520',
    grey: '#808080',
    greenyellow: '#ADFF2F',
    honeydew: '#F0FFF0',
    hotpink: '#FF69B4',
    indianred: '#CD5C5C',
    indigo: '#4B0082',
    ivory: '#FFFFF0',
    khaki: '#F0E68C',
    lavender: '#E6E6FA',
    lavenderblush: '#FFF0F5',
    lawngreen: '#7CFC00',
    lemonchiffon: '#FFFACD',
    lightblue: '#ADD8E6',
    lightcoral: '#F08080',
    lightcyan: '#E0FFFF',
    lightgoldenrodyellow: '#FAFAD2',
    lightgreen: '#90EE90',
    lightgrey: '#D3D3D3',
    lightpink: '#FFB6C1',
    lightsalmon: '#FFA07A',
    lightseagreen: '#20B2AA',
    lightskyblue: '#87CEFA',
    lightslategray: '#778899',
    lightslategrey: '#778899',
    lightsteelblue: '#B0C4DE',
    lightyellow: '#FFFFE0',
    limegreen: '#32CD32',
    linen: '#FAF0E6',
    magenta: '#FF00FF',
    mediumaquamarine: '#66CDAA',
    mediumblue: '#0000CD',
    mediumorchid: '#BA55D3',
    mediumpurple: '#9370DB',
    mediumseagreen: '#3CB371',
    mediumslateblue: '#7B68EE',
    mediumspringgreen: '#00FA9A',
    mediumturquoise: '#48D1CC',
    mediumvioletred: '#C71585',
    midnightblue: '#191970',
    mintcream: '#F5FFFA',
    mistyrose: '#FFE4E1',
    moccasin: '#FFE4B5',
    navajowhite: '#FFDEAD',
    oldlace: '#FDF5E6',
    olivedrab: '#6B8E23',
    orange: '#FFA500',
    orangered: '#FF4500',
    orchid: '#DA70D6',
    palegoldenrod: '#EEE8AA',
    palegreen: '#98FB98',
    paleturquoise: '#AFEEEE',
    palevioletred: '#DB7093',
    papayawhip: '#FFEFD5',
    peachpuff: '#FFDAB9',
    peru: '#CD853F',
    pink: '#FFC0CB',
    plum: '#DDA0DD',
    powderblue: '#B0E0E6',
    rosybrown: '#BC8F8F',
    royalblue: '#4169E1',
    saddlebrown: '#8B4513',
    salmon: '#FA8072',
    sandybrown: '#F4A460',
    seagreen: '#2E8B57',
    seashell: '#FFF5EE',
    sienna: '#A0522D',
    skyblue: '#87CEEB',
    slateblue: '#6A5ACD',
    slategray: '#708090',
    slategrey: '#708090',
    snow: '#FFFAFA',
    springgreen: '#00FF7F',
    steelblue: '#4682B4',
    tan: '#D2B48C',
    thistle: '#D8BFD8',
    tomato: '#FF6347',
    turquoise: '#40E0D0',
    violet: '#EE82EE',
    wheat: '#F5DEB3',
    whitesmoke: '#F5F5F5',
    yellowgreen: '#9ACD32'
  };


  function getRgbHslContent(styleString) {
    var start = styleString.indexOf('(', 3);
    var end = styleString.indexOf(')', start + 1);
    var parts = styleString.substring(start + 1, end).split(',');
    // add alpha if needed
    if (parts.length != 4 || styleString.charAt(3) != 'a') {
      parts[3] = 1;
    }
    return parts;
  }

  function percent(s) {
    return parseFloat(s) / 100;
  }

  function clamp(v, min, max) {
    return Math.min(max, Math.max(min, v));
  }

  function hslToRgb(parts){
    var r, g, b, h, s, l;
    h = parseFloat(parts[0]) / 360 % 360;
    if (h < 0)
      h++;
    s = clamp(percent(parts[1]), 0, 1);
    l = clamp(percent(parts[2]), 0, 1);
    if (s == 0) {
      r = g = b = l; // achromatic
    } else {
      var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
      var p = 2 * l - q;
      r = hueToRgb(p, q, h + 1 / 3);
      g = hueToRgb(p, q, h);
      b = hueToRgb(p, q, h - 1 / 3);
    }

    return '#' + decToHex[Math.floor(r * 255)] +
        decToHex[Math.floor(g * 255)] +
        decToHex[Math.floor(b * 255)];
  }

  function hueToRgb(m1, m2, h) {
    if (h < 0)
      h++;
    if (h > 1)
      h--;

    if (6 * h < 1)
      return m1 + (m2 - m1) * 6 * h;
    else if (2 * h < 1)
      return m2;
    else if (3 * h < 2)
      return m1 + (m2 - m1) * (2 / 3 - h) * 6;
    else
      return m1;
  }

  var processStyleCache = {};

  function processStyle(styleString) {
    if (styleString in processStyleCache) {
      return processStyleCache[styleString];
    }

    var str, alpha = 1;

    styleString = String(styleString);
    if (styleString.charAt(0) == '#') {
      str = styleString;
    } else if (/^rgb/.test(styleString)) {
      var parts = getRgbHslContent(styleString);
      var str = '#', n;
      for (var i = 0; i < 3; i++) {
        if (parts[i].indexOf('%') != -1) {
          n = Math.floor(percent(parts[i]) * 255);
        } else {
          n = +parts[i];
        }
        str += decToHex[clamp(n, 0, 255)];
      }
      alpha = +parts[3];
    } else if (/^hsl/.test(styleString)) {
      var parts = getRgbHslContent(styleString);
      str = hslToRgb(parts);
      alpha = parts[3];
    } else {
      str = colorData[styleString] || styleString;
    }
    return processStyleCache[styleString] = {color: str, alpha: alpha};
  }

  var DEFAULT_STYLE = {
    style: 'normal',
    variant: 'normal',
    weight: 'normal',
    size: 10,
    family: 'sans-serif'
  };

  // Internal text style cache
  var fontStyleCache = {};

  function processFontStyle(styleString) {
    if (fontStyleCache[styleString]) {
      return fontStyleCache[styleString];
    }

    var el = document.createElement('div');
    var style = el.style;
    try {
      style.font = styleString;
    } catch (ex) {
      // Ignore failures to set to invalid font.
    }

    return fontStyleCache[styleString] = {
      style: style.fontStyle || DEFAULT_STYLE.style,
      variant: style.fontVariant || DEFAULT_STYLE.variant,
      weight: style.fontWeight || DEFAULT_STYLE.weight,
      size: style.fontSize || DEFAULT_STYLE.size,
      family: style.fontFamily || DEFAULT_STYLE.family
    };
  }

  function getComputedStyle(style, element) {
    var computedStyle = {};

    for (var p in style) {
      computedStyle[p] = style[p];
    }

    // Compute the size
    var canvasFontSize = parseFloat(element.currentStyle.fontSize),
        fontSize = parseFloat(style.size);

    if (typeof style.size == 'number') {
      computedStyle.size = style.size;
    } else if (style.size.indexOf('px') != -1) {
      computedStyle.size = fontSize;
    } else if (style.size.indexOf('em') != -1) {
      computedStyle.size = canvasFontSize * fontSize;
    } else if(style.size.indexOf('%') != -1) {
      computedStyle.size = (canvasFontSize / 100) * fontSize;
    } else if (style.size.indexOf('pt') != -1) {
      computedStyle.size = fontSize / .75;
    } else {
      computedStyle.size = canvasFontSize;
    }

    // Different scaling between normal text and VML text. This was found using
    // trial and error to get the same size as non VML text.
    computedStyle.size *= 0.981;

    return computedStyle;
  }

  function buildStyle(style) {
    return style.style + ' ' + style.variant + ' ' + style.weight + ' ' +
        style.size + 'px ' + style.family;
  }

  var lineCapMap = {
    'butt': 'flat',
    'round': 'round'
  };

  function processLineCap(lineCap) {
    return lineCapMap[lineCap] || 'square';
  }

  /**
   * This class implements CanvasRenderingContext2D interface as described by
   * the WHATWG.
   * @param {HTMLElement} canvasElement The element that the 2D context should
   * be associated with
   */
  function CanvasRenderingContext2D_(canvasElement) {
    this.m_ = createMatrixIdentity();

    this.mStack_ = [];
    this.aStack_ = [];
    this.currentPath_ = [];

    // Canvas context properties
    this.strokeStyle = '#000';
    this.fillStyle = '#000';

    this.lineWidth = 1;
    this.lineJoin = 'miter';
    this.lineCap = 'butt';
    this.miterLimit = Z * 1;
    this.globalAlpha = 1;
    this.font = '10px sans-serif';
    this.textAlign = 'left';
    this.textBaseline = 'alphabetic';
    this.canvas = canvasElement;

    var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' +
        canvasElement.clientHeight + 'px;overflow:hidden;position:absolute';
    var el = canvasElement.ownerDocument.createElement('div');
    el.style.cssText = cssText;
    canvasElement.appendChild(el);

    var overlayEl = el.cloneNode(false);
    // Use a non transparent background.
    overlayEl.style.backgroundColor = 'red';
    overlayEl.style.filter = 'alpha(opacity=0)';
    canvasElement.appendChild(overlayEl);

    this.element_ = el;
    this.arcScaleX_ = 1;
    this.arcScaleY_ = 1;
    this.lineScale_ = 1;
  }

  var contextPrototype = CanvasRenderingContext2D_.prototype;
  contextPrototype.clearRect = function() {
    if (this.textMeasureEl_) {
      this.textMeasureEl_.removeNode(true);
      this.textMeasureEl_ = null;
    }
    this.element_.innerHTML = '';
  };

  contextPrototype.beginPath = function() {
    // TODO: Branch current matrix so that save/restore has no effect
    //       as per safari docs.
    this.currentPath_ = [];
  };

  contextPrototype.moveTo = function(aX, aY) {
    var p = getCoords(this, aX, aY);
    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
    this.currentX_ = p.x;
    this.currentY_ = p.y;
  };

  contextPrototype.lineTo = function(aX, aY) {
    var p = getCoords(this, aX, aY);
    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});

    this.currentX_ = p.x;
    this.currentY_ = p.y;
  };

  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
                                            aCP2x, aCP2y,
                                            aX, aY) {
    var p = getCoords(this, aX, aY);
    var cp1 = getCoords(this, aCP1x, aCP1y);
    var cp2 = getCoords(this, aCP2x, aCP2y);
    bezierCurveTo(this, cp1, cp2, p);
  };

  // Helper function that takes the already fixed cordinates.
  function bezierCurveTo(self, cp1, cp2, p) {
    self.currentPath_.push({
      type: 'bezierCurveTo',
      cp1x: cp1.x,
      cp1y: cp1.y,
      cp2x: cp2.x,
      cp2y: cp2.y,
      x: p.x,
      y: p.y
    });
    self.currentX_ = p.x;
    self.currentY_ = p.y;
  }

  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
    // the following is lifted almost directly from
    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes

    var cp = getCoords(this, aCPx, aCPy);
    var p = getCoords(this, aX, aY);

    var cp1 = {
      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
    };
    var cp2 = {
      x: cp1.x + (p.x - this.currentX_) / 3.0,
      y: cp1.y + (p.y - this.currentY_) / 3.0
    };

    bezierCurveTo(this, cp1, cp2, p);
  };

  contextPrototype.arc = function(aX, aY, aRadius,
                                  aStartAngle, aEndAngle, aClockwise) {
    aRadius *= Z;
    var arcType = aClockwise ? 'at' : 'wa';

    var xStart = aX + mc(aStartAngle) * aRadius - Z2;
    var yStart = aY + ms(aStartAngle) * aRadius - Z2;

    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;

    // IE won't render arches drawn counter clockwise if xStart == xEnd.
    if (xStart == xEnd && !aClockwise) {
      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
                       // that can be represented in binary
    }

    var p = getCoords(this, aX, aY);
    var pStart = getCoords(this, xStart, yStart);
    var pEnd = getCoords(this, xEnd, yEnd);

    this.currentPath_.push({type: arcType,
                           x: p.x,
                           y: p.y,
                           radius: aRadius,
                           xStart: pStart.x,
                           yStart: pStart.y,
                           xEnd: pEnd.x,
                           yEnd: pEnd.y});

  };

  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
  };

  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
    var oldPath = this.currentPath_;
    this.beginPath();

    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
    this.stroke();

    this.currentPath_ = oldPath;
  };

  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
    var oldPath = this.currentPath_;
    this.beginPath();

    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
    this.fill();

    this.currentPath_ = oldPath;
  };

  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
    var gradient = new CanvasGradient_('gradient');
    gradient.x0_ = aX0;
    gradient.y0_ = aY0;
    gradient.x1_ = aX1;
    gradient.y1_ = aY1;
    return gradient;
  };

  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
                                                   aX1, aY1, aR1) {
    var gradient = new CanvasGradient_('gradientradial');
    gradient.x0_ = aX0;
    gradient.y0_ = aY0;
    gradient.r0_ = aR0;
    gradient.x1_ = aX1;
    gradient.y1_ = aY1;
    gradient.r1_ = aR1;
    return gradient;
  };

  contextPrototype.drawImage = function(image, var_args) {
    var dx, dy, dw, dh, sx, sy, sw, sh;

    // to find the original width we overide the width and height
    var oldRuntimeWidth = image.runtimeStyle.width;
    var oldRuntimeHeight = image.runtimeStyle.height;
    image.runtimeStyle.width = 'auto';
    image.runtimeStyle.height = 'auto';

    // get the original size
    var w = image.width;
    var h = image.height;

    // and remove overides
    image.runtimeStyle.width = oldRuntimeWidth;
    image.runtimeStyle.height = oldRuntimeHeight;

    if (arguments.length == 3) {
      dx = arguments[1];
      dy = arguments[2];
      sx = sy = 0;
      sw = dw = w;
      sh = dh = h;
    } else if (arguments.length == 5) {
      dx = arguments[1];
      dy = arguments[2];
      dw = arguments[3];
      dh = arguments[4];
      sx = sy = 0;
      sw = w;
      sh = h;
    } else if (arguments.length == 9) {
      sx = arguments[1];
      sy = arguments[2];
      sw = arguments[3];
      sh = arguments[4];
      dx = arguments[5];
      dy = arguments[6];
      dw = arguments[7];
      dh = arguments[8];
    } else {
      throw Error('Invalid number of arguments');
    }

    var d = getCoords(this, dx, dy);

    var w2 = sw / 2;
    var h2 = sh / 2;

    var vmlStr = [];

    var W = 10;
    var H = 10;

    // For some reason that I've now forgotten, using divs didn't work
    vmlStr.push(' <g_vml_:group',
                ' coordsize="', Z * W, ',', Z * H, '"',
                ' coordorigin="0,0"' ,
                ' style="width:', W, 'px;height:', H, 'px;position:absolute;');

    // If filters are necessary (rotation exists), create them
    // filters are bog-slow, so only create them if abbsolutely necessary
    // The following check doesn't account for skews (which don't exist
    // in the canvas spec (yet) anyway.

    if (this.m_[0][0] != 1 || this.m_[0][1] ||
        this.m_[1][1] != 1 || this.m_[1][0]) {
      var filter = [];

      // Note the 12/21 reversal
      filter.push('M11=', this.m_[0][0], ',',
                  'M12=', this.m_[1][0], ',',
                  'M21=', this.m_[0][1], ',',
                  'M22=', this.m_[1][1], ',',
                  'Dx=', mr(d.x / Z), ',',
                  'Dy=', mr(d.y / Z), '');

      // Bounding box calculation (need to minimize displayed area so that
      // filters don't waste time on unused pixels.
      var max = d;
      var c2 = getCoords(this, dx + dw, dy);
      var c3 = getCoords(this, dx, dy + dh);
      var c4 = getCoords(this, dx + dw, dy + dh);

      max.x = m.max(max.x, c2.x, c3.x, c4.x);
      max.y = m.max(max.y, c2.y, c3.y, c4.y);

      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),
                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',
                  filter.join(''), ", sizingmethod='clip');");

    } else {
      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');
    }

		var opacity = ~~(this.globalAlpha * 100);
    vmlStr.push(' ">' ,
                '<g_vml_:image src="', image.src, '"',
                ' style="width:', Z * dw, 'px;',
                ' height:', Z * dh, 'px;',
                ' -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=', opacity, ');',
                ' filter:alpha(opacity=', opacity, ')"',
                ' cropleft="', sx / w, '"',
                ' croptop="', sy / h, '"',
                ' cropright="', (w - sx - sw) / w, '"',
                ' cropbottom="', (h - sy - sh) / h, '"',
                ' />',
                '</g_vml_:group>');

    this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
  };

  contextPrototype.stroke = function(aFill) {
    var lineStr = [];
    var lineOpen = false;

    var W = 10;
    var H = 10;

    lineStr.push('<g_vml_:shape',
                 ' filled="', !!aFill, '"',
                 ' style="position:absolute;width:', W, 'px;height:', H, 'px;"',
                 ' coordorigin="0,0"',
                 ' coordsize="', Z * W, ',', Z * H, '"',
                 ' stroked="', !aFill, '"',
                 ' path="');

    var newSeq = false;
    var min = {x: null, y: null};
    var max = {x: null, y: null};

    for (var i = 0; i < this.currentPath_.length; i++) {
      var p = this.currentPath_[i];
      var c;

      switch (p.type) {
        case 'moveTo':
          c = p;
          lineStr.push(' m ', mr(p.x), ',', mr(p.y));
          break;
        case 'lineTo':
          lineStr.push(' l ', mr(p.x), ',', mr(p.y));
          break;
        case 'close':
          lineStr.push(' x ');
          p = null;
          break;
        case 'bezierCurveTo':
          lineStr.push(' c ',
                       mr(p.cp1x), ',', mr(p.cp1y), ',',
                       mr(p.cp2x), ',', mr(p.cp2y), ',',
                       mr(p.x), ',', mr(p.y));
          break;
        case 'at':
        case 'wa':
          lineStr.push(' ', p.type, ' ',
                       mr(p.x - this.arcScaleX_ * p.radius), ',',
                       mr(p.y - this.arcScaleY_ * p.radius), ' ',
                       mr(p.x + this.arcScaleX_ * p.radius), ',',
                       mr(p.y + this.arcScaleY_ * p.radius), ' ',
                       mr(p.xStart), ',', mr(p.yStart), ' ',
                       mr(p.xEnd), ',', mr(p.yEnd));
          break;
      }


      // TODO: Following is broken for curves due to
      //       move to proper paths.

      // Figure out dimensions so we can do gradient fills
      // properly
      if (p) {
        if (min.x == null || p.x < min.x) {
          min.x = p.x;
        }
        if (max.x == null || p.x > max.x) {
          max.x = p.x;
        }
        if (min.y == null || p.y < min.y) {
          min.y = p.y;
        }
        if (max.y == null || p.y > max.y) {
          max.y = p.y;
        }
      }
    }
    lineStr.push(' ">');

    if (!aFill) {
      appendStroke(this, lineStr);
    } else {
      appendFill(this, lineStr, min, max);
    }

    lineStr.push('</g_vml_:shape>');

    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
  };

  function appendStroke(ctx, lineStr) {
    var a = processStyle(ctx.strokeStyle);
    var color = a.color;
    var opacity = a.alpha * ctx.globalAlpha;
    var lineWidth = ctx.lineScale_ * ctx.lineWidth;

    // VML cannot correctly render a line if the width is less than 1px.
    // In that case, we dilute the color to make the line look thinner.
    if (lineWidth < 1) {
      opacity *= lineWidth;
    }

    lineStr.push(
      '<g_vml_:stroke',
      ' opacity="', opacity, '"',
      ' joinstyle="', ctx.lineJoin, '"',
      ' miterlimit="', ctx.miterLimit, '"',
      ' endcap="', processLineCap(ctx.lineCap), '"',
      ' weight="', lineWidth, 'px"',
      ' color="', color, '" />'
    );
  }

  function appendFill(ctx, lineStr, min, max) {
    var fillStyle = ctx.fillStyle;
    var arcScaleX = ctx.arcScaleX_;
    var arcScaleY = ctx.arcScaleY_;
    var width = max.x - min.x;
    var height = max.y - min.y;
    if (fillStyle instanceof CanvasGradient_) {
      // TODO: Gradients transformed with the transformation matrix.
      var angle = 0;
      var focus = {x: 0, y: 0};

      // additional offset
      var shift = 0;
      // scale factor for offset
      var expansion = 1;

      if (fillStyle.type_ == 'gradient') {
        var x0 = fillStyle.x0_ / arcScaleX;
        var y0 = fillStyle.y0_ / arcScaleY;
        var x1 = fillStyle.x1_ / arcScaleX;
        var y1 = fillStyle.y1_ / arcScaleY;
        var p0 = getCoords(ctx, x0, y0);
        var p1 = getCoords(ctx, x1, y1);
        var dx = p1.x - p0.x;
        var dy = p1.y - p0.y;
        angle = Math.atan2(dx, dy) * 180 / Math.PI;

        // The angle should be a non-negative number.
        if (angle < 0) {
          angle += 360;
        }

        // Very small angles produce an unexpected result because they are
        // converted to a scientific notation string.
        if (angle < 1e-6) {
          angle = 0;
        }
      } else {
        var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_);
        focus = {
          x: (p0.x - min.x) / width,
          y: (p0.y - min.y) / height
        };

        width  /= arcScaleX * Z;
        height /= arcScaleY * Z;
        var dimension = m.max(width, height);
        shift = 2 * fillStyle.r0_ / dimension;
        expansion = 2 * fillStyle.r1_ / dimension - shift;
      }

      // We need to sort the color stops in ascending order by offset,
      // otherwise IE won't interpret it correctly.
      var stops = fillStyle.colors_;
      stops.sort(function(cs1, cs2) {
        return cs1.offset - cs2.offset;
      });

      var length = stops.length;
      var color1 = stops[0].color;
      var color2 = stops[length - 1].color;
      var opacity1 = stops[0].alpha * ctx.globalAlpha;
      var opacity2 = stops[length - 1].alpha * ctx.globalAlpha;

      var colors = [];
      for (var i = 0; i < length; i++) {
        var stop = stops[i];
        colors.push(stop.offset * expansion + shift + ' ' + stop.color);
      }

      // When colors attribute is used, the meanings of opacity and o:opacity2
      // are reversed.
      lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"',
                   ' method="none" focus="100%"',
                   ' color="', color1, '"',
                   ' color2="', color2, '"',
                   ' colors="', colors.join(','), '"',
                   ' opacity="', opacity2, '"',
                   ' g_o_:opacity2="', opacity1, '"',
                   ' angle="', angle, '"',
                   ' focusposition="', focus.x, ',', focus.y, '" />');
    } else if (fillStyle instanceof CanvasPattern_) {
      if (width && height) {
        var deltaLeft = -min.x;
        var deltaTop = -min.y;
        lineStr.push('<g_vml_:fill',
                     ' position="',
                     deltaLeft / width * arcScaleX * arcScaleX, ',',
                     deltaTop / height * arcScaleY * arcScaleY, '"',
                     ' type="tile"',
                     // TODO: Figure out the correct size to fit the scale.
                     //' size="', w, 'px ', h, 'px"',
                     ' src="', fillStyle.src_, '" />');
       }
    } else {
      var a = processStyle(ctx.fillStyle);
      var color = a.color;
      var opacity = a.alpha * ctx.globalAlpha;
      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity,
                   '" />');
    }
  }

  contextPrototype.fill = function() {
    this.stroke(true);
  };

  contextPrototype.closePath = function() {
    this.currentPath_.push({type: 'close'});
  };

  function getCoords(ctx, aX, aY) {
    var m = ctx.m_;
    return {
      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
    };
  };

  contextPrototype.save = function() {
    var o = {};
    copyState(this, o);
    this.aStack_.push(o);
    this.mStack_.push(this.m_);
    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
  };

  contextPrototype.restore = function() {
    if (this.aStack_.length) {
      copyState(this.aStack_.pop(), this);
      this.m_ = this.mStack_.pop();
    }
  };

  function matrixIsFinite(m) {
    return isFinite(m[0][0]) && isFinite(m[0][1]) &&
        isFinite(m[1][0]) && isFinite(m[1][1]) &&
        isFinite(m[2][0]) && isFinite(m[2][1]);
  }

  function setM(ctx, m, updateLineScale) {
    if (!matrixIsFinite(m)) {
      return;
    }
    ctx.m_ = m;

    if (updateLineScale) {
      // Get the line scale.
      // Determinant of this.m_ means how much the area is enlarged by the
      // transformation. So its square root can be used as a scale factor
      // for width.
      var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
      ctx.lineScale_ = sqrt(abs(det));
    }
  }

  contextPrototype.translate = function(aX, aY) {
    var m1 = [
      [1,  0,  0],
      [0,  1,  0],
      [aX, aY, 1]
    ];

    setM(this, matrixMultiply(m1, this.m_), false);
  };

  contextPrototype.rotate = function(aRot) {
    var c = mc(aRot);
    var s = ms(aRot);

    var m1 = [
      [c,  s, 0],
      [-s, c, 0],
      [0,  0, 1]
    ];

    setM(this, matrixMultiply(m1, this.m_), false);
  };

  contextPrototype.scale = function(aX, aY) {
    this.arcScaleX_ *= aX;
    this.arcScaleY_ *= aY;
    var m1 = [
      [aX, 0,  0],
      [0,  aY, 0],
      [0,  0,  1]
    ];

    setM(this, matrixMultiply(m1, this.m_), true);
  };

  contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
    var m1 = [
      [m11, m12, 0],
      [m21, m22, 0],
      [dx,  dy,  1]
    ];

    setM(this, matrixMultiply(m1, this.m_), true);
  };

  contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
    var m = [
      [m11, m12, 0],
      [m21, m22, 0],
      [dx,  dy,  1]
    ];

    setM(this, m, true);
  };

  /**
   * The text drawing function.
   * The maxWidth argument isn't taken in account, since no browser supports
   * it yet.
   */
  contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) {
    var m = this.m_,
        delta = 1000,
        left = 0,
        right = delta,
        offset = {x: 0, y: 0},
        lineStr = [];

    var fontStyle = getComputedStyle(processFontStyle(this.font),
                                     this.element_);

    var fontStyleString = buildStyle(fontStyle);

    var elementStyle = this.element_.currentStyle;
    var textAlign = this.textAlign.toLowerCase();
    switch (textAlign) {
      case 'left':
      case 'center':
      case 'right':
        break;
      case 'end':
        textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left';
        break;
      case 'start':
        textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left';
        break;
      default:
        textAlign = 'left';
    }

    // 1.75 is an arbitrary number, as there is no info about the text baseline
    switch (this.textBaseline) {
      case 'hanging':
      case 'top':
        offset.y = fontStyle.size / 1.75;
        break;
      case 'middle':
        break;
      default:
      case null:
      case 'alphabetic':
      case 'ideographic':
      case 'bottom':
        offset.y = -fontStyle.size / 2.25;
        break;
    }

    switch(textAlign) {
      case 'right':
        left = delta;
        right = 0.05;
        break;
      case 'center':
        left = right = delta / 2;
        break;
    }

    var d = getCoords(this, x + offset.x, y + offset.y);

    lineStr.push('<g_vml_:line from="', -left ,' 0" to="', right ,' 0.05" ',
                 ' coordsize="100 100" coordorigin="0 0"',
                 ' filled="', !stroke, '" stroked="', !!stroke,
                 '" style="position:absolute;width:1px;height:1px;">');

    if (stroke) {
      appendStroke(this, lineStr);
    } else {
      // TODO: Fix the min and max params.
      appendFill(this, lineStr, {x: -left, y: 0},
                 {x: right, y: fontStyle.size});
    }

    var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' +
                m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0';

    var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z);

    lineStr.push('<g_vml_:skew on="t" matrix="', skewM ,'" ',
                 ' offset="', skewOffset, '" origin="', left ,' 0" />',
                 '<g_vml_:path textpathok="true" />',
                 '<g_vml_:textpath on="true" string="',
                 encodeHtmlAttribute(text),
                 '" style="v-text-align:', textAlign,
                 ';font:', encodeHtmlAttribute(fontStyleString),
                 '" /></g_vml_:line>');

    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
  };

  contextPrototype.fillText = function(text, x, y, maxWidth) {
    this.drawText_(text, x, y, maxWidth, false);
  };

  contextPrototype.strokeText = function(text, x, y, maxWidth) {
    this.drawText_(text, x, y, maxWidth, true);
  };

  contextPrototype.measureText = function(text) {
    if (!this.textMeasureEl_) {
      var s = '<span style="position:absolute;' +
          'top:-20000px;left:0;padding:0;margin:0;border:none;' +
          'white-space:pre;"></span>';
      this.element_.insertAdjacentHTML('beforeEnd', s);
      this.textMeasureEl_ = this.element_.lastChild;
    }
    var doc = this.element_.ownerDocument;
    this.textMeasureEl_.innerHTML = '';
    this.textMeasureEl_.style.font = this.font;
    // Don't use innerHTML or innerText because they allow markup/whitespace.
    this.textMeasureEl_.appendChild(doc.createTextNode(text));
    return {width: this.textMeasureEl_.offsetWidth};
  };

  /******** STUBS ********/
  contextPrototype.clip = function() {
    // TODO: Implement
  };

  contextPrototype.arcTo = function() {
    // TODO: Implement
  };

  contextPrototype.createPattern = function(image, repetition) {
    return new CanvasPattern_(image, repetition);
  };

  // Gradient / Pattern Stubs
  function CanvasGradient_(aType) {
    this.type_ = aType;
    this.x0_ = 0;
    this.y0_ = 0;
    this.r0_ = 0;
    this.x1_ = 0;
    this.y1_ = 0;
    this.r1_ = 0;
    this.colors_ = [];
  }

  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
    aColor = processStyle(aColor);
    this.colors_.push({offset: aOffset,
                       color: aColor.color,
                       alpha: aColor.alpha});
  };

  function CanvasPattern_(image, repetition) {
    assertImageIsValid(image);
    switch (repetition) {
      case 'repeat':
      case null:
      case '':
        this.repetition_ = 'repeat';
        break
      case 'repeat-x':
      case 'repeat-y':
      case 'no-repeat':
        this.repetition_ = repetition;
        break;
      default:
        throwException('SYNTAX_ERR');
    }

    this.src_ = image.src;
    this.width_ = image.width;
    this.height_ = image.height;
  }

  function throwException(s) {
    throw new DOMException_(s);
  }

  function assertImageIsValid(img) {
    if (!img || img.nodeType != 1 || img.tagName != 'IMG') {
      throwException('TYPE_MISMATCH_ERR');
    }
    if (img.readyState != 'complete') {
      throwException('INVALID_STATE_ERR');
    }
  }

  function DOMException_(s) {
    this.code = this[s];
    this.message = s +': DOM Exception ' + this.code;
  }
  var p = DOMException_.prototype = new Error;
  p.INDEX_SIZE_ERR = 1;
  p.DOMSTRING_SIZE_ERR = 2;
  p.HIERARCHY_REQUEST_ERR = 3;
  p.WRONG_DOCUMENT_ERR = 4;
  p.INVALID_CHARACTER_ERR = 5;
  p.NO_DATA_ALLOWED_ERR = 6;
  p.NO_MODIFICATION_ALLOWED_ERR = 7;
  p.NOT_FOUND_ERR = 8;
  p.NOT_SUPPORTED_ERR = 9;
  p.INUSE_ATTRIBUTE_ERR = 10;
  p.INVALID_STATE_ERR = 11;
  p.SYNTAX_ERR = 12;
  p.INVALID_MODIFICATION_ERR = 13;
  p.NAMESPACE_ERR = 14;
  p.INVALID_ACCESS_ERR = 15;
  p.VALIDATION_ERR = 16;
  p.TYPE_MISMATCH_ERR = 17;

  // set up externs
  G_vmlCanvasManager = G_vmlCanvasManager_;
  CanvasRenderingContext2D = CanvasRenderingContext2D_;
  CanvasGradient = CanvasGradient_;
  CanvasPattern = CanvasPattern_;
  DOMException = DOMException_;
})();

} // if
PK�|H[���z�zjquery.tagcanvas.min.jsnu&1i�/**
 * Copyright (C) 2010-2013 Graham Breach
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * jQuery.tagcanvas 2.2
 * For more information, please contact <graham@goat1000.com>
 */
(function(ad){var ap,ao,aa=Math.abs,w=Math.sin,l=Math.cos,I=Math.max,au=Math.min,V=Math.ceil,ai=Math.sqrt,X=Math.pow,L={},O={},R={0:"0,",1:"17,",2:"34,",3:"51,",4:"68,",5:"85,",6:"102,",7:"119,",8:"136,",9:"153,",a:"170,",A:"170,",b:"187,",B:"187,",c:"204,",C:"204,",d:"221,",D:"221,",e:"238,",E:"238,",f:"255,",F:"255,"},e,ae,d,a,af,z,o=document,H,c={};for(ap=0;ap<256;++ap){ao=ap.toString(16);if(ap<16){ao="0"+ao}O[ao]=O[ao.toUpperCase()]=ap.toString()+","}function ak(i){return typeof i!="undefined"}function v(i){return typeof i=="object"&&i!=null}function b(i,j,aw){return isNaN(i)?aw:au(aw,I(j,i))}function Y(){return false}function T(){return new Date().valueOf()}function n(aw,az){var j=[],ax=aw.length,ay;for(ay=0;ay<ax;++ay){j.push(aw[ay])}j.sort(az);return j}function ac(j){var ax=j.length-1,aw,ay;while(ax){ay=~~(Math.random()*ax);aw=j[ax];j[ax]=j[ay];j[ay]=aw;--ax}}function U(i,aw,j){this.x=i;this.y=aw;this.z=j}af=U.prototype;af.length=function(){return ai(this.x*this.x+this.y*this.y+this.z*this.z)};af.dot=function(i){return this.x*i.x+this.y*i.y+this.z*i.z};af.cross=function(j){var i=this.y*j.z-this.z*j.y,ax=this.z*j.x-this.x*j.z,aw=this.x*j.y-this.y*j.x;return new U(i,ax,aw)};af.angle=function(j){var i=this.dot(j),aw;if(i==0){return Math.PI/2}aw=i/(this.length()*j.length());if(aw>=1){return 0}if(aw<=-1){return Math.PI}return Math.acos(aw)};af.unit=function(){var i=this.length();return new U(this.x/i,this.y/i,this.z/i)};function K(aw,j){j=j*Math.PI/180;aw=aw*Math.PI/180;var i=w(aw)*l(j),ay=-w(j),ax=-l(aw)*l(j);return new U(i,ay,ax)}function k(i){this[1]={1:i[0],2:i[1],3:i[2]};this[2]={1:i[3],2:i[4],3:i[5]};this[3]={1:i[6],2:i[7],3:i[8]}}a=k.prototype;k.Identity=function(){return new k([1,0,0,0,1,0,0,0,1])};k.Rotation=function(ax,i){var j=w(ax),aw=l(ax),ay=1-aw;return new k([aw+X(i.x,2)*ay,i.x*i.y*ay-i.z*j,i.x*i.z*ay+i.y*j,i.y*i.x*ay+i.z*j,aw+X(i.y,2)*ay,i.y*i.z*ay-i.x*j,i.z*i.x*ay-i.y*j,i.z*i.y*ay+i.x*j,aw+X(i.z,2)*ay])};a.mul=function(aw){var ax=[],aA,az,ay=(aw.xform?1:0);for(aA=1;aA<=3;++aA){for(az=1;az<=3;++az){if(ay){ax.push(this[aA][1]*aw[1][az]+this[aA][2]*aw[2][az]+this[aA][3]*aw[3][az])}else{ax.push(this[aA][az]*aw)}}}return new k(ax)};a.xform=function(aw){var j={},i=aw.x,ay=aw.y,ax=aw.z;j.x=i*this[1][1]+ay*this[2][1]+ax*this[3][1];j.y=i*this[1][2]+ay*this[2][2]+ax*this[3][2];j.z=i*this[1][3]+ay*this[2][3]+ax*this[3][3];return j};function s(ax,az,aE,aB){var aA,aD,j,aC,aF=[],ay=Math.PI*(3-ai(5)),aw=2/ax;for(aA=0;aA<ax;++aA){aD=aA*aw-1+(aw/2);j=ai(1-aD*aD);aC=aA*ay;aF.push([l(aC)*j*az,aD*aE,w(aC)*j*aB])}return aF}function at(ay,aw,aB,aH,aF){var aG,aI=[],az=Math.PI*(3-ai(5)),ax=2/ay,aE,aD,aC,aA;for(aE=0;aE<ay;++aE){aD=aE*ax-1+(ax/2);aG=aE*az;aC=l(aG);aA=w(aG);aI.push(aw?[aD*aB,aC*aH,aA*aF]:[aC*aB,aD*aH,aA*aF])}return aI}function Q(aw,ax,aA,aG,aE,aC){var aF,aH=[],ay=Math.PI*2/ax,aD,aB,az;for(aD=0;aD<ax;++aD){aF=aD*ay;aB=l(aF);az=w(aF);aH.push(aw?[aC*aA,aB*aG,az*aE]:[aB*aA,aC*aG,az*aE])}return aH}function E(ax,i,j,aw){return at(ax,0,i,j,aw)}function W(ax,i,j,aw){return at(ax,1,i,j,aw)}function C(ay,i,j,aw,ax){ax=isNaN(ax)?0:ax*1;return Q(0,ay,i,j,aw,ax)}function N(ay,i,j,aw,ax){ax=isNaN(ax)?0:ax*1;return Q(1,ay,i,j,aw,ax)}function u(az,i){var ay=az,ax,aw,j=(i*1).toPrecision(3)+")";if(az[0]==="#"){if(!L[az]){if(az.length===4){L[az]="rgba("+R[az[1]]+R[az[2]]+R[az[3]]}else{L[az]="rgba("+O[az.substr(1,2)]+O[az.substr(3,2)]+O[az.substr(5,2)]}}ay=L[az]+j}else{if(az.substr(0,4)==="rgb("||az.substr(0,4)==="hsl("){ay=(az.replace("(","a(").replace(")",","+j))}else{if(az.substr(0,5)==="rgba("||az.substr(0,5)==="hsla("){ax=az.lastIndexOf(",")+1,aw=az.indexOf(")");i*=parseFloat(az.substring(ax,aw));ay=az.substr(0,ax)+i.toPrecision(3)+")"}}}return ay}function h(i,j){if(window.G_vmlCanvasManager){return null}var aw=o.createElement("canvas");aw.width=i;aw.height=j;return aw}function D(){var j=h(3,3),ax,aw;if(!j){return false}ax=j.getContext("2d");ax.strokeStyle="#000";ax.shadowColor="#fff";ax.shadowBlur=3;ax.globalAlpha=0;ax.strokeRect(2,2,2,2);ax.globalAlpha=1;aw=ax.getImageData(2,2,1,1);j=null;return(aw.data[0]>0)}function av(aD,j){var aw=1024,az=aD.weightGradient,ay,aB,ax,aC,aA;if(aD.gCanvas){aB=aD.gCanvas.getContext("2d")}else{aD.gCanvas=ay=h(aw,1);if(!ay){return null}aB=ay.getContext("2d");aC=aB.createLinearGradient(0,0,aw,0);for(ax in az){aC.addColorStop(1-ax,az[ax])}aB.fillStyle=aC;aB.fillRect(0,0,aw,1)}aA=aB.getImageData(~~((aw-1)*j),0,1,1).data;return"rgba("+aA[0]+","+aA[1]+","+aA[2]+","+(aA[3]/255)+")"}function B(aB,aA,ax,aH,aC,aD,aw,aE,aF){var az=(aD||0)+(aw&&aw[0]<0?aa(aw[0]):0),j=(aD||0)+(aw&&aw[1]<0?aa(aw[1]):0),ay,aG;aB.font=aA;aB.textBaseline="top";aB.fillStyle=ax;aC&&(aB.shadowColor=aC);aD&&(aB.shadowBlur=aD);aw&&(aB.shadowOffsetX=aw[0],aB.shadowOffsetY=aw[1]);for(ay=0;ay<aH.length;++ay){aG=aF?(aE-aF[ay])/2:0;aB.fillText(aH[ay],az+aG,j);j+=parseInt(aA)}}function q(aK,aB,aG,aI,aA,ax,aE,aF,j,aJ,aH,aD,aw){var ay=aI+aa(j[0])+aF+aF,i=aA+aa(j[1])+aF+aF,az,aC;az=h(ay+aJ,i+aH);if(!az){return null}aC=az.getContext("2d");B(aC,aB,ax,aK,aE,aF,j,aD,aw);return az}function an(aB,aE,aF,ax){var aG=aa(ax[0]),aC=aa(ax[1]),ay=aB.width+(aG>aF?aG+aF:aF*2),j=aB.height+(aC>aF?aC+aF:aF*2),aA=(aF||0)+(ax[0]<0?aG:0),aw=(aF||0)+(ax[1]<0?aC:0),az,aD;az=h(ay,j);if(!az){return null}aD=az.getContext("2d");aE&&(aD.shadowColor=aE);aF&&(aD.shadowBlur=aF);ax&&(aD.shadowOffsetX=ax[0],aD.shadowOffsetY=ax[1]);aD.drawImage(aB,aA,aw,aB.width,aB.height);return az}function ag(aI,aA,aG){var aH=parseInt(aI.toString().length*aG),az=parseInt(aG*2*aI.length),ax=h(aH,az),aD,j,ay,aC,aF,aE,aw,aB;if(!ax){return null}aD=ax.getContext("2d");aD.fillStyle="#000";aD.fillRect(0,0,aH,az);B(aD,aG+"px "+aA,"#fff",aI,0,0,[]);j=aD.getImageData(0,0,aH,az);ay=j.width;aC=j.height;aB={min:{x:ay,y:aC},max:{x:-1,y:-1}};for(aE=0;aE<aC;++aE){for(aF=0;aF<ay;++aF){aw=(aE*ay+aF)*4;if(j.data[aw+1]>0){if(aF<aB.min.x){aB.min.x=aF}if(aF>aB.max.x){aB.max.x=aF}if(aE<aB.min.y){aB.min.y=aE}if(aE>aB.max.y){aB.max.y=aE}}}}if(ay!=aH){aB.min.x*=(aH/ay);aB.max.x*=(aH/ay)}if(aC!=az){aB.min.y*=(aH/aC);aB.max.y*=(aH/aC)}ax=null;return aB}function y(i){return"'"+i.replace(/(\'|\")/g,"").replace(/\s*,\s*/g,"', '")+"'"}function G(i,j,aw){aw=aw||o;if(aw.addEventListener){aw.addEventListener(i,j,false)}else{aw.attachEvent("on"+i,j)}}function am(ay,aA,ax,aw){var az=aw.imageScale,j;if(!aA.complete){return G("load",function(){am(ay,aA,ax,aw)},aA)}if(!ay.complete){return G("load",function(){am(ay,aA,ax,aw)},ay)}aA.width=aA.width;aA.height=aA.height;if(az){ay.width=aA.width*az;ay.height=aA.height*az}ax.w=ay.width;ax.h=ay.height;if(aw.txtOpt&&aw.shadow){j=an(ay,aw.shadow,aw.shadowBlur,aw.shadowOffset);if(j){ax.image=j;ax.w=j.width;ax.h=j.height}}}function aj(ax,aw){var j=o.defaultView,i=aw.replace(/\-([a-z])/g,function(ay){return ay.charAt(1).toUpperCase()});return(j&&j.getComputedStyle&&j.getComputedStyle(ax,null).getPropertyValue(aw))||(ax.currentStyle&&ax.currentStyle[i])}function F(aw,j){var i=1,ax;if(aw.weightFrom){i=1*(j.getAttribute(aw.weightFrom)||aw.textHeight)}else{if(ax=aj(j,"font-size")){i=(ax.indexOf("px")>-1&&ax.replace("px","")*1)||(ax.indexOf("pt")>-1&&ax.replace("pt","")*1.25)||ax*3.3}else{aw.weight=false}}return i}function A(i){return i.target&&ak(i.target.id)?i.target.id:i.srcElement.parentNode.id}function M(ay,az){var ax,aw,i=parseInt(aj(az,"width"))/az.width,j=parseInt(aj(az,"height"))/az.height;if(ak(ay.offsetX)){ax={x:ay.offsetX,y:ay.offsetY}}else{aw=r(az.id);if(ak(ay.changedTouches)){ay=ay.changedTouches[0]}if(ay.pageX){ax={x:ay.pageX-aw.x,y:ay.pageY-aw.y}}}if(ax&&i&&j){ax.x/=i;ax.y/=j}return ax}function m(aw){var j=aw.target||aw.fromElement.parentNode,i=x.tc[j.id];if(i){i.mx=i.my=-1;i.UnFreeze();i.EndDrag()}}function ah(aA){var ax,aw=x,j,az,ay=A(aA);for(ax in aw.tc){j=aw.tc[ax];if(j.tttimer){clearTimeout(j.tttimer);j.tttimer=null}}if(ay&&aw.tc[ay]){j=aw.tc[ay];if(az=M(aA,j.canvas)){j.mx=az.x;j.my=az.y;j.Drag(aA,az)}j.drawn=0}}function Z(ax){var j=x,i=o.addEventListener?0:1,aw=A(ax);if(aw&&ax.button==i&&j.tc[aw]){j.tc[aw].BeginDrag(ax)}}function g(ay){var aw=x,j=o.addEventListener?0:1,ax=A(ay),i;if(ax&&ay.button==j&&aw.tc[ax]){i=aw.tc[ax];ah(ay);if(!i.EndDrag()&&!i.touched){i.Clicked(ay)}}}function J(aw){var i=x,j=A(aw);if(j&&aw.changedTouches&&i.tc[j]){i.tc[j].touched=1;i.tc[j].BeginDrag(aw)}}function p(aw){var i=x,j=A(aw);if(j&&aw.changedTouches&&i.tc[j]){ab(aw);if(!i.tc[j].EndDrag()){i.tc[j].Draw();i.tc[j].Clicked(aw)}}}function ab(aA){var ax,aw=x,j,az,ay=A(aA);for(ax in aw.tc){j=aw.tc[ax];if(j.tttimer){clearTimeout(j.tttimer);j.tttimer=null}}if(ay&&aw.tc[ay]&&aA.changedTouches){j=aw.tc[ay];if(az=M(aA,j.canvas)){j.mx=az.x;j.my=az.y;j.Drag(aA,az)}j.drawn=0}}function ar(aw){var i=x,j=A(aw);if(j&&i.tc[j]){aw.cancelBubble=true;aw.returnValue=false;aw.preventDefault&&aw.preventDefault();i.tc[j].Wheel((aw.wheelDelta||aw.detail)>0)}}function t(ay){var j=x.tc,ax,aw;ay=ay||T();for(ax in j){aw=j[ax].interval;j[ax].Draw(ay)}x.NextFrame(aw)}function r(aw){var az=o.getElementById(aw),i=az.getBoundingClientRect(),aC=o.documentElement,aA=o.body,aB=window,ax=aB.pageXOffset||aC.scrollLeft,aD=aB.pageYOffset||aC.scrollTop,ay=aC.clientLeft||aA.clientLeft,j=aC.clientTop||aA.clientTop;return{x:i.left+ax-ay,y:i.top+aD-j}}function aq(j,ax,ay,aw){var i=j.radius*j.z1/(j.z1+j.z2+ax.z);return{x:ax.x*i*ay,y:ax.y*i*aw,z:ax.z,w:(j.z1-ax.z)/j.z2}}function P(i){this.e=i;this.br=0;this.line=[];this.text=[];this.original=i.innerText||i.textContent}z=P.prototype;z.Lines=function(ay){var ax=ay?1:0,az,j,aw;ay=ay||this.e;az=ay.childNodes;j=az.length;for(aw=0;aw<j;++aw){if(az[aw].nodeName=="BR"){this.text.push(this.line.join(" "));this.br=1}else{if(az[aw].nodeType==3){if(this.br){this.line=[az[aw].nodeValue];this.br=0}else{this.line.push(az[aw].nodeValue)}}else{this.Lines(az[aw])}}}ax||this.br||this.text.push(this.line.join(" "));return this.text};z.SplitWidth=function(aw,aD,aA,az){var ay,ax,aC,aB=[];aD.font=az+"px "+aA;for(ay=0;ay<this.text.length;++ay){aC=this.text[ay].split(/\s+/);this.line=[aC[0]];for(ax=1;ax<aC.length;++ax){if(aD.measureText(this.line.join(" ")+" "+aC[ax]).width>aw){aB.push(this.line.join(" "));this.line=[aC[ax]]}else{this.line.push(aC[ax])}}aB.push(this.line.join(" "))}return this.text=aB};function f(i){this.ts=T();this.tc=i;this.x=this.y=this.w=this.h=this.sc=1;this.z=0;this.Draw=i.pulsateTo<1&&i.outlineMethod!="colour"?this.DrawPulsate:this.DrawSimple;this.SetMethod(i.outlineMethod)}e=f.prototype;e.SetMethod=function(aw){var j={block:["PreDraw","DrawBlock"],colour:["PreDraw","DrawColour"],outline:["PostDraw","DrawOutline"],classic:["LastDraw","DrawOutline"],none:["LastDraw"]},i=j[aw]||j.outline;if(aw=="none"){this.Draw=function(){return 1}}else{this.drawFunc=this[i[1]]}this[i[0]]=this.Draw};e.Update=function(aC,aB,aD,ay,az,aA,ax,i){var j=this.tc.outlineOffset,aw=2*j;this.x=az*aC+ax-j;this.y=az*aB+i-j;this.w=az*aD+aw;this.h=az*ay+aw;this.sc=az;this.z=aA};e.DrawOutline=function(az,i,ay,j,aw,ax){az.strokeStyle=ax;az.strokeRect(i,ay,j,aw)};e.DrawColour=function(ax,aA,ay,aB,aw,i,aC,j,az){return this[aC.image?"DrawColourImage":"DrawColourText"](ax,aA,ay,aB,aw,i,aC,j,az)};e.DrawColourText=function(ay,aB,az,aC,aw,i,aD,j,aA){var ax=aD.colour;aD.colour=i;aD.alpha=1;aD.Draw(ay,j,aA);aD.colour=ax;return 1};e.DrawColourImage=function(aB,aE,aC,aF,aA,i,aI,j,aD){var aG=aB.canvas,ay=~~I(aE,0),ax=~~I(aC,0),az=au(aG.width-ay,aF)+0.5|0,aH=au(aG.height-ax,aA)+0.5|0,aw;if(H){H.width=az,H.height=aH}else{H=h(az,aH)}if(!H){return this.SetMethod("outline")}aw=H.getContext("2d");aw.drawImage(aG,ay,ax,az,aH,0,0,az,aH);aB.clearRect(ay,ax,az,aH);aI.alpha=1;aI.Draw(aB,j,aD);aB.setTransform(1,0,0,1,0,0);aB.save();aB.beginPath();aB.rect(ay,ax,az,aH);aB.clip();aB.globalCompositeOperation="source-in";aB.fillStyle=i;aB.fillRect(ay,ax,az,aH);aB.restore();aB.globalCompositeOperation="destination-over";aB.drawImage(H,0,0,az,aH,ay,ax,az,aH);aB.globalCompositeOperation="source-over";return 1};e.DrawBlock=function(az,i,ay,j,aw,ax){az.fillStyle=ax;az.fillRect(i,ay,j,aw)};e.DrawSimple=function(ay,i,j,ax){var aw=this.tc;ay.setTransform(1,0,0,1,0,0);ay.strokeStyle=aw.outlineColour;ay.lineWidth=aw.outlineThickness;ay.shadowBlur=ay.shadowOffsetX=ay.shadowOffsetY=0;ay.globalAlpha=1;return this.drawFunc(ay,this.x,this.y,this.w,this.h,aw.outlineColour,i,j,ax)};e.DrawPulsate=function(az,i,j,ax){var ay=T()-this.ts,aw=this.tc;az.setTransform(1,0,0,1,0,0);az.strokeStyle=aw.outlineColour;az.lineWidth=aw.outlineThickness;az.shadowBlur=az.shadowOffsetX=az.shadowOffsetY=0;az.globalAlpha=aw.pulsateTo+((1-aw.pulsateTo)*(0.5+(l(2*Math.PI*ay/(1000*aw.pulsateTime))/2)));return this.drawFunc(az,this.x,this.y,this.w,this.h,aw.outlineColour,i,j,ax)};e.Active=function(aw,i,j){return(i>=this.x&&j>=this.y&&i<=this.x+this.w&&j<=this.y+this.h)};e.PreDraw=e.PostDraw=e.LastDraw=Y;function S(ax,aD,aA,aC,aB,ay,j,aw,i){var az=ax.ctxt;this.tc=ax;this.image=aD.src?aD:null;this.text=aD.src?[]:aD;this.text_original=i;this.line_widths=[];this.title=aA.title||null;this.a=aA;this.position=new U(aC[0],aC[1],aC[2]);this.x=this.y=this.z=0;this.w=aB;this.h=ay;this.colour=j||ax.textColour;this.textFont=aw||ax.textFont;this.weight=this.sc=this.alpha=1;this.weighted=!ax.weight;this.outline=new f(ax);if(!this.image){this.textHeight=ax.textHeight;this.extents=ag(this.text,this.textFont,this.textHeight);this.Measure(az,ax)}this.SetShadowColour=ax.shadowAlpha?this.SetShadowColourAlpha:this.SetShadowColourFixed;this.SetDraw(ax)}ae=S.prototype;ae.EqualTo=function(aw){var j=aw.getElementsByTagName("img");if(this.a.href!=aw.href){return 0}if(j.length){return this.image.src==j[0].src}return(aw.innerText||aw.textContent)==this.text_original};ae.SetDraw=function(i){this.Draw=this.image?(i.ie>7?this.DrawImageIE:this.DrawImage):this.DrawText;i.noSelect&&(this.CheckActive=Y)};ae.MeasureText=function(az){var ax,aw=this.text.length,j=0,ay;for(ax=0;ax<aw;++ax){this.line_widths[ax]=ay=az.measureText(this.text[ax]).width;j=I(j,ay)}return j};ae.Measure=function(aA,j){this.h=this.extents?this.extents.max.y+this.extents.min.y:this.textHeight;aA.font=this.font=this.textHeight+"px "+this.textFont;this.w=this.MeasureText(aA);if(j.txtOpt){var ax=j.txtScale,ay=ax*this.textHeight,az=ay+"px "+this.textFont,aw=[ax*j.shadowOffset[0],ax*j.shadowOffset[1]],i;aA.font=az;i=this.MeasureText(aA);this.image=q(this.text,az,ay,i,ax*this.h,this.colour,j.shadow,ax*j.shadowBlur,aw,ax,ax,i,this.line_widths);if(this.image){this.w=this.image.width/ax;this.h=this.image.height/ax}this.SetDraw(j);j.txtOpt=!!this.image}};ae.SetFont=function(i,j){this.textFont=i;this.colour=j;this.extents=ag(this.text,this.textFont,this.textHeight);this.Measure(this.tc.ctxt,this.tc)};ae.SetWeight=function(i){if(!this.text.length){return}this.weight=i;this.Weight(this.tc.ctxt,this.tc);this.Measure(this.tc.ctxt,this.tc)};ae.Weight=function(ax,aw){var j=this.weight,i=aw.weightMode;this.weighted=true;if(i=="colour"||i=="both"){this.colour=av(aw,(j-aw.min_weight)/(aw.max_weight-aw.min_weight))}if(i=="size"||i=="both"){if(aw.weightSizeMin>0&&aw.weightSizeMax>aw.weightSizeMin){this.textHeight=aw.weightSize*(aw.weightSizeMin+(aw.weightSizeMax-aw.weightSizeMin)*(j-aw.min_weight)/(aw.max_weight-aw.min_weight))}else{this.textHeight=j*aw.weightSize}}this.extents=ag(this.text,this.textFont,this.textHeight)};ae.SetShadowColourFixed=function(aw,j,i){aw.shadowColor=j};ae.SetShadowColourAlpha=function(aw,j,i){aw.shadowColor=u(j,i)};ae.DrawText=function(ay,aB,ax){var aC=this.tc,aA=this.x,az=this.y,aD=this.sc,j,aw;ay.globalAlpha=this.alpha;ay.fillStyle=this.colour;aC.shadow&&this.SetShadowColour(ay,aC.shadow,this.alpha);ay.font=this.font;aA+=aB/aD;az+=(ax/aD)-(this.h/2);for(j=0;j<this.text.length;++j){aw=aA-(this.line_widths[j]/2);ay.setTransform(aD,0,0,aD,aD*aw,aD*az);ay.fillText(this.text[j],0,0);az+=this.textHeight}};ae.DrawImage=function(ay,aE,ax){var aB=this.x,az=this.y,aF=this.sc,j=this.image,aC=this.w,aw=this.h,aA=this.alpha,aD=this.shadow;ay.globalAlpha=aA;aD&&this.SetShadowColour(ay,aD,aA);aB+=(aE/aF)-(aC/2);az+=(ax/aF)-(aw/2);ay.setTransform(aF,0,0,aF,aF*aB,aF*az);ay.drawImage(j,0,0,aC,aw)};ae.DrawImageIE=function(ay,aC,ax){var j=this.image,aD=this.sc,aB=j.width=this.w*aD,aw=j.height=this.h*aD,aA=(this.x*aD)+aC-(aB/2),az=(this.y*aD)+ax-(aw/2);ay.setTransform(1,0,0,1,0,0);ay.globalAlpha=this.alpha;ay.drawImage(j,aA,az)};ae.Calc=function(i,aw){var j,az=this.tc,ay=az.minBrightness,ax=az.maxBrightness,aA=az.max_radius;j=i.xform(this.position);this.xformed=j;j=aq(az,j,az.stretchX,az.stretchY);this.x=j.x;this.y=j.y;this.z=j.z;this.sc=j.w;this.alpha=aw*b(ay+(ax-ay)*(aA-this.z)/(2*aA),0,1)};ae.CheckActive=function(ax,aB,aw){var aC=this.tc,i=this.outline,aA=this.w,j=this.h,az=this.x-aA/2,ay=this.y-j/2;i.Update(az,ay,aA,j,this.sc,this.z,aB,aw);return i.Active(ax,aC.mx,aC.my)?i:null};ae.Clicked=function(az){var j=this.a,aw=j.target,ax=j.href,i;if(aw!=""&&aw!="_self"){if(self.frames[aw]){self.frames[aw].document.location=ax}else{try{if(top.frames[aw]){top.frames[aw].document.location=ax;return}}catch(ay){}window.open(ax,aw)}return}if(o.createEvent){i=o.createEvent("MouseEvents");i.initMouseEvent("click",1,1,window,0,0,0,0,0,0,0,0,0,0,null);if(!j.dispatchEvent(i)){return}}else{if(j.fireEvent){if(!j.fireEvent("onclick")){return}}}o.location=ax};function x(aB,j,ax){var aw,az,aA=o.getElementById(aB),ay=["id","class","innerHTML"];if(!aA){throw 0}if(ak(window.G_vmlCanvasManager)){aA=window.G_vmlCanvasManager.initElement(aA);this.ie=parseFloat(navigator.appVersion.split("MSIE")[1])}if(aA&&(!aA.getContext||!aA.getContext("2d").fillText)){az=o.createElement("DIV");for(aw=0;aw<ay.length;++aw){az[ay[aw]]=aA[ay[aw]]}aA.parentNode.insertBefore(az,aA);aA.parentNode.removeChild(aA);throw 0}for(aw in x.options){this[aw]=ax&&ak(ax[aw])?ax[aw]:(ak(x[aw])?x[aw]:x.options[aw])}this.canvas=aA;this.ctxt=aA.getContext("2d");this.z1=250/this.depth;this.z2=this.z1/this.zoom;this.radius=au(aA.height,aA.width)*0.0075;this.max_weight=0;this.min_weight=200;this.textFont=this.textFont&&y(this.textFont);this.textHeight*=1;this.pulsateTo=b(this.pulsateTo,0,1);this.minBrightness=b(this.minBrightness,0,1);this.maxBrightness=b(this.maxBrightness,this.minBrightness,1);this.ctxt.textBaseline="top";this.lx=(this.lock+"").indexOf("x")+1;this.ly=(this.lock+"").indexOf("y")+1;this.frozen=this.dx=this.dy=this.fixedAnim=this.touched=0;this.fixedAlpha=1;this.source=j||aB;this.transform=k.Identity();this.startTime=this.time=T();this.Animate=this.dragControl?this.AnimateDrag:this.AnimatePosition;this.animTiming=(typeof x[this.animTiming]=="function"?x[this.animTiming]:x.Smooth);if(this.shadowBlur||this.shadowOffset[0]||this.shadowOffset[1]){this.ctxt.shadowColor=this.shadow;this.shadow=this.ctxt.shadowColor;this.shadowAlpha=D()}else{delete this.shadow}this.Load();if(j&&this.hideTags){(function(i){if(x.loaded){i.HideTags()}else{G("load",function(){i.HideTags()},window)}})(this)}this.yaw=this.initial?this.initial[0]*this.maxSpeed:0;this.pitch=this.initial?this.initial[1]*this.maxSpeed:0;if(this.tooltip){if(this.tooltip=="native"){this.Tooltip=this.TooltipNative}else{this.Tooltip=this.TooltipDiv;if(!this.ttdiv){this.ttdiv=o.createElement("div");this.ttdiv.className=this.tooltipClass;this.ttdiv.style.position="absolute";this.ttdiv.style.zIndex=aA.style.zIndex+1;G("mouseover",function(i){i.target.style.display="none"},this.ttdiv);o.body.appendChild(this.ttdiv)}}}else{this.Tooltip=this.TooltipNone}if(!this.noMouse&&!c[aB]){G("mousemove",ah,aA);G("mouseout",m,aA);G("mouseup",g,aA);G("touchstart",J,aA);G("touchend",p,aA);G("touchcancel",p,aA);G("touchmove",ab,aA);if(this.dragControl){G("mousedown",Z,aA);G("selectstart",Y,aA)}if(this.wheelZoom){G("mousewheel",ar,aA);G("DOMMouseScroll",ar,aA)}c[aB]=1}x.started||(x.started=setTimeout(t,this.interval))}d=x.prototype;d.SourceElements=function(){if(o.querySelectorAll){return o.querySelectorAll("#"+this.source)}return[o.getElementById(this.source)]};d.HideTags=function(){var aw=this.SourceElements(),j;for(j=0;j<aw.length;++j){aw[j].style.display="none"}};d.GetTags=function(){var aA=this.SourceElements(),az,aw=[],ay,ax;for(ay=0;ay<aA.length;++ay){az=aA[ay].getElementsByTagName("a");for(ax=0;ax<az.length;++ax){aw.push(az[ax])}}return aw};d.CreateTag=function(aB,aA){var j=aB.getElementsByTagName("img"),ay,ax,az,aw;aA=aA||[0,0,0];if(j.length){ay=new Image;ay.src=j[0].src;ax=new S(this,ay,aB,aA,0,0);am(ay,j[0],ax,this);return ax}az=new P(aB);ax=az.Lines();aw=this.textFont||y(aj(aB,"font-family"));if(this.splitWidth){ax=az.SplitWidth(this.splitWidth,this.ctxt,aw,this.textHeight)}return new S(this,ax,aB,aA,2,this.textHeight+2,this.textColour||aj(aB,"color"),aw,az.original)};d.UpdateTag=function(aw,i){var ax=this.textColour||aj(i,"color"),j=this.textFont||y(aj(i,"font-family"));aw.title=i.title;if(aw.colour!=ax||aw.textFont!=j){aw.SetFont(j,ax)}};d.Weight=function(ax){var aw=ax.length,j,ay,az=[];for(ay=0;ay<aw;++ay){j=F(this,ax[ay].a);if(j>this.max_weight){this.max_weight=j}if(j<this.min_weight){this.min_weight=j}az.push(j)}if(this.max_weight>this.min_weight){for(ay=0;ay<aw;++ay){ax[ay].SetWeight(az[ay])}}};d.Load=function(){var aF=this.GetTags(),aB=[],aE,aA,ax,aw,j,ay,aD,az=[],aC={sphere:s,vcylinder:E,hcylinder:W,vring:C,hring:N};if(aF.length){az.length=aF.length;for(aD=0;aD<aF.length;++aD){az[aD]=aD}this.shuffleTags&&ac(az);ax=100*this.radiusX;aw=100*this.radiusY;j=100*this.radiusZ;this.max_radius=I(ax,I(aw,j));if(this.shapeArgs){this.shapeArgs[0]=aF.length}else{aA=this.shape.toString().split(/[(),]/);aE=aA.shift();this.shape=aC[aE]||aC.sphere;this.shapeArgs=[aF.length,ax,aw,j].concat(aA)}ay=this.shape.apply(this,this.shapeArgs);this.listLength=aF.length;for(aD=0;aD<aF.length;++aD){aB.push(this.CreateTag(aF[az[aD]],ay[aD]))}this.weight&&this.Weight(aB,true)}this.taglist=aB};d.Update=function(){var aF=this.GetTags(),aE=[],az=this.taglist,aG,aD=[],aB=[],ax,aC,aw,aA,ay;if(!this.shapeArgs){return this.Load()}if(aF.length){aw=this.listLength=aF.length;aC=az.length;for(aA=0;aA<aC;++aA){aE.push(az[aA]);aB.push(aA)}for(aA=0;aA<aw;++aA){for(ay=0,aG=0;ay<aC;++ay){if(az[ay].EqualTo(aF[aA])){this.UpdateTag(aE[ay],aF[aA]);aG=aB[ay]=-1}}if(!aG){aD.push(aA)}}for(aA=0,ay=0;aA<aC;++aA){if(aB[ay]==-1){aB.splice(ay,1)}else{++ay}}if(aB.length){ac(aB);while(aB.length&&aD.length){aA=aB.shift();ay=aD.shift();aE[aA]=this.CreateTag(aF[ay])}aB.sort(function(j,i){return j-i});while(aB.length){aE.splice(aB.pop(),1)}}ay=aE.length/(aD.length+1);aA=0;while(aD.length){aE.splice(V(++aA*ay),0,this.CreateTag(aF[aD.shift()]))}this.shapeArgs[0]=aw=aE.length;ax=this.shape.apply(this,this.shapeArgs);for(aA=0;aA<aw;++aA){aE[aA].position=new U(ax[aA][0],ax[aA][1],ax[aA][2])}this.weight&&this.Weight(aE)}this.taglist=aE};d.SetShadow=function(i){i.shadowBlur=this.shadowBlur;i.shadowOffsetX=this.shadowOffset[0];i.shadowOffsetY=this.shadowOffset[1]};d.Draw=function(aG){if(this.paused){return}var aA=this.canvas,ay=aA.width,aF=aA.height,aI=0,ax=(aG-this.time)*this.interval/1000,aE=ay/2+this.offsetX,aD=aF/2+this.offsetY,aM=this.ctxt,aC,aN,aK,aw=-1,az=this.taglist,aJ=az.length,j=this.frontSelect,aH=(this.centreFunc==Y),aB;this.time=aG;if(this.frozen&&this.drawn){return this.Animate(ay,aF,ax)}aB=this.AnimateFixed();aM.setTransform(1,0,0,1,0,0);this.active=null;for(aK=0;aK<aJ;++aK){az[aK].Calc(this.transform,this.fixedAlpha)}az=n(az,function(aO,i){return i.z-aO.z});for(aK=0;aK<aJ;++aK){aN=this.mx>=0&&this.my>=0&&this.taglist[aK].CheckActive(aM,aE,aD);if(aN&&aN.sc>aI&&(!j||aN.z<=0)){aC=aN;aw=aK;aC.tag=this.taglist[aK];aI=aN.sc}}this.active=aC;this.txtOpt||(this.shadow&&this.SetShadow(aM));aM.clearRect(0,0,ay,aF);for(aK=0;aK<aJ;++aK){if(!aH&&az[aK].z<=0){try{this.centreFunc(aM,ay,aF,aE,aD)}catch(aL){alert(aL);this.centreFunc=Y}aH=true}if(!(aC&&aC.tag==az[aK]&&aC.PreDraw(aM,az[aK],aE,aD))){az[aK].Draw(aM,aE,aD)}aC&&aC.tag==az[aK]&&aC.PostDraw(aM)}if(this.freezeActive&&aC){this.Freeze()}else{this.UnFreeze();this.drawn=(aJ==this.listLength)}if(this.fixedCallback){this.fixedCallback(this,this.fixedCallbackTag);this.fixedCallback=null}aB||this.Animate(ay,aF,ax);aC&&aC.LastDraw(aM);aA.style.cursor=aC?this.activeCursor:"";this.Tooltip(aC,this.taglist[aw])};d.TooltipNone=function(){};d.TooltipNative=function(j,i){this.canvas.title=j&&i.title?i.title:""};d.TooltipDiv=function(ay,j){var i=this,ax=i.ttdiv.style,az=i.canvas.id,aw="none";if(ay&&j.title){if(j.title!=i.ttdiv.innerHTML){ax.display=aw}i.ttdiv.innerHTML=j.title;j.title=i.ttdiv.innerHTML;if(ax.display==aw&&!i.tttimer){i.tttimer=setTimeout(function(){var aA=r(az);ax.display="block";ax.left=aA.x+i.mx+"px";ax.top=aA.y+i.my+24+"px";i.tttimer=null},i.tooltipDelay)}}else{ax.display=aw}};d.Transform=function(az,i,aB){if(i||aB){var j=w(i),aA=l(i),aC=w(aB),ay=l(aB),aw=new k([ay,0,aC,0,1,0,-aC,0,ay]),ax=new k([1,0,0,0,aA,-j,0,j,aA]);az.transform=az.transform.mul(aw.mul(ax))}};d.AnimateFixed=function(){var aw,j,ay,i,ax;if(this.fadeIn){j=T()-this.startTime;if(j>=this.fadeIn){this.fadeIn=0;this.fixedAlpha=1}else{this.fixedAlpha=j/this.fadeIn}}if(this.fixedAnim){if(!this.fixedAnim.transform){this.fixedAnim.transform=this.transform}aw=this.fixedAnim,j=T()-aw.t0,ay=aw.angle,i,ax=this.animTiming(aw.t,j);this.transform=aw.transform;if(j>=aw.t){this.fixedCallbackTag=aw.tag;this.fixedCallback=aw.cb;this.fixedAnim=this.yaw=this.pitch=0}else{ay*=ax}i=k.Rotation(ay,aw.axis);this.transform=this.transform.mul(i);return(this.fixedAnim!=0)}return false};d.AnimatePosition=function(aw,az,ax){var j=this,i=j.mx,aB=j.my,ay,aA;if(!j.frozen&&i>=0&&aB>=0&&i<aw&&aB<az){ay=j.maxSpeed,aA=j.reverse?-1:1;j.lx||(j.yaw=aA*ax*((ay*2*i/aw)-ay));j.ly||(j.pitch=aA*ax*-((ay*2*aB/az)-ay));j.initial=null}else{if(!j.initial){if(j.frozen&&!j.freezeDecel){j.yaw=j.pitch=0}else{j.Decel(j)}}}this.Transform(j,j.pitch,j.yaw)};d.AnimateDrag=function(j,ay,ax){var i=this,aw=100*ax*i.maxSpeed/i.max_radius/i.zoom;if(i.dx||i.dy){i.lx||(i.yaw=i.dx*aw/i.stretchX);i.ly||(i.pitch=i.dy*-aw/i.stretchY);i.dx=i.dy=0;i.initial=null}else{if(!i.initial){i.Decel(i)}}this.Transform(i,i.pitch,i.yaw)};d.Freeze=function(){if(!this.frozen){this.preFreeze=[this.yaw,this.pitch];this.frozen=1;this.drawn=0}};d.UnFreeze=function(){if(this.frozen){this.yaw=this.preFreeze[0];this.pitch=this.preFreeze[1];this.frozen=0}};d.Decel=function(i){var aw=i.minSpeed,ax=aa(i.yaw),j=aa(i.pitch);if(!i.lx&&ax>aw){i.yaw=ax>i.z0?i.yaw*i.decel:0}if(!i.ly&&j>aw){i.pitch=j>i.z0?i.pitch*i.decel:0}};d.Zoom=function(i){this.z2=this.z1*(1/i);this.drawn=0};d.Clicked=function(aw){var i=this.active;try{if(i&&i.tag){if(this.clickToFront===false||this.clickToFront===null){i.tag.Clicked(aw)}else{this.TagToFront(i.tag,this.clickToFront,function(){i.tag.Clicked(aw)})}}}catch(j){}};d.Wheel=function(j){var aw=this.zoom+this.zoomStep*(j?1:-1);this.zoom=au(this.zoomMax,I(this.zoomMin,aw));this.Zoom(this.zoom)};d.BeginDrag=function(i){this.down=M(i,this.canvas);i.cancelBubble=true;i.returnValue=false;i.preventDefault&&i.preventDefault()};d.Drag=function(ay,ax){if(this.dragControl&&this.down){var aw=this.dragThreshold*this.dragThreshold,j=ax.x-this.down.x,i=ax.y-this.down.y;if(this.dragging||j*j+i*i>aw){this.dx=j;this.dy=i;this.dragging=1;this.down=ax}}};d.EndDrag=function(){var i=this.dragging;this.dragging=this.down=null;return i};d.Pause=function(){this.paused=true};d.Resume=function(){this.paused=false};d.FindTag=function(aw){if(!ak(aw)){return null}ak(aw.index)&&(aw=aw.index);if(!v(aw)){return this.taglist[aw]}var ax,ay,j;if(ak(aw.id)){ax="id",ay=aw.id}else{if(ak(aw.text)){ax="innerText",ay=aw.text}}for(j=0;j<this.taglist.length;++j){if(this.taglist[j].a[ax]==ay){return this.taglist[j]}}};d.RotateTag=function(aD,aw,aC,i,aA){var aB=aD.xformed,ay=new U(aB.x,aB.y,aB.z),ax=K(aC,aw),j=ay.angle(ax),az=ay.cross(ax).unit();if(j==0){this.fixedCallbackTag=aD;this.fixedCallback=aA}else{this.fixedAnim={angle:-j,axis:az,t:i,t0:T(),cb:aA,tag:aD}}};d.TagToFront=function(i,j,aw){this.RotateTag(i,0,0,j,aw)};x.Start=function(aw,i,j){x.tc[aw]=new x(aw,i,j)};function al(i,j){x.tc[j]&&x.tc[j][i]()}x.Linear=function(i,j){return j/i};x.Smooth=function(i,j){return 0.5-l(j*Math.PI/i)/2};x.Pause=function(i){al("Pause",i)};x.Resume=function(i){al("Resume",i)};x.Reload=function(i){al("Load",i)};x.Update=function(i){al("Update",i)};x.TagToFront=function(j,i){if(!v(i)){return false}i.lat=i.lng=0;return x.RotateTag(j,i)};x.RotateTag=function(aw,i){if(!v(i)){return false}if(x.tc[aw]){if(isNaN(i.time)){i.time=500}var j=x.tc[aw].FindTag(i);if(j){x.tc[aw].RotateTag(j,i.lat,i.lng,i.time,i.callback);return true}}return false};x.NextFrame=function(i){var j=window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;x.NextFrame=j?x.NextFrameRAF:x.NextFrameTimeout;x.NextFrame(i)};x.NextFrameRAF=function(){requestAnimationFrame(t)};x.NextFrameTimeout=function(i){setTimeout(t,i)};x.tc={};x.options={z1:20000,z2:20000,z0:0.0002,freezeActive:false,freezeDecel:false,activeCursor:"pointer",pulsateTo:1,pulsateTime:3,reverse:false,depth:0.5,maxSpeed:0.05,minSpeed:0,decel:0.95,interval:20,minBrightness:0.1,maxBrightness:1,outlineColour:"#ffff99",outlineThickness:2,outlineOffset:5,outlineMethod:"outline",textColour:"#ff99ff",textHeight:15,textFont:"Helvetica, Arial, sans-serif",shadow:"#000",shadowBlur:0,shadowOffset:[0,0],initial:null,hideTags:true,zoom:1,weight:false,weightMode:"size",weightFrom:null,weightSize:1,weightSizeMin:null,weightSizeMax:null,weightGradient:{0:"#f00",0.33:"#ff0",0.66:"#0f0",1:"#00f"},txtOpt:true,txtScale:2,frontSelect:false,wheelZoom:true,zoomMin:0.3,zoomMax:3,zoomStep:0.05,shape:"sphere",lock:null,tooltip:null,tooltipDelay:300,tooltipClass:"tctooltip",radiusX:1,radiusY:1,radiusZ:1,stretchX:1,stretchY:1,offsetX:0,offsetY:0,shuffleTags:false,noSelect:false,noMouse:false,imageScale:1,paused:false,dragControl:false,dragThreshold:4,centreFunc:Y,splitWidth:0,animTiming:"Smooth",clickToFront:false,fadeIn:0};for(ap in x.options){x[ap]=x.options[ap]}window.TagCanvas=x;jQuery.fn.tagcanvas=function(j,i){var aw={pause:function(){ad(this).each(function(){al("Pause",ad(this)[0].id)})},resume:function(){ad(this).each(function(){al("Resume",ad(this)[0].id)})},reload:function(){ad(this).each(function(){al("Load",ad(this)[0].id)})},update:function(){ad(this).each(function(){al("Update",ad(this)[0].id)})},tagtofront:function(){ad(this).each(function(){x.TagToFront(ad(this)[0].id,i)})},rotatetag:function(){ad(this).each(function(){x.RotateTag(ad(this)[0].id,i)})}};if(typeof j=="string"&&aw[j]){aw[j].apply(this)}else{x.jquery=1;ad(this).each(function(){x.Start(ad(this)[0].id,i,j)});return x.started}};G("load",function(){x.loaded=1},window)})(jQuery);
PK�|H[`���"�"�excanvas.jsnu&1i�PK�|H[���z�z]�jquery.tagcanvas.min.jsnu&1i�PK�_