/*
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version 1.09i
 */
var Cufon = (function() {
    var m = function() { return m.replace.apply(null, arguments); };
    var x = m.DOM = {
        ready: (function() {
            var C = false, E = { loaded: 1, complete: 1 };
            var B = [], D = function() {
                if (C) {
                    return;
                }
                C = true;
                for (var F; F = B.shift(); F()) {
                }
            };
            if (document.addEventListener) {
                document.addEventListener("DOMContentLoaded", D, false);
                window.addEventListener("pageshow", D, false);
            }
            if (!window.opera && document.readyState) {
                (function() { E[document.readyState] ? D() : setTimeout(arguments.callee, 10); })();
            }
            if (document.readyState && document.createStyleSheet) {
                (function() {
                    try {
                        document.body.doScroll("left");
                        D();
                    } catch(F) {
                        setTimeout(arguments.callee, 1);
                    }
                })();
            }
            q(window, "load", D);
            return function(F) {
                if (!arguments.length) {
                    D();
                } else {
                    C ? F() : B.push(F);
                }
            };
        })(),
        root: function() { return document.documentElement || document.body; }
    };
    var n = m.CSS = {
        Size: function(C, B) {
            this.value = parseFloat(C);
            this.unit = String(C).match( /[a-z%]*$/ )[0] || "px";
            this.convert = function(D) { return D / B * this.value; };
            this.convertFrom = function(D) { return D / this.value * B; };
            this.toString = function() { return this.value + this.unit; };
        },
        addClass: function(C, B) {
            var D = C.className;
            C.className = D + (D && " ") + B;
            return C;
        },
        color: j(function(C) {
            var B = { };
            B.color = C.replace( /^rgba\((.*?),\s*([\d.]+)\)/ , function(E, D, F) {
                B.opacity = parseFloat(F);
                return "rgb(" + D + ")";
            });
            return B;
        }),
        fontStretch: j(function(B) {
            if (typeof B == "number") {
                return B;
            }
            if ( /%$/ .test(B)) {
                return parseFloat(B) / 100;
            }
            return { "ultra-condensed": 0.5, "extra-condensed": 0.625, condensed: 0.75, "semi-condensed": 0.875, "semi-expanded": 1.125, expanded: 1.25, "extra-expanded": 1.5, "ultra-expanded": 2 }[B] || 1;
        }),
        getStyle: function(C) {
            var B = document.defaultView;
            if (B && B.getComputedStyle) {
                return new a(B.getComputedStyle(C, null));
            }
            if (C.currentStyle) {
                return new a(C.currentStyle);
            }
            return new a(C.style);
        },
        gradient: j(function(F) {
            var G = { id: F, type: F.match( /^-([a-z]+)-gradient\(/ )[1], stops: [] }, C = F.substr(F.indexOf("(")).match( /([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig );
            for (var E = 0, B = C.length, D; E < B; ++E) {
                D = C[E].split("=", 2).reverse();
                G.stops.push([D[1] || E / (B - 1), D[0]]);
            }
            return G;
        }),
        quotedList: j(function(E) {
            var D = [], C = /\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g , B;
            while (B = C.exec(E)) {
                D.push(B[3] || B[1]);
            }
            return D;
        }),
        recognizesMedia: j(function(G) {
            var E = document.createElement("style"), D, C, B;
            E.type = "text/css";
            E.media = G;
            try {
                E.appendChild(document.createTextNode("/**/"));
            } catch(F) {
            }
            C = g("head")[0];
            C.insertBefore(E, C.firstChild);
            D = (E.sheet || E.styleSheet);
            B = D && !D.disabled;
            C.removeChild(E);
            return B;
        }),
        removeClass: function(D, C) {
            var B = RegExp("(?:^|\\s+)" + C + "(?=\\s|$)", "g");
            D.className = D.className.replace(B, "");
            return D;
        },
        supports: function(D, C) {
            var B = document.createElement("span").style;
            if (B[D] === undefined) {
                return false;
            }
            B[D] = C;
            return B[D] === C;
        },
        textAlign: function(E, D, B, C) {
            if (D.get("textAlign") == "right") {
                if (B > 0) {
                    E = " " + E;
                }
            } else {
                if (B < C - 1) {
                    E += " ";
                }
            }
            return E;
        },
        textShadow: j(function(F) {
            if (F == "none") {
                return null;
            }
            var E = [], G = { }, B, C = 0;
            var D = /(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig ;
            while (B = D.exec(F)) {
                if (B[0] == ",") {
                    E.push(G);
                    G = { };
                    C = 0;
                } else {
                    if (B[1]) {
                        G.color = B[1];
                    } else {
                        G[["offX", "offY", "blur"][C++]] = B[2];
                    }
                }
            }
            E.push(G);
            return E;
        }),
        textTransform: (function() {
            var B = { uppercase: function(C) { return C.toUpperCase(); }, lowercase: function(C) { return C.toLowerCase(); }, capitalize: function(C) { return C.replace( /\b./g , function(D) { return D.toUpperCase(); }); } };
            return function(E, D) {
                var C = B[D.get("textTransform")];
                return C ? C(E) : E;
            };
        })(),
        whiteSpace: (function() {
            var D = { inline: 1, "inline-block": 1, "run-in": 1 };
            var C = /^\s+/ , B = /\s+$/ ;
            return function(H, F, G, E) {
                if (E) {
                    if (E.nodeName.toLowerCase() == "br") {
                        H = H.replace(C, "");
                    }
                }
                if (D[F.get("display")]) {
                    return H;
                }
                if (!G.previousSibling) {
                    H = H.replace(C, "");
                }
                if (!G.nextSibling) {
                    H = H.replace(B, "");
                }
                return H;
            };
        })()
    };
    n.ready = (function() {
        var B = !n.recognizesMedia("all"), E = false;
        var D = [], H = function() {
            B = true;
            for (var K; K = D.shift(); K()) {
            }
        };
        var I = g("link"), J = g("style");

        function C(K) {
            return K.disabled || G(K.sheet, K.media || "screen");
        }

        function G(M, P) {
            if (!n.recognizesMedia(P || "all")) {
                return true;
            }
            if (!M || M.disabled) {
                return false;
            }
            try {
                var Q = M.cssRules, O;
                if (Q) {
                    search:for (var L = 0, K = Q.length; O = Q[L], L < K; ++L) {
                               switch (O.type) {
                               case 2:
                                   break;
                               case 3:
                                   if (!G(O.styleSheet, O.media.mediaText)) {
                                       return false;
                                   }
                                   break;
                               default:
                                   break search;
                               }
                           }
                }
            } catch(N) {
            }
            return true;
        }

        function F() {
            if (document.createStyleSheet) {
                return true;
            }
            var L, K;
            for (K = 0; L = I[K]; ++K) {
                if (L.rel.toLowerCase() == "stylesheet" && !C(L)) {
                    return false;
                }
            }
            for (K = 0; L = J[K]; ++K) {
                if (!C(L)) {
                    return false;
                }
            }
            return true;
        }

        x.ready(function() {
            if (!E) {
                E = n.getStyle(document.body).isUsable();
            }
            if (B || (E && F())) {
                H();
            } else {
                setTimeout(arguments.callee, 10);
            }
        });
        return function(K) {
            if (B) {
                K();
            } else {
                D.push(K);
            }
        };
    })();

    function s(D) {
        var C = this.face = D.face, B = { "\u0020": 1, "\u00a0": 1, "\u3000": 1 };
        this.glyphs = D.glyphs;
        this.w = D.w;
        this.baseSize = parseInt(C["units-per-em"], 10);
        this.family = C["font-family"].toLowerCase();
        this.weight = C["font-weight"];
        this.style = C["font-style"] || "normal";
        this.viewBox = (function() {
            var F = C.bbox.split( /\s+/ );
            var E = { minX: parseInt(F[0], 10), minY: parseInt(F[1], 10), maxX: parseInt(F[2], 10), maxY: parseInt(F[3], 10) };
            E.width = E.maxX - E.minX;
            E.height = E.maxY - E.minY;
            E.toString = function() { return [this.minX, this.minY, this.width, this.height].join(" "); };
            return E;
        })();
        this.ascent = -parseInt(C.ascent, 10);
        this.descent = -parseInt(C.descent, 10);
        this.height = -this.ascent + this.descent;
        this.spacing = function(L, N, E) {
            var O = this.glyphs, M, K, G, P = [], F = 0, J = -1, I = -1, H;
            while (H = L[++J]) {
                M = O[H] || this.missingGlyph;
                if (!M) {
                    continue;
                }
                if (K) {
                    F -= G = K[H] || 0;
                    P[I] -= G;
                }
                F += P[++I] = ~~(M.w || this.w) + N + (B[H] ? E : 0);
                K = M.k;
            }
            P.total = F;
            return P;
        };
    }

    function f() {
        var C = { }, B = { oblique: "italic", italic: "oblique" };
        this.add = function(D) { (C[D.style] || (C[D.style] = { }))[D.weight] = D; };
        this.get = function(H, I) {
            var G = C[H] || C[B[H]] || C.normal || C.italic || C.oblique;
            if (!G) {
                return null;
            }
            I = { normal: 400, bold: 700 }[I] || parseInt(I, 10);
            if (G[I]) {
                return G[I];
            }
            var E = { 1: 1, 99: 0 }[I % 100], K = [], F, D;
            if (E === undefined) {
                E = I > 400;
            }
            if (I == 500) {
                I = 400;
            }
            for (var J in G) {
                if (!k(G, J)) {
                    continue;
                }
                J = parseInt(J, 10);
                if (!F || J < F) {
                    F = J;
                }
                if (!D || J > D) {
                    D = J;
                }
                K.push(J);
            }
            if (I < F) {
                I = F;
            }
            if (I > D) {
                I = D;
            }
            K.sort(function(M, L) { return (E ? (M >= I && L >= I) ? M < L : M > L : (M <= I && L <= I) ? M > L : M < L) ? -1 : 1; });
            return G[K[0]];
        };
    }

    function r() {

        function D(F, G) {
            if (F.contains) {
                return F.contains(G);
            }
            return F.compareDocumentPosition(G) & 16;
        }

        function B(G) {
            var F = G.relatedTarget;
            if (!F || D(this, F)) {
                return;
            }
            C(this, G.type == "mouseover");
        }

        function E(F) {
            C(this, F.type == "mouseenter");
        }

        function C(F, G) {
            setTimeout(function() {
                var H = d.get(F).options;
                m.replace(F, G ? h(H, H.hover) : H, true);
            }, 10);
        }

        this.attach = function(F) {
            if (F.onmouseenter === undefined) {
                q(F, "mouseover", B);
                q(F, "mouseout", B);
            } else {
                q(F, "mouseenter", E);
                q(F, "mouseleave", E);
            }
        };
    }

    function u() {
        var C = [], D = { };

        function B(H) {
            var E = [], G;
            for (var F = 0; G = H[F]; ++F) {
                E[F] = C[D[G]];
            }
            return E;
        }

        this.add = function(F, E) { D[F] = C.push(E) - 1; };
        this.repeat = function() {
            var E = arguments.length ? B(arguments) : C, F;
            for (var G = 0; F = E[G++];) {
                m.replace(F[0], F[1], true);
            }
        };
    }

    function A() {
        var D = { }, B = 0;

        function C(E) {
            return E.cufid || (E.cufid = ++B);
        }

        this.get = function(E) {
            var F = C(E);
            return D[F] || (D[F] = { });
        };
    }

    function a(B) {
        var D = { }, C = { };
        this.extend = function(E) {
            for (var F in E) {
                if (k(E, F)) {
                    D[F] = E[F];
                }
            }
            return this;
        };
        this.get = function(E) { return D[E] != undefined ? D[E] : B[E]; };
        this.getSize = function(F, E) { return C[F] || (C[F] = new n.Size(this.get(F), E)); };
        this.isUsable = function() { return !!B; };
    }

    function q(C, B, D) {
        if (C.addEventListener) {
            C.addEventListener(B, D, false);
        } else {
            if (C.attachEvent) {
                C.attachEvent("on" + B, function() { return D.call(C, window.event); });
            }
        }
    }

    function v(C, B) {
        var D = d.get(C);
        if (D.options) {
            return C;
        }
        if (B.hover && B.hoverables[C.nodeName.toLowerCase()]) {
            b.attach(C);
        }
        D.options = B;
        return C;
    }

    function j(B) {
        var C = { };
        return function(D) {
            if (!k(C, D)) {
                C[D] = B.apply(null, arguments);
            }
            return C[D];
        };
    }

    function c(F, E) {
        var B = n.quotedList(E.get("fontFamily").toLowerCase()), D;
        for (var C = 0; D = B[C]; ++C) {
            if (i[D]) {
                return i[D].get(E.get("fontStyle"), E.get("fontWeight"));
            }
        }
        return null;
    }

    function g(B) {
        return document.getElementsByTagName(B);
    }

    function k(C, B) {
        return C.hasOwnProperty(B);
    }

    function h() {
        var C = { }, B, F;
        for (var E = 0, D = arguments.length; B = arguments[E], E < D; ++E) {
            for (F in B) {
                if (k(B, F)) {
                    C[F] = B[F];
                }
            }
        }
        return C;
    }

    function o(E, M, C, N, F, D) {
        var K = document.createDocumentFragment(), H;
        if (M === "") {
            return K;
        }
        var L = N.separate;
        var I = M.split(p[L]), B = (L == "words");
        if (B && t) {
            if ( /^\s/ .test(M)) {
                I.unshift("");
            }
            if ( /\s$/ .test(M)) {
                I.push("");
            }
        }
        for (var J = 0, G = I.length; J < G; ++J) {
            H = z[N.engine](E, B ? n.textAlign(I[J], C, J, G) : I[J], C, N, F, D, J < G - 1);
            if (H) {
                K.appendChild(H);
            }
        }
        return K;
    }

    function l(D, M) {
        var C = D.nodeName.toLowerCase();
        if (M.ignore[C]) {
            return;
        }
        var E = !M.textless[C];
        var B = n.getStyle(v(D, M)).extend(M);
        var F = c(D, B), G, K, I, H, L, J;
        if (!F) {
            return;
        }
        for (G = D.firstChild; G; G = I) {
            K = G.nodeType;
            I = G.nextSibling;
            if (E && K == 3) {
                if (H) {
                    H.appendData(G.data);
                    D.removeChild(G);
                } else {
                    H = G;
                }
                if (I) {
                    continue;
                }
            }
            if (H) {
                D.replaceChild(o(F, n.whiteSpace(H.data, B, H, J), B, M, G, D), H);
                H = null;
            }
            if (K == 1) {
                if (G.firstChild) {
                    if (G.nodeName.toLowerCase() == "cufon") {
                        z[M.engine](F, null, B, M, G, D);
                    } else {
                        arguments.callee(G, M);
                    }
                }
                J = G;
            }
        }
    }

    var t = " ".split( /\s+/ ).length == 0;
    var d = new A();
    var b = new r();
    var y = new u();
    var e = false;
    var z = { }, i = { }, w = { autoDetect: false, engine: null, forceHitArea: false, hover: false, hoverables: { a: true }, ignore: { applet: 1, canvas: 1, col: 1, colgroup: 1, head: 1, iframe: 1, map: 1, optgroup: 1, option: 1, script: 1, select: 1, style: 1, textarea: 1, title: 1, pre: 1 }, printable: true, selector: (window.Sizzle || (window.jQuery && function(B) { return jQuery(B); }) || (window.dojo && dojo.query) || (window.Ext && Ext.query) || (window.YAHOO && YAHOO.util && YAHOO.util.Selector && YAHOO.util.Selector.query) || (window.$$ && function(B) { return $$(B); }) || (window.$ && function(B) { return $(B); }) || (document.querySelectorAll && function(B) { return document.querySelectorAll(B); }) || g), separate: "words", textless: { dl: 1, html: 1, ol: 1, table: 1, tbody: 1, thead: 1, tfoot: 1, tr: 1, ul: 1 }, textShadow: "none" };
    var p = { words: /\s/ .test("\u00a0") ? /[^\S\u00a0]+/ : /\s+/ , characters: "", none: /^/ };
    m.now = function() {
        x.ready();
        return m;
    };
    m.refresh = function() {
        y.repeat.apply(y, arguments);
        return m;
    };
    m.registerEngine = function(C, B) {
        if (!B) {
            return m;
        }
        z[C] = B;
        return m.set("engine", C);
    };
    m.registerFont = function(D) {
        if (!D) {
            return m;
        }
        var B = new s(D), C = B.family;
        if (!i[C]) {
            i[C] = new f();
        }
        i[C].add(B);
        return m.set("fontFamily", '"' + C + '"');
    };
    m.replace = function(D, C, B) {
        C = h(w, C);
        if (!C.engine) {
            return m;
        }
        if (!e) {
            n.addClass(x.root(), "cufon-active cufon-loading");
            n.ready(function() { n.addClass(n.removeClass(x.root(), "cufon-loading"), "cufon-ready"); });
            e = true;
        }
        if (C.hover) {
            C.forceHitArea = true;
        }
        if (C.autoDetect) {
            delete C.fontFamily;
        }
        if (typeof C.textShadow == "string") {
            C.textShadow = n.textShadow(C.textShadow);
        }
        if (typeof C.color == "string" && /^-/ .test(C.color)) {
            C.textGradient = n.gradient(C.color);
        } else {
            delete C.textGradient;
        }
        if (!B) {
            y.add(D, arguments);
        }
        if (D.nodeType || typeof D == "string") {
            D = [D];
        }
        n.ready(function() {
            for (var F = 0, E = D.length; F < E; ++F) {
                var G = D[F];
                if (typeof G == "string") {
                    m.replace(C.selector(G), C, true);
                } else {
                    l(G, C);
                }
            }
        });
        return m;
    };
    m.set = function(B, C) {
        w[B] = C;
        return m;
    };
    return m;
})();
Cufon.registerEngine("vml", (function() {
    var e = document.namespaces;
    if (!e) {
        return;
    }
    e.add("cvml", "urn:schemas-microsoft-com:vml");
    e = null;
    var b = document.createElement("cvml:shape");
    b.style.behavior = "url(#default#VML)";
    if (!b.coordsize) {
        return;
    }
    b = null;
    var h = (document.documentMode || 0) < 8;
    document.write(('<style type="text/css">cufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:' + (h ? "middle" : "text-bottom") + ";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}</style>").replace( /;/g , "!important;"));

    function c(i, j) {
        return a(i, /(?:em|ex|%)$|^[a-z-]+$/i .test(j) ? "1em" : j);
    }

    function a(l, m) {
        if (m === "0") {
            return 0;
        }
        if ( /px$/i .test(m)) {
            return parseFloat(m);
        }
        var k = l.style.left, j = l.runtimeStyle.left;
        l.runtimeStyle.left = l.currentStyle.left;
        l.style.left = m.replace("%", "em");
        var i = l.style.pixelLeft;
        l.style.left = k;
        l.runtimeStyle.left = j;
        return i;
    }

    function f(l, k, j, n) {
        var i = "computed" + n, m = k[i];
        if (isNaN(m)) {
            m = k.get(n);
            k[i] = m = (m == "normal") ? 0 : ~~j.convertFrom(a(l, m));
        }
        return m;
    }

    var g = { };

    function d(p) {
        var q = p.id;
        if (!g[q]) {
            var n = p.stops, o = document.createElement("cvml:fill"), i = [];
            o.type = "gradient";
            o.angle = 180;
            o.focus = "0";
            o.method = "sigma";
            o.color = n[0][1];
            for (var m = 1, l = n.length - 1; m < l; ++m) {
                i.push(n[m][0] * 100 + "% " + n[m][1]);
            }
            o.colors = i.join(",");
            o.color2 = n[l][1];
            g[q] = o;
        }
        return g[q];
    }

    return function(ac, G, Y, C, K, ad, W) {
        var n = (G === null);
        if (n) {
            G = K.alt;
        }
        var I = ac.viewBox;
        var p = Y.computedFontSize || (Y.computedFontSize = new Cufon.CSS.Size(c(ad, Y.get("fontSize")) + "px", ac.baseSize));
        var y, q;
        if (n) {
            y = K;
            q = K.firstChild;
        } else {
            y = document.createElement("cufon");
            y.className = "cufon cufon-vml";
            y.alt = G;
            q = document.createElement("cufoncanvas");
            y.appendChild(q);
            if (C.printable) {
                var Z = document.createElement("cufontext");
                Z.appendChild(document.createTextNode(G));
                y.appendChild(Z);
            }
            if (!W) {
                y.appendChild(document.createElement("cvml:shape"));
            }
        }
        var ai = y.style;
        var R = q.style;
        var l = p.convert(I.height), af = Math.ceil(l);
        var V = af / l;
        var P = V * Cufon.CSS.fontStretch(Y.get("fontStretch"));
        var U = I.minX, T = I.minY;
        R.height = af;
        R.top = Math.round(p.convert(T - ac.ascent));
        R.left = Math.round(p.convert(U));
        ai.height = p.convert(ac.height) + "px";
        var F = Y.get("color");
        var ag = Cufon.CSS.textTransform(G, Y).split("");
        var L = ac.spacing(ag, f(ad, Y, p, "letterSpacing"), f(ad, Y, p, "wordSpacing"));
        if (!L.length) {
            return null;
        }
        var k = L.total;
        var x = -U + k + (I.width - L[L.length - 1]);
        var ah = p.convert(x * P), X = Math.round(ah);
        var O = x + "," + I.height, m;
        var J = "r" + O + "ns";
        var u = C.textGradient && d(C.textGradient);
        var o = ac.glyphs, S = 0;
        var H = C.textShadow;
        var ab = -1, aa = 0, w;
        while (w = ag[++ab]) {
            var D = o[ag[ab]] || ac.missingGlyph, v;
            if (!D) {
                continue;
            }
            if (n) {
                v = q.childNodes[aa];
                while (v.firstChild) {
                    v.removeChild(v.firstChild);
                }
            } else {
                v = document.createElement("cvml:shape");
                q.appendChild(v);
            }
            v.stroked = "f";
            v.coordsize = O;
            v.coordorigin = m = (U - S) + "," + T;
            v.path = (D.d ? "m" + D.d + "xe" : "") + "m" + m + J;
            v.fillcolor = F;
            if (u) {
                v.appendChild(u.cloneNode(false));
            }
            var ae = v.style;
            ae.width = X;
            ae.height = af;
            if (H) {
                var s = H[0], r = H[1];
                var B = Cufon.CSS.color(s.color), z;
                var N = document.createElement("cvml:shadow");
                N.on = "t";
                N.color = B.color;
                N.offset = s.offX + "," + s.offY;
                if (r) {
                    z = Cufon.CSS.color(r.color);
                    N.type = "double";
                    N.color2 = z.color;
                    N.offset2 = r.offX + "," + r.offY;
                }
                N.opacity = B.opacity || (z && z.opacity) || 1;
                v.appendChild(N);
            }
            S += L[aa++];
        }
        var M = v.nextSibling, t, A;
        if (C.forceHitArea) {
            if (!M) {
                M = document.createElement("cvml:rect");
                M.stroked = "f";
                M.className = "cufon-vml-cover";
                t = document.createElement("cvml:fill");
                t.opacity = 0;
                M.appendChild(t);
                q.appendChild(M);
            }
            A = M.style;
            A.width = X;
            A.height = af;
        } else {
            if (M) {
                q.removeChild(M);
            }
        }
        ai.width = Math.max(Math.ceil(p.convert(k * P)), 0);
        if (h) {
            var Q = Y.computedYAdjust;
            if (Q === undefined) {
                var E = Y.get("lineHeight");
                if (E == "normal") {
                    E = "1em";
                } else {
                    if (!isNaN(E)) {
                        E += "em";
                    }
                }
                Y.computedYAdjust = Q = 0.5 * (a(ad, E) - parseFloat(ai.height));
            }
            if (Q) {
                ai.marginTop = Math.ceil(Q) + "px";
                ai.marginBottom = Q + "px";
            }
        }
        return y;
    };
})());
Cufon.registerEngine("canvas", (function() {
    var b = document.createElement("canvas");
    if (!b || !b.getContext || !b.getContext.apply) {
        return;
    }
    b = null;
    var a = Cufon.CSS.supports("display", "inline-block");
    var e = !a && (document.compatMode == "BackCompat" || /frameset|transitional/i .test(document.doctype.publicId));
    var f = document.createElement("style");
    f.type = "text/css";
    f.appendChild(document.createTextNode(("cufon{text-indent:0;}@media screen,projection{cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;" + (e ? "" : "font-size:1px;line-height:1px;") + "}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}" + (a ? "cufon canvas{position:relative;}" : "cufon canvas{position:absolute;}") + "}@media print{cufon{padding:0;}cufon canvas{display:none;}}").replace( /;/g , "!important;")));
    document.getElementsByTagName("head")[0].appendChild(f);

    function d(p, h) {
        var n = 0, m = 0;
        var g = [], o = /([mrvxe])([^a-z]*)/g , k;
        generate:for (var j = 0; k = o.exec(p); ++j) {
                     var l = k[2].split(",");
                     switch (k[1]) {
                     case "v":
                         g[j] = { m: "bezierCurveTo", a: [n + ~~l[0], m + ~~l[1], n + ~~l[2], m + ~~l[3], n += ~~l[4], m += ~~l[5]] };
                         break;
                     case "r":
                         g[j] = { m: "lineTo", a: [n += ~~l[0], m += ~~l[1]] };
                         break;
                     case "m":
                         g[j] = { m: "moveTo", a: [n = ~~l[0], m = ~~l[1]] };
                         break;
                     case "x":
                         g[j] = { m: "closePath" };
                         break;
                     case "e":
                         break generate;
                     }
                     h[g[j].m].apply(h, g[j].a);
                 }
        return g;
    }

    function c(m, k) {
        for (var j = 0, h = m.length; j < h; ++j) {
            var g = m[j];
            k[g.m].apply(k, g.a);
        }
    }

    return function(V, w, P, t, C, W) {
        var k = (w === null);
        if (k) {
            w = C.getAttribute("alt");
        }
        var A = V.viewBox;
        var m = P.getSize("fontSize", V.baseSize);
        var B = 0, O = 0, N = 0, u = 0;
        var z = t.textShadow, L = [];
        if (z) {
            for (var U = z.length; U--;) {
                var F = z[U];
                var K = m.convertFrom(parseFloat(F.offX));
                var I = m.convertFrom(parseFloat(F.offY));
                L[U] = [K, I];
                if (I < B) {
                    B = I;
                }
                if (K > O) {
                    O = K;
                }
                if (I > N) {
                    N = I;
                }
                if (K < u) {
                    u = K;
                }
            }
        }
        var Z = Cufon.CSS.textTransform(w, P).split("");
        var E = V.spacing(Z, ~~m.convertFrom(parseFloat(P.get("letterSpacing")) || 0), ~~m.convertFrom(parseFloat(P.get("wordSpacing")) || 0));
        if (!E.length) {
            return null;
        }
        var h = E.total;
        O += A.width - E[E.length - 1];
        u += A.minX;
        var s, n;
        if (k) {
            s = C;
            n = C.firstChild;
        } else {
            s = document.createElement("cufon");
            s.className = "cufon cufon-canvas";
            s.setAttribute("alt", w);
            n = document.createElement("canvas");
            s.appendChild(n);
            if (t.printable) {
                var S = document.createElement("cufontext");
                S.appendChild(document.createTextNode(w));
                s.appendChild(S);
            }
        }
        var aa = s.style;
        var H = n.style;
        var j = m.convert(A.height);
        var Y = Math.ceil(j);
        var M = Y / j;
        var G = M * Cufon.CSS.fontStretch(P.get("fontStretch"));
        var J = h * G;
        var Q = Math.ceil(m.convert(J + O - u));
        var o = Math.ceil(m.convert(A.height - B + N));
        n.width = Q;
        n.height = o;
        H.width = Q + "px";
        H.height = o + "px";
        B += A.minY;
        H.top = Math.round(m.convert(B - V.ascent)) + "px";
        H.left = Math.round(m.convert(u)) + "px";
        var r = Math.max(Math.ceil(m.convert(J)), 0) + "px";
        if (a) {
            aa.width = r;
            aa.height = m.convert(V.height) + "px";
        } else {
            aa.paddingLeft = r;
            aa.paddingBottom = (m.convert(V.height) - 1) + "px";
        }
        var X = n.getContext("2d"), D = j / A.height;
        X.scale(D, D * M);
        X.translate(-u, -B);
        X.save();

        function T() {
            var x = V.glyphs, ab, l = -1, g = -1, y;
            X.scale(G, 1);
            while (y = Z[++l]) {
                var ab = x[Z[l]] || V.missingGlyph;
                if (!ab) {
                    continue;
                }
                if (ab.d) {
                    X.beginPath();
                    if (ab.code) {
                        c(ab.code, X);
                    } else {
                        ab.code = d("m" + ab.d, X);
                    }
                    X.fill();
                }
                X.translate(E[++g], 0);
            }
            X.restore();
        }

        if (z) {
            for (var U = z.length; U--;) {
                var F = z[U];
                X.save();
                X.fillStyle = F.color;
                X.translate.apply(X, L[U]);
                T();
            }
        }
        var q = t.textGradient;
        if (q) {
            var v = q.stops, p = X.createLinearGradient(0, A.minY, 0, A.maxY);
            for (var U = 0, R = v.length; U < R; ++U) {
                p.addColorStop.apply(p, v[U]);
            }
            X.fillStyle = p;
        } else {
            X.fillStyle = P.get("color");
        }
        T();
        return s;
    };
})());
