
	var _imgtxtEngineInstance;

	function ImgtxtEngine(imageUrlPrefix) {
		_imgtxtEngineInstance = new ImgtxtEngineImpl(imageUrlPrefix);
	}

	function ImgtxtEngineImpl(imageUrlPrefix) {

		/*
			see
			http://www.quirksmode.org/dom/fir.html
			http://www.alistapart.com/articles/dynatext/
			and
			http://www.webfactory.de :)
			
		*/

		this.loadImages = false;
		this.pageLoaded = false;
		this.hiddenRules = new Array();
		this.imageNameRegExp = /imgtxt-([a-f0-9]+\.[a-z]+)-/;
		this.imageUrlPrefix = imageUrlPrefix;

		this.addLoadHandler = function(handler) {
			if (window.addEventListener)
				window.addEventListener("load",handler,false);
			else if (window.attachEvent)
				window.attachEvent("onload",handler);
			else if (window.onload) {
				var oldHandler = window.onload;
				window.onload = function piggyback() {
					oldHandler();
					handler();
				};
			} else
				window.onload = handler;
		}

		this.showHiddenRules = function() {
			for (var i = 0; i < this.hiddenRules.length; i++)
				this.hiddenRules[i].style.visibility = 'visible';
		}

		this.createTestURL = function() {
			// Verwende ein imgtxt selbst als Test, ob Bilder geladen werden müssen
			var targets = document.getElementsByTagName("span");
			for(i = 0; i < targets.length; i++)
				if(targets[i].id.substr(0, 7) == 'imgtxt-') {
					this.imageNameRegExp.exec(targets[i].id);
					return this.imageUrlPrefix + '/' + RegExp.$1;
				}
			return false;
		}

		this.testForImages = function() {
			var url;
			if (url = this.createTestURL()) {
				var testImg = new Image();
				testImg.onload = function() { _imgtxtEngineInstance.loadImages = true; if (_imgtxtEngineInstance.pageLoaded) _imgtxtEngineInstance.imgtxt(); };
				testImg.src = url + "?date=" + (new Date()).getTime();
			} else {
				if (!this.pageLoaded) window.setTimeout("_imgtxtEngineInstance.testForImages();", 100);
			}
		}

		this.imgtxt = function() { // gerufen, wenn Seite fertig geladen und Bilder verwendet werden
			var targets = document.getElementsByTagName("span");
			for(i = 0; i < targets.length; ) {
				if(targets[i].id.substr(0, 7) == 'imgtxt-') {
					this.imageNameRegExp.exec(targets[i].id);
					var substitute = document.createElement('IMG');
					substitute.src  = this.imageUrlPrefix + '/' +  RegExp.$1;
					substitute.style.verticalAlign = 'text-bottom';
					substitute.alt = targets[i].childNodes[0].nodeValue;
					targets[i].parentNode.replaceChild(substitute, targets[i]);
				} else {
					i++;
				}
			}
		}

		this.parseStylesheets = function() {
			if (!window.document.styleSheets) return; // Opera...
			var sheets = window.document.styleSheets, l = sheets.length;
			for(var i=0; i<l; i++) {
					this.parseStylesheet(sheets[i]);
			}
		}
		this.parseStylesheet = function(sheet) {
			var l, rules, imports;
			if(sheet.imports) {
				imports = sheet.imports, l = imports.length;
				for(var i=0; i<l; i++)
					this.parseStylesheet(sheet.imports[i]);
			}
			rules = sheet.cssRules ? sheet.cssRules : sheet.rules; l = rules.length;
			for(var j=0; j<l; j++) {
				this.parseCSSRule(rules[j], sheet);
			}
		}

		this.parseCSSRule = function(rule, currentSheet) {
			var select = rule.selectorText, style = rule.style.cssText;
			var regExp = /\.imgtxt-/;
			if (regExp.test(select)) {
				this.hiddenRules[this.hiddenRules.length] = rule;
				rule.style.visibility = 'hidden';
			}
		}

		this.addLoadHandler( function() { _imgtxtEngineInstance.pageLoaded = true; if (_imgtxtEngineInstance.loadImages) _imgtxtEngineInstance.imgtxt(); } );
		this.testForImages();
		this.parseStylesheets();
		window.setTimeout("_imgtxtEngineInstance.showHiddenRules();", 3000);
	}