(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('h3');
		};
		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;
		}
		return false;
	}

	var bubbleSkipped = false;

	addEvent(document, 'click', function(e) {
		if (!handle(e.target || e.srcElement)) return;
		if (e.preventDefault) e.preventDefault();
		else e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		else e.returnValue = false;
	});

	addEvent(window, 'load', function() {
		var form = byId('generator'), uploads, i, l;
		if (!form) return;
		uploads = form.elements['font[]'];
		for (i = 0, l = uploads.length; i < l; ++i) {
			addEvent(uploads[i], 'change', checkUpload);
		}
	});

})();
