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, '&').replace(/"/g, '"');
}
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 �z jquery.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 � _