
if (!itdr) var itdr = new Object();
if (!itdr.classes) itdr.classes = new Object();
if (!itdr.classes.ImageReplace) itdr.classes.ImageReplace = new function () {
	/*
		private members
		*/
	var _use = false;
	var inited = false;
	var basepath = "/darkroom/";
	var defaults = {};
	var rules = [];
	var fonts = [];
	/*
		private methods
		*/
	function getElementsBySelector(selector) {
		var tokens = selector.split(' ');
		var currentContext = new Array(document);
		for(var i=0;i<tokens.length;i++) {
			var token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
			if (token.indexOf('#') > -1) {
				var bits = token.split('#');
				var tagName = bits[0];
				var id = bits[1];
				var element = document.getElementById(id);
				if(tagName && element.nodeName.toLowerCase() != tagName) return new Array();
				currentContext = new Array(element);
				continue;
			}
			if (token.indexOf('.') > -1) {
				var bits = token.split('.');
				var tagName = bits[0];
				var className = bits[1];
				if(!tagName) tagName = '*';
				var found = new Array;
				var foundCount = 0;
				for(var h=0;h<currentContext.length;h++) {
					var elements;
					if(tagName == '*') elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
					else elements = currentContext[h].getElementsByTagName(tagName);
					for(var j=0;j<elements.length;j++) found[foundCount++] = elements[j];
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for(var k=0;k<found.length;k++) {
					if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) currentContext[currentContextIndex++] = found[k];
				}
				continue;
			}
			if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
				var tagName = RegExp.$1;
				var attrName = RegExp.$2;
				var attrOperator = RegExp.$3;
				var attrValue = RegExp.$4;
				if(!tagName) tagName = '*';
				var found = new Array;
				var foundCount = 0;
				for(var h=0;h<currentContext.length;h++) {
					var elements;
					if (tagName == '*')elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
					else elements = currentContext[h].getElementsByTagName(tagName);
					for (var j=0;j<elements.length;j++) found[foundCount++] = elements[j];
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				var checkFunction;
				switch (attrOperator) {
					case '=':
						checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
						break;
					case '~':
						checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
						break;
					case '|':
						checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
						break;
					case '^':
						checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
						break;
					case '$':
						checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
						break;
					case '*':
						checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
						break;
					default :
						checkFunction = function(e) { return e.getAttribute(attrName); };
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for (var k=0;k<found.length;k++) {
					if(checkFunction(found[k])) currentContext[currentContextIndex++] = found[k];
				}
				continue;
			}
			tagName = token;
			var found = new Array;
			var foundCount = 0;
			for (var h=0;h<currentContext.length;h++) {
				var elements = currentContext[h].getElementsByTagName(tagName);
				for(var j=0;j<elements.length; j++) found[foundCount++] = elements[j];
			}
			currentContext = found;
		}
		return currentContext;
	};
	function init () {
		if (inited) return;
		inited = true;
		if (_use==false) return;
		/* embed all the js files
			*/
		document.write(unescape("%3Cscript src='" + basepath + "blog/js/cufon-yui.js' type='text/javascript'%3E%3C/script%3E"));
		for (var i=0; i<fonts.length; ++i) {
			document.write(unescape("%3Cscript src='" + basepath + "blog/fonts/" + fonts[i] + "' type='text/javascript'%3E%3C/script%3E"));
		}
	}
	function doReplace () {
		if (_use==false) return;
		/* setup all the defaults
			*/
		for (var prop in defaults) {
			if (Cufon) Cufon.set(prop, defaults[prop]);
		}
		/* assign all the rules
			*/
		for(var i=0; i<rules.length; i++) {
			var rule = rules[i];
			if (Cufon) Cufon.replace(rule.selector, rule.options);
		}
	}
	/*
		public methods
		*/
	this.start = function () {
		init();
	};
	this.replace = function () {
		doReplace();
	};
	this.ready = function () {
		if (_use==false) return;
		if (Cufon) Cufon.now();
	};
	this.refresh = function () {
		if (_use==false) return;
		if (Cufon) Cufon.refresh();
	};
	this.use = function (bool) {
		_use = bool;
	};
	this.loadFont = function(str) {
		fonts.push(str);
	};
	this.addRule = function(selector, options) {
		rules.push({
			selector: selector,
			options: options
		});
	};
	this.setDefaults = function(obj) {
		for (var prop in obj) defaults[prop] = obj[prop];
	};
	this.setBasePath = function(path) {
		basepath = path;
	};
	/*
		constructor
		*/
	this.setDefaults({
		"hover": true,
		"hoverables": {a:true, li:true},
		"selector": getElementsBySelector
	});
};

// a little backwards compatibility
if (!thetainteractive) var thetainteractive = itdr;
if (!intothedarkroom) var intothedarkroom = itdr;
