(function() {

    function addEvent(el, type, listener) {
        if (!el) return;
        if (el.addEventListener) {
            el.addEventListener(type, listener, false);
        }
        else if (el.attachEvent) {
            el.attachEvent('on' + type, function() {
                return listener.call(el, window.event);
            });
        }
    }

    function byId(id) {
        return document.getElementById(id);
    }

    function byTag(tag, el) {
        if (!el) return [];
        return el.getElementsByTagName(tag);
    }

    function checkUpload(e) {
        var value, xhr, x, y;
        if (bubbleSkipped) return;
        disposeBubble();
        value = this.value.replace(/^.*?([\\\/]).*\1/, '');
        if (!value) return;
        xhr = createXHR();
        if (!xhr) {
            // Whoa what's this?
            return;
        }
        x = this.offsetLeft + this.offsetWidth;
        y = this.offsetTop + this.offsetHeight / 2;
        xhr.open('GET', 'typekit.php?fn=' + encodeURIComponent(value) + '&_=' + new Date().getTime(), true);
        xhr.onreadystatechange = function() {
            var bubble;
            if (this.readyState < 4) return;
            if (this.status < 200 || this.status >= 300) return;
            if (!this.responseText) return;
            if (window.pageTracker) pageTracker._trackEvent('Try Typekit', 'Open', this.getResponseHeader('X-Typekit-Font'));
            bubble = createTypekitBubble(this.responseText);
            bubble.style.left = x + 'px';
            bubble.style.top = y + 'px';
            document.body.appendChild(bubble);
            Cufon.refresh('h1');
        };
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(null);
        if (window.pageTracker) pageTracker._trackEvent('Try Typekit', 'Choose font');
    }

    function createTypekitBubble(html) {
        var dummy, bubble;
        dummy = document.createElement('div');
        dummy.innerHTML = html;
        bubble = dummy.removeChild(dummy.firstChild);
        dummy = null;
        return bubble;
    }

    function createXHR() {
        try {
            if (window.XMLHttpRequest) return new XMLHttpRequest();
            if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {}
        return null;
    }

    function disposeBubble() {
        var bubble = byId('bubble');
        if (!bubble) return;
        bubble.parentNode.removeChild(bubble);
    }

    function handle(el) {
        var callback, node, clone, anchor, target, list, input;
        switch (el.nodeName.toLowerCase()) {
            case '#text':
                // fall through
            case 'img':
                return handle(el.parentNode);
            case 'a':
                if (/callback/.test(el.className)) {
                    callback = byId('icallback');
                    if (callback) {
                        callback.value = el.title;
                        el.blur();
                        return true;
                    }
                }
                if (/bubble-close/.test(el.className)) {
                    disposeBubble();
                    bubbleSkipped = true;
                    return true;
                }
                return false;
