//Lifted from David Mark's library
var API, global = this;
API = API || {};

(function() {
	var doc, html;
	var reFeaturedMethod = new RegExp('^function|object$', 'i');
	var isRealObjectProperty = function(o, p) { return !!(typeof o[p] == 'object' && o[p]); };
	API.isRealObjectProperty = isRealObjectProperty;
	var isHostMethod = function(o, m) {
		var t = typeof o[m];
		return !!((reFeaturedMethod.test(t) && o[m]) || t == 'unknown');
	};
	API.isHostMethod = isHostMethod;
	var isHostObjectProperty = function(o, p) {
		var t = typeof o[p];
		return !!(reFeaturedMethod.test(t) && o[p]);
	};
	API.isHostObjectProperty = isHostObjectProperty;
	var areFeatures = function() {
		var i = arguments.length;
		while (i--) { if (!API[arguments[i]]) { return false; } }
		return true;
	};
	API.areFeatures = areFeatures;
	var isOwnProperty = function(o, p) {
		var prop = o.constructor.prototype[p];
		return typeof prop == 'undefined' || prop !== o[p];
	};
	API.isOwnProperty = isOwnProperty;
	if (isRealObjectProperty(this, 'document')) {
		doc = this.document;
	}
	//DOM section
	var allElements, commonElementsByTagName, disableElements, getAttribute, getChildren, getEBI, getEBTN, getHeadElement;
	var attributeAliases = {'for':'htmlFor', accesskey:'accessKey', codebase:'codeBase', frameborder:'frameBorder', framespacing:'frameSpacing', nowrap:'noWrap', maxlength:'maxLength', 'class':'className', readonly:'readOnly', longdesc:'longDesc', tabindex:'tabIndex', rowspan:'rowSpan', colspan:'colSpan', ismap:'isMap', usemap:'useMap', cellpadding:'cellPadding', cellspacing:'cellSpacing'};
	var attributesBad;
	var camelize, reNotEmpty, reCamel = new RegExp('([^-]*)-(.)(.*)');
	var findReplacedElement;
	var createElementWithAttributes, setAttribute;
	var addElementText, getElementText, setElementText;
	var getDocumentWindow;
	if (doc) {
		getDocumentWindow = (function() {
			if (isRealObjectProperty(doc, 'parentWindow')) {
				return function(docNode) {
					return (docNode || global.document).parentWindow;
				};
			}
			if (isRealObjectProperty(doc, 'defaultView') && doc.defaultView == this) { // defaultView is not always window/global object (e.g. IceBrowser, Safari 2)
				return function(docNode) { return (docNode || global.document).defaultView; };
			}
			if (isRealObjectProperty(doc, '__parent__')) { // IceBrowser
				return function(docNode) {
					return (docNode || global.document).__parent__;
				};
			}
		})();
	}
	API.getDocumentWindow = getDocumentWindow;
	//var purgeListeners;
	function getElementSize(el) { return [el.offsetHeight || 0, el.offsetWidth || 0, el.clientHeight || 0, el.clientWidth || 0, el.scrollHeight || 0, el.scrollWidth || 0]; }
	API.getElementSize = getElementSize;
	function getElementDocument(el) {
		if (el.ownerDocument) { return el.ownerDocument; }
		if (el.parentNode) { 
			while (el.parentNode) { el = el.parentNode; }
			return (el.nodeType == 9 || (!el.nodeType && !el.tagName))?el:null;
		}
	}
	API.getElementDocument = getElementDocument;
	function getElementParentElement(el) {
		return (el.parentNode && (el.parentNode.tagName || el.parentNode.nodeType == 1))?el.parentNode:(el.parentElement || null);
	}
	API.getElementParentElement = getElementParentElement;
	function getElementNodeName(el) {
		var nn = (el.tagName || el.nodeName).toLowerCase();
		return (!nn.indexOf('html:'))?nn.substring(5):nn;
	}
	API.getElementNodeName = getElementNodeName;
	var getAnElement, getHtmlElement;
	if (doc) {
		// Returns the HTML element by default or optionally the first element it finds.
		getHtmlElement = function(docNode, bAnyElement) {
			var h, all;
			docNode = docNode || global.document;
			h = isRealObjectProperty(docNode, 'documentElement')?docNode.documentElement:((getEBTN)?getEBTN('html', docNode)[0]:null);
			if (!h && allElements) {
				all = allElements(docNode); // Don't bother to filter for this
				h = all[(all[0].tagName == '!')?1:0];
				if (h && !bAnyElement && h.tagName.toLowerCase() != 'html') { h = null; }
			}
			return h;
		};
	    API.getHtmlElement = getHtmlElement;
	    getAnElement = function(docNode) { return getHtmlElement(docNode, true); };
	    API.getAnElement = getAnElement;
	    html = getAnElement();
	    getEBTN = (function() {
	    	var els;
	    	if (isHostMethod(doc, 'getElementsByTagName')) {
	    		els = doc.getElementsByTagName('*');      // Test "*" parameter, which fails in some agents (e.g. IE5, Safari 1)
	    		if (els && (els.length || allElements)) { // Need document.all as fallback for agents that cannot handle a "*" parameter (Safari 1 is excluded by this test.)
	    			return function(t, docNode) {
	    				return commonElementsByTagName(docNode || global.document, t);
	    			};
	    		}
	    	}
	    	if (isHostObjectProperty(doc, 'all') && isHostMethod(doc.all, 'tags')) {
	    		return function(t, docNode) {
	    			return (docNode || global.document).all.tags(t);
	    		};
	    	}
	    })();
	    API.getEBTN = getEBTN;	    
	}
	var floatStyle, getCascadedStyle, getKomputedStyle, getInlineStyle, getObjectStyle, getOverrideStyle, getStyle, getStylePixels, setStyle, setStyles;
	floatStyle = (typeof html.style.cssFloat == 'string')?'cssFloat':'styleFloat';
	getObjectStyle = function(o, style) {
		if (style == 'float') { style = floatStyle; }
		return (o)?o[style] || null:null;
	};
	getCascadedStyle = (function() {
		if (isRealObjectProperty(html, 'currentStyle')) {
			return function(el, style) {
				return getObjectStyle(el.currentStyle, style);
			};
		}
	})();
	API.getCascadedStyle = getCascadedStyle;
	getKomputedStyle = (function() {
		var rePositioned = new RegExp('^(absolute|fixed)$');
		var rePixelConvert = new RegExp('^(height|width|left|top|right|bottom|margin.+|border.+|padding.+)$', 'i');
		if (isRealObjectProperty(doc, 'defaultView') && isHostMethod(doc.defaultView, 'getComputedStyle')) {
			return function(el, style) {
				var docNode = getElementDocument(el);
				var s = docNode.defaultView.getComputedStyle(el, null);
				return getObjectStyle(s, style);
			};
		}
		if (getCascadedStyle) {
			return function(el, style) {
				var floatS, parent, position, styleInline, styleRuntime;
				var value = getCascadedStyle(el, style);
				if (value == 'inherit') {
					parent = getElementParentElement(el);
					if (parent) {
						return getKomputedStyle(parent, style);
					}
				}
				switch(style) {
				case 'float':
					position = getKomputedStyle(el, 'position');
					return (position && rePositioned.test(position))?'none':value;
				case 'display':
					if (value != 'none') {
						parent = getElementParentElement(el);
						while (parent) {
							if (getCascadedStyle(parent, 'display') == 'none') {
								return 'none';
							}
							parent = getElementParentElement(parent);
						}
						position = getKomputedStyle(el, 'position');
						if (position && rePositioned.test(position)) {
							value = 'block';
						}
						else {
							floatS = getCascadedStyle(el, 'float');
							if (floatS && floatS != 'none') {
								value = 'block';
							}
						}
					}
					return value;
				}
				if (rePixels.test(value)) { return value; }
				if (reOtherUnits.test(value)) {
					if (rePixelConvert.test(style)) {
						if (parseFloat(value)) {
							if (isRealObjectProperty(el, 'runtimeStyle')) {
								styleInline = el.style.left;
								styleRuntime = el.runtimeStyle.left;
								el.runtimeStyle.left = el.currentStyle.left;
								el.style.left = value;
								value = el.style.pixelLeft;
								el.style.left = styleInline;
								el.runtimeStyle.left = styleRuntime;
								return value + 'px';
							}
						}
						else {
							return '0px';
						}
					}
					return null;
				}
				return ((value == 'auto' && style != 'overflow') || value == 'inherit')?null:value;
			};
		}
	})();
    API.getComputedStyle = getKomputedStyle;	
	
	var setOpacity, getOpacity, opacityStyles = ['KhtmlOpacity', 'MozOpacity', 'opacity'];
	setOpacity = (function(el) { 
		var i, s, so;
		var reOpacity = new RegExp('alpha\\(opacity=[^\\)]+\\)', 'i');
		var fn = function(el, o) { el.style[s] = o; };
		i = opacityStyles.length;
		while (i--) {
			if (typeof el.style[opacityStyles[i]] == 'string') {
				s = opacityStyles[i];
				return fn;
			}
		}
		if (typeof el.style.filter == 'string') {
			return function(el, o) {
				so = el.style;
				//var f;
				//if (typeof el.filters != 'undefined') {
				if (el.currentStyle && !el.currentStyle.hasLayout) { so.zoom = 1; }
				//f = el.filters.alpha;
				//if (typeof f != 'undefined') {
				//  f.enabled = o == 1;
				//  f.opacity = o * 100;
				//}
				//else {
				if (!reOpacity.test(so.filter)) {
					so.filter += ' alpha(opacity=' + (o * 100) + ')';
				}
				else {
					so.filter = so.filter.replace(reOpacity, (o >= 0.9999)?'':'alpha(opacity=' + (o * 100) + ')');
				}
				//}
				//}
			};
		}
	})(html);
	API.setOpacity = setOpacity;
	getOpacity = (function(el) {
		var i, s, reOpacity = new RegExp('opacity\\s*=\\s*([^\\)]*)', 'i');
		var fn = function(el) {
			var o = el.style[s];
			if (o) { return parseFloat(o); }
			if (getKomputedStyle) {
				o = getKomputedStyle(el, 'opacity');
				if (o !== null) { return parseFloat(o); }
			}
			return 1;
		};
		i = opacityStyles.length;
		while (i--) {
			if (typeof el.style[opacityStyles[i]] == 'string') {
				s = opacityStyles[i];
				return fn;
			}
		}
		if (typeof html.style.filter == 'string' && getCascadedStyle) {
			return (function() {
				var m;
//              if (html.filters) {
//                return function(el) {
//                  return (typeof el.filters.alpha != 'undefined' && el.filters.alpha.enabled)?el.filters.alpha.opacity / 100:1;
//                };
//              }				
				return function(el) {
					var style = getCascadedStyle(el, 'filter');
					if (style) {
						m = style.match(reOpacity);
						return (m)?parseFloat(m[1]) / 100:1;
					}
					return 1;
				};				
			})();
		}
	})(html);
	API.getOpacity = getOpacity;	
	
})();

var addClass = function(el, className) { if (!el.className) { el.className = className; } else { var re = new RegExp('(^|\\s)' + className + '(\\s|$)'); if (!re.test(el.className)) { el.className += ' ' + className; } } };
var removeClass = function(el, className) { if (el.className) { if (el.className == className) { el.className = ''; } else { var re = new RegExp('(^|\\s)' + className + '(\\s|$)'); var m = el.className.match(re); if (m && m.length == 3) { el.className = el.className.replace(re, (m[1] && m[2])?' ':''); } } } };
var hasClass = function(el, className) { return (new RegExp('(^|\\s)' + className + '(\\s|$)')).test(el.className); };
var tmpTimer, showElement = function(element, duration, gradient) {
	if (!duration) duration = 10;
	if (!gradient) gradient = 0.10;
	API.setOpacity(element, 0);
	if (element.style.display == 'none') element.style.display = '';
	tmpTimer = setTimeout(function fadeIn() {
		var o = API.getOpacity(element) + gradient;
		if (o <= 1) {
			API.setOpacity(element, o);
			tmpTimer = setTimeout(fadeIn, duration);
		} else { clearTimeout(tmpTimer); }
	}, duration);
}
this.onload = function() {
	if (document.getElementById('cufon_homepage_tabs'))	Cufon.replace(document.getElementById('cufon_homepage_tabs').getElementsByTagName('a'), {color: '#444444'});
	//Cufon.replace(document.getElementById('ft').getElementsByTagName('p'), {color: '#ffffff'});
	Cufon.replace('h3', {color: '#444444'});
	Cufon.replace('h2', {color: '#444444'});
};