
	function hideInputBg(field)
	{
		ipField = document.getElementById(field);
		ipField.style.background = "#fff";
	}
	
	
	function IE_Refresh(){
		if (document.all) location.reload();
	}
	window.onresize = IE_Refresh;
	
	
/* >> Standard Popup functions */
	function StandardPopup(Attrs){
		// @params IE and Gecko-Browser compatible window parameter attributes.
		this.params = ['left', 'top', 'location', 'menubar', 'resizable', 'scrollbars', 'status', 'toolbar', 'height', 'width'];
		this.href = Attrs.href ? Attrs.href : 'http://www.google.de'; // url to the popup content
		this.name = Attrs.name ? Attrs.name : 'standardPopup'; // standard window name
		this.height = Attrs.height ? Attrs.height : '550'; // standard height opened window
		this.width = Attrs.width ? Attrs.width : '650'; // standard width opened window
		this.left = Attrs.left ? Attrs.left : null; // window left position from the upper left corner of the client screen
		this.top = Attrs.top ? Attrs.top : null; // window top position from the top of the client screen
		this.locationbar = Attrs.location ? Attrs.location : 'no'; // ['yes', 'no'] display the locationbar
		this.menubar = Attrs.menubar ? Attrs.menubar : 'no'; // ['yes', 'no'] display the menubar
		this.resizable = Attrs.resizable ? Attrs.resizable : 'yes'; // ['yes', 'no'] allows the user to change the window size
		this.scrollbars = Attrs.scrollbars ? Attrs.scrollbars : 'yes'; // ['yes', 'no'] show scrollbars if necessary
		this.status = Attrs.status ? Attrs.status : 'no'; // ['yes', 'no'] show statusbar
		this.toolbar = Attrs.toolbar ? Attrs.toolbar : 'no'; // ['yes', 'no'] show toolbar
		this.blank = Attrs.blank ? Attrs.blank : 'false'; // ['true', 'false'] show window as popup or blank window
		this.wRef = null // window reference to make changes on the opened windowe
	}
	
	StandardPopup.prototype._formatParams = function()
	{
		var str = '\'';
		var objParam;
		for (var i = 0; i < this.params.length; ++i){
			objParam = this.params[i] == 'location' ? 'locationbar' : this.params[i];
			p = eval("this." + objParam);
			if (p){
				str += this.params[i] + '=' + p + ',';
			}
		}
		str = str.substring(0, str.length -1);
		str += '\'';
		return str;
	}
	
	StandardPopup.prototype.open = function(){
		if (this.blank){
			this.wRef = window.open(this.href);
		}else{
			var paraStr = this._formatParams();
			this.wRef = window.open(this.href, this.name, paraStr);
		}
		if (this.wRef)
			this.wRef.focus();
		return false;
	}
/* << */


/* >> rss publisher, requires Mochikit 1.4+*/
	RSSPublisher = {
		publishers: false,
		register: function(args){
			this.append(args);
		},
		append: function(args){
			var RSSObj = new RSS();
			RSSObj.target = args.target;
			RSSObj.source = args.source;
			RSSObj.tags = args.tags;
			RSSObj.descLength = args.descLength;
			RSSObj.descLengthEnding = args.descLengthEnding
			RSSObj.pubDateFormat = args.pubDateFormat;
			RSSObj.refresh = args.refresh;
			RSSObj.itemsCount = args.itemsCount ? args.itemsCount : 5;
			RSSObj.staticTest = args.staticTest;
			if (args.acceptMimeTypes && typeof args.acceptMimeTypes == 'object'){
				RSSObj.acceptMimeTypesCgiStr = this.createMimeTypeCgiStr(args.acceptMimeTypes);
			}
			if (typeof this.publishers != 'boolean'){
				this.publishers.push(RSSObj);
			}else{
				this.publishers = [RSSObj];
			}
			RSSObj.getSource();
		},
		createMimeTypeCgiStr: function(mtList){
			var str = '&mimetypes=';
			for (var i = 0; i < mtList.length; ++i){
				str += encodeURIComponent(this.strTrim(mtList[i])) + ',';
			}
			return str.substring(0, str.length -1);
		},
		strTrim: function(str){
			var ccSpace = 32;
			var ps = 0;
			var pe = 0;
			var psLock = false;
			var peLock = false;
			for (var i = 0; i < str.length; ++i){
				if (str.charCodeAt(i) == ccSpace){
					if (! psLock) ps++;
					if (str.charCodeAt(str.length - 1 - i) == ccSpace){
						if (! peLock) pe++;
					}else{
						peLock = true;
					}
				}else{
					psLock = true;
					if (str.charCodeAt(str.length - 1 - i) == ccSpace){
						if (! peLock) pe++;
					}else{
						peLock = true;
					}
				}
			}
			var string = str.substring(ps, str.length);
			return string.substring(0, str.length - pe - ps);
		}
	}


	function RSS(){
		this.root = DIV(null);
		this.target = null;
		this.source = null;
		this.tags = ['title', 'description'];
		this.descLength = null;
		this.descLengthEnding = 32;
		this.pubDateFormat = 2;
		this.refresh = null;
		this.itemsCount = null;
		this.staticTest = false;
		this.acceptMimeTypesCgiStr = null;
		this.charCount = 0;
		this.stop = false;
	}
	
	RSS.prototype.getSource = function(){
		this.charCount = 0;
		this.stop = false;
		this.root.innerHTML = '';
		if (this.staticTest){
			var url = this.source;
		}else{
			var url = '/urlfetcher/?url=' + encodeURIComponent(this.source);
		}
		if (this.acceptMimeTypesCgiStr && ! this.staticTest) url += this.acceptMimeTypesCgiStr;
		var def = doSimpleXMLHttpRequest(url);
		def.addCallbacks(bind('handleSource', this), bind('handleSourceError', this));
		if (this.refresh) callLater(this.refresh, bind('getSource', this));
	}
	
	RSS.prototype.handleSource = function(def){
		var xmlElements = def.responseXML.documentElement;
		var items = xmlElements.getElementsByTagName('item');
		var count = items.length;
		if (this.itemsCount <= items.length) count = this.itemsCount;
		var tags = this.tags;
		for (var i = 0; i < count; ++i){
			var href = this.getLink(items[i]);
			this.appendElement(this.getItem(items[i], tags, href, i), this.root);
		}
		this.publish();
	}
	
	RSS.prototype.handleSourceError = function(def){
		log(def.message);
		this.target.appendChild(DIV(null, 'Service ist voruebergehend nicht verfuegbar.'));
	}
	
	RSS.prototype.appendElement = function(elm, root){
		if (elm){
			root.appendChild(elm);
			return true;
		}
		return false;
	}

	RSS.prototype.cloneXML2DOM = function(src, tar, igRoot, len, correctHyphen){
		for (var i = 0; i < src.childNodes.length; i++){
			var node = src.childNodes[i];
			switch (node.nodeType){
				case 1:
					if (! igRoot){
						var newNode = tar.appendChild(document.createElement(node.nodeName));
						for (var j = 0; j < node.attributes.length; j++){
							newNode.setAttribute(node.attributes[j].nodeName, node.attributes[j].nodeValue);
						}
						this.cloneXML2DOM(node, newNode, false, correctHyphen);
						break;
					}else{
						this.cloneXML2DOM(node, tar, false, correctHyphen);
						break;
					}
				case 3:
					if (len){
						var text = node.nodeValue;
						if (this.charCount + text.length < len){
							this.charCount += text.length;
						}else{
							var pos = 0;
							var t = '';
							while(1){
								t += text.substr(pos, 1);
								if (t.length + this.charCount >= len){
									var cCode = t.charCodeAt(t.length -1);
									if (cCode == this.descLengthEnding || pos == t.length){
										this.charCount += t.length;
										if (cCode == this.descLengthEnding){
											t += cCode == 32 ? '....' : ' ....';
											this.stop = true;
										}else{
											this.stop = false;
										}
										text = t;
										break;
									}
								}else if(text.length + this.charCount < len){
									var cCode = text.charCodeAt(text.length -1);
									this.charCount += text.length;
									text += cCode == 32 ? '....' : ' ....';
									this.stop = true;
									break;
								}
								pos++;
							}
						}
					}else{
						text = node.nodeValue;
					}
					if (correctHyphen) text = this.correctHyphenatedText(text);
					subNode = document.createTextNode(text);
				tar.appendChild(subNode);
			}
			if (this.stop){
				this.charCount = 0;
				break;
			}
		}
	}
	
	RSS.prototype.correctHyphenatedText = function(text){
		return text.replace(/-/g, '- ');
	}
	
	RSS.prototype.cloneContent = function(src, len, correctHyphen){
		var root = DIV(null);
		if (len){
			this.charCount = 0;
			this.stop = false;
		}
		this.cloneXML2DOM(src, root, false, len, correctHyphen);
		return root.childNodes;
	}

	RSS.prototype.getFirstNodeMatch = function(nName, parent, type){
		var n = parent.childNodes;
		var nName = nName.toLowerCase();
		type = type ? type : 1;
		for (var i = 0; i < n.length; ++i){
			if (n[i].nodeType == type && n[i].nodeName.toLowerCase() == nName){
				return n[i];
			}
		}
		return false;
	}
	
	RSS.prototype.getLink = function(item){
		var link = this.getFirstNodeMatch('link', item);
		if (link && link.childNodes.length > 0) return link.childNodes[0].nodeValue;
		return false;
	}
	
	RSS.prototype.getItem = function(item, tags, href, count){
		var sty = count % 2 == 0 ? 'item' : 'item odd';
		var itemShell = DIV({'class': sty});
		for (var j = 0; j < tags.length; ++j){
			switch (tags[j]){
				case 'title':
					this.appendElement(this.getTitle(item, href), itemShell);
					break;
				case 'description':
					this.appendElement(this.getDescription(item), itemShell);
					break;
				case 'pubDate':
					this.appendElement(this.getPubDate(item), itemShell);
					break;
			}
		}
		return itemShell;
	}

	RSS.prototype.getTitle = function(item, href){
		var title = this.getFirstNodeMatch('title', item);
		if (title && title.childNodes.length > 0){
			return Layout.getTitle(this.cloneContent(title, false, true), href);
		}
		return false;
	}
	
	RSS.prototype.getDescription = function(item){
		var description = this.getFirstNodeMatch('description', item);
		if (description && description.childNodes.length > 0) {
			return Layout.getDescription(this.cloneContent(description, this.descLength, true));
		}
		return false;
	}
	
	RSS.prototype.getPubDate = function(item){
		var pubDate = this.getFirstNodeMatch('pubDate', item);
		if (pubDate && pubDate.childNodes.length > 0) {
			var dateGMT = pubDate.childNodes[0].nodeValue;
			pubDate.childNodes[0].nodeValue = this.formatDate(dateGMT);
			return Layout.getPubDate(this.cloneContent(pubDate, false, false));
		}
		return false;
	}
	
	RSS.prototype.formatDate = function(dateStr){
		var date = toISODate(new Date(dateStr));
		var time = toISOTime(new Date(dateStr));
		date = date.split('-');
		if (this.pubDateFormat == 1 || this.pubDateFormat == 4){
			var y = (date[0] % 1000);
			date[0] = y < 10 ? '0' + y : y;
			date[1] = Math.abs(date[1]);
			date[2] = Math.abs(date[2]);
			if (this.pubDateFormat == 4) return date[1] + '/' + date[2] + '/' + date[0];
			return date[2] + '.' + date[1] + '.' + date[0];
		}else if(this.pubDateFormat == 2 || this.pubDateFormat == 5){
			if (this.pubDateFormat == 5) return date[1] + '/' + date[2] + '/' + date[0];
			return date[2] + '.' + date[1] + '.' + date[0];
		}else if(this.pubDateFormat == 3 || this.pubDateFormat == 6){
			if (this.pubDateFormat == 6) return date[1] + '/' + date[2] + '/' + date[0] + ' ' + time;
			return date[2] + '.' + date[1] + '.' + date[0] + ' ' + time;
		}else{
			if (this.pubDateFormat == 5) return date[1] + '/' + date[2] + '/' + date[0];
			return date[2] + '.' + date[1] + '.' + date[0];
		}
	}
	
	RSS.prototype.publish = function(){
		$(this.target).innerHTML ='';
		$(this.target).innerHTML = this.root.innerHTML;
	}
	
	Layout = {
		getTitle: function(t, href){
			if (href) t = A({'href': href, 'target': '_blank'}, t);
			return DIV(
				{'class': 'rssElementTitle'},
				H3(null, SPAN(null, t))
			);
		},
		getDescription: function(desc){
			return DIV(
				{'class': 'rssElementDesc'},
				DIV({'class': 'inner'}, desc)
			);
		},
		getPubDate: function(d){
			return DIV(
				{'class': 'rssElementPubDate'},
				SPAN(null, d)
			);
		}
	}
/* << */

/* >> Generic Multimedia CMS tool, requires Mochikit 1.4+*/
	function GenericMultimedia(args){
		this.lang = this.getLang();
		this.altText = args.altText;
		this.altImg = args.altImg;
		this.data = args.data;
		if ($(args.target)) this.target = $(args.target);
		this.htmlSrcDom = this.getHtmlSrcDom(args.htmlSrc);
		this.javaApplet = this.isJavaApplet();
		this.modifyAndWriteDocumentElements();
	}
	
	GenericMultimedia.prototype.getLang = function(){
		var htmlEl = document.getElementsByTagName('html')[0];
		if (getNodeAttribute(htmlEl, 'lang')){
			return this.formatLang(getNodeAttribute(htmlEl, 'lang'));
		}else if(getNodeAttribute(htmlEl, 'xml:lang')){
			return this.formatLang(getNodeAttribute(htmlEl, 'xml:lang'));
		}
		return 'en';
	}
	
	GenericMultimedia.prototype.formatLang = function (lang){
		if (lang.search(/-/) > -1) return lang.substring(0, lang.search(/-/));
		return lang;
	}
	
	GenericMultimedia.prototype.getHtmlSrcDom = function(htmlSrc){
		if (typeof htmlSrc == 'string' && htmlSrc.length > 0){
			var outer = DIV(null);
			outer.innerHTML = '<xml>' + htmlSrc + '</xml>';
			return outer;
		}
		return null;
	}
	
	GenericMultimedia.prototype.isJavaApplet = function(){
		var elms = this.htmlSrcDom.childNodes[0].childNodes;
		if (elms.length > 0){
			for (var i = 0; i < elms.length; ++i){
				var elm = elms[i];
				if (elm.nodeType == 1 && elm.nodeName.toLowerCase() == 'object'){
					var classidAttr = getNodeAttribute(elm, 'classid');
					if (classidAttr){
						if (classidAttr.search('java:') > -1) return true;
					}
				}
			}
		}
		return false;
	}
	
	GenericMultimedia.prototype.modifyAndWriteDocumentElements = function(){
		var output = '';
		var elms = this.htmlSrcDom.childNodes[0].childNodes;
		var onlyEmbed = false;
		var model;
		if (elms.length > 0){
			for (var i = 0; i < elms.length; ++i){
				var node = elms[i];
				var name = elms[i].nodeName.toLowerCase();
				var type = elms[i].nodeType;
				if (this.javaApplet || (! this.useEmbed() && ! this.javaApplet)){
					if (type == 1 && name == 'object'){
						model = false;
						output += this.startElement('object', this.getNodeAttributes(node), model);
						var objChilds = node.childNodes;
						for (var j = 0; j < objChilds.length; ++j){
							node = objChilds[j];
							name = objChilds[j].nodeName.toLowerCase();
							type = objChilds[j].nodeType;
							if (type == 1 && name == 'param'){
								model = true;
								output += this.startElement('param', this.getNodeAttributes(node), model);
							}
							if (type == 1 && name == 'embed'){
								model = true;
								output += this.startElement('embed', this.getNodeAttributes(node), model);
							}
						}
					}
				}else{
					onlyEmbed = true;
					var objChilds = node.childNodes;
					for (var j = 0; j < objChilds.length; ++j){
						node = objChilds[j];
						name = objChilds[j].nodeName.toLowerCase();
						type = objChilds[j].nodeType;
						if (type == 1 && name == 'embed'){
							model = true;
							output += this.startElement('embed', this.getNodeAttributes(node), model);
						}
					}
				}
			}
			if (this.altText || this.altImg){
				if (this.altText) var text = '<p>' + this.altText + '</p>';
				if (this.altImg) var img = '<img src="' + this.altImg + '" alt="" title="" />';
				if (this.useEmbed() && ! this.javaApplet){
					output += '<noembed>' + text + img + '</noembed>';
				}else{
					output += text + img;
				}
			}
			if (! onlyEmbed) output += this.endElement('object');
		}
		document.write(output);
	}
	
	GenericMultimedia.prototype.useEmbed = function(){
		var agent = navigator.userAgent;
		if (agent.search(/MSIE | Safari/) > -1) return false;
		return true;
	}
	
	GenericMultimedia.prototype.getNodeAttributes = function(node){
		var name = node.nodeName.toLowerCase();
		var codebase = false;
		if (node.attributes.length > 0){
			var attrs = {};
			var attrValue = '';
			for (var i = 0; i < node.attributes.length; ++i){
				var attrName = node.attributes[i].nodeName.toLowerCase();
				var attrValue = node.attributes[i].nodeValue;
				if (name == 'object' && (attrName == 'classid' || attrName == 'movie' || attrName == 'data')){
					if (attrName == 'classid'){
						attrs[attrName] = this.makeClassidAttribute(attrValue);
					}else if (this.javaApplet && attrName == 'codebase'){
						codebase = true;
						attrs[attrName] = this. makeJavaAppletCodebaseAttribute();
					}else{
						if (attrName == 'codebase') codebase = true;
						attrs[attrName] = this.data + this.copyCgiArgs(attrValue);
					}
				}else if (name == 'embed' && attrName == 'src'){
					attrs[attrName] = this.data + this.copyCgiArgs(attrValue);
				}else{
					attrs[attrName] = attrValue;
				}
			}
			if (this.javaApplet && ! codebase){
						codebase = true;
						attrs['codebase'] = this. makeJavaAppletCodebaseAttribute();
			}
			if (name == 'param'){
				attrNameValue = attrs.name.toLowerCase();
				attrValueValue = attrs.value;
				if (attrNameValue == 'filename' || attrNameValue == 'movie' || attrNameValue == 'src'){
					attrs.value = this.data + this.copyCgiArgs(attrValueValue);
				}
			}
			return attrs;
		}
		return null;
	}
	
	GenericMultimedia.prototype.copyCgiArgs = function(value){
		if (value.lastIndexOf('?') > -1){
			return value.substring(value.lastIndexOf('?'), value.length);
		}
		return '';
	}
	
	GenericMultimedia.prototype.startElement = function(name, attrs, single){
		var element = '<' + name;
		for (var attrName in attrs){
			element += ' ' + attrName + '="' + attrs[attrName] + '"';
		}
		if (single){
			element += '/>';
		}else{
			element += '>';
		}
		return element;
	}

	GenericMultimedia.prototype.endElement = function(name){
		return '</' + name + '>';
	}

	GenericMultimedia.prototype.makeClassidAttribute = function(value){
		var data = this.data;
		if (value.search('java:') > -1){
			return 'java:' + data.substring(data.lastIndexOf('/') +1, data.length) + this.copyCgiArgs(value);
		}
		return value;
	}
	
	GenericMultimedia.prototype.makeJavaAppletCodebaseAttribute = function(){
		var data = this.data;
		return data.substring(0, data.lastIndexOf('/') +1);
	}
/* << */

/* >> bookmarking tool (require mochikit 1.4 and ll StandardPopup) */
	function BookmarkStoreAt(args){
		this.targetName = null;
		this.container = null;
		this.titleHTML = null;
		this.textHTML = null;
		this.descSliceStandard = ' ...';
		this.imgPath = null;
		this.bmItems = ['delicious', 'mrwong', 'blinklist', 'yahoo', 'yigg', 'furl', 'oneview', 'folkd', 'linkarena', 'google', 'webnews'];
		this.bmURL = null;
		this.bmTitle = null;
		this.bmTargets = {};
		this.init(args);
	}
	
	BookmarkStoreAt.prototype.init = function(args){
		this.targetName = args.targetName;
		if (document.getElementById(args.targetName)){
			this.container = document.getElementById(args.targetName);
		}
		if (args.bmItems){
			this.bmItems = args.bmItems;
		}
		this.imgPath = args.imgPath;
		this.titleHTML = args.titleHTML;
		this.textHTML = args.textHTML;
		this.bmURL = encodeURIComponent(location.href);
		this.bmTitle = encodeURIComponent(document.title);
		this.bmTargets['delicious'] = {'title': 'del.icio.us', 'desc': 'del.icio.us', 'url': 'http://del.icio.us/post?url=' + this.bmURL + '&title=' + this.bmTitle};
		this.bmTargets['mrwong'] = {'title': 'Mister Wong', 'desc': 'Mister Wong', 'url': 'http://www.mister-wong.de/index.php?action=addurl&bm_url=' + this.bmURL + '&bm_description=' + this.bmTitle};
		this.bmTargets['blinklist'] = {'title': 'BlinkList', 'desc': 'BlinkList', 'url': 'http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=' + this.bmURL + '&Title=' + this.bmTitle};
		this.bmTargets['yahoo'] = {'title': 'Yahoo MyWeb', 'desc': 'Yahoo MyWeb', 'url': 'http://myweb2.search.yahoo.com/myresults/bookmarklet?u=' + this.bmURL + '&t=' + this.bmTitle};
		this.bmTargets['yigg'] = {'title': 'YiGG', 'desc': 'YiGG', 'url': 'http://yigg.de/neu?exturl=' + this.bmURL + '&exttitle=' + this.bmTitle};
		this.bmTargets['furl'] = {'title': 'Furl', 'desc': 'Furl', 'url': 'http://www.furl.net/storeIt.jsp?u=' + this.bmURL + '&t=' + this.bmTitle};
		this.bmTargets['oneview'] = {'title': 'OneView', 'desc': 'OneView', 'url': 'http://beta.oneview.de:80/quickadd/neu/addBookmark.jsf?URL=' + this.bmURL + '&title=' + this.bmTitle};
		this.bmTargets['folkd'] = {'title': 'Folkd', 'desc': 'Folkd', 'url': 'http://www.folkd.com/submit/page/' + this.bmURL};
		this.bmTargets['linkarena'] = {'title': 'Linkarena', 'desc': 'Linkarena', 'url': 'http://linkarena.com/bookmarks/addlink/?url=' + this.bmURL + '&title=' + this.bmTitle + '&desc=&tags='};
		this.bmTargets['google'] = {'title': 'Google', 'desc': 'Google', 'url': 'http://www.google.com/bookmarks/mark?op=add&hl=de&bkmk=' + this.bmURL + '&title=' + this.bmTitle};
		this.bmTargets['webnews'] = {'title': 'Webnews', 'desc': 'Webnews', 'url': 'http://www.webnews.de/einstellen?url=' + this.bmURL + '&title=' + this.bmTitle};
		this._createLayout();
	}

	BookmarkStoreAt.prototype.store = function(target){
		this.open(this.bmTargets[target].url);
	}
	
	BookmarkStoreAt.prototype.open = function(url){
		if (typeof StandardPopup == 'function'){
			var p = new StandardPopup({'href': url, 'blank': true})
			p.open();
		}else{
			window.open(url);
		}
	}
	
	BookmarkStoreAt.prototype.changeDescSlice = function(key){
		var el = 'bmDescSlice_' + this.targetName;
		if (key){
			$(el).innerHTML = '<span>' + this.bmTargets[key].desc + '</span>';
		}else{
			$(el).innerHTML = this.descSliceStandard;
		}
	}
	
	BookmarkStoreAt.prototype._getTitle = function(){
		var t = DIV({'class': 'bookmarkTitleOuter'});
		var th = H3(null, this.titleHTML);
		t.appendChild(th);
		return t
	}

	BookmarkStoreAt.prototype._getText = function(){
		var t = DIV({'class': 'bookmarkTextOuter'});
		var p = P(null, this.textHTML);
		var s = SPAN({'id': 'bmDescSlice_' + this.targetName, 'class': 'bmDescSlice'}, this.descSliceStandard);
		p.appendChild(s);
		t.appendChild(p);
		return t;
	}

	BookmarkStoreAt.prototype._getImageItems = function(){
		var bmi = this.bmItems;
		var imgOuter = DIV({'class': 'imgOuter'});
		var img;
		for (var i = 0; i < bmi.length; ++i){
			img = IMG({'src': this.imgPath + '/' + bmi[i] + '.gif', 'alt': this.bmTargets[bmi[i]].title, 'title': this.bmTargets[bmi[i]].title});
			connect(img, 'onclick', bind('store', this, bmi[i]));
			if (this.textHTML.length > 0){
				connect(img, 'onmouseover', bind('changeDescSlice', this, bmi[i]));
				connect(img, 'onmouseout', bind('changeDescSlice', this, false));
			}
			imgOuter.appendChild(img);
		}
		return imgOuter;
	}

	BookmarkStoreAt.prototype._createLayout = function(){
		var outer = DIV({'id': 'bookmarksOuter'});
		if (this.titleHTML.length > 0) outer.appendChild(this._getTitle());
		if (this.textHTML.length > 0) outer.appendChild(this._getText());
		outer.appendChild(this._getImageItems());
		this.container.appendChild(outer);
	}
/* << */

/* >> login teaser require mochikit 1.4*/
	function handleFieldPrompt(fieldList){
		for (var i = 0; i < fieldList.length; ++i){
			connect(fieldList[i], 'onfocus', partial(hidePrompt, fieldList[i]));
			connect(fieldList[i], 'onblur', partial(showPrompt, fieldList[i]));
			if ($(fieldList[i]).value != '') hidePrompt(fieldList[i]);
		}
	}
	
	function hidePrompt(field, e){
		setNodeAttribute(field, 'style', {'background-image': 'none'});
	}

	function showPrompt(field, e){
		setNodeAttribute(field, 'style', null);
	}
/* << */


/* >> client current date (require mochikit 1.4) */
	function getCurrentDate(id){
		$(id).innerHTML = '';
		var week = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
		var month = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
		var date = new Date();
		var d = week[date.getDay()];
		var dom = date.getDate();
		var m = month[date.getMonth()];
		var y = date.getFullYear();
		var std = date.getHours();
		var min = date.getMinutes();
		if (dom < 10) dom = "0" + dom;
		if (min < 10) min = "0" + min;
		var t = DIV(null, d + ', ' + dom + '. ' + m + ' ' + y + ', ' + std + ':' + min);
		t.appendChild(SPAN({'class': 'clock'}, 'Uhr'));
		$(id).appendChild(t);
		callLater(1, function(){getCurrentDate(id)});
	}
/* << */


// >> LL_TableColumnEnhancer (require MochiKit 1.4) Version: rel-1-0-0
	LL_TableColumnEnhancer = function(){
		this.table = null;
		this.colConfig = [0,1,2,-3,-2,-1];
		this.tableFullWidth = 0;
		this.tableFullHeight = 0;
		this.tableCurrentWidth = 0;
		this.tableCurrentHeight = 0;
		this.variantsWidth = 0;
		this.variantsHeight = 0;
		this.moved = false;
		this.columns = []; // holds to hide columns with there cells
		this.idOuter = null;
	}
	
	LL_TableColumnEnhancer.prototype.init = function(id, idOuter, display){
		var t = $(id);
		this.idOuter = idOuter;
		var columnsIndex = [];
		if (t.nodeName.toLowerCase() == 'table'){
			this.table = t;
			this.tableFullWidth = t.offsetWidth;
			this.tableFullHeight = t.offsetHeight;
			var tbody = this._getElementChildNodeWithName(t, 'tbody', null);
			for (var i = 0; i < this._getElementChildNodesCount(tbody, 1); ++i){
				var row = this._getElementChildNodeWithName(tbody, 'tr', i);
				for (var j = 0; j < this._getElementChildNodesCount(row, 1); ++j){
					columnsIndex = this.getColumnsIndex(this._getElementChildNodesCount(row, 1), this.colConfig);
					var cell = this._getElementChildNodeWithName(row, 'td', j);
					if (! this._inArray(j, columnsIndex)){
						if (this.columns[j] instanceof DefaultTableColumn){
							this.columns[j].addCell(cell);
						}else{
							this.columns[j] = new DefaultTableColumn(j);
							this.columns[j].addCell(cell);
						}
					}
				}
			}
		}
		showElement($('variantsButtons'));
		this.updateDisplay(display);
		this.tableCurrentWidth = t.offsetWidth;
		this.tableCurrentHeight = t.offsetHeight;
		this.variantsWidth = $(this.idOuter).offsetWidth;
		this.variantsHeight = $(this.idOuter).offsetHeight;
		connect($('variantsViewAllButton'), 'onclick', bind('openInlinePopup', this));
		connect($('variantsViewLessButton'), 'onclick', bind('closeInlinePopup', this));
	}
	
	LL_TableColumnEnhancer.prototype.openInlinePopup = function(e){
		var contOrig = $('variantsOuterShell');
		var cont = $('variantsPopupContainer');
		var elm = $(this.idOuter);
		if (elm){
			cont.innerHTML = '';
			cont.appendChild(elm);
			contOrig.innerHTML = '';
			contOrig.appendChild(IMG({'src': '../px/spc.gif', 'height': this.variantsHeight, 'width': 1, 'class': 'variantsDvShellDummy'}, null));
			this.updateDisplay(true);
			var popup = $('variantsInlinePopupOuter');
			var popupShell = $('variantsPopupShell');
			var distance = ((this.tableFullWidth - this.tableCurrentWidth) / 2) + 12;
			setNodeAttribute(popupShell, 'style', {'left': '-' + distance + 'px'});
			if (this.tableFullWidth == this.tableCurrentWidth){
				setNodeAttribute(this.table, 'style', {'width': this.tableCurrentWidth + 'px'});
			}
			appear(popup, {'duration': 0.3});
			this.moved = true;
		}
	}
	
	LL_TableColumnEnhancer.prototype.closeInlinePopup = function(e){
		var popup = $('variantsInlinePopupOuter');
		var cont = $('variantsOuterShell');
		hideElement(popup);
		var elm = $(this.idOuter);
		if (elm){
			this.updateDisplay(false);
			cont.replaceChild(elm, this._getElementChildNodeWithName(cont, 'img', null));
		}
	}

	LL_TableColumnEnhancer.prototype.updateDisplay = function(display, e){
		if (e) e.stop();
		this.hidden = true;
		if (display) this.hidden = false;
		for (var i = 0; i < this.columns.length; ++i){
			var col = this.columns[i];
			if (col instanceof DefaultTableColumn) col.setDisplay(display);
		}
		if (this.hidden){
			setNodeAttribute($('variantsViewAllButton'), 'style', {'display': 'inline'})
			setNodeAttribute($('variantsViewLessButton'), 'style', {'display': 'none'})
		}else{
			setNodeAttribute($('variantsViewAllButton'), 'style', {'display': 'none'})
			setNodeAttribute($('variantsViewLessButton'), 'style', {'display': 'inline'})
		}
	}
	
	LL_TableColumnEnhancer.prototype._inArray = function(needle, arr){
		for (var i = 0; i < arr.length; ++i){
			if (needle == arr[i]) return true;
		}
		return false;
	}
	
	LL_TableColumnEnhancer.prototype._getElementChildNodeWithName = function(parent, name, pos){
		var pos = pos ? pos : 0;
		var count = 0;
		var childs = parent.childNodes;
		if (childs){
			for (var i = 0; i < childs.length; ++i){
				var c = childs[i];
				if (c.nodeType == 1){
					var nname = c.nodeName.toLowerCase();
					var n = name.toLowerCase();
					if (n = nname && count == pos) return c;
					++count;
				}
			}
		}
		return null;
	}
	
	LL_TableColumnEnhancer.prototype._getElementChildNodesCount = function(parent, type){
		var childs = parent.childNodes;
		var count = 0;
		if (childs){
			for (var i = 0; i < childs.length; ++i){
				var c = childs[i];
				if (c.nodeType == type) ++count;
			}
		}
		return count;
	}

	LL_TableColumnEnhancer.prototype.getColumnsIndex = function(colCount, permCols){
		for (var i = 0; i < permCols.length; ++i){
			if (permCols[i] < 0) permCols[i] += colCount;
		}
		return permCols;
	}


	DefaultTableColumn = function(cid){
		this.cid = cid;
		this.cells = [];
		this.hidden = false;
	}
	
	DefaultTableColumn.prototype.addCell = function(Cell){
		if (Cell.nodeName.toLowerCase() == 'td' || Cell.nodeName.toLowerCase() == 'th'){
			this.cells.push(new DefaultTableCell(Cell));
		}
	}
	
	DefaultTableColumn.prototype.setDisplay = function(display){
		this.hidden = true;
		if (display) this.hidden = false;
		for (var i = 0; i < this.cells.length; ++i){
			this.cells[i].setDisplay(display);
		}
	}


	DefaultTableCell = function(domel){
		this.domel = domel;
		this.hidden = false;
		this.attrs = {};
		this.children = null;
		this.content = null;
		this._backupAttrsAndChildren();
		this._backupContent();
	}
	
	DefaultTableCell.prototype._backupAttrsAndChildren = function(){
		var elm = this.domel;
		this.children = elm.childNodes;
		for (var i = 0; i < elm.attributes.length; ++i){
			var attr = elm.attributes[i];
			var name = attr.nodeName;
			var value = attr.nodeValue;
			this.attrs[name] = value;
		}
	}
	
	DefaultTableCell.prototype._backupContent = function(){
		var node = this.domel;
		while (node.nodeType == 1){
			node = node.childNodes[0];
			if (node && node.nodeType == 3){
				this.content = node.nodeValue;
				break;
			}else{
				if (! node) break;
			}
		}
	}
	
	DefaultTableCell.prototype.setDisplay = function(display){
		if (display){
			this.hidden = false;
			setNodeAttribute(this.domel, 'style', {'display': ''});
			return true;
		}
		this.hidden = true;
		setNodeAttribute(this.domel, 'style', {'display': 'none'});
		return true;
	}
// <<


