AjaxURLManager.setMode('live');
AjaxURLManager.registerKey('erweitertesuche/scope', null, 'enhancedSearchTest.text', false, '/');
AjaxURLManager.registerKey('countcompanyentries', null, null, false, '/');
AjaxURLManager.registerKey('xreview', null, 'xreviewOverall.text', false, '/');
AjaxURLManager.registerKey('xreviewcomments', null, 'xreviewComments.text', false, '/');
AjaxURLManager.registerKey('search', null, null, false);
AjaxURLManager.registerKey('search_rell', null, null, false);
AjaxURLManager.registerKey('search_relh', null, null, false);
AjaxURLManager.registerKey('search_rels', null, null, false);
AjaxURLManager.registerKey('search_relk', null, null, false);
AjaxURLManager.registerKey('search_relp', null, null, false);
AjaxURLManager.registerKey('search_date', null, null, false);
AjaxURLManager.registerKey('fdb_step1', null, null, false, '/datagateway/');
AjaxURLManager.registerKey('fdb_step2', null, null, false, '/datagateway/');
AjaxURLManager.registerKey('fdb_companies', null, null, false, '/datagateway/');
AjaxURLManager.registerKey('quiz', null, null, false, '/datagateway/');

// >> Overwrite STANDARDS
	function getCurrentDate(id){
		$(function(){
			//getElement(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 = date.getMonth() + 1;
			var y = date.getFullYear();
			var std = date.getHours();
			var min = date.getMinutes();
			var sec = date.getSeconds();
			if (m < 10){
				m = '0' + m;
			}
			if (dom < 10){
				dom = '0' + dom;
			}
			if (min < 10){
				min = '0' + min;
			}
			if (sec < 10){
				sec = '0' + sec;
			}
			var timeSection = $('<span class="timeSection"><span class="inner"></span></span>');
			var timeSectionInner = timeSection.find('.inner');
			timeSectionInner.append('<span class="sepYT">, </span>')
				.append('<span class="hour">' + std + '</span>')
				.append('<span class="sepHM">:</span>')
				.append('<span class="min">' + min + '</span>')
				.append('<span class="sepMS">:</span>')
				.append('<span class="sec">' + sec + '</span>')
				.append('<span class="clock">Uhr</span>');
			$('#' + id).empty().append(
				$('<div></div>')
					.append('<span class="weekday">' + d + '</span>')
					.append('<span class="sepWD">, </span>')
					.append('<span class="text">den </span>')
					.append('<span class="day">' + dom + '.</span>')
					.append('<span class="month">' + m + '.</span>')
					.append('<span class="year">' + y + '</span>')
					.append(timeSection)
			);
			setTimeout(function(){getCurrentDate(id);}, 1000);
		});
	}

	XPopupTriggerHandler.prototype = new DefaultRelationHandler();

	XPopupTriggerHandler.prototype.action = function(){
		var self = this;
		setTimeout(
			function(){
				var i, elm, relAttrs,
				x = function(e){
					e.preventDefault();
					e.stopPropagation();
					$(this).parents('.zoomIcoOuter, .zoomIcoInImgOuter').prev().find('a').trigger(relAttrs[0]);
				};
				for (i = 0; i < self.elms.length; ++i){
					elm = self.elms[i].elm;
					relAttrs = self.elms[i].relAttrs;
					$(elm).bind(relAttrs[0], x);
				}
			},
			10
		);
	};

	JsPager = $.extend(
		$.clone(LLObject),
		{
			create: function(options){
				var o = LLObject.create.call(this);
				o.items = [];
				o.groupCnt = -1;
				o.pos = 0;
				o.data = null;
				o.countPerLine = 1;
				o.slideInterval = 0;
				o.interval = null;
				o.defaults = {
					target: null
				};
				if (options){
					$.extend(o.defaults, options);
				}
				for (var k in o.defaults){
					o[k] = o.defaults[k];
				}
				o.prepareContentArea();
				return o;
			},
			slide: function(pos){
				this.pos += pos;
				if (this.pos < 0){
					this.pos = 0;
				}else if (this.pos > this.groupCnt){
					if (this.interval){
						this.pos = 0;
					}else{
						this.pos = this.groupCnt;
					}
				}
				$(this.target).find('div.jsArea').scrollTo(this.props.width * this.pos, this.props.duration, {'axis': 'x'});
			},
			slideToPos: function(pos, duration){
				var grpItems = this.target.find('.ms_scrollPane >div'), d = this.props.duration;
				if (typeof duration !== 'undefined' && !isNaN(parseInt(duration, 10))){
					d = duration;
				}
				if (pos > -1 && pos < grpItems.length){
					$(this.target).find('div.jsArea').scrollTo(grpItems.eq(pos), d, {'axis': 'x'});
					this.pos = pos;
				}
			},
			prepareContentArea: function(){
				var t = this.target;
				t.data('jsPager', this);
				t.css({'overflow': 'auto'});
				var w = this.props.width;
				var h = this.props.height;
				var content = t.find('div.jsArea');
				content.css({
					'width': w,
					'height': h,
					'overflow': 'hidden'
				});
			},
			makeContentAreaItems: function(){
				var self = this;
				var t = self.target;
				var prefix = t.attr('id');
				var d = this.target.find('div.jsPagerItem');
				var grpShell = null;

				if (d && typeof d.length == 'number'){
					var groups = 1;
					if (d.length / self.countPerLine >= 1){
						groups = d.length / self.countPerLine;
						if (groups % 1 > 0){
							groups++;
						}
					}
					var scrollPaneWidth = self.props.width * groups;
					var scrollPane = $('<div class="ms_scrollPane ms_scrollPane_' + prefix + '"></div>');
					scrollPane.css({'width': scrollPaneWidth, 'height': self.props.height});
					var slideInterval;
					if (groups > 1){
						if (this.props.slideInterval && this.props.slideInterval > 0){
							slideInterval = this.props.slideInterval;
						}else{
							slideInterval = 0;
						}
						if (slideInterval === parseInt(0, 10)){
							t.find('.prev').bind('click', function(e){self.slide(-1);}).css({"cursor": 'pointer'}).end()
								.find('.next').css({'cursor': 'pointer'}).bind('click', function(e){self.slide(1);});
							t.find('div.jsPagerButtons').hover(
								function(){$(this).addClass('jspb_hover');},
								function(){$(this).removeClass('jspb_hover');}
							);
						}else{
							var iterval = slideInterval;
							t.find('table.jsPagerOuterTable td.button').hide();
							this.interval = setInterval(function(){self.slide(1);}, slideInterval);
						}
					}
					$(d).each(function(i){
						if (i % self.countPerLine === parseInt(0, 10)){
							self.groupCnt++;
							var hwAttrs = {'width': self.props.width, 'height': self.props.height};
							grpShell = $('<div id="ms_grpShell_' + prefix + '_' + self.groupCnt + '" class="ms_grpShell"></div>');
							grpShell.css(hwAttrs);
							var table = $('<table class="jsPagerContentTable" cellpadding="0" cellspacing="0" border="0"><tr></tr></table>');
							table.css(hwAttrs);
							grpShell.append(table);
						}
						var item = JsPagerItem.create(i, this, self);
						self.items.push(item);
						item = item.make();
						grpShell.find('table tr').append(item);
						scrollPane.append(grpShell);
					});
					t.find('.jsArea').append(scrollPane);
				}
				t.find('div.jsPagerItem').empty();
			}
		}
	);

	JsPagerItem = $.extend(
		$.clone(LLObject),
		{
			create: function(id, data, JsPager){
				var o = LLObject.create.call(this);
				o.slider = JsPager || null;
				o.id = id;
				o.data = data || null;
				o.itemWidth = JsPager.defaults.props.itemWidth || null;
				return o;
			},
			make: function(){
				var sliderId = this.slider.target.attr('id');
				var item = $(
					'<td>' + $(this.data).html() + '</td>'
				);
				item.css({'vertical-align': 'top', 'text-align': 'center'});
				return item;
			}
		}
	);
// <<


// >> XReview Version: exp-6 requires:
	// jQuery 1.2.6+,
	// toJson extension,
	// cookie plugin,
	// lang extension,
	// AjaxUrlManager rel-1-0-1,
	// Utilities rel-1-0-0

	// >> language resources
		$.lang('reviewPrompt', {
				"de": "Artikel bewerten",
				"en": "Rate article"
		});

		$.lang('reviewPopupTitle', {
				"de": "Wertung auswählen",
				"en": "Choose rating"
		});

		$.lang('xreviewPopupNoRating', {
				"de": "Keine Wertung",
				"en": "No rating"
		});

		$.lang('xreviewCommentsMore', {
				"de": "alles anzeigen",
				"en": "view more"
		});

		$.lang('xreviewCommentsLess', {
				"de": "weniger anzeigen",
				"en": "view less"
		});

		// language resources for form error messages
		$.lang('formError_name', {
				"de": "Bitte geben Sie einen Namen ein",
				"en": "Please enter your name"
		});

		$.lang('formError_headline', {
				"de": "Bitte geben Sie eine &Uuml;berschrift ein",
				"en": "Please enter a headline"
		});

		$.lang('formError_comment', {
				"de": "Bitte geben Sie einen Kommentar ein",
				"en": "Please enter a comment"
		});
	// <<


	// >> XReview
		XReview = $.extend(
			$.clone(LLObject),
			{
				create: function (opts) {
					var o = LLObject.create.call(this);
					o.reviews = [];
					o.defaults = {
						'target': null,
						'baseReceiveHandler': 'xreview', // server side script receiver name for the base request.
						'baseSendHandler': 'xreview', // server side script receiver name for item clicks.
						'commentsReceiveHandler': 'xreviewcomments', // server side script receiver name for comments data.
						'maxVisualElements': 5, // maximum count of the visuals e.q. stars.
						'reviewOverallPrefix': 'xreviewOverall_', // Prefix of the overall container class name.
						'reviewType': 'simple', // simple | standard.
						'addReviewTotal': true, // added a total review number to the review action prompt.
						'reviewRequiresLogin': false, // Only logged on users can create a review.
						'onAfterInit': null, // Fires a callback after the initialisation.
						'onReviewSuccess': null, // Fires a callback if a request runs successfully.
						'onAfterElementCreated': null // Fires a callback if an review element creation has finished.
					};
					o.data = null;
					if (opts && typeof opts === 'object'){
						o.defaults = $.extend(o.defaults, opts);
					}
					o.detailId = null;
					return o;
				},
				init: function () {
					var ocs = this.getOverallIdCollectionString(),
							url = AjaxURLManager.getUrlWithKey(this.defaults.baseReceiveHandler, {'type': this.defaults.reviewType, 'ocs': ocs}),
							self = this,
							cb;
					$.getJSON(url, function (data, textStatus) {
						self.data = data;
						self.preparePageOverall();
						if (self.defaults.reviewRequiresLogin){
							User = (typeof XIST4C_GLOBALS !== 'undefined' && XIST4C_GLOBALS.login) || null;
							if (User){
								self.preparePageReviewAction();
							}
						}else{
							self.preparePageReviewAction();
						}
						cb = self.defaults.onAfterInit;
						if (cb && typeof cb === 'function'){
							cb.call(self);
						}
					});
				},
				findPageOverallReviews: function () {
					return $('div[class^=' + this.defaults.reviewOverallPrefix + ']');
				},
				detailIdHandler: function (elm) {
					var pfx = this.defaults.reviewOverallPrefix,
							className = elm.attr("class"),
							self = this;
					return {
						get: function () {return className.substring(pfx.length, className.length);},
						set: function () {return (self.detailId = className.substring(pfx.length, className.length));}
					};
				},
				getOverallIdCollectionString: function () {
					var str = '',
							ovRevs = this.findPageOverallReviews(),
							self = this;
					ovRevs.each(function (i) {
						str += self.detailIdHandler($(this)).get() + ',';
					});
					if (str.length > 0){
						str = str.substring(0, str.length - 1);
					}
					return str;
				},
				preparePageOverall: function () {
					var ovRevs = this.findPageOverallReviews(),
							ovRevsData = this.data.reviews,
							self = this,
							elm, id, value, XrOv;
					if (ovRevs.length && typeof ovRevsData !== 'undefined') {
						ovRevs.each(function (i) {
							elm = $(this);
							id = self.detailIdHandler(elm).set();
							value = ovRevsData['_' + id].rating;
							XrOv = XReviewOverall.create();
							XrOv.target = elm;
							XrOv.id = self.defaults.reviewOverallPrefix + i;
							XrOv.domel = elm.get(0);
							XrOv.value = value;
							XrOv.parent = self;
							XrOv.data = ovRevsData['_' + id];
							self.reviews.push(XrOv);
							XrOv.make();
						});
					}
				},
				preparePageReviewAction: function () {
					var target = $('div[class^=xreviewAction_]'), Xra, type;
					if (target.size() > 0){
						type = this.defaults.reviewType;
						if (type === 'simple'){
							Xra = XReviewSimpleOuterBox.create();
						}else if(type === 'standard'){
							Xra = XReviewStandardOuterBox.create();
						}
						Xra.target = target;
						Xra.id = 'xreview_abc'; // todo: find a way to store a unique id
						Xra.parent = this;
						Xra.data = this.data.reviews['_' + this.detailId];
						Xra.make();
					}
				},
				preparePageComments: function (data) {
					var target, url;
					if (this.defaults.allowComments){
						target = $('div.xreviewComments');
						if (target.size() > 0){
							url = AjaxURLManager.getUrlWithKey('xreviewcomments', {'detailId': this.detailId});
						}
					}
				},
				makeStandardReviewBoxLayout: function (commentFormTool) {
					var lay, self, data;
					if (commentFormTool){
						lay = $(
							'<div class="xreviewPopup">' +
								'<div class="xrDes1">' +
									'<div class="xrDes2">' +
										'<div class="xrDes3">' +
											'<div class="title">' + $.lang('reviewPopupTitle') + '</div>' +
											'<table cellpadding="0" cellspacing="0" border="0" class="itemsOuter">' +
											'</table>' +
										'</div>' +
									'</div>' +
								'</div>' +
							'</div>'
						);
					}else{
						lay = $(
							'<div id="xreviewStandardReviewPopup" class="xreviewPopup">' +
								'<div class="xrDes1">' +
									'<div class="xrDes2">' +
										'<div class="xrDes3">' +
											'<form method="post" action="#">' +
												'<input type="hidden" name="reviewId" value="' + this.detailId + '" />' +
												'<div class="title">' + $.lang('reviewPopupTitle') + '</div>' +
												'<table cellpadding="0" cellspacing="0" border="0" class="itemsOuter">' +
												'</table>' +
												'<div class="viewport buttonsShell">' +
													'<div class="button sendButton"></div>' +
													'<div class="button cancelButton"></div>' +
													'<div class="floatTerm"></div>' +
												'</div>' +
											'</form>' +
										'</div>' +
									'</div>' +
								'</div>' +
							'</div>'
						);
						self = this;
						lay.find('.sendButton').bind('click', function (e) {
							data = $('#xreviewStandardReviewPopup').find(':input').serializeArray();
							self.requestReview(data[0].value, data[1].value);
							self.closeReviewPopup();
						});
						lay.find('.cancelButton').bind('click', function (e) {
							self.closeReviewPopup();
						});
					}
					return lay;
				},
				openReviewPopup: function (pos) {
					$('#xreviewStandardReviewPopup').css(pos);
					$('#xreviewStandardReviewPopup').show('fast');
				},
				closeReviewPopup: function () {
					$('#xreviewStandardReviewPopup').hide('fast');
				},
				handleRatingRecordAndReturnPermission: function(formData){
					var cookieName = 'X-Review',
							User = (typeof XIST4C_GLOBALS !== 'undefined' && XIST4C_GLOBALS.login && XIST4C_GLOBALS.login.userID) !== null || null,
							expireVal = 365,
							data;
					if (User){
						return {
							'userId': XIST4C_GLOBALS.login.userID || null,
							'userName': XIST4C_GLOBALS.login.userName || null
						};
					}else{
						if ($.cookie(cookieName)){
							eval('data = ' + $.cookie(cookieName));
							if ($.inArray(String(this.detailId), data.data) > -1){
								return false;
							}else{
								data.data.push(this.detailId);
								$.cookie(cookieName, $.toJson(data), { path: '/', expires: expireVal });
								return true;
							}
						}else{
							data = {type: "XReviewCookieData", data: [this.detailId]};
							$.cookie(cookieName, $.toJson(data), { path: '/', expires: expireVal });
							return true;
						}
					}
				},
				requestReview: function (detailId, rating, formData) {
					var url = AjaxURLManager.getUrlWithKey(this.defaults.baseSendHandler),
							params = {'detailId': detailId, 'rating': rating},
							fire = false,
							permission, self, cb;
					permission = this.handleRatingRecordAndReturnPermission(formData);
					if (formData){
						params = $.extend(params, {'formData': encodeURIComponent($.toJson(formData))});
					}
					if (typeof permission === 'object'){
						params = $.extend(params, permission);
						fire = true;
					}else if (permission === true){
						fire = true;
					}
					self = this;
					if (fire){
						$.ajax({
							type: 'post',
							url: url,
							data: params,
							success: function (data, msg) {
								if (typeof data === 'object'){
									self.data = data;
								}else if (typeof data === 'string'){
									eval('data = ' + decodeURIComponent(data));
									self.data = data;
								}
								cb = self.defaults.onReviewSuccess;
								if (cb && typeof cb === 'function'){
									cb.call(self);
								}
								self.preparePageOverall();
								self.preparePageReviewAction();
							},
							error: function (req, status, error) {

							}
						});
					}
				}
			}
		);
	// <<

	// >> XReview Overall
		XReviewOverall = $.extend(
			$.clone(LLObject),
			{
				create: function () {
					var o = LLObject.create.call(this);
					o.type = 'XReviewOverall';
					o.target = null;
					o.value = 0;
					o.items = [];
					o.id = null;
					o.domel = null;
					o.parent = null;
					o.data = null;
					return o;
				},
				makeLayout: function () {
					var lay = $(
						'<div id="' + this.id + '" class="xreviewItemBox xreviewOverallItemBox">' +
							'<div class="inner"></div>' +
						'</div>'
					);
					return lay;
				},
				addItemsToShell: function (target) {
					var val = this.value,
							normVal = Math.floor(val * 2 + 0.5) / 2,
							count = this.parent.defaults.maxVisualElements,
							i, Item;
					for (i = 0; i < count; i+=1){
						Item = XReviewItem.create();
						Item.target = target;
						Item.parent = this;
						Item.index = i;
						if (i <= normVal){
							Item.active = true;
						}else if(i - 1 <= normVal){
							if (Math.floor(normVal) !== normVal){
								Item.half = true;
							}
						}
						Item.make();
						this.items.push(Item);
					}
				},
				afterElementCreated: function(){
					var cb = this.parent.defaults.onAfterElementCreated;
					if (cb && typeof cb === 'function'){
						cb.call(this);
					}
				},
				make: function () {
					var bl = this.makeLayout();
					this.target.empty().append(bl);
					this.addItemsToShell(bl.find('.inner'));
					this.afterElementCreated();
				}
			}
		);
	// <<

	// >> XReview Item
		XReviewItem = $.extend(
			$.clone(LLObject),
			{
				create: function () {
					var o = LLObject.create.call(this);
					o.target = null;
					o.parent = null;
					o.active = false;
					o.half = false;
					o.index = 0;
					o.detailId = null;
					return o;
				},
				makeLayout: function () {
					var lay = $(
						'<div class="xreviewItem xreviewItem_passive"></div>'
					);
					if (this.active){
						lay.removeClass('xreviewItem_passive').addClass('xreviewItem_active');
					}
					if (this.half){
						lay.removeClass('xreviewItem_passive');
						lay.removeClass('xreviewItem_active');
						lay.addClass('xreviewItem_half');
					}
					return lay;
				},
				bindEvents: function (lay) {},
				make: function () {
					var item = this.makeLayout();
					this.bindEvents(item);
					this.target.append(item);
				}
			}
		);
	// <<


	// >> XReview Simple outer box
		XReviewSimpleOuterBox = $.extend(
			$.clone(XReviewOverall),
			{
				create: function () {
					var o = XReviewOverall.create.call(this);
					o.type = 'XReviewSimpleOuterBox';
					o.hasBind = false;
					o.data = null;
					return o;
				},
				makeLayout: function () {
					var lay, prompt, total, pmt;
					lay = $(
						'<div id="' + this.id + '" class="xreviewItemBox xreviewSimpleItemBox">' +
							'<div class="inner"></div>' +
						'</div>'
					);
					prompt = $.lang('reviewPrompt');
					total = this.parent.defaults.addReviewTotal;
					if (prompt){
						pmt = $(
							'<div class="viewport xreviewPromptViewport">' +
								'<div class="promptOuter">' +
									'<span class="pmt">' + prompt + '</span>' +
								'</div>' +
							'</div>'
						);
						if (total){
							pmt.find('.promptOuter').append(
								'<span class="total">(' + this.data.total + ')</span>'
							);
						}
					}else{
						if (total){
							pmt = $(
								'<div class="viewport">' +
									'<div class="promptOuter">' +
										'<span class="total">(' + this.data.total + ')</span>' +
									'</div>' +
								'</div>'
							);
						}else{
							pmt = null;
						}
					}
					lay.find('.inner').prepend(pmt);
					return lay;
				},
				addItemsToShell: function (target) {
					var count = this.parent.defaults.maxVisualElements, i, Item;
					for (i = 0; i < count; i+=1){
						Item = SimpleXReviewItem.create();
						Item.target = target;
						Item.parent = this;
						Item.index = i;
						Item.detailId = this.parent.detailId;
						Item.make();
						this.items.push(Item);
					}
				}
			}
		);
	// <<


	// >> XReview Standard outer box
		XReviewStandardOuterBox = $.extend(
			$.clone(XReviewOverall),
			{
				create: function () {
					var o = XReviewOverall.create.call(this);
					o.type = 'XReviewStandardOuterBox';
					o.hasBind = false;
					o.data = null;
					return o;
				},
				makeLayout: function () {
					var lay, self, pos, popupHeight, total;
					lay = $(
						'<div id="' + this.id + '" class="xreviewItemBox xreviewStandardItemBox">' +
							'<div class="inner">' +
								'<div class="reviewActionButton"></div>' +
							'</div>' +
						'</div>'
					);
					self = this;
					lay.find('.reviewActionButton').bind('click', function (e) {
						pos = $(this).offset();
						popupHeight = $('#xreviewStandardReviewPopup').height();
						pos.top -= popupHeight + 10;
						self.parent.openReviewPopup(pos);
					});
					total = this.parent.defaults.addReviewTotal;
					return lay;
				},
				addItemsToShell: function (target) {
					$('body').append(this.parent.makeStandardReviewBoxLayout());
					var Item = StandardXReviewItem.create();
					Item.target = target;
					Item.parent = this;
					Item.index = 0;
					Item.detailId = this.parent.detailId;
					Item.make();
					this.items.push(Item);
				}
			}
		);
	// <<

	// >> Simple XReview Item
		SimpleXReviewItem = $.extend(
			$.clone(XReviewItem),
			{
				create: function () {
					var o = XReviewItem.create.call(this);
					return o;
				},
				bindEvents: function (lay) {
					var self = this;
					if (!this.parent.hasBind){
						$('#' + this.parent.id).find('div.inner').bind('mouseleave', function (e) {
							$(this).find('.xreviewItem').removeClass('xreviewItem_hover');
						});
						this.parent.hasBind = true;
					}
					lay.hover(
						function () {
							$(this).prevAll('.xreviewItem').andSelf().addClass('xreviewItem_hover');
						},
						function () {
							$(this).removeClass('xreviewItem_hover');
						}
					);
					if (this.detailId){
						lay.bind('click', function (e) {
							self.parent.parent.requestReview(self.detailId, self.index, null);
						});
					}
				}
			}
		);
	// <<

	// >> Standard XReview Item
		StandardXReviewItem = $.extend(
			$.clone(XReviewItem),
			{
				create: function () {
					var o = XReviewItem.create.call(this);
					return o;
				},
				makeLayout: function (firstItem) {
					var lay = $(
						'<tr>' +
							'<td class="option"></td>' +
							'<td class="visual">' +
							'</td>' +
						'</tr>'
					);
					if (!firstItem){
						lay.find('.visual').append('<div class="xreviewItemBox"></div>');
					}
					return lay;
				},
				makeOption: function () {
					return $('<input type="radio" name="rating" value="" />');
				},
				make: function (target) {
					var firstItem, firstOpt, max, i, j, item, opt, XrItem;
					if (!target || target.size() === 0){
						target = $('#xreviewStandardReviewPopup').find('.itemsOuter');
					}
					firstItem = this.makeLayout(true).clone();
					firstOpt = this.makeOption().clone().attr({'checked': 'checked'});
					firstOpt.attr({'value': -1});
					firstItem.find('.option').append(firstOpt);
					firstItem.find('.visual').html('<div class="noRatingPrompt">' + $.lang('xreviewPopupNoRating') + '</div>');
					target.append(firstItem);
					max = this.parent.parent.defaults.maxVisualElements;
					if (typeof max === 'undefined'){
						max = this.parent.defaults.maxVisualElements;
					}
					for (i = 0; i < max; i+=1){
						item = this.makeLayout().clone();
						opt = this.makeOption().clone().attr({'value': i});
						item.find('.option').append(opt);
						for (j = 0; j < i+1; j+=1){
							XrItem = XReviewItem.create();
							XrItem.target = item.find('.xreviewItemBox');
							XrItem.parent = this;
							XrItem.active = true;
							XrItem.index = j;
							XrItem.make();
						}
						target.append(item);
					}
				}
			}
		);
	// <<


	// >> XReview comments
		XReviewComments = $.extend(
			$.clone(LLObject),
			{
				create: function (opts) {
					var o = LLObject.create.call(this);
					o.comments = [];
					o.form = null;
					o.target = null;
					o.parent = null;
					o.defaults = {
						'target': null, // jquery object to append the comments.
						'xreview': null, // review base rating tool object.
						'baseReceiveHandler': 'xreviewcomments', // server side script receiver name for the base request.
						'baseSendHandler': 'xreview', // server side script receiver name for item clicks.,
						'commentsPrefix': 'xreviewComments_', // Prefix of the comments container class name.
						'commentsClipping': null, // Text clipping after number of chars.
						'commentFormPath': 'commentForm/', // Path to the XHTML form document.
						'requiredFormFields': [], // List with required form field names.
						'reviewRequiresLogin': false // Only logged on users can create a review.
					};
					o.data = null;
					if (opts && typeof opts === 'object'){
						o.defaults = $.extend(o.defaults, opts);
					}
					o.parent = o.defaults.xreview;
					return o;
				},
				init: function () {
					var target, url, self, XRCom;
					target = this.target = $('div[class^=' + this.defaults.commentsPrefix + ']');
					target.empty();
					target = this.makeBaseLayout(target);
					if (target.size() > 0){
						url = AjaxURLManager.getUrlWithKey(this.defaults.baseReceiveHandler, {'detailId': this.parent.detailId});
						self = this;
						$.getJSON(url, function (data, textStatus) {
							self.data = data;
							$(data.comments).each(function (i) {
								XRCom = XReviewComment.create();
								XRCom.parent = self;
								XRCom.data = this;
								XRCom.target = target;
								self.comments.push(XRCom);
								XRCom.make();
							});
							self.appendForm();
						});
					}
				},
				makeBaseLayout: function (target) {
					var lay = $('<div class="xreviewCommentsBaseContainer"></div>');
					target.append(lay);
					return target.find('.xreviewCommentsBaseContainer');
				},
				getCommentsId: function (elm) {
					var pfx = this.defaults.commentsPrefix,
							className = elm.attr("class");
					return className.substring(pfx.length, className.length);
				},
				appendForm: function () {
					var User, makeForm, Form, self = this;
					makeForm = function(){
						Form = XReviewCommentForm.create();
						Form.data = self.data;
						Form.target = self.target;
						Form.parent = self;
						self.form = Form;
						Form.make();
					};
					if (this.defaults.reviewRequiresLogin){
						User = (typeof XIST4C_GLOBALS !== 'undefined' && XIST4C_GLOBALS.login && XIST4C_GLOBALS.login.userID) || null;
						if (User){
							makeForm();
						}
					}else{
						makeForm();
					}
				}
			}
		);
	// <<

	// >> XReview comment
		XReviewComment = $.extend(
			$.clone(LLObject),
			{
				create: function () {
					var o = LLObject.create.call(this);
					o.parent = null;
					o.data = null;
					o.target = null;
					return o;
				},
				makeLayout: function () {
					var lay = $(
						'<div class="xreviewComment">' +
							'<div class="name"></div>' +
							'<div class="xreviewItemBox"></div>' +
							'<div class="headline"></div>' +
							'<div class="comment"></div>' +
						'</div>'
					);
					return lay;
				},
				injectData: function (item, clippingAfter, clippingKey) {
					var d = this.data, k, i, XrItem, text, eventFunc, rating;
					eventFunc = function (e) {
						e.preventDefault();
						e.stopPropagation();
						$(this).parents('.commentClippingOuter').find('.buttonOuter').toggle();
						$(this).parent('.buttonOuter').prevAll('.hiddenText').toggle();
						$(this).parent('.buttonOuter').prevAll('.dots').toggle();
					};
					for (k in d){
						if (k !== 'undefined'){
							if (k === 'rating'){
								rating = d[k];
								for (i = 0; i < this.parent.parent.defaults.maxVisualElements; i+=1){
									XrItem = XReviewItem.create();
									XrItem.target = item.find('.xreviewItemBox');
									XrItem.parent = this;
									if (! (rating === null || rating === -1)){
										if (i <= rating){
											XrItem.active = true;
										}
									}
									XrItem.index = i;
									XrItem.make();
								}
								continue;
							}
							if (clippingAfter && k === clippingKey){
								if (d[k].length > clippingAfter + 50){
									text = $(
										'<div class="commentClippingOuter">' +
											'<span class="clipping">' + d[k].substring(0, clippingAfter) + '</span>' +
											'<span class="dots">...</span>' +
											'<span class="hiddenText">' + d[k].substring(clippingAfter, d[k].length) + '</span>' +
											'<div class="buttonOuter more"><a href="#">' + $.lang('xreviewCommentsMore') + '</a></div>' +
											'<div class="buttonOuter less" style="display: none;"><a href="#">' + $.lang('xreviewCommentsLess') + '</a></div>' +
										'</div>'
									);
									item.find('.' + k).html(text);
									item.find('.hiddenText').hide();
									item.find('.buttonOuter a').bind('click', eventFunc);
									continue;
								}
							}
							item.find('.' + k).html(d[k]);
						}
					}
				},
				make: function () {
					var item = this.makeLayout();
					this.injectData(item, this.parent.defaults.commentsClipping, this.parent.data.clippingKey);
					this.target.append(item);
				}
			}
		);
	// <<


	// >> XReview  comment form
		XReviewCommentForm = $.extend(
			$.clone(LLObject),
			{
				create: function () {
					var o = LLObject.create.call(this);
					o.data = null;
					o.target = null;
					o.parent = null;
					return o;
				},
				injectXReviewRatingTool: function () {
					// xreviewRatingTool
					var XRev = this.parent.defaults.xreview, target;
					$('#xreviewRatingTool').append(XRev.makeStandardReviewBoxLayout(true));
					target = $('#xreviewRatingTool .itemsOuter');
					this.addItemsToShell(target, XRev);
				},
				addItemsToShell: function (target, XRev) {
					var Citem = StandardXReviewItem.create();
					Citem.target = target;
					Citem.parent = this.parent;
					Citem.index = 0;
					Citem.reviewId = XRev.reviewId;
					Citem.make(target);
				},
				makeLayout: function () {
					var lay = $(
						'<div id="xreviewCommentForm" class="xreviewCommentForm">' +
							'<div class="viewport showHideButtonOuter">' +
								'<div class="button showButton"></div>' +
								'<div class="button hideButton" style="display: none;"></div>' +
							'</div>' +
							'<div id="xreviewCommentFormContainer" style="display: none;"></div>' +
						'</div>'
					);
					lay.find('.button').bind('click', function (e) {
						$('#xreviewCommentForm').find('.button, #xreviewCommentFormContainer').toggle();
					});
					return lay;
				},
				makeErrorsBaseLayout: function () {
					var lay = $(
						'<div id="commentErrorMessages">' +
							'<ul class="errors">' +
							'</ul>' +
						'</div>'
					);
					return lay;
				},
				makeErrorLayout: function (msg) {
					return $('<li>' + msg + '</li>');
				},
				makeSubmitButtonLayout: function () {
					var lay, self, error, formData, XRev, detailId;
					lay = $(
						'<div class="viewport submitButtonOuter">' +
							'<div class="submitButton"></div>' +
						'</div>'
					);
					self = this;
					lay.find('.submitButton').bind('click', function (e) {
						error = self.checkRequiredFormFields();
						if (!error){
							formData = self.getFormDataAsJson();
							XRev = self.parent.defaults.xreview;
							detailId = XRev.detailId;
							if (detailId){
								XRev.requestReview(detailId, formData.rating, formData);
							}
						}
					});
					return lay;
				},
				getFormDataAsJson: function () {
					var fields = $('#xreviewCommentForm').find(':input').serializeArray(),
							params = {}, i, field;
					for (i = 0; i < fields.length; i += 1){
						field = fields[i];
						params[field.name] = field.value;
					}
					return params;
				},
				checkRequiredFormFields: function () {
					var conf = this.parent.defaults.requiredFormFields,
							fields = $('#xreviewCommentForm').find(':input'),
							target = $('#commentErrorMessages'),
							error, self, f, name, value, emsg;
					target.remove();
					target = [];
					error = false;
					self = this;
					$(fields).each(function (i) {
						f = $(this);
						name = f.attr('name');
						value = f.val();
						if ($.inArray(name, conf) > -1 && value === ''){
							error = true;
							emsg = self.makeErrorLayout($.lang('formError_' + name));
							if (target.length === 0){
								target = self.makeErrorsBaseLayout();
								$('#xreviewCommentForm').prepend(target);
							}
							target.append(emsg);
						}
					});
					return error;
				},
				make: function () {
					var self = this,
							target = this.target,
							sb, page;
					target.append(this.makeLayout());
					sb = this.makeSubmitButtonLayout();
					page = this.parent.defaults.commentFormPath + 'xreviewCommentForm_' + $.lang() + '.html';
					$('#xreviewCommentFormContainer').load(page + ' #xreviewCommentFormShell', function (responseText, textStatus, XMLHttpRequest) {
						self.injectXReviewRatingTool();
						$('#xreviewCommentFormContainer').append(self.makeSubmitButtonLayout());
					});
				}
			}
		);
	// <<
// <<

// >> Alternativ XReview comment form layout
	ExtraReviewComments = $.extend(
		$.clone(XReviewComments),
		{
			create: function (opts) {
				return XReviewComments.create.call(this, opts);
			},
			appendForm: function () {
				var User, makeForm, Form, self = this;
				makeForm = function(){
					Form = ExtraReviewCommentForm.create();
					Form.data = self.data;
					Form.target = self.target;
					Form.parent = self;
					self.form = Form;
					Form.make();
				};
				if (this.defaults.reviewRequiresLogin){
					User = (typeof XIST4C_GLOBALS !== 'undefined' && XIST4C_GLOBALS.login && XIST4C_GLOBALS.login.userID) || null;
					if (User){
						makeForm();
					}
				}else{
					makeForm();
				}
			}
		}
	);

	ExtraReviewCommentForm = $.extend(
		$.clone(XReviewCommentForm),
		{
			create: function (opts) {
				return XReviewCommentForm.create.call(this);
			},
			make: function () {
				var self = this,
						target = this.target,
						sb, page;
				target.prepend(this.makeLayout());
				sb = this.makeSubmitButtonLayout();
				page = this.parent.defaults.commentFormPath + 'xreviewCommentForm_' + $.lang() + '.html';
				$('#xreviewCommentFormContainer').load(page + ' #xreviewCommentFormShell', function (responseText, textStatus, XMLHttpRequest) {
					self.injectXReviewRatingTool();
					$('#xreviewCommentFormContainer').append(self.makeSubmitButtonLayout());
				});
			}
		}
	);
// <<

// >> Helper objects, there are triggered by XReview callbacks
	// >> Overall bubbles
		OverallBubble = $.extend(
			$.clone(LLObject),
			{
				create: function(OvObj){
					var o = LLObject.create.call(this);
					o.OvObj = OvObj || null;
					return o;
				},
				makeLayout: function(OvObj){
					var lay = $(
						'<div class="viewport">' +
							'<div class="overallBubbleOuter">' +
								'<div class="bubbleWithCount">' +
									'<span class="bubble"></span>' +
									'<span class="count">(' + OvObj.data.totalcomments + ')</span>' +
								'</div>' +
							'</div>' +
						'</div>'
					);
					lay.css({'text-align': 'right'});
					return lay;
				},
				make: function(OvObj, target){
					target = target || OvObj.target.find('.inner');
					target.prepend(this.makeLayout(OvObj));
				}
			}
		);
	// <<
//<<


// >> Solr-Search embedding kit Version: rel-1-2-4
	if (typeof(window.llsolr) === 'undefined'){
		window.llsolr = {};
	}

	llsolr.SolrSearchEmbeddingKit = $.extend(
		$.clone(LLObject),
		{
			create: function(opts){
				var o = LLObject.create.call(this);
				o.keyCnt = 0;
				o.proposalItems = {
					'current': 0,
					'items': null
				};
				o.addOns = [];
				o.searchPhraseProposals = null;
				o.SolrFacetAddOn = null;
				o.SolrFacetSelectboxFacetTeaserAddOn = null;
				o.SolrStaticFacetSelectboxFacetTeaserAddOn = null;
				o.gardenDefaults = null;
				o.defaults = {
					// Holds the standard params to run solr search.
					// Add, change or remove params with the "defaultParams" method on
					// runtime or init.
					standardParams: {
						'q': '',
						'start': 0,
						'rows': 0,
						'indent': 'on',
						'qt': 'dismax',
						'spellcheck': false,
						'wt': 'json',
						'spellcheck.extendedResults': true,
						'spellcheck.collate': true,
						'facet': true,
						'facet.mincount': 1,
						'keyCnt': o.keyCnt,
						'facet.field': [],
						'facet.query': []
					},
					// Holds the params for search autocomplete.
					// Again, use "defaultParams" to change that.
					searchPhraseParams: {
						'facet.limit': 100,
						'facet.prefix': ''
					},
					// Use this params to extend the search autocomplete matching.
					// If filter query param (fq) is a single list, one resultset
					// is used to display the autocomplete list.
					// If list with lists, the a resultset for each list will return
					// and used to display the autocomplete list with several areas.
					extendedSearchPhraseParams: {
						'fq': null
					},
					// Holds the search phrase variants.
					searchPhraseFacets: ['textpropose'],
					// This list can be used to set persitent params.
					// Useful to set params to restrict to url or country.
					persistentStaticParams: [],
					// Amount of showing search detail items.
					// It would display a pager, if more than the restricted number found.
					detailSearchResultCount: 10,
					// Holds the params for search detail.
					// Again, use "defaultParams" to change that.
					detailSearchParams: {
						'hl': 'false',
						'hl.fl': 'textpropose',
						'facet.sort': 'count'
					},
					detailSearchFacets: [],
					searchDetailTarget: [],
					searchDetailUrl: '/',
					detailSearchAjaxHandler: 'search',
					searchPhraseOuterTarget: [],
					autocomplete: false,
					pagerFrameWidth: 10,
					pagerTopTarget: $('#llsolr-pager1'),
					pagerBottomTarget: $('#llsolr-pager2'),
					searchResultTarget: $('#llsolr-detailSearchResult'),
					facetPanelsTarget: $('#llsolr-facetPanels'),
					positionAbsolute: false,
					relativeTargetPosition: null,
					onBeforeSearchResult: null,
					onSearchResult: null,
					searchTransmitter: null,
					searchPhraseProposalItem: llsolr.SolrSearchPhraseProposalsItem,
					searchPhraseTitleItem: llsolr.SolrSearchPhraseTitleItem,
					showSearchPhraseProposalCount: false,
					productProposalItem: llsolr.SolrProductProposalsItem,
					staticSearchPhrasePrefix: ''
				};
				if (opts && Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				o.currentFacets = {};
				o.data = null;
				o.phrase = '';
				o.originalTarget = null;
				return o;
			},
			sequence: (function(){
				var seq = 0;
				return {
					next: function(){
						return (seq += 1);
					}
				};
			}()),
			prepareSearchElement: function(){
				var spp, searchTargets = this.defaultParams('searchPhraseOuterTarget'), self = this,
				posAbsolute = this.defaultParams('positionAbsolute'),
				autocomplete = this.defaultParams('autocomplete');
				if ($('#llsolr-searchPhraseProposals', searchTargets).length === 0){
					$('body').bind('click.solr-searchembeddingkit-autocomplete', function(e){
						self.searchPhraseProposals.hide();
					});
					spp = this.makeSearchPhraseProposalPaneLayout().hide();
					if (posAbsolute){
						spp.addClass('llsolr-searchPhraseProposals-posAbs');
						$('body').append(spp);
					}else{
						searchTargets.each(function(i){
							var form, field, button;
							form = $(this).find('form');
							field = $(this).find('input[type=text]');
							button = $(this).find('.button input');
							if (!button.length){
								button = $(this).find('.button');
							}
							button.bind('click.autocomplete', function(e){
								self.handleKeyPress(e);
							});
							self.originalTarget = field;
							form.bind('submit.autocomplete', function(e){
								e.preventDefault();
								e.stopPropagation();
								if (!autocomplete){
									window.location.href = self.defaultParams('searchDetailUrl') +
									Utils.getUrlParamsFromJson({'phrase': self.preprocessPhrase($.trim(field.val()))});
								}else{
									self.handleKeyPress(e);
								}
							}).css({
								position: 'relative',
								zIndex: 1000 + (self.sequence.next() * 1)
							});
							$(this).find('llsolr-searchPhraseProposals-root').css({
								zIndex: 1000000 + (self.sequence.next() * 1)
							});
							if (autocomplete){
								field.attr({
									autocomplete: 'off'
								});
								$(this).bind('keydown.autocomplete', function(e){
									self.handleKeyPress(e);
								});
								(function(currentTarget, searchTargets){
									field.bind('keyup.autocomplete', function(e){
										var spp, searchTarget, phrase;
										self.keyCnt +=1;
										for (i = 0; i < searchTargets.length; i+=1){
											searchTarget = searchTargets[i];
											if (searchTarget !== currentTarget.get(0)){
												$(searchTarget).find('input[type=text]').val(currentTarget.find('input[type=text]').val());
											}
										}
										if (e.keyCode === 8 || e.keyCode > 45 || e.keyCode === 0){
											field = $(this);
											// check if autocomplete shell is not in search target then append to the search target.
											if (!currentTarget.find('.llsolr-searchPhraseProposals-root').length){
												currentTarget.append($('body').find('.llsolr-searchPhraseProposals-root'));
											}
											if (field.val().charCodeAt(field.val().length - 1) !== 32){
												phrase = self.preprocessPhrase(field.val());
												self.handleSearchPhraseProposals(phrase);
											}
										}
										currentTarget.find('.llsolr-searchPhraseProposals-root').css({
											zIndex: 1000000 + (self.sequence.next() * 1)
										});
									});
								}($(this), searchTargets));
							}
							field.parent().css({
							}).append(spp);
						});
					}
					this.searchPhraseProposals = spp;
				}
			},
			preprocessPhrase: function(phrase){
				return phrase.replace(/\-/g, ' ');
			},
			defaultParams: function(name, param, value){
				var p;
				if (arguments.length){
					if (name && param && typeof(value) === 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return this.defaults[name][param];
						}
						return this.defaults[name];
					}else if (name && !param && value){
						return (this.defaults[name] = value);
					}else if (name && param && typeof(value) !== 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return (this.defaults[name][param] = value);
						}
						return (this.defaults[name] = value);
					}
					return this.defaults[name];
				}else{
					return this.defaults;
				}
			},
			addOn: function(addOnObj){
				var i, isAlreadyAdded = false;
				if (Utils.isObject(addOnObj)){
					for (i = 0; i < this.addOns.length; i+=1){
						if (this.addOns === addOnObj){
							isAlreadyAdded = true;
							break;
						}
					}
					if (!isAlreadyAdded){
						this.addOns.push(addOnObj);
						addOnObj.parent = this;
						return addOnObj;
					}
				}
				return null;
			},
			makeSearchPhraseProposalPaneLayout: function(){
				var lay = $(
					'<div class="viewport llsolr-searchPhraseProposals-root" style="z-index: 10000000">' +
						'<div id="llsolr-searchPhraseProposals" class="llsolr-searchPhraseProposals">' +
							'<div id="llsolr-searchPhraseProposalsPane">' +
								'<div class="title"></div>' +
								'<div id="llsolr-searchPhraseProposalsScrollPane"></div>' +
							'</div>' +
						'</div>' +
					'</div>'
				);
				return lay;
			},
			makeProductProposalPaneLayout: function(){
				var lay, idx = '', srTarId = this.defaults.searchDetailTarget.attr('id');
				try {
					if (srTarId.lastIndexOf('_') > -1){
						idx = srTarId.substring(srTarId.lastIndexOf('_'), srTarId.length);
					}
					lay = $(
						'<div id="llsolr-productSearchProposals' + idx + '" class="llsolr-productSearchProposals">' +
							'<div id="llsolr-productSearchProposalsPane' + idx + '" class="llsolr-productSearchProposalsPane">' +
								'<div class="title">' +
									'<div class="viewport">' +
										'<div class="searchInfo"></div>' +
									'</div>' +
									'<div class="titleInner"></div>' +
								'</div>' +
								'<div id="llsolr-productSearchProposalsScrollPane' + idx + '" class="llsolr-productSearchProposalsScrollPane"></div>' +
							'</div>' +
						'</div>'
					);
				}catch(e){
					if (window.console && window.console.error){
						console.error('Exception: SolrSearchEmbeddingKit.makeProductProposalPaneLayout', e);
					}
				}
				return lay;
			},
			makeSearchSummaryLayout: function(){
				var d = this.data, numFound, start, rows, overall, current;
				numFound = d.response.numFound;
				start = d.responseHeader.params.start;
				rows = d.responseHeader.params.rows;
				current = start / rows + 1;
				overall = numFound % rows > 0 ? Math.floor(numFound / rows) + 1 : numFound / rows;
				return $(
					'<div class="outer">' +
						'<span class="prompt">' + $.lang('searchInfoPrompt1') + '</span>' +
						'<span class="current">' + current + '</span>' +
						'<span class="prompt">' + $.lang('searchInfoPrompt2') + '</span>' +
						'<span class="overall">' + overall + '</span>' +
					'</div>'
				);
			},
			buildFacetQueryParams: function(params, facetQueryKeys){
				var k, realParams = [], facetDates = this.data.facet_counts.facet_dates,
				facetDatesKeys = [];
				if (typeof(facetDates) !== 'undefined'){
					for (k in facetDates){
						facetDatesKeys.push(k);
					}
				}
				for (k in params){
					if ($.inArray(k, facetDatesKeys) > -1){
						realParams.push([k,':',params[k]].join(''));
					}else if ($.inArray(k.substring(0, k.lastIndexOf(':')), facetQueryKeys) > -1){
						var key = k.substring(0, k.lastIndexOf(':'));
						realParams.push([key,':',params[k].substring(params[k].lastIndexOf(':')+1, params[k].length)].join(''));
					}else{
						realParams.push([k,':"',params[k],'"'].join(''));
					}
				}
				return {
					fq: realParams
				};
			},
			getQueryParams: function(type, phrase, addParams){
				var stdParams = this.defaultParams('standardParams'),
				searchPhraseParamExt = this.defaultParams('searchPhraseParams'),
				searchPhraseFacets = this.defaultParams('searchPhraseFacets'),
				detailSearchParamExt = this.defaultParams('detailSearchParams'),
				detailSearchFacets = this.defaultParams('detailSearchFacets'),
				staticSearchPhrasePrefix = this.defaultParams('staticSearchPhrasePrefix'),
				persistentStaticParams = this.defaultParams('persistentStaticParams'),
				coreParams, facetFields, q;
				stdParams.keyCnt = this.keyCnt;
				if (addParams && typeof addParams === 'object'){
					if (addParams.start || parseInt(addParams.start, 10) === 0){
						stdParams = $.extend(stdParams, {'start': addParams.start});
						delete addParams.start;
					}
					addParams = Utils.getUrlParamsFromJson(addParams);
					addParams = '&' + addParams.substring(1, addParams.length);
				}else{
					addParams = '';
				}
				coreParams = null;
				facetFields = null;
				if (type == 'searchProposals'){
					facetFields = searchPhraseFacets;
					q = $.trim(phrase).split(' ');
					if (q[0] !== '' && q[0] !== ' '){
						if (q.length === 1){
							searchPhraseParamExt['facet.prefix'] = q[0].toLowerCase();
							searchPhraseParamExt['q.alt'] = '*:*';
						}else{
							if (q.length > 1 && q[q.length -1] !== ' '){
								stdParams.q = q.slice(0, q.length -1).join(' ');
								searchPhraseParamExt['facet.prefix'] = q[q.length -1].toLowerCase();
							}
						}
						coreParams = $.extend(stdParams, searchPhraseParamExt);
					}
				}else if (type == 'productProposals'){
					facetFields = detailSearchFacets;
					stdParams.rows = this.defaultParams('detailSearchResultCount');
					if (Math.abs(decodeURIComponent(phrase)) === 0){
						phrase = '';
					}
					stdParams.q = staticSearchPhrasePrefix ? staticSearchPhrasePrefix + ' ' + phrase : phrase;
					coreParams = $.extend(stdParams, detailSearchParamExt);
				}
				if (coreParams){
					coreParams = Utils.getUrlParamsFromJson(coreParams);
					// extend core params cgi string with facet fields.
					$(facetFields).each(function(i){
						coreParams += '&facet.field=' + this;
					});
					coreParams += addParams;
					if (persistentStaticParams.length){
						$(persistentStaticParams).each(function(i){
							coreParams += '&' + this;
						});
					}
					return coreParams;
				}
				return null;
			},
			completeSearchProposalsParams: function(params, phrase, idx){
				var fqParams = this.defaultParams('extendedSearchPhraseParams'),
				staticParams = this.defaultParams('persistentStaticParams');
				if (fqParams && fqParams.fq){
					if (fqParams.fq.length){
						fqParams = fqParams.fq[idx];
					}
				}
				if (typeof params === 'string'){
					params = Utils.getUrlParamsAsJson(params);
				}
				delete params['facet.query'];
				params.q = '';//phrase.substring(0, phrase.lastIndexOf(' ') > -1 ? phrase.lastIndexOf(' ') : phrase.length);
				if (fqParams.length){
					params.fq = ['type:(' + fqParams.join(',') + ')'];
				}
				if (staticParams.length){
					$(staticParams).each(function(i){
						var parts = this.split('=');
						if (params[parts[0]]){
							if (!Utils.isArray(params[parts[0]])){
								params[parts[0]] = [params[parts[0]]];
							}
							if ($.inArray(parts[1], params[parts[0]]) === -1){
								params[parts[0]].push(parts[1]);
							}
						}
					});
				}
				return params;
			},
			facetParamsAsJson: function(facet){
				var i, fqs = this.defaultParams('standardParams', 'fq'), fq, realFqs = [],
				staticParams = this.defaultParams('persistentStaticParams');
				if (Utils.isObject(facet)){
					this.currentFacets = $.extend(this.currentFacets, facet);
				}else if (typeof facet === 'string' && this.currentFacets){
					delete this.currentFacets[facet];
					if (fqs){
						for (i = 0; i < fqs.length; i+=1){
							fq = fqs[i].split(':')[0];
							if (fq != facet){
								realFqs.push(fqs[i]);
							}
						}
					}
					if (staticParams.length){
						$(staticParams).each(function(i){
							var parts = this.split('=');
							if ($.inArray(parts[1], fqs) === -1) {
								realFqs.push(parts[1]);
							}
						});
					}
					this.defaultParams('standardParams', 'fq', realFqs);
				}
				if (this.SolrFacetAddOn){
					this.SolrFacetAddOn.currentFacets = this.currentFacets;
				}
				if (this.SolrFacetSelectboxFacetTeaserAddOn){
					this.SolrFacetSelectboxFacetTeaserAddOn.currentFacets = this.currentFacets;
				}
				if (this.SolrStaticFacetSelectboxFacetTeaserAddOn){
					this.SolrStaticFacetSelectboxFacetTeaserAddOn.currentFacets = this.currentFacets;
				}
				return this.currentFacets;
			},
			getFilterQuery: function(){
				var d = this.data, respHeader = d.responseHeader;
				if (respHeader.params && respHeader.params.fq){
					if (respHeader.params.fq){
						return respHeader.params.fq;
					}
				}
				return null;
			},
			getFacetQueryKeys: function(){
				var facetQuery = this.defaultParams('standardParams', 'facet.query'), i,
				keys = [], key;
				for (i = 0; i < facetQuery.length; i++){
					key = facetQuery[i].split(':')[0];
					if ($.inArray(key, keys) === -1){
						keys.push(key);
					}
				}
				return keys;
			},
			requestData: function(url, callback){
				var searchTransmitter = this.defaults.searchTransmitter, k, params;
				if (searchTransmitter && Utils.isObject(searchTransmitter)){
					if (!searchTransmitter.parent){
						searchTransmitter.parent = this;
					}
					searchTransmitter.requestData(url, callback);
				}else{
					url = decodeURIComponent(url);
					params = Utils.getUrlParamsAsJson(url);
					url = url.substring(0, url.indexOf('?')) + Utils.getUrlParamsFromJson(params);
					$.getJSON(url, callback);
				}
			},
			initItemsAndShow: function(items){
				var item;
				for (i = 0; i < items.length; i+=1){
					if (typeof this.defaults.productProposalItem === 'object'){
						item = this.defaults.productProposalItem.create();
					}else{
						item = window.llsolr[this.defaults.productProposalItem].create();
					}
					item.id = i;
					item.parent = this;
					item.data = items[i];
					item.make();
					this.proposalItems.items.push(item);
				}
			},
			handleSearchPhraseProposals: function(phrase){
				var params = this.getQueryParams('searchProposals', phrase), opts = this.defaults,
				url, i, j, itemTitle, target = null, reqCnt = -1, ajaxOnTheWay = 0, idx,
				spp = this.searchPhraseProposals, handleRequestData, self = this, items = [],
				ItemTitleClass = self.defaultParams('searchPhraseTitleItem'), xloop,
				fqParams = this.defaultParams('extendedSearchPhraseParams');
				if (typeof fqParams.fq === 'object'){
					fqParams = fqParams.fq;
				}else{
					fqParams = '--';
				}
				spp.removeAttr('style');
				if (params){
					this.proposalItems.current = 0;
					this.proposalItems.items = [];
					$('#llsolr-searchPhraseProposalsScrollPane').empty();
					if (fqParams.length > 1){
						for (i = 0; i < fqParams.length; i+=2) {
							itemTitle = ItemTitleClass.create(fqParams[i], i);
							itemTitle.make();
							items.push(itemTitle);
							items.push([]);
							reqCnt+=2;
						}
					}else{
						items.push([]);
					}
					xloop = function(items, j){
						handleRequestData = function(data, textStatus){
							var ItemClass = self.defaultParams('searchPhraseProposalItem'),
							searchTextSnippet, item, proposal, proposals, k, count;
							if (self.keyCnt == (data.responseHeader.params.keyCnt * 1)){
								ajaxOnTheWay--;
								self.data = data;
								spp.find('.title').html($.lang('searchPhraseProposalTitle'));
								if (data.facet_counts.facet_fields.textpropose.length > 0){
									proposals = data.facet_counts.facet_fields.textpropose;
									searchTextSnippet = '';
									if (phrase.search(' ') > -1){
										searchTextSnippet = phrase.substring(0, phrase.lastIndexOf(' ')) + ' ';
									}
									for (k in proposals){
										k = parseInt(k, 10);
										if (k % 2 == 1){continue;}
										proposal = searchTextSnippet + proposals[k];
										count = null;
										if (self.defaultParams('showSearchPhraseProposalCount')){
											count = proposals[k+1];
										}
										if (typeof ItemClass === 'object'){
											item = ItemClass.create(proposal, count, self.phrase);
										}else{
											item = window.llsolr[ItemClass].create();
										}
										item.id = k / 2;
										item.parent = self;
										if (reqCnt > -1){
											item.target = items[j].getTarget();
											items[j+1].push(item);
										}else{
											items[0].push(item);
										}
									}
								}else{
									self.proposalItems.current = 0;
								}
							}
						};
					};
					for (j = 0; j < items.length; j+=2) {
						idx = fqParams.length == 1 ? 0 : j + 1;
						params = this.completeSearchProposalsParams(params, phrase, idx);
						params.reqCnt = reqCnt;
						url = AjaxURLManager.getUrlWithKey(opts.detailSearchAjaxHandler) +
							decodeURIComponent(Utils.getUrlParamsFromJson(params));
						xloop(items, j, reqCnt);
						this.requestData(url, handleRequestData);
						ajaxOnTheWay++;
					}
					Utils.busyWait(
						function(intervalObj){
							if (ajaxOnTheWay < 1){
								return true;
							}
							return false;
						},
						100,
						1000,
						function(intervalObj){
							var i, item;
							self.proposalItems.items.push(opts.searchPhraseOuterTarget.find('input[type=text]'));
							for (i = 0; i < items.length; i++) {
								item = items[i];
								if (Utils.isArray(item)){
									for (j = 0; j < item.length; j++) {
										self.proposalItems.items.push(item[j]);
										if (item[j].instanceOf && item[j].instanceOf(llsolr.SolrSearchPhraseProposalsItem)){
											item[j].make();
										}
									}
								}else{
									self.proposalItems.items.push(item);
								}
							}
						}
					);
				}else{
					spp.hide('fast');
					self.proposalItems.items = [];
					$('#llsolr-searchPhraseProposalsScrollPane').empty();
				}
			},
			handleProductProposals: function(phrase, params){
				var opts = this.defaults, url, self = this, facetParams, realParams, isFacetQueryKey,
				facetQueryKeys = this.getFacetQueryKeys(), start, rows, numFound, pObj, k, i, key,
				handleRequestData, beforeSearchCallback = this.defaults.onBeforeSearchResult, idx = '',
				srTarId;
				if (this.defaults.searchDetailTarget.length){
					srTarId = this.defaults.searchDetailTarget.attr('id');
					try{
						if (srTarId.lastIndexOf('_') > -1){
							idx = srTarId.substring(srTarId.lastIndexOf('_'), srTarId.length);
						}
						if (phrase || phrase === ''){
							if (!phrase){
								this.phrase = phrase = '*';
							}else{
								this.phrase = phrase = decodeURIComponent(phrase);
							}
							if (beforeSearchCallback && Utils.isFunction(beforeSearchCallback)){
								beforeSearchCallback.call(this);
							}
							if (! params){
								facetParams = this.facetParamsAsJson();
								realParams = {'fq': []};
								for (k in facetParams){
									isFacetQueryKey = false;
									for (i = 0; i < facetQueryKeys.length; i++){
										key = facetQueryKeys[i];
										if (k.search(key) !== -1){
											isFacetQueryKey = true;
											break;
										}
									}
									if (isFacetQueryKey){
										realParams.fq.push(k);
									}else{
										realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
									}
								}
								params = this.getQueryParams('productProposals', phrase, realParams);
							}
							if (params){
								url = AjaxURLManager.getUrlWithKey(opts.detailSearchAjaxHandler) + params;
								url = decodeURIComponent(url);
								this.proposalItems.current = 0;
								this.proposalItems.items = [$('#productSearchFieldImage').find(':input')];
								handleRequestData = function(data, textStatus){
									var cb = self.defaults.onSearchResult, i, pagerCallback, pagerData, currentPage, docs;
									self.data = data;
									if (cb && Utils.isFunction(cb)){
										cb.call(self);
									}
									for (i = 0; i < self.addOns.length; i+=1){
										self.addOns[i].update();
									}
									$('#llsolr-productSearchProposals' + idx).find('.titleInner').html($.lang('productProposalTitle'));
									$('#llsolr-productSearchProposals' + idx).find('.title .searchInfo').html(self.makeSearchSummaryLayout());
									$('#llsolr-productSearchProposalsScrollPane' + idx).empty();
									if (data.response.docs.length){
										docs = data.response.docs;
										self.initItemsAndShow(docs);
									}
									pagerCallback = function(page){
										var p, facetQueryKeys = self.getFacetQueryKeys(), facetParams, realParams, params;
										p = page;
										facetParams = self.facetParamsAsJson();
										realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
										realParams = $.extend(realParams, {'start': (p-1) * data.responseHeader.params.rows});
										params = self.getQueryParams('productProposals', phrase, realParams);
										self.handleProductProposals(phrase, params);
									};
									pagerData = {
										frameWidth: self.defaults.pagerFrameWidth,
										callback: pagerCallback
									};
									if (opts.pagerTopTarget){
										Pager1 = PagerElement.create($.extend({target: opts.pagerTopTarget}, pagerData));
									}
									pagerData.target = opts.pagerBottomTarget;
									if (opts.pagerBottomTarget){
										Pager2 = PagerElement.create($.extend({target: opts.pagerTopTarget}, pagerData));
									}
									start = data.response.start;
									rows = data.responseHeader.params.rows;
									numFound = data.response.numFound;
									currentPage = start / rows + 1;
									pObj = {
										pager:{
											currentPage: currentPage,
											overall: numFound,
											offset: rows
										}
									};
									if (opts.pagerTopTarget){Pager1.update(pObj);}
									if (opts.pagerBottomTarget){Pager2.update(pObj);}
								};
								this.requestData(url, handleRequestData);
							}else{
								$('#llsolr-productSearchProposalsScrollPane' + idx).empty();
							}
						}
					}catch(e){
						if (window.console && window.console.error){
							console.error('Exception: SolrSearchEmbeddingKit.handleProductProposals', e);
						}
					}
				}else{
					if (phrase || phrase === ''){
						this.phrase = phrase;
						if (beforeSearchCallback && Utils.isFunction(beforeSearchCallback)){
							beforeSearchCallback.call(this);
						}
						if (! params){
							facetParams = this.facetParamsAsJson();
							realParams = {'fq': []};
							for (k in facetParams){
								isFacetQueryKey = false;
								for (i = 0; i < facetQueryKeys.length; i++){
									key = facetQueryKeys[i];
									if (k.search(key) !== -1){
										isFacetQueryKey = true;
										break;
									}
								}
								if (isFacetQueryKey){
									realParams.fq.push(k);
								}else{
									realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
								}
							}
							params = this.getQueryParams('productProposals', phrase, realParams);
						}
						if (params){
							url = AjaxURLManager.getUrlWithKey(opts.detailSearchAjaxHandler) + params;
							url = decodeURIComponent(url);
							this.proposalItems.current = 0;
							this.proposalItems.items = [$('#productSearchFieldImage').find(':input')];
							handleRequestData = function(data, textStatus){
								var cb = self.defaults.onSearchResult, i, pagerCallback, pagerData, currentPage, docs;
								self.data = data;
								if (cb && Utils.isFunction(cb)){
									cb.call(self);
								}
								for (i = 0; i < self.addOns.length; i+=1){
									self.addOns[i].update();
								}
								$('#llsolr-productSearchProposals' + idx).find('.titleInner').html($.lang('productProposalTitle'));
								$('#llsolr-productSearchProposals' + idx).find('.title .searchInfo').html(self.makeSearchSummaryLayout());
								$('#llsolr-productSearchProposalsScrollPane' + idx).empty();
								if (data.response.docs.length){
									docs = data.response.docs;
									self.initItemsAndShow(docs);
								}
								pagerCallback = function(page){
									var p, facetQueryKeys = self.getFacetQueryKeys(), facetParams, realParams, params;
									p = page;
									facetParams = self.facetParamsAsJson();
									realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
									realParams = $.extend(realParams, {'start': (p-1) * data.responseHeader.params.rows});
									params = self.getQueryParams('productProposals', phrase, realParams);
									self.handleProductProposals(phrase, params);
								};
								pagerData = {
									frameWidth: self.defaults.pagerFrameWidth,
									callback: pagerCallback
								};
								if (opts.pagerTopTarget){
									Pager1 = PagerElement.create($.extend({target: opts.pagerTopTarget}, pagerData));
								}
								pagerData.target = opts.pagerBottomTarget;
								if (opts.pagerBottomTarget){
									Pager2 = PagerElement.create($.extend({target: opts.pagerTopTarget}, pagerData));
								}
								start = data.response.start;
								rows = data.responseHeader.params.rows;
								numFound = data.response.numFound;
								currentPage = start / rows + 1;
								pObj = {
									pager:{
										currentPage: currentPage,
										overall: numFound,
										offset: rows
									}
								};
								if (opts.pagerTopTarget){Pager1.update(pObj);}
								if (opts.pagerBottomTarget){Pager2.update(pObj);}
							};
							this.requestData(url, handleRequestData);
						}else{
							$('#llsolr-productSearchProposalsScrollPane' + idx).empty();
						}
					}
				}
				return phrase;
			},
			removeProposalsHoverEffect: function(){
				$(this.proposalItems.items).each(function(i){
					if (i > 0){
						this.domel.removeClass('searchProposalItemHover');
					}
				});
			},
			completePhrase: function(){
				var opts = this.defaults, field = opts.searchPhraseOuterTarget.find('input[type=text]'),
				proposal = this.proposalItems.items[this.proposalItems.current];
				field.val(proposal.proposal);
			},
			completePhraseAndSetFocusToInput: function(proposal){
				var opts = this.defaults, field = opts.searchPhraseOuterTarget.find('input[type=text]'), currentPhrase,
				spp = this.searchPhraseProposals;
				if (proposal){
					field.val(proposal);
					field.focus();
				}else{
					currentPhrase = $.trim(field.val());
					proposal = this.proposalItems.items[this.proposalItems.current];
					if (typeof proposal !== 'undefined'){
						field.val(proposal.proposal);
					}
				}
				this.proposalItems.current = 0;
				spp.hide('fast');
			},
			fire: function(){
				var opts = this.defaults, field = opts.searchPhraseOuterTarget.find('input[type=text]'),
				sessId = '', tabbar, params = {};
				if (Utils.getXist4cSessionId()){
					sessId = Utils.getXist4cSessionId({
							returnWithPrefix: true
					});
				}
				if (this.gardenDefaults){
					if (this.gardenDefaults.mode == 'tabbed'){
						tabbar = this.gardenDefaults.modeViewTarget;
						params.tidx = tabbar.tabs("option", "selected");
					}
				}
				params.phrase = this.preprocessPhrase($.trim(field.val()));
				window.location.href = [
					opts.searchDetailUrl,
					sessId,
					Utils.getUrlParamsFromJson(params)
				].join('');
			},
			handleKeyPress: function(e){
				e.stopPropagation();
				var pItems = this.proposalItems, current, spp = this.searchPhraseProposals, i;
				if (e.keyCode === 13 || e.type === 'click'){ // if return key
					//this.completePhraseAndSetFocusToInput();
					spp.hide('fast');
					this.fire();
				}else if (e.keyCode === 38 || e.keyCode === 40){ // if up or down cursor key
					this.removeProposalsHoverEffect();
					if (e.keyCode === 38){
						if (pItems.current > 0){
							current = pItems.current -= 1;
						}else{
							current = pItems.items.length -1;
							pItems.current = current;
						}
					}else{
						if (pItems.current < pItems.items.length -1){
							current = pItems.current +=1;
						}else{
							current = 0;
							pItems.current = current;
						}
					}
					if (current > 0){
						if (pItems.items[current].instanceOf && pItems.items[current].instanceOf(llsolr.SolrSearchPhraseProposalsItem)){
							pItems.items[current].domel.addClass('searchProposalItemHover');
						}else{
							while (pItems.items[current].instanceOf && pItems.items[current].instanceOf(llsolr.SolrSearchPhraseTitleItem)){
								current = pItems.current +=1;
							}
							pItems.items[current].domel.addClass('searchProposalItemHover');
						}
					}else{
						pItems.items[0].focus();
					}
					this.completePhrase();
				}else if(e.keyCode === 27){ // if escape key
					spp.hide('fast');
				}
			},
			make: function(){
				this.prepareSearchElement();
			},
			makeDetail: function(){
				var phrase = null, params = Utils.getUrlParamsAsJson(), validParams = [], i, j, k, facets, facetQuerys, tmp,
				queryParams = Utils.getUrlParamsAsJson(this.getQueryParams('productProposals', '')), facet, realParams = {},
				isValid, target = this.defaultParams('searchDetailTarget');
				try {
					if (target.length){
						if (params && typeof(params.phrase) !== 'undefined'){
							phrase = this.preprocessPhrase(decodeURIComponent(params.phrase));
							if (this.defaults.searchPhraseOuterTarget.length){
								this.defaults.searchPhraseOuterTarget.find('input[type=text]').css({
									backgroundImage: 'none'
								}).val(phrase);
							}
						}else{
							phrase = '';
						}
						if (params && params.searchTrigger){
							facets = queryParams['facet.field'];
							facetQuerys = queryParams['facet.query'];
							facetDates = queryParams['facet.date'];
							for (i = 0; i < facets.length; i++){
								facet = facets[i];
								if ($.inArray(facet, validParams) === -1){
									validParams.push(facet);
								}
							}
							for (j = 0; j < facetQuerys.length; j++){
								facet = decodeURIComponent(facetQuerys[i]).split(':')[0];
								if ($.inArray(facet, validParams) === -1){
									validParams.push(facet);
								}
							}
							for (k in params){
								isValid = false;
								for (i = 0; i < validParams.length; i++){
									if (k.search(validParams[i]) > -1){
										isValid = true;
										break;
									}
								}
								if (isValid){
									if (typeof(realParams[k]) === 'undefined'){
										realParams[k] = params[k];
									}else{
										if (realParams[k] && Utils.isArray(realParams[k])){
											realParams[k].push(params[k]);
										}else if (realParams[k] && !Utils.isArray(realParams[k])){
											tmp = realParams[k];
											realParams[k] = [tmp];
											realParams[k].push(params[k]);
										}
									}
								}
							}
							this.facetParamsAsJson(realParams);
						}
						target.append(this.makeProductProposalPaneLayout());
						this.handleProductProposals(phrase);
					}
				}catch(e){
					if (window.console && window.console.error){
						console.error('Exception: SolrSearchEmbeddingKit.makeDetail', e);
					}
				}
			}
		}
	);

	llsolr.SolrSearchPhraseProposalsItem = $.extend(
		$.clone(LLObject),
		{
			create: function(proposal, count, phrase){
				var o = LLObject.create.call(this);
				o.id = null;
				o.parent = null;
				o.target = $('#llsolr-searchPhraseProposalsScrollPane');
				o.proposal = proposal;
				o.domel = null;
				o.count = count;
				o.phrase = phrase;
				return o;
			},
			changeProposalFirstLetterCase: function(){
				var fl = this.proposal.substring(0, 1);
				var rest = this.proposal.substring(1, this.proposal.length);
				if (isNaN(fl)){
					fl = fl.toUpperCase();
				}
				return fl + rest;
			},
			makeItemLayout: function(){
				var lay = $(
					'<div class="proposalItem searchProposalItem">' +
						'<div class="viewport"><div class="count"></div></div>' +
						'<div class="proposal"></div>' +
					'</div>'
				), count;
				lay.find('.proposal').text(this.changeProposalFirstLetterCase());
				if (this.count){
					lay.find('.count').text('(' + this.count + ')');
				}
				lay.hover(
					function(){
						$(this).addClass('searchProposalItemHover');
					},
					function(){
						$(this).removeClass('searchProposalItemHover');
					}
				);
				var self = this;
				lay.bind('click', function(e){
					self.parent.proposalItems.current = self.id;
					self.parent.completePhraseAndSetFocusToInput(self.proposal);
					self.parent.fire();
				});
				return lay;
			},
			make: function(){
				var item = this.makeItemLayout();
				this.domel = item;
				if (this.target && this.target.length){
					this.target.append(item);
				}
			}
		}
	);

	llsolr.SolrSearchPhraseTitleItem = $.extend(
		$.clone(LLObject),
		{
			create: function(title, id){
				var o = LLObject.create.call(this);
				o.id = null;
				o.parent = null;
				o.domel = null;
				o.title = title || null;
				o.id = id;
				return o;
			},
			makeItemLayout: function(){
				if (this.title){
					return $(
						'<div class="proposalTitleItemsShell proposalTitleItemsShell_' + this.id + '">' +
							'<div class="titleItem searchTextItem">' +
								'<div class="text">' + this.title + '</div>' +
							'</div>' +
						'</div>'
					);
				}
				return $('<div/>');
			},
			getTarget: function(){
				return $('.proposalTitleItemsShell_' + this.id);
			},
			make: function(){
				var item = this.makeItemLayout();
				this.domel = item;
				$('#llsolr-searchPhraseProposalsScrollPane').append(item);
			}
		}
	);

	llsolr.SolrProductProposalsItem = $.extend(
		$.clone(LLObject),
		{
			create: function(){
				var o = LLObject.create.call(this);
				o.id = null;
				o.parent = null;
				o.data = null;
				o.domel = null;
				o.descAttrs = [
					'art_beschreibung_s_tg'
				];
				return o;
			},
			getDescription: function(){
				var str = '', realText, self = this;
				$(this.descAttrs).each(function(i){
					if (typeof self.data[this] !== 'undefined'){
						realText = self.data[this];
						if (realText.indexOf('_') === 0 || realText.indexOf('_') == 7){
							realText = realText.substring(realText.indexOf('_') + 1, realText.length);
						}
						str += realText + ', ';
					}
				});
				if (str.length > 0){
					return str.substring(0, str.length -2);
				}
				return str;
			},
			makeItemLayout: function(){
				var img = '', d = this.data, lay;
				if (this.data.img_src){
					iattrs = {
						src: d.img_src,
						width: d.img_width,
						height: d.img_height,
						border: 0
					};
					img = $('<img/>').attr(iattrs);
				}
				lay = $(
					'<div class="proposalItem productProposalItem">' +
						'<div class="proposal">' +
							'<div class="image"></div>' +
							'<div class="textOuter">' +
								'<h1 class="headline">' + d.art_bezeichnung_s_tg + '</h1>' +
								'<p class="desc">' + this.getDescription() + '</p>' +
							'</div>' +
							'<div class="floatTerm"></div>' +
						'</div>' +
					'</div>'
				);
				lay.find('.image').append(img);
				lay.hover(
					function(){
						$(this).addClass('productProposalItemHover');
					},
					function(){
						$(this).removeClass('productProposalItemHover');
					}
				);
				lay.bind('click', function(){
					var sessId = '', href = d.link, params = Utils.getUrlParamsAsJson(d.link);
					if (params){
						href = d.link.substring(0, d.link.indexOf('?'));
					}
					if (Utils.getXist4cSessionId()){
						sessId = Utils.getXist4cSessionId({
							returnWithPrefix: true
						});
					}
					window.location.href = href + sessId + (Utils.getUrlParamsFromJson(params) || '');
				});
				return lay;
			},
			make: function(){
				var item = this.makeItemLayout(), idx = '', srTarId = this.parent.defaults.searchDetailTarget.attr('id');
				if (srTarId && srTarId.lastIndexOf('_') > -1){
					idx = srTarId.substring(srTarId.lastIndexOf('_'), srTarId.length);
				}
				this.domel = item;
				$('#llsolr-productSearchProposalsScrollPane' + idx).append(item);
			}
		}
	);


	llsolr.SolrAddOn = $.extend(
		$.clone(LLObject),
		{
			create: function(opts){
				var o = LLObject.create.call(this);
				o.parent = null;
				o.domel = null;
				o.defaults = {
					target: null,
					usedPanelClass: llsolr.SolrProductFacetPanel,
					usedItemClass: llsolr.SolrProductFacetPanelItem,
					usedBackItemClass: llsolr.SolrProductFacetPanelBackItem
				};
				if(Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				return o;
			}
		}
	);

	llsolr.SolrFacetAddOn = $.extend(
		$.clone(llsolr.SolrAddOn),
		{
			create: function(opts){
				var o;
				if (!opts){
					opts = {};
				}
				if (!opts.priceBuckets){
					opts.priceBuckets = true;
				}
				if (!opts.priceBucketsCurrency){
					opts.priceBucketsCurrency = 'EUR';
				}
				o = llsolr.SolrAddOn.create.call(this, opts);
				o.currentFacets = null;
				o.cnt = 0;
				o.iCnt = 0;
				o.facets = [];
				o.facetQueryPartsRegister = {};
				if(Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				$.lang('solrFacetAddOn_upto', {
					de: 'Bis ',
					en: 'Up to '
				});
				$.lang('solrFacetAddOn_over', {
					de: '&Uuml;ber ',
					en: 'Over '
				});
				return o;
			},
			parseFacetQueryExpressionByType: function(type, expr, count){
				var exprGrp = [], exprParts, rexOR = /\sOR\s/, rexAND = /\sAND\s/, rexTO = /\sTO\s/, mode = 0, i,
				curr = this.defaults.priceBucketsCurrency;
				if (rexOR.test(expr)){
					mode = 1;
					exprGrp = expr.split(rexOR);
				}else if (rexAND.test(expr)){
					mode = 2;
					exprGrp = expr.split(rexAND);
				}else{
					exprGrp.push(expr);
				}
				for (i = 0; i < exprGrp.length; i+=1){
					expr = exprGrp[i];
					exprParts = expr.substring(1, expr.length -1).split(rexTO);
					if (type == 'priceBuckets'){
						return {
							from: (parseFloat(exprParts[0]).toFixed(2) + '').replace(/\./, ','),
							to: (parseFloat(exprParts[1]).toFixed(2) + '').replace(/\./, ','),
							currency: curr,
							rawExpr: expr,
							count: count
						};
					}
				}
				return null;
			},
			registerFacetQueryPartsByType: function(type, key, name){
				var fq = this.parent.data.facet_counts.facet_queries, k,
				fqr, expr, count;
				fqr = this.facetQueryPartsRegister = {};
				for (k in fq){
					count = fq[k];
					if (!fqr[type]){
						fqr[type] = {
							key: key,
							name: name,
							items: []
						};
					}
					if (k.search(key) > -1){
						expr = this.parseFacetQueryExpressionByType(type, k.split(':')[1], count);
						if (expr){
							fqr[type].items.push(expr);
						}
					}
				}
			},
			getFacetQueryPartsKeyList: function(){
				var k, list = [], parts = this.facetQueryPartsRegister;
				for (k in parts){
					list.push(parts[k].key);
				}
				return list;
			},
			searchFacetKeys: function(data){
				var i, searchFacets =
				(data.responseHeader && data.responseHeader.params.fq) ? data.responseHeader.params.fq : [],
				searchFacet = [];
				if (searchFacets){
					if (typeof searchFacets !== 'string'){
						for (i = 0; i < searchFacets.length; i+=1){
							searchFacet.push(searchFacets[i].split(':')[0]);
						}
					}else{
						searchFacet.push(searchFacets.split(':')[0]);
					}
				}
				return searchFacet;
			},
			clearFacets: function(){
				this.facets = [];
			},
			add: function(key, pTitle, linkedPanels, useClass){
				var opts = this.defaults, d = this.parent.data, panel, target = opts.target,
				count, item, i, facet, searchFacets = this.searchFacetKeys(d),
				facets = d.facet_counts.facet_fields || null,
				panelClass = opts.usedPanelClass,
				itemClass = opts.usedItemClass,
				backItemClass = opts.usedBackItemClass;
				if (Utils.isObject(useClass)){
					if (useClass.usedPanelClass){
						panelClass = useClass.usedPanelClass;
					}
					if (useClass.usedItemClass){
						itemClass = useClass.usedItemClass;
					}
					if (useClass.usedBackItemClass){
						backItemClass = useClass.usedBackItemClass;
					}
				}
				this.domel = target;
				if (facets){
					facet = facets[key];
					panel = panelClass.create();
					panel.target = target;
					panel.parent = this;
					panel.id = this.cnt;
					panel.domId = 'facetPanel_' + this.cnt;
					panel.title = pTitle;
					panel.realTitle = key;
					panel.key = key;
					panel.linkedPanels = linkedPanels || [];
					if ($.inArray(key, searchFacets) > -1){
						item = backItemClass.create();
						item.id = -1;
						item.parent = panel;
						item.phrase = this.parent.phrase;
						item.domId = 'facetPanelItem_' + this.cnt + '-1';
						item.title = $.lang('searchFacetPanelItemBack');
						item.count = count;
						item.attributeName = key;
						panel.items.push(item);
					}
					for (i = 0; i < facet.length; i+=1){
						if (i % 2 == 1){
							this.iCnt++;
							continue;
						}
						title = realTitle = facet[i];
						if (realTitle.indexOf('_') === 0 || realTitle.indexOf('_') == 7){
							title = realTitle.substring(realTitle.indexOf('_') + 1, realTitle.length);
						}
						count = facet[i+1];
						item = itemClass.create();
						item.id = this.iCnt;
						item.parent = panel;
						item.phrase = this.parent.phrase;
						item.domId = 'facetPanelItem_' + this.iCnt;
						item.title = title;
						item.realTitle = realTitle;
						item.count = count;
						item.attributeName = key;
						if (panel.items.length && panel.items[panel.items.length - 1].instanceOf(backItemClass)){
							panel.selectedItems = [item];
						}else{
							panel.selectedItems = [];
						}
						panel.items.push(item);
					}
					this.cnt++;
					this.facets.push(panel);
				}
			},
			// todo: >>>
			addMulti: function(key, pTitle, linkedPanels){
				var opts = this.defaults, d = this.parent.data, panel, target = opts.target,
				count, item, i, facets, facet, searchFacets = this.searchFacetKeys(d);
				facets = d.facet_counts.facet_fields || null;
				if (facets){
					facet = facets[key];
					panel = llsolr.SolrProductFacetPanel.create();
					panel.target = target;
					panel.parent = this;
					panel.id = this.cnt;
					panel.domId = 'facetPanel_' + this.cnt;
					panel.title = pTitle;
					panel.realTitle = key;
					panel.key = key;
					panel.linkedPanels = linkedPanels || [];
					// if ($.inArray(key, searchFacets) > -1){
					// }
					for (i = 0; i < facet.length; i+=1){
						if (i % 2 === 1){
							this.iCnt++;
							continue;
						}
						title = realTitle = facet[i];
						if (realTitle.indexOf('_') === 0 || realTitle.indexOf('_') == 7){
							title = realTitle.substring(realTitle.indexOf('_') + 1, realTitle.length);
						}
						count = facet[i+1];
						item = llsolr.SolrProductFacetPanelItem.create();
						item.id = this.iCnt;
						item.parent = panel;
						item.phrase = this.parent.phrase;
						item.domId = 'facetPanelItem_' + this.iCnt;
						item.title = title;
						item.realTitle = realTitle;
						item.count = count;
						item.attributeName = key;
						if (panel.items.length && panel.items[panel.items.length - 1].instanceOf(llsolr.SolrProductFacetPanelBackItem)){
							panel.selectedItems = [item];
						}else{
							panel.selectedItems = [];
						}
						panel.items.push(item);
					}
					this.cnt++;
					this.facets.push(panel);
				}
			},
			addDates: function(key, pTitle, linkedPanels, useClass){
				var opts = this.defaults, d = this.parent.data, panel, k, target = opts.target,
				count, item, facet, searchFacets = this.searchFacetKeys(d),
				facets = d.facet_counts.facet_dates || null,
				panelClass = opts.usedPanelClass,
				itemClass = opts.usedItemClass,
				backItemClass = opts.usedBackItemClass;
				if (Utils.isObject(useClass)){
					if (useClass.usedPanelClass){
						panelClass = useClass.usedPanelClass;
					}
					if (useClass.usedItemClass){
						itemClass = useClass.usedItemClass;
					}else{
						itemClass = llsolr.SolrProductFacetPanelDateItem;
					}
					if (useClass.usedBackItemClass){
						backItemClass = useClass.usedBackItemClass;
					}
				}
				this.domel = target;
				if (facets){
					facet = facets[key];
					panel = panelClass.create();
					panel.target = target;
					panel.parent = this;
					panel.id = this.cnt;
					panel.domId = 'facetPanel_' + this.cnt;
					panel.title = pTitle;
					panel.realTitle = key;
					panel.key = key;
					panel.linkedPanels = linkedPanels || [];
					if ($.inArray(key, searchFacets) > -1){
						item = backItemClass.create();
						item.id = -1;
						item.parent = panel;
						item.phrase = this.parent.phrase;
						item.domId = 'facetPanelItem_' + this.cnt + '-1';
						item.title = $.lang('searchFacetPanelItemBack');
						item.count = -1;
						item.attributeName = key;
						panel.items.push(item);
					}
					for (k in facet){
						if (!isNaN(parseInt(k, 10)) && facet[k] > 0){
							title = realTitle = k;
							if (realTitle.indexOf('_') === 0 || realTitle.indexOf('_') == 7){
								title = realTitle.substring(realTitle.indexOf('_') + 1, realTitle.length);
							}
							title = realTitle.split('-')[0];
							this.iCnt++;
							count = facet[k];
							item = itemClass.create();
							item.id = this.iCnt;
							item.parent = panel;
							item.phrase = this.parent.phrase;
							item.domId = 'facetPanelItem_' + this.iCnt;
							item.title = title;
							item.realTitle = realTitle;
							item.count = count;
							item.attributeName = key;
							if (panel.items.length && panel.items[panel.items.length - 1].instanceOf(backItemClass)){
								panel.selectedItems = [item];
							}else{
								panel.selectedItems = [];
							}
							panel.items.push(item);
						}
					}
					this.cnt++;
					this.facets.push(panel);
				}
			},
			handleFacetQuery: function(){
				var opts = this.defaults, panel, target = opts.target,
				i, facet, count, fromVal, toVal, item,
				priceBuckets = this.facetQueryPartsRegister.priceBuckets, phrase = this.parent.phrase,
				currFacet, fq, noLinkedPanelsHandling;
				if (opts.priceBuckets && priceBuckets){
					this.cnt++;
					panel = llsolr.SolrProductFacetPanel.create();
					panel.target = target;
					panel.parent = this;
					panel.id = this.cnt;
					panel.domId = 'facetPanel_' + this.cnt;
					panel.title = priceBuckets.name;
					fq = this.parent.getFilterQuery();
					if (fq){
						if (Utils.isArray(fq)){
							for (i = 0; i < fq.length; i+=1){
								if (fq[i].search(priceBuckets.key) > -1){
									currFacet = fq[i];
								}
							}
						}else{
							if (fq.search(priceBuckets.key) > -1){
								currFacet = fq;
							}
						}
					}else{
						currFacet = null;
					}
					if (!currFacet){
						for (i = 0; i < priceBuckets.items.length; i++){
							facet = priceBuckets.items[i];
							if (facet.count){
								if (facet.from == 'NaN'){
									toVal = $.lang('solrFacetAddOn_upto') + facet.to;
									fromVal = '';
								}else if (facet.to == 'NaN'){
									fromVal = $.lang('solrFacetAddOn_over') + facet.from;
									toVal = '';
								}else{
									fromVal = facet.from + ' - ';
									toVal = facet.to;
								}
								count = facet.count;
								this.iCnt++;
								item = llsolr.SolrProductFacetPanelPriceBucketItem.create();
								item.id = this.iCnt;
								item.parent = panel;
								item.phrase = phrase;
								item.domId = 'facetPanelItem_' + this.iCnt;
								item.title = [fromVal,toVal,' ',facet.currency].join('');
								item.realTitle = priceBuckets.key + ':' + facet.rawExpr;
								item.count = count;
								item.attributeName = priceBuckets.key + ':' + facet.rawExpr;
								panel.items.push(item);
							}
						}
					}else{
						item = llsolr.SolrProductFacetPanelBackItem.create();
						item.id = -1;
						item.parent = panel;
						item.phrase = phrase;
						item.domId = 'facetPanelItem_' + this.cnt + '-1';
						item.title = $.lang('searchFacetPanelItemBack');
						item.count = count;
						item.attributeName = currFacet;
						item.key = priceBuckets.key;
						panel.items.push(item);
						this.iCnt++;
						item = llsolr.SolrProductFacetPanelCustomerPriceBucketItem.create();
						item.id = this.iCnt;
						item.parent = panel;
						item.phrase = phrase;
						item.domId = 'facetPanelItem_' + this.iCnt;
						facet = this.parseFacetQueryExpressionByType('priceBuckets', currFacet.split(':')[1], '1');
						if (facet){
							item.realTitle = priceBuckets.key + ':' + facet.rawExpr;
							item.key = priceBuckets.key;
							item.facetData = facet;
							item.attributeName = priceBuckets.key + ':' + facet.rawExpr;
							panel.items.push(item);
						}
					}
					panel.make(noLinkedPanelsHandling = true);
				}
			},
			update: function(phrase){
				var i, target = this.defaults.target;
				this.parent.SolrFacetAddOn = this;
				target.empty();
				for (i = 0; i < this.facets.length; i+=1){
					this.facets[i].make();
				}
				this.handleFacetQuery();
			}
		}
	);

	llsolr.SolrProductPanel = $.extend(
		$.clone(LLObject),
		{
			create: function(){
				var o = LLObject.create.call(this);
				o.target = null;
				o.parent = null;
				o.id = null;
				o.domId = null;
				o.domel = null;
				o.title = null;
				o.realTitle = null;
				o.items = [];
				return o;
			},
			makePanelLayout: function(){
				var lay = $(
					'<div id="' + this.domId + '" class="llsolr-facetPanel"></div>'
				);
				return lay;
			},
			makeTitleLayout: function(){
				return $(
					'<div class="facetPanelTitle">' +
						'<span>' + this.title + '</span>' +
					'</div>'
				);
			},
			appendPanelItems: function(panel){
				$(this.items).each(function(i){
					var domel;
					domel = this.make();
					panel.append(domel);
					this.domel = domel;
				});
			},
			make: function(){
				var panel = this.makePanelLayout(), i, p;
				if (this.title){
					panel.append(this.makeTitleLayout());
				}
				this.appendPanelItems(panel);
				this.target.append(panel);
				this.domel = panel;
			}
		}
	);

	llsolr.SolrProductPanelItem = $.extend(
		$.clone(LLObject),
		{
			create: function(){
				var o = LLObject.create.call(this);
				o.id = null;
				o.panel = null;
				o.parent = null;
				o.phrase = null;
				o.domId = null;
				o.domel = null;
				o.title = null;
				o.href = null;
				o.realTitle = null;
				return o;
			},
			makeItemLayout: function(){
				var lay;
				lay = $(
					'<a href="' + this.href + '" id="' + this.domId + '" class="facetItem">' +
						'<span class="title">' + this.title + '</span>' +
					'</a>'
				);
				return lay;
			},
			make: function(){
				var item = this.makeItemLayout();
				this.domel = item;
				return item;
			}
		}
	);

	llsolr.SolrProductFacetPanel = $.extend(
		$.clone(llsolr.SolrProductPanel),
		{
			create: function(){
				var o = llsolr.SolrProductPanel.create.call(this);
				o.selectedItems = [];
				o.linkedPanels = [];
				o.key = null;
				return o;
			},
			make: function(noLinkedPanelsHandling){
				var panel = this.makePanelLayout(), i, panels = this.parent.facets, p;
				panel.append(this.makeTitleLayout());
				this.appendPanelItems(panel);
				for (i = 0; i < panels.length; i+=1){
					p = panels[i];
					if (!noLinkedPanelsHandling){
						if (p !== this && $.inArray(this.realTitle, p.linkedPanels) > -1 && !p.selectedItems.length){
							panel.hide();
							break;
						}else{
							panel.show();
						}
					}
				}
				this.target.append(panel);
				this.domel = panel;
			}
		}
	);

	llsolr.SolrProductFacetPanelItem = $.extend(
		$.clone(llsolr.SolrProductPanelItem),
		{
			create: function(){
				var o = llsolr.SolrProductPanelItem.create.call(this);
				o.count = null;
				o.attributeName = null;
				o.key = null;
				return o;
			},
			prepareSingleYearDateQueryString: function(dateStr){
				var startTime = '00:00:00Z', endTime = '23:59:59Z', op = '" TO "',
				date = dateStr.split('T')[0], year = date.split('-')[0], lastMonth = '-12-31';
				return ['["',date,'T',startTime,op,year,lastMonth,'T',endTime,'"]'].join('');
			},
			buildFacetQueryParams: function(params, facetQueryKeys){
				return this.parent.parent.parent.buildFacetQueryParams(params, facetQueryKeys);
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<a href="#" id="' + this.domId + '" class="facetItem">' +
						'<span class="viewport">' +
							'<span class="count">(' + this.count + ')</span>' +
						'</span>' +
						'<span class="title">' + this.title + '</span>' +
					'</a>'
				);
				lay.bind('click', function(e){
					e.preventDefault();
					e.stopPropagation();
					facetParams = {};
					facetParams[self.attributeName] = self.realTitle;
					facetParams = topParent.facetParamsAsJson(facetParams);
					realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
					realParams.start = 0;
					realParams = topParent.getQueryParams('productProposals', self.phrase, realParams);
					topParent.handleProductProposals(self.phrase, realParams);
				});
				return lay;
			},
			make: function(){
				var item = this.makeItemLayout();
				return item;
			}
		}
	);

	llsolr.SolrProductFacetPanelPriceBucketItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelItem),
		{
			create: function(){
				var o = llsolr.SolrProductFacetPanelItem.create.call(this);
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<a href="#" id="' + this.domId + '" class="facetItem">' +
						'<span class="viewport">' +
							'<span class="count">(' + this.count + ')</span>' +
						'</span>' +
						'<span class="title">' + this.title + '</span>' +
					'</a>'
				);
				lay.bind('click', function(e){
					e.preventDefault();
					e.stopPropagation();
					facetParams = {};
					facetParams = topParent.facetParamsAsJson(self.attributeName);
					realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
					facetParams[self.attributeName] = self.attributeName;
					topParent.facetParamsAsJson(facetParams);
					realParams.fq.push(self.attributeName);
					realParams.start = 0;
					realParams = topParent.getQueryParams('productProposals', self.phrase, realParams);
					topParent.handleProductProposals(self.phrase, realParams);
				});
				return lay;
			}
		}
	);

	llsolr.SolrProductFacetPanelCustomerPriceBucketItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelItem),
		{
			create: function(opts){
				var o = llsolr.SolrProductFacetPanelItem.create.call(this);
				o.key = null;
				o.facetData = null;
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams, from, to;
				from = isNaN(this.facetData.from.replace(',', '.')) ? '' : this.facetData.from;
				to = isNaN(this.facetData.to.replace(',', '.')) ? '' : this.facetData.to;
				lay = $(
					'<div class="llsolr-customerPriceBucketItem" id="' + this.domId + '">' +
						'<table cellpadding="0" cellspacing="0" border="0">' +
							'<tr>' +
								'<td class="field">' +
									'<input type="text" name="from" value="' + from + '"/>' +
								'</td>' +
								'<th class="currency">&nbsp;-&nbsp;</th>' +
								'<td class="field">' +
									'<input type="text" name="to" value="' + to + '"/>' +
								'</td>' +
								'<th class="currency">' + this.facetData.currency + '</th>' +
								'<td class="button">' +
									'<input type="image" src="/xist4c/px/spc.gif"/>' +
								'</td>' +
							'</tr>' +
						'</table>' +
					'</div>'
				);
				lay.find('.button').bind('click', function(e){
					var custPriceItem = $(this).parents('.llsolr-customerPriceBucketItem'), fromVal, toVal, expr, k;
					e.preventDefault();
					e.stopPropagation();
					facetParams = {};
					fromVal = custPriceItem.find('input[name=from]').val().replace(',', '.');
					toVal = custPriceItem.find('input[name=to]').val().replace(',', '.');
					fromVal = !isNaN(parseInt(fromVal, 10)) ? fromVal : '*';
					toVal = !isNaN(parseInt(toVal, 10)) ? toVal : '*';
					expr = ['[',fromVal,' TO ',toVal,']'].join('');
					facetParams = topParent.facetParamsAsJson(facetParams);
					realParams = {'fq': []};
					for (k in facetParams){
						if (k.search(self.key) === -1){
							realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
						}
					}
					realParams.fq.push(self.key + ':' + expr);
					realParams = topParent.getQueryParams('productProposals', self.phrase, realParams);
					topParent.handleProductProposals(self.phrase, realParams);
				});
				return lay;
			}
		}
	);

	llsolr.SolrProductFacetPanelDateItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelPriceBucketItem),
		{
			create: function(){
				var o = llsolr.SolrProductFacetPanelPriceBucketItem.create.call(this);
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<a href="#" id="' + this.domId + '" class="facetItem">' +
						'<span class="viewport">' +
							'<span class="count">(' + this.count + ')</span>' +
						'</span>' +
						'<span class="title">' + this.title + '</span>' +
					'</a>'
				);
				lay.bind('click', function(e){
					e.preventDefault();
					e.stopPropagation();
					facetParams = topParent.facetParamsAsJson(self.attributeName);
					realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
					facetParams[self.attributeName] = self.prepareSingleYearDateQueryString(self.realTitle);
					topParent.facetParamsAsJson(facetParams);
					realParams.fq.push([self.attributeName,':',self.prepareSingleYearDateQueryString(self.realTitle)].join(''));
					realParams.start = 0;
					realParams = topParent.getQueryParams('productProposals', self.phrase, realParams);
					topParent.handleProductProposals(self.phrase, realParams);
				});
				return lay;
			}
		}
	);

	llsolr.SolrProductFacetPanelBackItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelItem),
		{
			create: function(){
				var o = llsolr.SolrProductFacetPanelItem.create.call(this);
				o.key = null;
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<a href="#" id="' + this.domId + '" class="facetItem facetBackItem">' +
						'<span class="title">' + this.title + '</span>' +
					'</a>'
				);
				lay.bind('click', function(e){
					var panel = self.parent, panels = self.parent.parent.facets, i, p;
					e.preventDefault();
					e.stopPropagation();
					facetParams = topParent.facetParamsAsJson(self.attributeName);
					for (i = 0; i < panels.length; i+=1){
						p = panels[i];
						if ($.inArray(p.realTitle, panel.linkedPanels) > -1 && p.selectedItems.length){
							facetParams = topParent.facetParamsAsJson(p.selectedItems[0].attributeName);
						}
					}
					realParams = self.buildFacetQueryParams(facetParams, facetQueryKeys);
					realParams.start = 0;
					realParams = topParent.getQueryParams('productProposals', self.phrase, realParams);
					topParent.handleProductProposals(self.phrase, realParams);
				});
				return lay;
			}
		}
	);

	llsolr.SolrSelectboxFacetTeaserAddOn = $.extend(
		$.clone(llsolr.SolrFacetAddOn),
		{
			create: function(opts, noLayout){
				var o, lay;
				if (opts){
					if (!opts.usedPanelClass){
						opts.usedPanelClass = llsolr.SolrProductSelectFacetAttribute;
					}
					if (!opts.usedItemClass){
						opts.usedItemClass = llsolr.SolrProductSelectFacetAttributeItem;
					}
					if (!opts.usedBackItemClass){
						opts.usedBackItemClass = null;
					}
				}
				o = llsolr.SolrFacetAddOn.create.call(this, opts);
				if (!noLayout){
					lay = o.makeOuterLayout();
					o.defaults.target.append(lay);
					o.defaults.target = lay.find('.sftao_des4');
				}
				return o;
			},
			makeOuterLayout: function(){
				var lay = $(
					'<div class="llsolr-selectboxfacetTeaserAddOn">' +
						'<div class="sftao_des1">' +
							'<div class="sftao_des2">' +
								'<div class="sftao_des3">' +
									'<div class="sftao_des4">' +
									'</div>' +
								'</div>' +
							'</div>' +
						'</div>' +
					'</div>'
				);
				return lay;
			},
			add: function(key, pTitle, linkedAttributes, classOpts){
				var opts = this.defaults, d = this.parent.data, attribute, target = opts.target, searchFacet = [],
				searchFacets = (d.responseHeader && d.responseHeader.params.fq) ? d.responseHeader.params.fq : [],
				count, item, i, facets, facet,
				panelClass = opts.usedPanelClass,
				itemClass = opts.usedItemClass;
				if (Utils.isObject(classOpts)){
					if (classOpts.usedPanelClass){
						panelClass = classOpts.usedPanelClass;
					}
					if (classOpts.usedItemClass){
						itemClass = classOpts.usedItemClass;
					}
				}
				if (searchFacets){
					if (typeof searchFacets !== 'string'){
						for (i = 0; i < searchFacets.length; i+=1){
							searchFacet.push(searchFacets[i].split(':')[0]);
						}
					}else{
						searchFacet.push(searchFacets.split(':')[0]);
					}
				}
				facets = d.facet_counts.facet_fields || null;
				if (facets){
					facet = facets[key];
					attribute = panelClass.create();
					attribute.target = target;
					attribute.parent = this;
					attribute.id = this.cnt;
					attribute.domId = 'facetSelectAttribute_' + this.cnt;
					attribute.title = pTitle;
					attribute.realTitle = key;
					attribute.key = key;
					attribute.attributeName = key;
					attribute.linkedAttributes = linkedAttributes || [];
					for (i = 0; i < facet.length; i+=1){
						if (i % 2 === 1){
							this.iCnt++;
							continue;
						}
						title = realTitle = facet[i];
						if (realTitle.indexOf('_') === 0 || realTitle.indexOf('_') == 7){
							title = realTitle.substring(realTitle.indexOf('_') + 1, realTitle.length);
						}
						count = facet[i+1];
						item = itemClass.create();
						item.id = this.iCnt;
						item.parent = attribute;
						item.phrase = this.parent.phrase;
						item.domId = 'facetAttributeItem_' + this.iCnt;
						item.title = title;
						item.realTitle = realTitle;
						item.count = count;
						item.attributeName = key;
						attribute.selectedItems = [];
						attribute.items.push(item);
					}
					this.cnt++;
					this.facets.push(attribute);
				}
			},
			handleFacetQuery: function(){
				var opts = this.defaults, attribute, target = opts.target,
				i, facet, count, fromVal, toVal, item,
				priceBuckets = this.facetQueryPartsRegister.priceBuckets, phrase = this.parent.phrase,
				currFacet, fq;
				if (opts.priceBuckets && priceBuckets){
					this.cnt++;
					attribute = llsolr.SolrProductSelectFacetAttribute.create();
					attribute.target = target;
					attribute.parent = this;
					attribute.id = this.cnt;
					attribute.domId = 'facetSelectAttribute_' + this.cnt;
					attribute.title = priceBuckets.name;
					attribute.attributeName = priceBuckets.key;
					fq = this.parent.getFilterQuery();
					if (fq){
						if (Utils.isArray(fq)){
							for (i = 0; i < fq.length; i+=1){
								if (fq[i].search(priceBuckets.key) > -1){
									currFacet = fq[i];
								}
							}
						}else{
							if (fq.search(priceBuckets.key) > -1){
								currFacet = fq;
							}
						}
					}else{
						currFacet = null;
					}
					for (i = 0; i < priceBuckets.items.length; i++){
						facet = priceBuckets.items[i];
						if (facet.count){
							if (facet.from == 'NaN'){
								toVal = $.lang('solrFacetAddOn_upto') + facet.to;
								fromVal = '';
							}else if (facet.to == 'NaN'){
								fromVal = $.lang('solrFacetAddOn_over') + facet.from;
								toVal = '';
							}else{
								fromVal = facet.from + ' - ';
								toVal = facet.to;
							}
							count = facet.count;
							this.iCnt++;
							item = llsolr.SolrProductSelectFacetAttributePriceBucketItem.create();
							item.id = this.iCnt;
							item.parent = attribute;
							item.phrase = phrase;
							item.domId = 'facetAttributeItem_' + this.iCnt;
							item.title = [fromVal,toVal,' ',facet.currency].join('');
							item.realTitle = priceBuckets.key + ':' + facet.rawExpr;
							item.count = count;
							item.attributeName = priceBuckets.key + ':' + facet.rawExpr;
							attribute.items.push(item);
						}
					}
					attribute.make(noLinkedAttributesHandling = true);
				}
			},
			update: function(phrase){
				var i, target = this.defaults.target;
				this.parent.SolrFacetSelectboxFacetTeaserAddOn = this;
				target.empty();
				for (i = 0; i < this.facets.length; i+=1){
					facetPanel = this.facets[i];
					facetPanel.make();
				}
				this.handleFacetQuery();
			}
		}
	);

	llsolr.SolrProductSelectFacetAttribute = $.extend(
		$.clone(llsolr.SolrProductFacetPanel),
		{
			create: function(){
				var o = llsolr.SolrProductFacetPanel.create.call(this);
				delete o.linkedPanels;
				return o;
			},
			makePanelLayout: function(){
				var self = this, lay = $(
					'<div id="' + this.domId + '" class="llsolr-facetSelectAttribute">' +
						'<select name="' + this.attributeName + '"></select>' +
					'</div>'
				),
				facetQueryKeys = this.parent.getFacetQueryPartsKeyList();
				lay.find('select').bind('change', function(e){
					var i, item, panels = self.parent.facets, p, topParent = self.parent.parent, facetParams, realParams, k;
					e.preventDefault();
					e.stopPropagation();
					for (i = 0; i < self.items.length; i++){
						item = self.items[i];
						if (item.realTitle == $(this).val()){
							self.selectedItems = [item];
							break;
						}
					}
					if ($(this).val() !== '-1'){
						facetParams = {};
						realParams = {'fq': []};
						if (self.selectedItems[0].instanceOf(llsolr.SolrProductSelectFacetAttributePriceBucketItem)){
							facetParams = topParent.facetParamsAsJson(self.selectedItems[0].attributeName);
							for (k in facetParams){
								if ($.inArray(k, facetQueryKeys) === -1){
									realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
								}else{
									realParams.fq.push(k);
								}
							}
							facetParams[self.selectedItems[0].attributeName] = self.selectedItems[0].attributeName;
							topParent.facetParamsAsJson(facetParams);
							realParams.fq.push(self.selectedItems[0].attributeName);
						}else{
							facetParams[self.selectedItems[0].attributeName] = self.selectedItems[0].realTitle;
							facetParams = topParent.facetParamsAsJson(facetParams);
							for (k in facetParams){
								if ($.inArray(k.split(':')[0], facetQueryKeys) === -1){
									realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
								}else{
									realParams.fq.push(k);
								}
							}
						}
					}else{
						facetParams = topParent.facetParamsAsJson(self.selectedItems[0].attributeName);
						for (i = 0; i < panels.length; i+=1){
							p = panels[i];
							if ($.inArray(p.attributeName, self.linkedAttributes) > -1 && p.selectedItems.length){
								facetParams = topParent.facetParamsAsJson(p.selectedItems[0].parent.attributeName);
							}
						}
						realParams = {'fq': []};
						for (k in facetParams){
							if ($.inArray(k.split(':')[0], facetQueryKeys) === -1){
								realParams.fq.push([k,':"',facetParams[k],'"'].join(''));
							}else{
								realParams.fq.push(k);
							}
						}
					}
					realParams = topParent.getQueryParams('productProposals', self.selectedItems[0].phrase, realParams);
					topParent.handleProductProposals(self.selectedItems[0].phrase, realParams);
				});
				return lay;
			},
			makeTitleLayout: function(){
				return $(
					'<div class="llsolr-facetSelectAttributePrompt">' +
						'<span>' + this.title + '</span>' +
					'</div>'
				);
			},
			appendPanelItems: function(panel){
				var self = this, backItem = llsolr.SolrProductSelectFacetAttributeBackItem.create(), topParent = this.parent.parent,
				params = topParent.facetParamsAsJson();
				backItem.id = -1;
				backItem.parent = this;
				backItem.phrase = this.parent.parent.phrase;
				backItem.domId = 'facetPanelItem_00_-1';
				backItem.title = $.lang('searchSelectFacetPanelItemBack');
				this.items.unshift(backItem);
				$(this.items).each(function(i){
					var k, domel;
					domel = this.make();
					panel.find('select').append(domel);
					this.domel = domel;
					for (k in params){
						if (k == this.attributeName && (params[k] == this.title || params[k] == this.attributeName)){
							backItem.attributeName = this.attributeName;
							domel.attr({
								selected: true
							});
							self.selectedItems = [this];
						}
					}
				});
			},
			make: function(noLinkedPanelsHandling){
				var panel = this.makePanelLayout(), i, panels = this.parent.facets, p;
				panel.prepend(this.makeTitleLayout());
				this.appendPanelItems(panel);
				for (i = 0; i < panels.length; i+=1){
					p = panels[i];
					if (!noLinkedPanelsHandling){
						if (p !== this && $.inArray(this.realTitle, p.linkedAttributes) > -1 && !p.selectedItems.length){
							panel.hide();
							break;
						}else{
							panel.show();
						}
					}
				}
				this.target.append(panel);
				this.domel = panel;
			}
		}
	);

	llsolr.SolrProductSelectFacetAttributeItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelItem),
		{
			create: function(opts){
				return llsolr.SolrProductFacetPanelItem.create.call(this, opts);
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams, k,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<option class="llsolr-selectFacetItem" value="' + this.realTitle + '">' +
						this.title + ' (' + this.count + ')' +
					'</option>'
				);
				return lay;
			}
		}
	);

	llsolr.SolrProductSelectFacetAttributePriceBucketItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelPriceBucketItem),
		{
			create: function(opts){
				var o = llsolr.SolrProductFacetPanelPriceBucketItem.create.call(this, opts);
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams, k;
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<option class="llsolr-selectFacetItem" value="' + this.attributeName + '">' +
							this.title + ' (' + this.count + ')' +
					'</a>'
				);
				return lay;
			}
		}
	);

	llsolr.SolrProductSelectFacetAttributeBackItem = $.extend(
		$.clone(llsolr.SolrProductFacetPanelBackItem),
		{
			create: function(opts){
				var o = llsolr.SolrProductFacetPanelBackItem.create.call(this, opts);
				return o;
			},
			makeItemLayout: function(){
				var lay, topParent = this.parent.parent.parent, self = this, facetParams, realParams, k,
				facetQueryKeys = this.parent.parent.getFacetQueryPartsKeyList();
				lay = $(
					'<option class="llsolr-selectFacetItem llsolr-selectFacetBackItem" value="-1">' +
						this.title +
					'</option>'
				);
				return lay;
			}
		}
	);


	llsolr.SolrStaticSelectboxFacetTeaserAddOn = $.extend(
		$.clone(llsolr.SolrSelectboxFacetTeaserAddOn),
		{
			create: function(opts){
				var o = llsolr.SolrSelectboxFacetTeaserAddOn.create.call(this, opts, true),
				lay = o.makeOuterLayout();
				if (o.defaults.target.length){
					o.defaults.target.append(lay);
					o.defaults.target = lay.find('.sftao_attributes');
				}
				if (o.defaults.autoInit){
					Utils.busyWait(
						function(intervalObj){
							if (o.parent){
								return true;
							}
							return false;
						},
						200,
						100,
						function(intervalObj){
							o.init();
						}
					);
				}
				return o;
			},
			init: function(){
				var params;
				if (this.defaults.target && this.defaults.target.length){
					params = Utils.getUrlParamsAsJson(this.parent.getQueryParams('productProposals', ''));
					delete params.q;
					params['q.alt'] = '*:*';
					this.parent.handleProductProposals('', Utils.getUrlParamsFromJson(params));
				}
			},
			makeOuterLayout: function(){
				var self = this, lay = $(
					'<div class="llsolr-selectboxfacetTeaserAddOn llsolr-staticSelectboxfacetTeaserAddOn">' +
						'<div class="sftao_des1">' +
							'<div class="sftao_des2">' +
								'<div class="sftao_des3">' +
									'<div class="sftao_des4">' +
										'<div class="sftao_attributes"></div>' +
										'<div class="viewport">' +
											'<div class="sftao_button"></div>' +
										'</div>' +
									'</div>' +
								'</div>' +
							'</div>' +
						'</div>' +
					'</div>'
				);
				lay.find('.sftao_button').bind('click', function(e){
					var params = self.parent.facetParamsAsJson(), i, facet, searchDetailUrl = self.parent.defaults.searchDetailUrl,
					sessId = '';
					if (Utils.getXist4cSessionId()){
						sessId = Utils.getXist4cSessionId({
							returnWithPrefix: true
						});
					}
					params.searchTrigger = 's3ft'; // static facet filter
					window.location.href = searchDetailUrl + sessId + Utils.getUrlParamsFromJson(params);
				});
				return lay;
			},
			handleFacetQuery: function(){
				var opts = this.defaults, d = opts.data, attribute, k, target = opts.target, item,
				i, facet, count, fromVal, toVal,
				priceBuckets = this.facetQueryPartsRegister.priceBuckets, phrase = this.parent.phrase,
				currFacet, fq, noLinkedAttributeHandling;
				if (opts.priceBuckets && priceBuckets){
					this.cnt++;
					attribute = llsolr.SolrProductSelectFacetAttribute.create();
					attribute.target = target;
					attribute.parent = this;
					attribute.id = this.cnt;
					attribute.domId = 'facetSelectAttribute_' + this.cnt;
					attribute.title = priceBuckets.name;
					attribute.attributeName = priceBuckets.key;
					fq = this.parent.getFilterQuery();
					if (fq){
						if (Utils.isArray(fq)){
							for (i = 0; i < fq.length; i+=1){
								if (fq[i].search(priceBuckets.key) > -1){
									currFacet = fq[i];
								}
							}
						}else{
							if (fq.search(priceBuckets.key) > -1){
								currFacet = fq;
							}
						}
					}else{
						currFacet = null;
					}
					for (i = 0; i < priceBuckets.items.length; i++){
						facet = priceBuckets.items[i];
						if (facet.count){
							if (facet.from == 'NaN'){
								toVal = $.lang('solrFacetAddOn_upto') + facet.to;
								fromVal = '';
							}else if (facet.to == 'NaN'){
								fromVal = $.lang('solrFacetAddOn_over') + facet.from;
								toVal = '';
							}else{
								fromVal = facet.from + ' - ';
								toVal = facet.to;
							}
							count = facet.count;
							this.iCnt++;
							item = llsolr.SolrProductSelectFacetAttributePriceBucketItem.create();
							item.id = this.iCnt;
							item.parent = attribute;
							item.phrase = phrase;
							item.domId = 'facetAttributeItem_' + this.iCnt;
							item.title = [fromVal,toVal,' ',facet.currency].join('');
							item.realTitle = priceBuckets.key + ':' + facet.rawExpr;
							item.count = count;
							item.attributeName = priceBuckets.key + ':' + facet.rawExpr;
							attribute.items.push(item);
						}
					}
					attribute.make(noLinkedAttributesHandling = true);
					this.facets.push(attribute);
				}
			}
		}
	);

	// >> Pager element
		PagerElement = $.extend(
			$.clone(LLObject),
			{
				create: function(opts){
					var o = LLObject.create.call(this);
					o.defaults = {
						target: [],
						frameWidth: 3,
						callback: null
					};
					if (typeof(opts) !== 'undefined'){
						$.extend(true, o.defaults, opts);
					}
					o.currentPage = 1;
					o.overall = null;
					o.offset = null;
					return o;
				},
				getPages: function(){
					var ov, off;
					ov = this.overall;
					off = this.offset;
					return ov % off > 0 ? Math.ceil(ov / off) : ov / off;
				},
				makeArrowNaviLayout: function(){
					var opts = this.defaults, firstBind, lastBind, divFirstClass, divPrevClass, divLastClass, divNextClass,
					self = this, firstCol, previousCol, lastCol, nextCol, cb = opts.callback,
					tpl = $(
						'<td class="pagerArrowOuter">' +
							'<div></div>' +
						'</td>'
					);
					firstBind = false;
					lastBind = false;
					if (this.currentPage > 1){
						divFirstClass = 'firstPage';
						divPrevClass = 'previousPage';
						firstBind = true;
						if (this.currentPage < this.getPages()){
							divLastClass = 'lastPage';
							divNextClass = 'nextPage';
							lastBind = true;
						}else{
							divLastClass = 'lastPagePass';
							divNextClass = 'nextPagePass';
						}
					}else{
						divFirstClass = 'firstPagePass';
						divPrevClass = 'previousPagePass';
						if (this.currentPage < this.getPages()){
							divLastClass = 'lastPage';
							divNextClass = 'nextPage';
							lastBind = true;
						}else{
							divLastClass = 'lastPagePass';
							divNextClass = 'nextPagePass';
						}
					}
					firstCol = tpl.clone();
					firstCol.find('div').addClass(divFirstClass).hover(
						function(e){if (self.currentPage > 1){$(this).addClass('firstPageOver');}},
						function(e){$(this).removeClass('firstPageOver');}
					);
					previousCol = tpl.clone();
					previousCol.find('div').addClass(divPrevClass).hover(
						function(e){if (self.currentPage > 1){$(this).addClass('previousPageOver');}},
						function(e){$(this).removeClass('previousPageOver');}
					);
					lastCol = tpl.clone();
					lastCol.find('div').addClass(divLastClass).hover(
						function(e){if (self.currentPage < self.getPages()){$(this).addClass('lastPageOver');}},
						function(e){$(this).removeClass('lastPageOver');}
					);
					nextCol = tpl.clone();
					nextCol.find('div').addClass(divNextClass).hover(
						function(e){if (self.currentPage < self.getPages()){$(this).addClass('nextPageOver');}},
						function(e){$(this).removeClass('nextPageOver');}
					);
					if (cb && Utils.isFunction(cb)){
						if (firstBind){
							firstCol.find('div').bind('click', function(e){
								cb.call(self, 1);
							});
							previousCol.find('div').bind('click', function(e){
								cb.call(self, self.currentPage - 1);
							});
						}
						if (lastBind){
							lastCol.find('div').bind('click', function(e){
								cb.call(self, self.getPages());
							});
							nextCol.find('div').bind('click', function(e){
								cb.call(self, self.currentPage + 1);
							});
						}
					}
					return {
						first: firstCol.add(previousCol),
						last: nextCol.add(lastCol)
					};
				},
				makePageLayout: function(page, here){
					var lay = $('<td class="pageOuter"><div class="page"><span>' + page + '</span></div></td>'),
					cb = this.defaults.callback, self = this;
					if (here){
						lay.find('.page').addClass('pageHere');
					}else{
						if (cb && Utils.isFunction(cb)){
							lay.find('div').bind('click', function(e){
								cb.call(self, page);
							});
						}
						lay.find('.page').hover(
							function(e){$(this).addClass('pageOver');},
							function(e){$(this).removeClass('pageOver');}
						);
					}
					return lay;
				},
				makePagerLayout: function(){
					var opts = this.defaults,
					pOuter = $('<table cellpadding="0" cellspacing="0" class="jsonTablePager"><tr></tr></table>'),
					pages = this.getPages(),
					currPage = this.currentPage, start, end, row, i;
					halfFrameWidth = opts.frameWidth / 2;
					if (currPage - halfFrameWidth > 0){
						start = currPage - halfFrameWidth;
						end = start + opts.frameWidth;
					}else{
						start = 1;
						end = start + opts.frameWidth;
						if (end > pages){
							end = pages + 1;
						}
					}

					if (currPage + halfFrameWidth > pages){
						start = start - (halfFrameWidth - (pages - currPage)) +1;
						end = start + opts.frameWidth + 1;
						if (start <= 0){
							start = 1;
						}
					}
					row = pOuter.find('tr');
					row.append(this.makeArrowNaviLayout().first);
					for (i = start; i < end; ++i){
						if (i > pages){
							break;
						}
						if (i == currPage){
							row.append(this.makePageLayout(i, true));
						}else{
							row.append(this.makePageLayout(i, false));
						}
					}
					row.append(this.makeArrowNaviLayout().last);
					return pOuter;
				},
				update: function(data){
					var target = this.defaults.target;
					this.currentPage = data.pager.currentPage;
					this.overall = data.pager.overall;
					this.offset = data.pager.offset;
					target.empty().append(this.makePagerLayout());
				}
			}
		);
	// <<
// <<

// >> Solr-Search embedding kits garden Version: rel-1-2-4
	if (typeof(window.llsolr) === 'undefined'){
		window.llsolr = {};
	}
	llsolr.SolrSearchEmbeddingKitsGarden = $.extend(
		$.clone(LLObject),
		{
			create: function(opts){
				var o = LLObject.create.call(this);
				o.kitConfigs = [];
				o.machines = [];
				o.defaults = {
					mode: 'tabbed',
					activeMachine: 0,
					kitVarPrefix: 'SolrEK',
					modeViewTarget: null
				};
				if(Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				return o;
			},
			defaultParams: function(name, param, value){
				var p;
				if (arguments.length){
					if (name && param && typeof(value) === 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return this.defaults[name][param];
						}
						return this.defaults[name];
					}else if (name && !param && value){
						return (this.defaults[name] = value);
					}else if (name && param && typeof(value) !== 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return (this.defaults[name][param] = value);
						}
						return (this.defaults[name] = value);
					}
					return this.defaults[name];
				}else{
					return this.defaults;
				}
			},
			addConfig: function(config){
				try {
					if (config.instanceOf(llsolr.SolrSearchEmbeddingKitsGardenKitConfig)){
						this.kitConfigs.push(config);
					}else{
						throw 'Invalid SolrSearchEmbeddingKitsGarden kit configuration!';
					}
				}catch(e){
					if (window.console && window.console.error){
						console.error('Error:', e);
					}
				}
			},
			prepareViewForMode: function(){
				var mode = this.defaults.mode, mvt = this.defaults.modeViewTarget,
				self = this;
				if (mode == 'standard'){
					/* >> todo
						complete the code...
					<< */
				}else if(mode == 'tabbed'){
					mvt.find('li').each(function(i){
						if (!$('.numFound', $(this)).length){
							$(this).find('a span').append('<span class="numFound numFound_' + i + '">(0)</span>');
						}
					});
					Utils.busyWait(
						function(intervalObj){
							if (mvt.tabs){
								return true;
							}
							return false;
						},
						100,
						100,
						function(intervalObj){
							var params = Utils.getUrlParamsAsJson();
							if (params && params.tidx) {
								mvt.tabs('select', parseInt(params.tidx, 10));
							}else{
								mvt.tabs('select', parseInt(self.defaults.activeMachine, 10));
							}
						}
					);
					$('.llsolr_facetPanels').hide();
					$('#llsolr-facetPanels_' + this.defaults.activeMachine).show();

					mvt.bind('tabsselect', function(e, ui){
						try {
							$('.llsolr_facetPanels').hide();
							$('#llsolr-facetPanels_' + ui.index).show();
						}catch(err){
							if (window.console && window.console.error){
								console.error('Exception: SolrSearchEmbeddingKitsGarden.prepareViewForMode', err);
							}
						}
					});
				}
			},
			plantMachines: function(){
				var i, conf, machine;
				this.prepareViewForMode();
				for (i = 0; i < this.kitConfigs.length; i+=1){
					conf = this.kitConfigs[i];
					try {
						machine = conf.initiateKit(this.defaults.kitVarPrefix + '_' + i);
						if (machine.instanceOf || machine.instanceOf(llsolr.SolrSearchEmbeddingKit)){
							machine.gardenDefaults = this.defaults;
							this.machines.push(machine);
							machine.make();
							machine.makeDetail();
						}
					} catch(e) {
						if (window.console && window.console.error){
							console.error('Exception: SolrSearchEmbeddingKitsGarden.plantMachines', e);
						}
					}
				}
			},
			each: function(callback){
				var doBreak;
				for (i = 0; i < this.machines.length; i+=1){
					doBreak = callback.call(this.machines[i], i);
					if (typeof doBreak !== 'undefined' && doBreak === false){
						break;
					}
				}
			},
			eachConfig: function(callback){
				var doBreak;
				for (i = 0; i < this.kitConfigs.length; i+=1){
					doBreak = callback.call(this.kitConfigs[i], i);
					if (typeof doBreak !== 'undefined' && doBreak === false){
						break;
					}
				}
			},
			getAjaxHandlerForEachMachine: function(){
				var i, results = [], handler = this.eachConfig;
				if (this.machines.length){
					handler = this.each;
				}
				handler.call(this, function(i){
					// "this" is now a machine or config.
					results.push(this.defaultParams('detailSearchAjaxHandler'));
				});
				return results;
			}
		}
	);

	llsolr.SolrSearchEmbeddingKitsGardenKitConfig = $.extend(
		$.clone(LLObject),
		{
			create: function(opts){
				var o = LLObject.create.call(this);
				o.defaults = {
					embeddingKit: llsolr.SolrSearchEmbeddingKit
				};
				o.addOns = [];
				if(Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				return o;
			},
			defaultParams: function(name, param, value){
				var p;
				if (arguments.length){
					if (name && param && typeof(value) === 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return this.defaults[name][param];
						}
						return this.defaults[name];
					}else if (name && !param && value){
						return (this.defaults[name] = value);
					}else if (name && param && typeof(value) !== 'undefined'){
						p = this.defaults[name];
						if (Utils.isObject(p)){
							return (this.defaults[name][param] = value);
						}else{
							this.defaults[name] = {};
							return (this.defaults[name][param] = value);
						}
					}
					return this.defaults[name];
				}else{
					return this.defaults;
				}
			},
			addOn: function(addOn){
				try{
					if (addOn.instanceOf(llsolr.SolrAddOn)){
						this.addOns.push(addOn);
					}else{
						throw 'Invalid SolrSearchEmbeddingKit addOn Instance!';
					}
				}catch(e){
					if (window.console && window.console.error){
						console.error('Error:', e);
					}
				}
			},
			initiateKit: function(key){
				var i;
				if (typeof this.defaults.embeddingKit === 'object'){
					window[key] = this.defaults.embeddingKit.create();
				}else{
					window[key] = window.llsolr[this.defaults.embeddingKit].create();
				}
				$.extend(true, window[key].defaults, this.defaults);
				for (i = 0; i < this.addOns.length; i+=1){
					window[key].addOn(this.addOns[i]);
				}
				return window[key];
			}
		}
	);
// <<

// >> Override Classes of the solr embedding kit.
	llsolr.SolrSearchEmbeddingKit_Hopp = $.extend(
		$.clone(llsolr.SolrSearchEmbeddingKit),
		{
			create: function(opts){
				return llsolr.SolrSearchEmbeddingKit.create.call(this, opts);
			},
			completeSearchProposalsParams: function(params, phrase, idx){
				var fqParams = this.defaultParams('extendedSearchPhraseParams'), joinedFqParams = '',
				staticParams = this.defaultParams('persistentStaticParams');
				if (fqParams && fqParams.fq){
					if (fqParams.fq.length){
						fqParams = fqParams.fq[idx];
					}
				}
				if (typeof params === 'string'){
					params = Utils.getUrlParamsAsJson(params);
				}
				delete params['facet.query'];
				params.q = '';
				if (fqParams.length){
					joinedFqParams = fqParams.join(',');
					params.fq = ['type:(' + joinedFqParams + ')'];
				}
				if (staticParams.length && joinedFqParams !== '"fdb_product"' && joinedFqParams !== '"fdb_company"'){
					$(staticParams).each(function(i){
						var parts = this.split('=');
						if (params[parts[0]]){
							if (!Utils.isArray(params[parts[0]])){
								params[parts[0]] = [params[parts[0]]];
							}
							if ($.inArray(parts[1], params[parts[0]]) === -1){
								params[parts[0]].push(parts[1]);
							}
						}
					});
				}
				return params;
			}
		}
	);
// <<


// >> Helpers
	var Base64 = {
		// private property
		_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

		// public method for encoding
		encode : function (input) {
			var output = "";
			var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
			var i = 0;

			input = Base64._utf8_encode(input);

			while (i < input.length) {

				chr1 = input.charCodeAt(i++);
				chr2 = input.charCodeAt(i++);
				chr3 = input.charCodeAt(i++);

				enc1 = chr1 >> 2;
				enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
				enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
				enc4 = chr3 & 63;

				if (isNaN(chr2)) {
					enc3 = enc4 = 64;
				} else if (isNaN(chr3)) {
					enc4 = 64;
				}

				output = output +
				this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
				this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

			}

			return output;
		},
		// public method for decoding
		decode : function (input) {
			var output = "";
			var chr1, chr2, chr3;
			var enc1, enc2, enc3, enc4;
			var i = 0;

			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

			while (i < input.length) {

				enc1 = this._keyStr.indexOf(input.charAt(i++));
				enc2 = this._keyStr.indexOf(input.charAt(i++));
				enc3 = this._keyStr.indexOf(input.charAt(i++));
				enc4 = this._keyStr.indexOf(input.charAt(i++));

				chr1 = (enc1 << 2) | (enc2 >> 4);
				chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
				chr3 = ((enc3 & 3) << 6) | enc4;

				output = output + String.fromCharCode(chr1);

				if (enc3 != 64) {
					output = output + String.fromCharCode(chr2);
				}
				if (enc4 != 64) {
					output = output + String.fromCharCode(chr3);
				}

			}
			output = Base64._utf8_decode(output);
			return output;
		},
		// private method for UTF-8 encoding
		_utf8_encode : function (string) {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
			for (var n = 0; n < string.length; n++) {
				var c = string.charCodeAt(n);
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
			}
			return utftext;
		},
		// private method for UTF-8 decoding
		_utf8_decode : function (utftext) {
			var string = "";
			var i = 0;
			var c, c1, c2;
			c = c1 = c2 = 0;
			while ( i < utftext.length ) {
				c = utftext.charCodeAt(i);
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				}
				else if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
			}
			return string;
		}
	};
// <<


// >> popups
	function openZoomImage(url, height, width, e){
		var pup = new StandardPopup({'href': url, 'height': height, 'width': width});
		pup.open();
		var wRef = pup.wRef;
	}
// <<


// >> >> Survey teaser (require jQuery 1.2.6+) Version: rel 1-0-0
	function Survey(args){
		this.surveyId = args.sId;
		this.survey = {'responseText': null};
		this.initUrl = args.initUrl;
		this.voteUrl = args.voteUrl;
		this.resultUrl = args.resultUrl;
		this.oldButtonValue = null;
		this.voteConnect = null;
	}

	Survey.prototype._connectButtons = function(){
		var self = this;
		$('#surveyVote').bind('click', function(e){
			e.preventDefault();
			self.vote($(this));
		});
		$('#surveyResult').bind('click', function(e){
			e.preventDefault();
			self.getResult($(this));
		});
	};

	Survey.prototype.getSurvey = function(){
		if (this.survey.responseText){
			this.loadSurvey();
		}else{
			var self = this;
			$.ajax({
				type: 'get',
				url: this.initUrl,
				dataType: 'text',
				success: function(data, msg){
					self.loadSurvey(data);
				},
				error: function(req, status, error){
					self.loadSurveyError(req);
				}
			});
		}
	};

	Survey.prototype.loadSurvey = function(data){
		if (! data){
			data = this.survey.responseText;
		}else{
			this.survey.responseText = data;
		}
		var self = this;
		$('#' + this.surveyId).fadeOut('fast', function(){
			self.appearContent(data);
		});
		if (this.oldButtonValue){
			$('#surveyVote').attr({'value': this.oldButtonValue});
			$('#surveyResult').css({'display': ''});
		}
		this.oldButtonValue = null;
		this._connectButtons();
	};

	Survey.prototype.loadSurveyError = function(def){
		var lay = $(
			'<div><div></div></div>'
		);
		lay.find(':first-child').css({'color': '#cc0000'}).text('Service nicht verfügbar!');
		$('#' + this.surveyId).empty().append(lay);
	};

	Survey.prototype.vote = function(button){
		var form = button.parents('form');
		var qStr = '?' + form.serialize();
		var params = Utils.getUrlParamsAsJson(qStr);
		var valid = false;
		for (var k in params){
			if (k != 'user'){
				valid = true;
			}
		}
		var self = this;
		if (valid){
			$.ajax({
				type: 'post',
				url: self.voteUrl,
				data: params,
				success: function(data, msg){
					self.handleVoting(data);
				},
				error: function(req, status, error){
					self.handleVotingError(req);
				}
			});
		}else{
			$('#voteFirstMsg').remove();
			var lay = $('<div></div>');
			lay.attr({'id': 'voteFirstMsg'}).css({'color': '#cc0000'}).text('Bitte stimmen Sie zuerst ab.');
			$('#' + this.surveyId).append(lay);
			setTimeout(function(){
				$('#voteFirstMsg').fadeOut('fast');
			}, 3000);
		}
	};

	Survey.prototype.handleVoting = function(def){
		var resElm = $('#surveyResult');
		for (var i = 0; i < 3; ++i){
			resElm.animate({'opacity': 0.2}, {'duration': 500})
			.animate({'opacity': 1}, {'duration': 500});
		}
	};

	Survey.prototype.handleVotingError = function(def){
		var lay = $('<div></div>');
		lay.css({'color': '#cc0000'}).text('Fehler bei Umfrageeintrag!');
		$('#' + this.surveyId).append(lay);
	};

	Survey.prototype.getResult = function(button){
		var self = this;
		$.ajax({
			type: 'get',
			url: this.resultUrl,
			success: function(data, msg){
				self.switchResult(data);
			},
			error: function(req, status, error){
				self.switchResultError(req);
			}
		});
	};

	Survey.prototype.switchResult = function(def){
		var self = this;
		$('#' + this.surveyId).fadeOut('fast', function(){
			self.appearContent(def);
		});
		var voteButton = $('#surveyVote');
		if(! this.oldButtonValue){
			this.oldButtonValue = voteButton.val();
			//this.oldButtonValue = getNodeAttribute(MochiKit.DOM.getElement('surveyVote'), 'value');
		}
		voteButton.val('Zurück').bind('click', function(e){
			e.preventDefault();
			self.getSurvey(voteButton);
		});
		$('#surveyResult').hide();
	};

	Survey.prototype.appearContent = function(def){
		$('#' + this.surveyId).empty().html(def).fadeIn('fast');
	};

	Survey.prototype.switchResultError = function(def){

	};
// <<


// >> Enhanced search teaser (require jQuery 1.2.6+) Version: rel-1-0-0
	function EnhancedSearch(optList){
		this.url = AjaxURLManager.getUrlWithKey('erweitertesuche/scope');
		this.optList = optList;
	}

	EnhancedSearch.prototype.connectOptions = function(){
		var self = this,
		xloop = function(optName){
			$('#' + opt).bind('click', function(e){
				self.prepareAction(optName);
			});
		};
		for (var i = 0; i < this.optList.length; ++i){
			var opt = this.optList[i];
			this.checkOption(opt);
			xloop(opt);
		}
	};

	EnhancedSearch.prototype.checkOption = function(id){
		// abstract method
	};

	EnhancedSearch.prototype.prepareAction = function(optId, e){
		if (optId == 'optNumber'){
			this.getOptions();
		}else{
			$('#magazineSelect').fadeOut('fast');
		}
	};

	EnhancedSearch.prototype.getOptions = function(){
		var self = this;
		$.ajax({
			type: 'get',
			url: this.url,
			dataType: 'json',
			success: function(data, msg){
				self.createSelectBox(data);
			},
			error: function(req, status, error){
				self.createSelectBoxError(req);
			}
		});
	};

	EnhancedSearch.prototype.createSelectBox = function(def){
		var selectShell = $('#magazineSelect').empty();
		var s = $('<select></select>');
		s.attr({'name': 'searchIssue', 'class': 'magazines'});
		var opts = def;
		s.append('<option>--- Nichts ausgewählt ---</option>').val('-1');
		$(opts).each(function(i){
			var opt = $('<option>Ausgabe: ' + this.content + '</option>')
				.val(this.value).attr({'selected': this.selected});
			s.append(opt);
		});
		selectShell.append(s);
		selectShell.fadeIn('fast');
	};

	EnhancedSearch.prototype.createSelectBoxError = function(def){
	};
// <<


// >> Enhanced standard search (require jQuery 1.2.6+) Version: rel-1-0-0
	function EnhancedStdSearch(optList, url){
		this.constructor(optList, url);
	}
	EnhancedStdSearch.prototype = new EnhancedSearch();

	EnhancedStdSearch.prototype.checkOption = function(id){
		var checked = $('#' + id).attr('checked');
		if (checked && id == 'i_610'){
			this.showSelectBox();
		}
	};

	EnhancedStdSearch.prototype.prepareAction = function(optId, e){
		if (optId == 'i_610'){
			this.showSelectBox();
		}else{
			$('#kennziffer_select_outer').fadeOut('fast');
		}
	};

	EnhancedStdSearch.prototype.showSelectBox = function(){
		var selectShell = $('#kennziffer_select_outer');
		selectShell.fadeIn('fast');
	};
// <<


// >> Enhanced product search (require jQuery 1.2.6+) Version: rel-1-0-0
	function EnhancedProductSearch(optList){
		this.constructor(optList, null);
	}
	EnhancedProductSearch.prototype = new EnhancedSearch();

	EnhancedProductSearch.prototype.connectOptions = function(hiddenFieldId){
		var self = this;
		$(this.optList).each(function(i){
			$('#' + self.optList[i]).bind('click', function(e){
				self.prepareAction(self.optList[i]);
			});
		});
	};

	EnhancedProductSearch.prototype.prepareAction = function(optId){
		var optVal, form, act;
		opt = $('#' + optId);
		form = opt.parents('form');
		act = form.attr('action');
		form.attr({'action': act.substring(0, act.lastIndexOf('id_') + 3) + opt.val() + '_.htm'});
	};
// <<


// >> Zoom images (require jQuery 1.2.6+) Version: rel-1-0-0
	function connectZoomImage(url, id, height, width){
		$('#' + id).bind('click', function(e){openZoomImage.call(window, url, height, width);});
	}
// <<


// >> toggle container (require jQuery 1.2.6+) Version rel-1-0-0
	ToggleContainer = {
		container: [],
		addToggle: function(id){
			var self = this;
			var t = new ToggleObj();
			t.id = id;
			t.status = 1;
			t.elm = $('#' + id);
			t.img = $('#' + id + '_img');
			t.conId = t.img.bind('click', function(e){
				e.preventDefault();
				self.toggle(id);
			});
			this.container.push(t);
		},
		toggle: function(id){
			var c = this.container;
			for (var i = 0; i < c.length; ++i){
				if (c[i].id == id){
					c[i].toggle();
				}
			}
		}
	};

	function ToggleObj(){
		this.id = null;
		this.status = 0;
		this.elm = null;
		this.img = null;
		this.conId = null;
		this.toggle = function(){
			if (this.status == 1){
				this.img.attr({'class': 'closed'});
				this.elm.slideUp('fast');
				this.status = 0;
			}else{
				this.img.attr({'class': 'open'});
				this.elm.slideDown('fast');
				this.status = 1;
			}
		};
	}
// <<


// >> form submit trigger (require jQuery 1.2.6+) Version rel-1-0-0
	function connectFormSubmitTrigger(){
		var links = document.links,
		xloop = function(e){
			e.preventDefault();
			submitSimpleForm(this);
		};
		for (var i = 0; i < links.length; ++i){
			var link = $(links[i]);
			if (link.attr('rel') == 'formSubmitTrigger'){
				link.bind('click', xloop);
			}
		}
	}

	function getTriggerForm(node){
		while (node){
			node = node.parentNode;
			if(node.nodeName.toLowerCase() == 'form'){
				return node;
			}
			return false;
		}
	}

	function submitSimpleForm(trigger){
		var form = getTriggerForm(trigger);
		if (form){
			form.submit();
		}
	}
// <<


// >> ad manager (require jQuery 1.2.6+) version: rel-1-0-1
	AdManager = {
		log: false,
		adManagers: [],
		adList: [],
		stdSkyLeft: 927,
		stdSkyTop: 0,
		wallpaperSkyLeft: 927,
		wallpaperSkyTop: -90,
		wallpaperVariant: function(v){
			Utils.busyWait(
				function(){
					if ($('#box_top').length && $('#skyscraper').length){
						return true;
					}
					return false;
				},
				50,
				100,
				function(){
					if (v == 1 || v == 2){
						var boxTop = $('#box_top'),
						sky = $('#skyscraper');
						boxTop.css({
							height: 90,
							left: 147,
							top: -127,
							margin: 0,
							position: 'relative',
							width: 900,
							zIndex: 200,
							textAlign: 'right',
							background: 'transparent'

						});
						boxTop.find('>div').css({
							textAlign: 'right'
						});
						if (sky.size() > 0){
							sky.css({
								left: 927,
								position: 'absolute',
								top: -37,
								zIndex: 100
							});
						}
					}else{
						if (this.log && window.console){
							console.log('ValueError: Wallpaper variant is not defined, variant info: ' + v);
						}
					}

				}
			);
		},
		_inArray: function(str, arr){
			for (var i = 0; i < arr.length; ++i){
				if (str == arr[i]){
					return {'value': str, 'index': i};
				}
			}
			return false;
		},
		logging: function(on){
			this.log = false;
			if (on){
				this.log = true;
			}
			for (var i = 0; i < this.adManagers.length; ++i){
				this.adManagers[i].logging(this.log);
			}
		},
		getLoggingLine: function(msg){
			log();
			var line = '';
			var len = 170;
			msg = ' >> ' + msg + ' << ';
			for (var i = 0; i < len - msg.length; ++i){
				line += '-';
			}
			return msg + line;
		},
		makeAdManager: function(adManager){
			this.adManagers.push(adManager);
			return adManager;
		},
		init: function(spcId){
			for (var i = 0; i < this.adManagers.length; ++i){
				var baseScriptStr = this.adManagers[i].writeBaseScript(spcId);
				if (this.log){
					if (window.console){
						console.log(this.getLoggingLine('Ad manager base scripts'));
					}
					if (window.console){
						console.log(this.adManagers[i].name + ' base script written: ' + baseScriptStr);
					}
				}
			}
			if (this.log && window.console){
				console.log(AdManager.getLoggingLine('Temporarily banner code written'));
			}
		},
		activateAds: function(){
			var i;
			for (i = 0; i < this.adManagers.length; ++i){
				var amb = this.adManagers[i].banner;
				if (this.log && window.console){
					console.log(this.getLoggingLine(this.adManagers[i].name + ' ads are pushed into ad list'));
				}
				for (var j = 0; j < amb.length; ++j){
					this.adList.push(amb[j]);
					if (this.log && window.console){
						console.log(amb[j].__repr__());
					}
				}
			}
			if (this.log && window.console){
				console.log(this.getLoggingLine('Move banner to there targets'));
			}
			for (i = 0; i < this.adList.length; ++i){
				var fineType = this.adList[i].type + '_temp';
				if (this.adList[i] instanceof BusinessAd_Banner){
					fineType = 'Ads_BA_' + fineType;
				}
				if ($('#' + fineType).length){
					var self = this;
					var banner = this.adList[i];
					this.placeBanner(banner);
				}
			}
			$('#admanager').remove();
		},
		getAdShell: function(attrs, css){
			var lay = $('<div></div>').attr(attrs).css(css);
			return lay;
		},
		placeBanner: function(banner){
			var n = banner.type;
			var area = $('#' + banner.target);
			if (area.size()=== 0){
				area = $('.' + banner.target).eq(0);
			}
			var attrs = {'align': 'center'};
			var css = null;
			if (n == 'start_skyscraper' || n == 'skyscraper' || n == 'wallpaper_sky' || n == 'SKY'){
				attrs = {'id': 'skyscraper'};
				css = {'position': 'absolute', 'z-index': 100, 'left': this.stdSkyLeft + 'px', 'top': this.stdSkyTop + 'px'};
			}else if (n == 'wallpaper_top'){
				attrs = {'align': 'right'};
			}else if (n == 'box_left' || n == 'box_right' || n == 'CAD' || n == 'CAD2'){
				area.css({'margin-bottom': '12px'});
			}else if (n == 'medium_rectangle'){
				area.css({'margin-bottom': '12px'});
			}else if (n == 'layer_ad' || n == 'FLB'){
				css = {'position': 'absolute', 'z-index': 1000, 'left': 184 + 'px', 'top': 367 + 'px'};
			}
			if (area.length){
				var cont = $('#' + n + '_temp');
				if (banner instanceof BusinessAd_Banner){
					cont = $('#Ads_BA_' + n + '_temp');
				}
				if (this.log && window.console){
					console.log('Moved ' + banner.type + ' to element ' + area.get(0), ' with id/class: ' + area.attr('id') + '/' + area.attr('class'));
				}
				var cNodes = cont.children();
				var shell = this.getAdShell(attrs, css);
				if (n == 'start_skyscraper' || n == 'skyscraper' || n == 'layer_ad' || n == 'wallpaper_sky' || n == 'SKY'){
					if ($.browser.msie){
						setTimeout(function(){
							area.append(shell);
							shell.append(cNodes);
							area.show();
						}, 2000);
					}else{
						area.append(shell);
						shell.append(cNodes);
						area.show();
					}
				}else{
					if ($.browser.msie){
						setTimeout(function(){
							area.show();
							area.append(shell);
							shell.append(cNodes);
						}, 2000);
					}else{
						area.show();
						area.append(shell);
						shell.append(cNodes);
					}
				}
				if (typeof wallpaperVariant != 'undefined'){
					this.wallpaperVariant(wallpaperVariant);
				}
			}else{
				if (this.log && window.console){
					console.log('*** CANCELED MOVE *** ' + banner.type + '. Element ' +  banner.target + ' not present!');
				}
			}
		}
	};

	//>> Abstract AdManager
		function Abstract_AdManager(url){
			this.name = 'AbstractAdManager';
			this.log = false;
			this.url = url;
			this.banner = [];
			this.lastStartBanner = null;
		}

		Abstract_AdManager.prototype.logging = function(on){
			this.log = false;
			if (on){
				this.log = true;
			}
			for (var i = 0; i < this.banner.length; ++i){
				this.banner[i].log = this.log;
			}
		};

		Abstract_AdManager.prototype.getCurrentCoId = function(){
			var loc = window.location.href;
			return loc.substring(loc.search(/_id_/) + 4, loc.search(/_.htm/));
		};

		Abstract_AdManager.prototype._inArray = function(num, arr){
			for (var i = 0; i < arr.length; ++i){
				if (num == arr[i]){
					return true;
				}
			}
			return false;
		};

		Abstract_AdManager.prototype.addBanner = function(bannerType, coInfo, bannerData, url){};
		Abstract_AdManager.prototype.writeBaseScript = function(){};
		Abstract_AdManager.prototype.startBanner = function(type){};
		Abstract_AdManager.prototype.endBanner = function(){};
	//<<


	//>> Abstract Banner
		function Abstract_Banner(url, type, coInfo){
			this.log = false;
			this.type = type;
			this.coInfo = coInfo;
			this.adServer = url;
		}

		Abstract_Banner.prototype.startBanner = function(){};
		Abstract_Banner.prototype.endBanner= function(){};
		Abstract_Banner.prototype.getAdSrc = function(layerAd){};
		Abstract_Banner.prototype.__repr__ = function(){};
	//<<


	//>> OpenAd ad manager implementation
		function OpenAd_AdManager(url){
			this.constructor(url);
			this.name = 'OpenAd';
		}
		OpenAd_AdManager.prototype = new Abstract_AdManager();

		OpenAd_AdManager.prototype.addBanner = function(bannerType, coInfo, bannerData, url){
			url = url ? url : this.url;
			this.banner.push(new OpenAd_Banner(url, bannerType, coInfo, bannerData));
		};

		OpenAd_AdManager.prototype.writeBaseScript = function(spcId){
			var str = '<script language="JavaScript" type="text/javascript" src="' + this.url + 'ad/adx.js"></script>';
			document.write(str);
			return str;
		};

		OpenAd_AdManager.prototype.startBanner = function(type){
			var published = false;
			var coId = this.getCurrentCoId();
			for (var i = 0; i < this.banner.length; ++i){
				var banner = this.banner[i];
				if (banner.type == type){
					published = true;
					if (banner.coInfo && banner.coInfo.flip){
						if (! this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else if(banner.coInfo){
						if (this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else{
						banner.startBanner();
						if (this.log && window.console){
							console.log(banner.__repr__());
						}
						this.lastStartBanner = banner;
					}
				}
			}
			if (! published){
				if (this.log && window.console){
					console.log('***Banner type ' + type + ' is not defined!***');
				}
			}
		};

		OpenAd_AdManager.prototype.endBanner = function(){
			if (this.lastStartBanner){
				this.lastStartBanner.endBanner();
				this.lastStartBanner = null;
			}
		};
	//<<


	//>> OpenAd banner implementation
		function OpenAd_Banner(url, type, coInfo, data){
			this.constructor(url, type, coInfo);
			this.zone = data[0];
			this.id = data[1];
			this.target = data[2];
		}

		OpenAd_Banner.prototype = new Abstract_Banner();

		OpenAd_Banner.prototype.startBanner = function(){
			document.write('<div id="' + this.type + '_temp" style="display: none;">');
			document.write('<script type="text/javascript" src="' + this.getAdSrc() + '"></script>');
			if (this.type != 'layer_ad'){
				document.write('<noscript>');
				document.write('<a href="' + this.adServer + 'ad/adclick.php?n=' + this.id + '" target="_blank">');
				document.write('<img src="' + this.adServer + 'ad/adview.php?what=zone:' + this.zone + '&amp;n=' + this.id + '" border="0" alt="" />');
				document.write('</a>');
				document.write('</noscript>');
			}
		};

		OpenAd_Banner.prototype.endBanner= function(){
			document.write('</div>');
		};

		OpenAd_Banner.prototype.getAdSrc = function(layerAd){
			if (this.type == 'layer_ad'){
				return this.adServer + 'ad/adlayer.php?what=zone:' + this.zone + '&amp;layerstyle=geocities&amp;align=right&amp;padding=2&amp;closetext=%5BSchlie%DFen%5D';
			}else{
				if (!document.phpAds_used){
					document.phpAds_used = ',';
				}
				phpAds_random = String(Math.random());
				phpAds_random = phpAds_random.substring(2,11);
				src = this.adServer + 'ad/adjs.php?n=' + phpAds_random;
				src += '&amp;what=zone:' + this.zone;
				src += '&amp;exclude=' + document.phpAds_used;
				if (document.referrer){
					src += '&amp;referer=' + escape(document.referrer);
				}
			}
			return src;
		};

		OpenAd_Banner.prototype.__repr__ = function(){
			var str = '';
			str += 'type: ' + this.type + ', ';
			if (this.coInfo){
				str += 'shown on: ' + this.coInfo.coIds + ', use invert list: ' + this.coInfo.flip + ', ';
			}else{
				str += 'shown on: all, ';
			}
			str += 'zone: ' + this.zone + ', ';
			str += 'id: ' + this.id + ', ';
			str += 'target: ' + this.target + ', ';
			str += 'ad server: ' + this.adServer + ', ';
			return str;
		};
	//<<


	//>> OpenX ad manager implementation
		function OpenX_AdManager(url){
			this.constructor(url);
			this.name = 'OpenX';
		}
		OpenX_AdManager.prototype = new Abstract_AdManager();

		OpenX_AdManager.prototype.addBanner = function(bannerType, coInfo, bannerData, url){
			url = url ? url : this.url;
			this.banner.push(new OpenX_Banner(url, bannerType, coInfo, bannerData));
		};

		OpenX_AdManager.prototype.writeBaseScript = function(spcId){
			// openX needs no base library to include.
			return null;
		};

		OpenX_AdManager.prototype.startBanner = function(type){
			var published = false;
			var coId = this.getCurrentCoId();
			for (var i = 0; i < this.banner.length; ++i){
				var banner = this.banner[i];
				if (banner.type == type){
					published = true;
					if (banner.coInfo && banner.coInfo.flip){
						if (! this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else if(banner.coInfo){
						if (this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else{
						banner.startBanner();
						if (this.log && window.console){
							console.log(banner.__repr__());
						}
						this.lastStartBanner = banner;
					}
				}
			}
			if (! published){
				if (this.log && window.console){
					console.log('***Banner type ' + type + ' is not defined!***');
				}
			}
		};

		OpenX_AdManager.prototype.endBanner = function(){
			if (this.lastStartBanner){
				this.lastStartBanner.endBanner();
				this.lastStartBanner = null;
			}
		};
	//<<


	//>> OpenX banner implementation
		function OpenX_Banner(url, type, coInfo, data){
			this.constructor(url, type, coInfo);
			this.zone = data[0];
			this.id = data[1];
			this.target = data[2];
		}

		OpenX_Banner.prototype = new Abstract_Banner();


		OpenX_Banner.prototype.startBanner = function(){
			var url = this.adServer;
			var adPhpFile = 'ad_new/www/delivery/ajs.php';
			var ckPhpFile = 'ad_new/www/delivery/ck.php';
			var avwPhpFile = 'ad_new/www/delivery/avw.php';
			var m3_u = url + adPhpFile;
			if (location.protocol=='https:'){
				url = url.replace(/http:/, 'https:');
				m3_u = url + adPhpFile;
			}
			var m3_r = Math.floor(Math.random()*99999999999);
			var str = '';
			str += '<div id="' + this.type + '_temp" style="display: none;">';
			str += '<scr' + 'ipt type="text/javascript" src="' + this.getAdSrc(m3_u, m3_r) + '"><\/scr' + 'ipt>';
			if (this.type != 'layer_ad'){
				// str += '<noscript>';
				// str += '<a href="' + url + ckPhpFile + '?n=' + this.id + '&amp;cb=' + m3_r + '" target="_blank">';
				// str += '<img src="' + url + avwPhpFile +'?zoneid=' + this.zone + '&amp;cb=' + m3_r + '&amp;n=' + this.id + '" border="0" alt="" />';
				// str += '</a>';
				// str += '</noscript>';
			}
			document.write(str);
		};

		OpenX_Banner.prototype.endBanner= function(){
			document.write('</div>');
		};

		OpenX_Banner.prototype.getAdSrc = function(m3_u, m3_r){
			if (!document.MAX_used){
				document.MAX_used = ',';
			}
			var str = m3_u;
			str += '?zoneid=' + this.zone;
			str += '&amp;cb=' + m3_r;
			if (document.MAX_used != ','){
				str += '&amp;exclude=' + document.MAX_used;
			}
			if (document.charset){
				str += '&amp;charset='+document.charset;
			}else if (document.characterSet){
				str += '&amp;charset='+document.characterSet;
			}
			str += '&amp;loc=' + escape(window.location);
			if (document.referrer){
				str += '&amp;referer=' + escape(document.referrer);
			}
			//if (document.context) str += '&context=' + escape(document.context);
			if (document.mmm_fo){
				str += '&amp;mmm_fo=1';
			}
			return str;
		};

		OpenX_Banner.prototype.__repr__ = function(){
			var str = '';
			str += 'type: ' + this.type + ', ';
			if (this.coInfo){
				str += 'shown on: ' + this.coInfo.coIds + ', use invert list: ' + this.coInfo.flip + ', ';
			}else{
				str += 'shown on: all, ';
			}
			str += 'zone: ' + this.zone + ', ';
			str += 'id: ' + this.id + ', ';
			str += 'target: ' + this.target + ', ';
			str += 'ad server: ' + this.adServer + ', ';
			return str;
		};
	//<<


	//>> OpenXSPC ad manager implementation
		function OpenXSPC_AdManager(url){
			this.constructor(url);
			this.name = 'OpenXSPC';
		}
		OpenXSPC_AdManager.prototype = new Abstract_AdManager();

		OpenXSPC_AdManager.prototype.addBanner = function(bannerType, coInfo, bannerData, url){
			if ($(bannerData[1])){
				url = url ? url : this.url;
				if (typeof OA_zones == 'undefined'){
					window.OA_zones = {};
				}
				OA_zones[bannerType] = bannerData[0];
				this.banner.push(new OpenXSPC_Banner(url, bannerType, coInfo, bannerData));
			}
		};

		OpenXSPC_AdManager.prototype.writeBaseScript = function(spcId){
			var str;
			if (spcId){
				str = '<script type="text/javascript" src="' + this.url + 'ad/www/delivery/spcjs.php?id=' + spcId + '"></script>';
				document.write(str);
				return str;
			}
			str = '<script type="text/javascript" src="' + this.url + 'ad/www/delivery/spcjs.php?id=1"></script>';
			document.write(str);
			return str;
		};

		OpenXSPC_AdManager.prototype.startBanner = function(type){
			var published = false;
			var coId = this.getCurrentCoId();
			for (var i = 0; i < this.banner.length; ++i){
				var banner = this.banner[i];
				if (banner.type == type){
					published = true;
					if (banner.coInfo && banner.coInfo.flip){
						if (! this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else if(banner.coInfo){
						if (this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else{
						banner.startBanner();
						if (this.log && window.console){
							console.log(banner.__repr__());
						}
						this.lastStartBanner = banner;
					}
				}
			}
			if (! published){
				if (this.log && window.console){
					console.log('***Banner type ' + type + ' is not defined!***');
				}
			}
		};

		OpenXSPC_AdManager.prototype.endBanner = function(){
			if (this.lastStartBanner){
				this.lastStartBanner.endBanner();
				this.lastStartBanner = null;
			}
		};
	//<<


	//>> OpenXSPC banner implementation
		function OpenXSPC_Banner(url, type, coInfo, data){
			this.constructor(url, type, coInfo);
			this.target = data[1];
		}
		OpenXSPC_Banner.prototype = new Abstract_Banner();


		OpenXSPC_Banner.prototype.startBanner = function(){
			var url = this.adServer;
			var str = '';
			str += '<div id="' + this.type + '_temp" style="display: block;">';
			str += OA_output[this.type];
			document.write(str);
		};

		OpenXSPC_Banner.prototype.endBanner= function(){
			document.write('</div>');
		};

		OpenXSPC_Banner.prototype.getAdSrc = function(){
			return null;
		};

		OpenXSPC_Banner.prototype.__repr__ = function(){
			var str = '';
			str += 'type: ' + this.type + ', ';
			if (this.coInfo){
				str += 'shown on: ' + this.coInfo.coIds + ', use invert list: ' + this.coInfo.flip + ', ';
			}else{
				str += 'shown on: all, ';
			}
			str += 'zone: ' + this.zone + ', ';
			str += 'id: ' + this.id + ', ';
			str += 'target: ' + this.target + ', ';
			str += 'ad server: ' + this.adServer + ', ';
			return str;
		};
	//<<


	//>> BusinessAd (www.businessad.de) ad manager implementation
		function BusinessAd_AdManager(url){
			this.constructor(url);
			this.name = 'BusinessAd';
		}
		BusinessAd_AdManager.prototype = new Abstract_AdManager();

		BusinessAd_AdManager.prototype.addBanner = function(bannerType, coInfo, target){
			if ($('#' + target).length || $('.' + target).length){
				this.banner.push(new BusinessAd_Banner(bannerType, coInfo, target));
			}
		};

		BusinessAd_AdManager.prototype.writeBaseScript = function(){
			var str = '<script type="text/javascript">' +
				'var Ads_BA_ADIDsite, Ads_BA_ADIDsection;' +
				'Ads_BA_ADIDsite = "mta-dialog.de";' +
				'Ads_BA_ADIDsection = "rotation";' +
				'Ads_BA_ADIDsection = "test";' + // only use for test purposes!
			'</script>' +
			'<script type="text/javascript" src="/xist4c/web/adlib.js"></script>';
			document.write(str);
			return str;
		};

		BusinessAd_AdManager.prototype.startBanner = function(type){
			var published = false;
			var coId = this.getCurrentCoId();
			for (var i = 0; i < this.banner.length; ++i){
				var banner = this.banner[i];
				if (banner.type == type){
					published = true;
					if (banner.coInfo && banner.coInfo.flip){
						if (! this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else if(banner.coInfo){
						if (this._inArray(coId, banner.coInfo.coIds)){
							banner.startBanner();
							if (this.log && window.console){
								console.log(banner.__repr__());
							}
							this.lastStartBanner = banner;
						}
					}else{
						banner.startBanner();
						if (this.log && window.console){
							console.log(banner.__repr__());
						}
						this.lastStartBanner = banner;
					}
				}
			}
			if (! published){
				if (this.log && window.console){
					console.log('***Banner type ' + type + ' is not defined!***');
				}
			}
		};

		BusinessAd_AdManager.prototype.endBanner = function(){
			if (this.lastStartBanner){
				this.lastStartBanner.endBanner();
				this.lastStartBanner = null;
			}
		};
	//<<


	//>> BusinessAd (www.businessad.de) banner implementation
		function BusinessAd_Banner(type, coInfo, target){
			this.constructor(null, type, coInfo);
			this.target = target;
		}
		BusinessAd_Banner.prototype = new Abstract_Banner();

		BusinessAd_Banner.prototype.startBanner = function(){
			var str = '';
			str += '<div id="Ads_BA_' + this.type + '_temp" style="display: block;">';
			str += '<script type="text/javascript">';
			str += 'Ads_BA_AD("' + this.type + '");';
			str += '</script>';
			document.write(str);
		};

		BusinessAd_Banner.prototype.endBanner= function(){
			document.write('</div>');
		};

		BusinessAd_Banner.prototype.getAdSrc = function(){
			return null;
		};

		BusinessAd_Banner.prototype.__repr__ = function(){
			var str = '';
			str += 'type: ' + this.type + ', ';
			if (this.coInfo){
				str += 'shown on: ' + this.coInfo.coIds + ', use invert list: ' + this.coInfo.flip + ', ';
			}else{
				str += 'shown on: all, ';
			}
			str += 'zone: ' + this.zone + ', ';
			str += 'id: ' + this.id + ', ';
			str += 'target: ' + this.target + ', ';
			str += 'ad server: ' + this.adServer + ', ';
			return str;
		};
	//<<
// <<


// >> Special Search Banner (require jQuery 1.2.6+) Version: rel-1-0-0
	SpecialSearchBanner = {
		chpyId: '/banner',
		phrase: null,
		targetEl: null,
		init: function(searchFieldId, target, phrase){
			this.targetEl = $('#' + target);
			this.phrase = $('#' + searchFieldId).val() || '';
			this.getBannerContent();
		},
		getBannerContent: function(){
			var url = this.chpyId + '/' + encodeURI(this.phrase);
			//var url = 'specialSearchBannerTest.text';
			var self = this;
			$.ajax({
				type: 'get',
				url: url,
				dataType: 'text',
				success: function(data, msg){
					self.changeTargetContent(data);
				},
				error: function(req, status, error){
					self.changeTargetContentError(error);
				}
			});
		},
		changeTargetContent: function(def){
			var adOuterStart = '<table cellpadding="0" cellspacing="0" class="specialSearchBanner"><tr><td class="adOuter"><span class="adPmt">Anzeige</span><br/>';
			var adOuterEnd = '</td></tr></table>';
			if (def.length > 1){
				this.targetEl.html(adOuterStart + def + adOuterEnd);
			}
		},
		changeTargetContentError: function(error){
			if (window.console){
				console.log('SpecialSearchBanner.getBannerContent ' + error);
			}
		}
	};
// <<


// >> Editorial office commendation (require jQuery 1.2.6+) Version: rel-1-0-0
	EditorialOfficeCommendation = {
		chpyId: '/commendation',
		phrase: null,
		targetEl: null,
		holderElm: null,
		init: function(searchFieldId, target, holderElmClassName, phrase){
			this.targetEl = $('#' + target);
			this.phrase = $('#' + searchFieldId).val() || '';
			this.holderElm = $('div.' + holderElmClassName).eq(0);
			this.getCommendationContent();
		},
		getCommendationContent: function(){
			var url = this.chpyId + '/' + encodeURI(this.phrase);
			//var url = 'specialSearchCommendationTest.text';
			var self = this;
			$.ajax({
				type: 'get',
				url: url,
				dataType: 'text',
				success: function(data, msg){
					self.changeTargetContent(data);
				},
				error: function(req, status, error){
					self.changeTargetContentError(error);
				}
			});
			var def = doSimpleXMLHttpRequest(url);
			def.addCallbacks(bind('changeTargetContent', this), bind('changeTargetContentError', this));
		},
		changeTargetContent: function(def){
			var adOuterStart = '<div class="commendationShell">';
			var adOuterEnd = '</div>';
			if (def.length > 1){
				this.targetEl.html(adOuterStart + def + adOuterEnd);
				this.holderElm.fadeIn('fast');
			}
		},
		changeTargetContentError: function(def){
			if (window.console){
				console.log('EditorialOfficeCommendation.getCommendationContent ' + def.error);
			}
		}
	};
// <<


// >> event calendar rubric banner switcher (require jQuery 1.2.6+ and LL_CookieTool) Version: rel-1-0-0
	CalRubricSwitcher = {
		adOuter: 'eventCalendarRubricAdOuter',
		ad: 'eventCalendarRubricAd',
		paramName: 'category',
		getUrlParam: function(name){
			var params = Utils.getUrlParamsAsJson(window.location.href);
			if (params[name]){
				return params[name];
			}
			return null;
		},
		createBanner: function(config){
			var param = this.getUrlParam(this.paramName);
			if (param && typeof config[param] == 'string'){
				if (document.cookie){
					LL_CookieTool.setCookies(
						new CookieData('eventCalendarAdId', param, document.domain, '/', null, null)
					);
				}
				this.createBannerLayout(config[param]);
			}else if (param && typeof config[param] == 'undefined'){
				LL_CookieTool.eraseCookie('eventCalendarAdId', document.domain, '/');
			}else if (! param){
				var cookieValue = LL_CookieTool.getCookie('eventCalendarAdId');
				if (cookieValue){
					this.createBannerLayout(config[cookieValue]);
				}
			}
		},
		createBannerLayout: function(src){
				var elm = $('<img src="' + src + '" alt=""/>');
				var ecrad = $('#' + this.ad).empty();
				ecrad.append(elm);
				$('#' + this.adOuter).show();
		}
	};
// <<


// >> media variants panel (require jQuery 1.2.6+) Version: rel-1-0-0
	MediaVariantsSwitcher = function(){
		this.buttons = [];
	};

	MediaVariantsSwitcher.prototype.addButton = function(button){
		if (button instanceof MvMenuButton){
			var self = this;
			$(button.domel).bind('click', function(e){
				self.switchLayout(null, this, e);
			});
			this.buttons.push(button);
			return button;
		}
		return null;
	};

	MediaVariantsSwitcher.prototype.activate = function(index){
		for (var i = 0; i < this.buttons.length; ++i){
			var b = this.buttons[i];
			if (i == index){
				b.toogle(1);
			}else{
				b.toggle(0);
			}
		}
	};

	MediaVariantsSwitcher.prototype.switchLayout = function(index, elm, e){
		for (var i = 0; i < this.buttons.length; ++i){
			var b = this.buttons[i];
			if (index > -1 && i == index){
				b.toggle(1);
			}else{
				if (e && b.domel == elm){
					b.toggle(1);
				}else{
					b.toggle(0);
				}
			}
		}
	};


	// standard menu button
	MvMenuButton = function(id, linkedelm){
		this.id = id;
		this.domel = $('#' + id);
		this.heresuffix = '_here';
		this.linkedelm = $('#' + linkedelm);
	};

	MvMenuButton.prototype.toggle = function(mode){
		if (mode == 1){
			this.domel.id = this.id + this.heresuffix;
			this.linkedelm.show();
			return mode;
		}
		this.domel.id = this.id;
		this.linkedelm.show();
		return mode;
	};


	// Abstract media
	MediaVariant = function(href){
		this.href = href;
	};

	MediaVariant.prototype.get = function(){}; //writes the special media code


	MediaVariantAudio = function(href){
		this.constructor(href);
	};
	MediaVariantAudio.prototype = new MediaVariant();

	MediaVariantAudio.prototype.get = function(){
		var flashvars = {
			'allowfullscreen':'false',
			'width':'240',
			'height':'20',
			'type':'sound',
			'file': this.href,
			'bufferlength':'10'
		},
		attributes = {},
		params = {};
		swfobject.embedSWF("/mediaplayer/player-licensed.swf", "mediaplayer", "240", "20", "9.0.0","/mediaplayer/expressInstall.swf", flashvars, params, attributes);
	};



	MediaVariantVideo = function(href){
		this.constructor(href);
	};
	MediaVariantVideo.prototype = new MediaVariant();

	MediaVariantVideo.prototype.get = function(){
		var flashvars = {
			'allowfullscreen':'false',
			'width':'240',
			'height':'198',
			'type':'video',
			'file': this.href
		},
		attributes = {},
		params = {};
		swfobject.embedSWF("/mediaplayer/player-licensed.swf", "mediaplayer", "240", "20", "7.0.0","/mediaplayer/expressInstall.swf", flashvars, params, attributes);
	};
// <<


// >>  Register shown company search Entries (require jQuery 1.2.6+) Version: rel-1-0-0
	RegisterShownCompanySearchEntries = function(){
		this.url = 'countcompanyentries';
		this.name = 'registerCompanySearchEntries';
		this.autoAction = true;
		this.filter(this.name);
		this.deferred = null;
	};
	RegisterShownCompanySearchEntries.prototype = new DefaultRelationHandler();

	RegisterShownCompanySearchEntries.prototype.makeCompanyIdStr = function(){
		var compStr = '';
		for (var i = 0; i < this.elms.length; ++i){
			compStr += this.elms[i].relAttrs[2];
			if ((i + 1) < this.elms.length){
				compStr += ',';
			}
		}
		return compStr;
	};

	RegisterShownCompanySearchEntries.prototype.getSearchPhrase = function(){
		var selm = document.getElementsByName('search_string');
		if (selm.length > 0){
			return selm[0].value;
		}
		return '';
	};

	RegisterShownCompanySearchEntries.prototype.action = function(){
		var wsid = this.elms.length > 0 ? this.elms[0].relAttrs[0] : '';
		var catid = this.elms.length > 0 ? this.elms[0].relAttrs[1] : '';
		var qParts = {
			'wsid': wsid,
			'catid': catid,
			'phrase': this.getSearchPhrase(),
			'companies': this.makeCompanyIdStr()
		};
		var self = this;
		$.ajax({
			type: 'get',
			url: AjaxURLManager.getUrlWithKey('countcompanyentries'),
			data: qParts,
			success: function(data, msg){
				self.actionSuccess(data);
			},
			error: function(req, status, error){
				self.actionError(qParts);
			}
		});
	};

	RegisterShownCompanySearchEntries.prototype.actionSuccess = function(e){
	};

	RegisterShownCompanySearchEntries.prototype.actionError = function(qParts, e){
		if (window.console){
			console.log('Company count error: ' + 'wsid = ' + qParts.wsid + ', phrase = ' + qParts.phrase + ', companies = ' + qParts.companies);
		}
	};
// <<


// >> SEO link transformer (require jQuery 1.2.6+) Version: rel-1-0-0 */
	SeoLinkTransformer = {
		transform: function(linklist, id, target){
			for (var i = 0; i < linklist.length; ++i){
				var l = linklist[i];
				var curElm = $('#' + id + i);
				var newElm = $(
					'<a>' + curElm.html() + '</a>'
				).attr({'href': l, 'target': target});
				curElm.relpaceWith(newElm);
			}
		}
	};
// <<


// >> NEW toggle container (requires jQuery 1.2.6 +) Version: rel-1-0-0
	jToggleContainer = $.extend(
		$.clone(LLObject),
		{
			create: function(options){
				var o = LLObject.create.call(this);
				o.items = [];
				o.defaults = {};
				if (options){
					$.extend(o.defaults, options);
				}
				for (var k in o.defaults){
					o[k] = o.defaults[k];
				}
				o.prepareToggler();
				return o;
			},
			prepareToggler: function(){
				var self = this;
				var shells = $('div.toggleOuterShell');
				shells.each(function(i){
					var toggleContent = $(this).find('div.toggleInnerShell');
					var toggler = $(this).find('a.toggler');
					toggler.toggle(
						function(){self.toggleElements(toggler, toggleContent, -1);},
						function(){self.toggleElements(toggler, toggleContent, 1);}
					);
				});
			},
			toggleElements: function(toggler, el, mode){
				toggler.removeClass('togglerClosed').removeClass('togglerOpen');
				var text = toggler.text();

				// close toggler
				if (mode == -1){
					toggler.text(text.replace(/schliessen\b/, "öffnen"));
					toggler.addClass('togglerClosed');
					if ($.browser.msie){
						el.fadeOut("normal");
					}else {
						el.slideUp("normal");
					}
				}
				// open toggler
				else{
					toggler.text(text.replace(/öffnen\b/, "schliessen"));
					toggler.addClass('togglerOpen');
					el.slideDown("normal");
				}
			}
		}
	);
	$(function(){jToggleContainer.create();});
// <<


// >> Handle article overall elements (requires jQuery 1.2.6 +) Version: rel-1-0-0
	ArticleOverallHandler = $.extend(
		$.clone(LLObject),
		{
			create: function(options){
				var o = LLObject.create.call(this);
				o.items = [];
				o.defaults = {};
				if (options){
					$.extend(o.defaults, options);
				}
				for (var k in o.defaults){
					o[k] = o.defaults[k];
				}
				o.moveSingleArticleInfos();
				o.moveDetailInfos();
				return o;
			},
			modifyTitleElement: function(el){
				var titleEl = el.find('div.massDataOuterTitle');
				var titleInner = titleEl.html();
				var titleInnerNew = '<table width="100%" class="articleRatingTitleEl"><tr>' +
					'<td class="title" width="100%">' + titleInner + '</td>' +
					'<td class="rating"></td>' +
				'</tr></table>';
				titleEl.html(titleInnerNew);
			},
			moveSingleArticleInfos: function(){
				var self = this;
				$('div.mdOverviewShell').each(function(i){
					if ($(this).find('div.articleShell').length < 2){
						self.modifyTitleElement($(this));
						var titleRating = $(this).find('table.articleRatingTitleEl td.rating');
						$(this).find('div.articleRatingSingleShell').appendTo(titleRating);
					}
				});
			},
			moveDetailInfos: function(){
				$('#articleRatingOverallShell').appendTo('#overallCommentInfo');
				this.sendOverallInfosToOtherElement(
					$('#articleRatingOverallShell td.comments'),
					$('#formAllCommentsInfo')
				);
			},
			sendOverallInfosToOtherElement: function(start, ziel){
				var startText = start.text();
				ziel.text(startText);
			}
		}
	);
	$(function(){ArticleOverallHandler.create();});

	PagedArticleOverallHandler = $.extend(
		$.clone(ArticleOverallHandler),
		{
			create: function(options){
				var o = ArticleOverallHandler.create.call(this);
				o.items = [];
				o.defaults = {};
				if (options){
					$.extend(o.defaults, options);
				}
				for (var k in o.defaults){
					o[k] = o.defaults[k];
				}
				o.moveSingleArticleInfos();
				return o;
			},
			moveSingleArticleInfos: function(){
				var self = this;
				$('div.articlePagerInner').each(function(i){
					var titleRating = $(this).find('table.pagedArticleRatingTitleEl td.rating');
					$(this).find('div.articleRatingSingleShell').appendTo(titleRating);
				});
			}
		}
	);
// <<


// >> Article rating
	ArticleRatingElement = $.extend(
		$.clone(LLObject),
		{
			create: function(options){
				var o = LLObject.create.call(this);
				o.prepareRatingShell();
				return o;
			},
			globalParams: ['HoppenstedtArticleRating', 'div.articleRatingShell', 'a.stars', '_stars'], // [cookiename, rating shell, stars, rating extension]
			ajaxPostUrl: 'http://www.plm-it-business.de/beitragbewertung/',
			prepareRatingShell: function(){
				var shell = $(this.globalParams[1]);
				var stars = shell.find(this.globalParams[2]);
				if (navigator.cookieEnabled === true){
					var articleID = this.getArticleID();
					if (articleID !== null){
						var cookieCont = eval(this.getCookieCont(this.globalParams[0]));
						var articleRated = false;
						var rating = null;
						for (var i = 0; i < cookieCont.length; ++i) {
							if (cookieCont[i][articleID]){
								articleRated = true;
								rating = cookieCont[i][articleID];
							}
						}
						if (articleRated){
							this.getStars(this.getSpecRatingSelector(rating));
							stars.each(function(i){
								$(this).bind('click', function(e){
									e.preventDefault();
								});
							});
						}
						else {
							this.bindingHandler("bind", stars, articleID);
						}
					}
					else {
						this.bindingHandler("click", stars, null);
					}
				}
				else {
					this.bindingHandler("click", stars, null);
				}
			},
			bindingHandler: function(method, elms, article){
				var self = this;
				if (method == "bind"){
					elms.each(function(i){
						$(this).bind('mouseover', function(e){
							self.getStars(this);
						});
						$(this).bind('mouseout', function(e){
							elms.find('img').removeClass('on');
						});
						$(this).bind('click', function(e){
							e.preventDefault();
							self.setCookie(elms, this, article);
						});
					});
				}
				else if (method == "unbind"){
					elms.each(function(i){
						$(this).unbind('mouseover');
						$(this).unbind('mouseout');
						$(this).unbind('click');
						$(this).bind('click', function(e){
							e.preventDefault();
						});
					});
				}
				else if (method == "click"){
					elms.each(function(i){
						$(this).bind('click', function(e){
							e.preventDefault();
						});
					});
				}
			},
			getSpecRatingSelector: function(rating){
				var selector = this.globalParams[1] + ' ' + this.globalParams[2] + ':eq(' + (rating -1) + ')';
				return selector;
			},
			getStars: function(el){
				var prevStars = $(el).prevAll(this.globalParams[2]).find('img');
				var actStar = $(el).find('img');
				actStar.addClass('on');
				prevStars.addClass('on');
			},
			getRating: function(el){
				var starsClass = $(el).attr('class');
				var ratingCount = starsClass.split(' ')[1].split(this.globalParams[3])[0];
				return ratingCount;
			},
			getArticleID: function(){
				var detail_id = '';
				if (Utils.isObject(XIST4C_GLOBALS)){
					if (XIST4C_GLOBALS.detail_id){
						detail_id = XIST4C_GLOBALS.detail_id;
					}
				}
				return detail_id;
			},
			getCookieCont: function(){
				var cookieCont = '[]';
				if ($.cookie(this.globalParams[0])){
					cookieCont = $.cookie(this.globalParams[0]);
				}
				return cookieCont;
			},
			setCookie: function(elms, star, articleID){
				var rating = this.getRating(star);
				var cookieCont = this.cutCookieContent(eval(this.getCookieCont()));
				var jsonText = {};

				jsonText[articleID] = rating;
				cookieCont.push(jsonText);
				$.cookie(this.globalParams[0], $.toJson(cookieCont), {'expires': 1000});
				this.bindingHandler("unbind", elms, articleID);
				this.getStars(this.getSpecRatingSelector(rating));
				this.sendRatingToCMS(articleID, rating);
			},
			cutCookieContent: function(cont){
				if (cont.length > 99){
					cont.shift();
				}
				return cont;
			},
			sendRatingToCMS: function(article, rating){
				var cont = 'btr_id=' + article + '&rating=' + rating;
				var url = this.ajaxPostUrl;
				$.ajax({
					type: 'POST',
					url: url,
					data: cont,
					success: function(data, msg){},
					error: function(req, status, error){}
				});
			}
		}
	);
	$(function(){ArticleRatingElement.create();});
// <<


// >> Article Pager
	ArticlePager = $.extend(
		$.clone(LLObject),
		{
			create: function(jsPagerID){
				var o = LLObject.create.call(this);
				this.prepareSliders(jsPagerID);
				return o;
			},
			prepareSliders: function(jsPagerID){
				var jsPager = eval("Pager_" + jsPagerID);
				var articlePager = $("div.articlePager_" + jsPagerID);
				articlePager.each(function(i){
						$(this).find('.pagerButton_prev a').bind('click', function(e){e.preventDefault();jsPager.slide(-1);}).css({'cursor': 'pointer'}).end()
					.find('.pagerButton_next a').css({'cursor': 'pointer'}).bind('click', function(e){e.preventDefault();jsPager.slide(1);});
				});
			}
		}
	);
// <<


// >> Hover effect for special elements
	HoverSpecialElements = $.extend(
		$.clone(LLObject),
		{
			create: function(){
				var o = LLObject.create.call(this);
				return o;
			},
			effect: function(hoverEl, styleEl){
				$(hoverEl).hover(
					function () {
						$(this).css('cursor', 'pointer').children(styleEl).addClass('hoverEffect');
					},
					function () {
						$(this).removeAttr('style').children(styleEl).removeClass('hoverEffect');
					}
				);
			}

		}
	);
	HoverEffects = HoverSpecialElements.create();
// <<


// >> Hide Add Teaser for special sites
	$(function(){$('div.hideAddTeaser').parents('div.teaserItem').hide();});
// <<


// >> Show/Hide Elements
	ShowHideElements = {
		elements: [],
		callback: null,
		register: function(el, inner, callback){
			this.elements.push([el, inner]);
			if (callback && typeof callback == 'function'){
				this.callback = callback;
			}
			this.action(el, inner);
		},
		action: function(el, inner){
			var self = this;
			$(el).hover(
				function(){
					$(this).find(inner).css('display', 'block');
					if (self.callback){
						self.callback.call(self, $(this), $(inner));
					}
				},
				function(){$(this).find(inner).hide();}
			);
		}
	};
// <<


// >> Toggle Elements
	ToggleElements = {
		register: function (toggler, toggleCont, firstMode) {
			this.action($(toggler), $(toggleCont), firstMode);
		},
		action: function (toggler, toggleCont, firstMode) {
			var self = this, mode;
			if (firstMode === "toggle_out") {
				modeOn = 1;
				modeOff = -1;
			}
			else {
				modeOn = -1;
				modeOff = 1;
			}

			toggler.toggle(
				function(){self.toggleElements(toggler, toggleCont, modeOn);},
				function(){self.toggleElements(toggler, toggleCont, modeOff);}
			);
		},
		toggleElements: function (toggler, toggleCont, mode) {
				toggler.removeClass('togglerClosed').removeClass('togglerOpen');
				// close toggler
				if (mode == -1){
					toggler.addClass('togglerClosed');
					if ($.browser.msie){
						$(toggleCont).fadeOut("normal");
					}else {
						$(toggleCont).slideUp("normal");
					}
				}
				// open toggler
				else{
					toggler.addClass('togglerOpen');
					$(toggleCont).slideDown("normal");
				}
		}
	};
// <<


// >> Social link handler
	SocialLinksHandler = $.extend(
		$.clone(LLObject),
		{
			create: function () {
				var o = LLObject.create.call(this);
				o.flyoutItems = $('div.[class^="socialLinksShell"] td.item_withFlyout div.inner');
				o.prepareLinks();
				return o;
			},
			prepareLinks: function () {
				var self = this;
				(this.flyoutItems).bind('mouseenter', function (e) {
					self.prepareShell($(this), "show");
				});
				(this.flyoutItems).bind('mouseleave', function (e) {
					self.prepareShell($(this), "hide");
				});
			},
			prepareShell: function (link, mode) {
				if (mode === "show") {
					link.find('div.prompt').addClass('prompt_flyout');
					link.find('div.flyout').show();
				}
				else {
					link.find('div.flyout').hide();
					link.find('div.prompt').removeClass('prompt_flyout');
				}
			}
		}
	);
	$(function(){SocialLinksHandler.create();});
// <<


// >> Company info handler for Articles
	CompanyInfoHandler = $.extend(
		$.clone(LLObject),
		{
			create: function (sty) {
				var o = LLObject.create.call(this);
				o.outerShell = $('div.addInfoOuter_companyInfo');
				o.handleJSON(sty);
				return o;
			},
			getArticleID: function(){
				var detail_id = '';
				if (Utils.isObject(XIST4C_GLOBALS)){
					if (XIST4C_GLOBALS.detail_id){
						detail_id = XIST4C_GLOBALS.detail_id;
					}
				}
				return detail_id;
			},
			handleJSON: function (sty) {
				var self = this, url = null;
				if (sty === 'test') {
					url = "companyInfoTest.text";
				} else if (sty === 'news') {
					url = "/datagateway/companies4news/" + this.getArticleID();
				} else {
					url = "/datagateway/companies4article/" + this.getArticleID();
				}

				$.getJSON(url,
					function (data, textStatus) {
						self.setItems(data);
					}
				);
			},
			itemsLayout: function (url, prompt, extLink) {
				var item;
				if (extLink === true) {
					button = '';
				} else {
					button = '<div class="stdButton stdLargeButton">' +
						'<a href="' + url + '" target="_blank" class="buttonInner"><span>zum Firmenprofil</span></a>' +
					'</div>';
				}

				item = '<div class="item">' +
					'<a href="' + url + '" target="_blank" class="itemTitle">' + prompt + '</a>' +
					button +
				'</div>';
				return item;
			},
			setItems: function (data) {
				var targetShell, url, prompt, i, item,
					self = this;
				targetShell = this.outerShell.find('div.cont');
				if (data) {
					for (i = 0; i < data.length; i += 1) {
						item = data[i];
						targetShell.append(self.itemsLayout(item.url, item.name, item.extlink));
					}
					this.outerShell.show();
				}
			}
		}
	);
// <<


// >> Login placeholder handler (for article detail view)
	LoginPlaceholderHandler = $.extend(
		$.clone(LLObject),
		{
			create: function () {
				var o = LLObject.create.call(this);
				o.phTop = $('#loginPlaceholderEl_top');
				o.phBottom = $('#loginPlaceholderEl_bottom');
				o.contentStopperElClass = 'bottomContentPager';
				if ($('div.massDataOuterShell #loginPlaceholderEl_top').length !== 0) {
					o.getLoginContent();
				}
				return o;
			},
			getLoginContent: function () {
				var self = this,
					loginUrl = '/Login.htm';
				if ((this.phTop).find('a.buttonInner').length !== 0) {
					loginUrl = (this.phTop).find('a.buttonInner').attr('href');
				}

				$.ajax({
					url: loginUrl,
					dataType: "html",
					success: function (data, msg) {
						self.splitLoginContent($(data));
					},
					error: function (req, status, error) {}
				});
			},
			splitLoginContent: function (loginCont) {
				var loginElms, partOne, partTwo, self = this, i, el;
				loginElms = $(loginCont.find('td.contentColumn div.contColDes5').eq(0)).find('div.co_login_part1').eq(0).nextAll();
				partOne = [];
				partTwo = [];
				for (i = 0; i < loginElms.length; i += 1) {
					el = $(loginElms[i]);
					if (el.attr('class') === self.contentStopperElClass) {
						break;
					}
					else if (el.prevAll('div.co_login_part2').length !== 0) {
						partTwo.push(el);
					}
					else if (el.attr('class') !== 'co_login_part2') {
						partOne.push(el);
					}
				}
				this.setContent(partOne, partTwo);
			},
			setContent: function (partOne, partTwo) {
				var self = this;
				this.phTop.empty();
				this.phBottom.empty();
				$(partOne).each(function (i) {
					self.phTop.append($(this));
				});
				$(partTwo).each(function (i) {
					self.phBottom.append($(this));
				});
				this.phBottom.append(this.staticScripts());
				this.showAltText();
			},
			showAltText: function() {
				$('#loginContParaTitle').hide();
				$('#loginContParaDetailTitle').show();
			},
			staticScripts: function() {
				var scripts = $("<script type=\"text/javascript\" language=\"javascript\">$(function(){ToggleElements.register('div.loginInfoTextShell img.infoIcon', 'div.co_loginFlyout', 'toggle_out');});</script>"+
					"<script type=\"text/javascript\" language=\"javascript\">handleFieldPrompt(['div.loginForm input:text','div.loginForm input:password']);</script>"
				);
				return scripts;
			}
		}
	);
// <<


// >> Social media add control handler (for article detail view)
	SocialMediaAddControlHandler = $.extend(
		$.clone(LLObject),
		{
			create: function () {
				var o = LLObject.create.call(this);
				o.addControlTarget = $('#socialMediaAddControllShell');
				o.socialLinkShell = $('div.socialLinksShell_addControl').eq(0);
				o.moveSocialMediaShell();
				return o;
			},
			moveSocialMediaShell: function () {
				var self=this;
				setTimeout(function(){
					self.socialLinkShell.find('script').remove();
					self.addControlTarget.replaceWith(self.socialLinkShell);
					self.adaptedAddControlShell();
					self.socialLinkShell.show();
				},1000);
			},
			adaptedAddControlShell: function () {
				$('div.topAddContrContainer').addClass('topAddContrContainer_withSocialMedia');
			}
		}
	);
// <<


// >> businessAd Banner controller
	businessAdBannerController = {
		checkNoBanner: function(banner, cssClassForHideElement){
			Utils.busyWait(
				function(intervalObj){
					if (banner.find('.no_banner_found').length){
						return true;
					}
					return false;
				},
				100,
				200,
				function(intervalObj){
					banner.parents('.' + cssClassForHideElement).hide();
				}
			);
		}
	};
// <<


// >> Simple Tag List (copy of PLMIT's market overview element)
	SimpleTagListHandler = $.extend(
		$.clone(LLObject),
		{
			create: function (opts) {
				var o = LLObject.create.call(this);
				o.defaults = {
					target: $('#simpleTagList'),
					filterData: null
				};
				if(Utils.isObject(opts)){
					$.extend(o.defaults, opts);
				}
				return o;
			},
			makeOuterLayout: function(){
				var lay = $(
					'<ul class="js_simpleTagListOuter">' +
					'</ul>'
				);
				return lay;
			},
			makeItemLayout: function(){
				var lay = $(
					'<li class="js_simpleTagListItem">' +
						'<div class="viewport"><span class="count"></span></div>' +
						'<a href="#"></a>' +
					'</li>'
				);
				return lay;
			},
			makeItemHereLayout: function(){
				var lay = $(
					'<li class="js_simpleTagListItem js_simpleTagListItem-here">' +
						'<div class="viewport"><span class="count"></span></div>' +
						'<div class="itemHere"></div>' +
					'</li>'
				);
				return lay;
			},
			prepareEl: function(){
				var data = this.defaults.data, target = this.defaults.target, item, dataItem,
				panel = this.makeOuterLayout(), self = this, backlink = data.backlink;
				target.append(panel);
				target = panel;
				if (backlink){
					item = self.makeItemLayout();
					item.find('a').text($.lang('simpleTagList_backlinkText')).attr({
						href: backlink
					}).css({
						fontWeight: 'bold'
					});
					target.append(item);
				}
				for (i = 0; i < data.items.length; i+=1){
					dataItem = data.items[i];
					if (dataItem.here){
						item = self.makeItemHereLayout();
						item.find('.itemHere').text(dataItem.name);
					}else{
						item = self.makeItemLayout();
						item.find('a').text(dataItem.name).attr({
							href: dataItem.link
						});
					}
					item.find('.count').text('(' + dataItem.count + ')');
					target.append(item);
				}
			},
			make: function () {
				this.prepareEl();
			}
		}
	);
// <<


// >> Translation Popup (engine translation prompts)
	TranslationPopupHandler = $.extend(
		$.clone(LLObject),
		{
			init: function (opts) {
				var o = LLObject.create.call(this);
				o.defaults = {
					items: $('.translate')
				};
				if (Utils.isObject(opts)) {
					$.extend(o.defaults, opts);
				}
				o.collectItems();
				return o;
			},
			popupLay: function (pmt) {
				var lay = '';
				if (pmt) {
					lay = '<span class="jsPopup"><span class="jsPopupInner">' + pmt + '</span></span>';
				}
				return lay;
			},
			makePopup: function (el) {
				var translation = el.attr('title');
				el.prepend(this.popupLay(translation));
				el.removeAttr('title');
			},
			collectItems: function () {
				var self = this;
				if (this.defaults.items.length > 0) {
					this.defaults.items.each(
						function (i) {
							if ($(this).attr('title')) {
								self.makePopup($(this));
								$(this).bind({
									'mouseenter.TranslationPopupHandler': function (e) {
										$(this).find(".jsPopup").css('display', 'block');
									},
									'mouseleave.TranslationPopupHandler': function (e) {
										$(this).find(".jsPopup").hide();
									}
								});
							}
						}
					);
				}
			}
		}
	);
// <<


// >> TabSwitcher (company premium profile)
	TabSwitcher = $.extend(
		$.clone(LLObject),
		{
			init: function (opts) {
				var o = LLObject.create.call(this);
				o.defaults = {
					targetTabShell: null,
					triggerEl: null,
					triggerAttr: 'href'
				};
				if (Utils.isObject(opts)) {
					$.extend(o.defaults, opts);
				}
				o.bindItems();
				return o;
			},
			bindItems: function () {
				var self = this, triggerValue;
				if (this.defaults.targetTabShell && this.defaults.triggerEl &&
					(this.defaults.targetTabShell.length > 0) && (this.defaults.triggerEl.length > 0)) {
					this.defaults.triggerEl.bind(
						'click.TabSwitcher',
						function (e) {
							e.preventDefault();
							e.stopPropagation();
							triggerValue = self.getTabSelector($(this).attr(self.defaults.triggerAttr));
							self.defaults.targetTabShell.tabs('select', triggerValue);
							return false;
						}
					);
				}
			},
			getTabSelector: function (str) {
				if (str) {
					return str.charAt(str.length - 1);
				}
				return null;
			}
		}
	);
// <<
