﻿

/*
		missing mixin.
*/


//  [document.getRenderEngineType]            - [http://www.pseliger.de/jsExtendedApi/jsApi.bundles.DOM.getters.dev.js] - refactored code according to an even better render engine detection as of august 14-2008:
(function () {
  var elmHTMLStyle = (document.documentElement || document.getElementsByTagName("html")[0]).style;/*

  document.isRenderEngineGECKO = (function () {return ((typeof elmHTMLStyle.MozOpacity!=="undefined")&&(typeof elmHTMLStyle.MozOpacity==="string"));});*/
  document.isRenderEngineKHTML = (function () {return ((typeof elmHTMLStyle.KhtmlOpacity!=="undefined")&&(typeof elmHTMLStyle.KhtmlOpacity==="string"));});/*
  document.isRenderEnginePRESTO = (function () {return ((typeof elmHTMLStyle.opPhonemes!=="undefined")&&(typeof elmHTMLStyle.opPhonemes==="string"));});*/
  document.isRenderEngineMSIE = (function () { return ((typeof elmHTMLStyle.behavior !== "undefined") && (typeof elmHTMLStyle.behavior === "string"));});/*

  document.getRenderEngineType = (function () {return ((document.isRenderEngineGECKO())?("gecko"):((document.isRenderEngineKHTML())?("khtml"):((document.isRenderEnginePRESTO())?("presto"):((document.isRenderEngineMSIE())?("msie"):(window.undefined)))));});*/

  delete elmHTMLStyle;
  delete arguments.callee;
})();

if (((typeof RegExp.prototype.compile != "function") && (typeof RegExp.prototype.compile != "object")) || document.isRenderEngineKHTML()) {RegExp.prototype.compile = (function () {return this.constructor.apply(this,arguments);});} // due to a safari bug that does not implement the native JavaScript RegExp method [RegExp.compile] properly.

//  [Array.normalize]    - [http://www.pseliger.de/jsExtendedApi/jsApi.Array.normalize.dev.js] as of november 11-2004:
if (typeof Array.prototype.normalize != "function") {Array.prototype.normalize = function() {var arr=this,i=0,k=0;while(i<arr.length){k=i+1;while(k<arr.length){if(arr[i]===arr[k]){arr=arr.slice(0,k).concat(arr.slice(k+1,arr.length));--k;}++k;}++i;}for(i=0;i<arr.length;++i){this[i]=arr[i];}this.length=arr.length;};}

//  [Array.prototypes.iterators.accessors]    - [http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozExtensions.dev.js] as of august 18-2005:
if (typeof Array.prototype.indexOf != "function") {Array.prototype.indexOf = function (obj, idx) {idx=((idx&&isNaN(Number(idx)))?(parseInt(Number(idx),10)):(0));idx=((idx<0)?(Math.max(0,(this.length+idx))):(idx));var k,i=-1;for(k=idx;k<this.length;++k){if(this[k]===obj){i=k;break;}}return i;};}/*
if (typeof Array.prototype.lastIndexOf != "function") {Array.prototype.lastIndexOf = function (obj, idx) {idx=((idx&&isNaN(Number(idx)))?(parseInt(Number(idx),10)):(this.length-1));idx=((idx<0)?(Math.max(0,(this.length+idx))):(idx));idx=((idx>this.length)?(this.length):(idx));var k,i=-1;for(k=idx;k>=0;--k){if(this[k]===obj){i=k;break;}}return i;};}*/
if (typeof Array.prototype.contains != "function") {Array.prototype.contains = function (obj) {return(this.indexOf(obj)>=0);};}
if (typeof Array.prototype.forEach != "function") {Array.prototype.forEach = function (fct, thisArr) {if(typeof fct=="function"){thisArr=((thisArr&&(typeof thisArr=="object")&&(thisArr instanceof Array))?(thisArr):(null));var i,l=this.length;for(i=0;i<l;++i){fct.call(thisArr,this[i],i,this);}}};}
if (typeof Array.prototype.every != "function") {Array.prototype.every = function (fct, thisArr) {var isAnd=false;if(typeof fct=="function"){thisArr=((thisArr&&(typeof thisArr=="object")&&(thisArr instanceof Array))?(thisArr):(null));isAnd=true;var i,l=this.length;for(i=0;i<l;++i){if(!fct.call(thisArr,this[i],i,this)){isAnd=false;break;}}}return isAnd;};}
if (typeof Array.prototype.some != "function") {Array.prototype.some = function (fct, thisArr) {var isOr=false;if(typeof fct=="function"){thisArr=((thisArr&&(typeof thisArr=="object")&&(thisArr instanceof Array))?(thisArr):(null));var i,l=this.length;for(i=0;i<l;++i){if(fct.call(thisArr,this[i],i,this)){isOr=true;break;}}}return isOr;};}
if (typeof Array.prototype.map != "function") {Array.prototype.map = function (fct, thisArr) {var arr=[];if(typeof fct=="function"){thisArr=((thisArr&&(typeof thisArr=="object")&&(thisArr instanceof Array))?(thisArr):(null));var i,l=this.length;for(i=0;i<l;++i){arr.push(fct.call(thisArr,this[i],i,this));}}return arr;};}
if (typeof Array.prototype.filter != "function") {Array.prototype.filter = function (fct, thisArr) {var arr=[];if(typeof fct=="function"){thisArr=((thisArr&&(typeof thisArr=="object")&&(thisArr instanceof Array))?(thisArr):(null));var i,l=this.length;for(i=0;i<l;++i){if(fct.call(thisArr,this[i],i,this)){arr.push(this[i]);}}}return arr;};}

//  [Array.generics.iterators.accessors]      - [http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozGenerics.dev.js] september 23-2006:
Array.indexOf = function (obj, objLookingFor, idx) {var k,i=-1,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));idx=((idx&&isNaN(Number(idx)))?(parseInt(Number(idx),10)):(0));idx=((idx<0)?(Math.max(0,(l+idx))):(idx));for(k=idx;k<l;++k){if((obj[k]||obj.item(k))===objLookingFor){i=k;break;}}return i;};/*
Array.lastIndexOf = function (obj, objLookingFor, idx) {var k,i=-1,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));idx=((idx&&isNaN(Number(idx)))?(parseInt(Number(idx),10)):(l-1));idx=((idx<0)?(Math.max(0,(l+idx))):(idx));idx=((idx>l)?(l):(idx));for(k=idx;k>=0;--k){if((obj[k]||obj.item(k))===objLookingFor){i=k;break;}}return i;};*/
Array.contains = function (obj, objLookingFor) {return(Array.indexOf(obj,objLookingFor)>=0);};
Array.forEach = function (obj, fct) {if(typeof fct=="function"){var i,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));for(i=0;i<l;++i){fct.call(null,(obj[i]||obj.item(i)),i,obj);}}};
Array.every = function (obj, fct) {var isAnd=false;if(typeof fct=="function"){isAnd=true;var i,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));for(i=0;i<l;++i){if(!fct.call(null,(obj[i]||obj.item(i)),i,obj)){isAnd=false;break;}}}return isAnd;};
Array.some = function (obj, fct) {var isOr=false;if(typeof fct=="function"){var i,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));for(i=0;i<l;++i){if(fct.call(null,(obj[i]||obj.item(i)),i,obj)){isOr=true;break;}}}return isOr;};
Array.map = function (obj, fct) {var arr=[];if(typeof fct=="function"){var i,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));for(i=0;i<l;++i){arr.push(fct.call(null,(obj[i]||obj.item(i)),i,obj));}}return arr;};
Array.filter = function (obj, fct) {var arr=[];if(typeof fct=="function"){var i,l=(((obj instanceof Array)||((typeof obj.length=="number")&&((typeof obj.item=="function")||(typeof obj.item=="object")||(typeof obj.item=="string")||(obj instanceof window.NodeList)||(obj instanceof window.HTMLCollection))))?(obj.length):(0));for(i=0;i<l;++i){if(fct.call(null,(obj[i]||obj.item(i)),i,obj)){arr.push(obj[i]||obj.item(i));}}}return arr;};

String.prototype.toRegExpString = function () {return this.replace(/([\^\$\.\*\+\?\=\!\:\|\\\/\(\)\[\]\{\}])/g,"\\$1");};

//  [document.getElmPosAbsolute]              - [http://www.pseliger.de/jsExtendedApi/jsApi.bundles.DOM.getters.dev.js] as of august 14-2008 and introduced only since there has been need to it once awhile:
document.getElmPosAbsolute = (function (elm) {var x=0,y=0;if(elm&&elm.offsetParent){x=elm.offsetLeft;y=elm.offsetTop;elm=elm.offsetParent;while(elm){x=x+elm.offsetLeft;y=y+elm.offsetTop;elm=elm.offsetParent;}}return{"left":x,"top":y};});



if (typeof Object.prototype.toSource != "function") {Object.prototype.toSource = Object.prototype.toString;}





(function () { // anonymus application context



	//	[http://www.pseliger.de/jsExtendedApi/jsApi.EventDispatcher.js] - june 04-2007 - DOM Level 2 alike event handling available to pure JavaScript objects that are in neither case bound onto the browsers UI(/DOM).
	var EventDispatcher=new(function(){this.constructor=Object;var Event=(function(target,type){this.constructor=arguments.callee;this.initEvent=(function(target,type){this.target=target;this.type=type;this.timeStamp=new Date();});this.initEvent.apply(this,arguments);});var EventListener=(function(thisTarget,type,handler){this.constructor=arguments.callee;var defaultEvent=new Event(thisTarget,type);this.handleEvent=(function(evt){if(typeof evt==="string"){evt={target:defaultEvent.target,type:defaultEvent.type,timeStamp:defaultEvent.timeStamp};}else{evt.target=((evt.target&&(typeof evt.target==="object")&&(evt.target instanceof EventTarget))?(evt.target):(defaultEvent.target));evt.type=((evt.type&&((typeof evt.type==="string")||(evt.type instanceof String)))?(evt.type):(defaultEvent.type));evt.timeStamp=defaultEvent.timeStamp;}handler(evt);});});var EventTarget=(function(){this.constructor=arguments.callee;var events={};this.addEventListener=(function(type,handler){if(type&&handler&&((typeof type==="string")||(type instanceof String))&&(typeof handler==="function")){var listener=new EventListener(this,type,handler);if(events[type]){var handlers=events[type].handlers;var listeners=events[type].listeners;if(!handlers.contains(handler)){handlers.push(handler);listeners.push(listener);}}else{var event=events[type]={};event.handlers=[];event.listeners=[];event.handlers.push(handler);event.listeners.push(listener);}listener=null;delete listener;}});this.removeEventListener=(function(type,handler){if(type&&handler&&((typeof type==="string")||(type instanceof String))&&(typeof handler==="function")){if(events[type]){var handlers=events[type].handlers;var listeners=events[type].listeners;var idx=handlers.indexOf(handler);handlers.remove(handler);listeners.remove(listeners[idx]);}}});this.dispatchEvent=(function(evt){var successfully=false;var type;type=((evt)?((typeof evt==="object")?((typeof evt.type==="string")?(evt.type):(type)):((typeof evt==="string")?(evt):(type))):(type));if(type){var listeners=(events[type]&&events[type].listeners);if(listeners&&(listeners.length>=1)){listeners.forEach(function(elm){elm.handleEvent(evt);});successfully=true;}}return successfully;});});this.register=(function(obj){EventTarget.call(obj);});this.unsubscribe=(function(obj){if(typeof obj.addEventListener==="function"){delete obj.addEventListener;}if(typeof obj.removeEventListener==="function"){delete obj.removeEventListener;}if(typeof obj.dispatchEvent==="function"){delete obj.dispatchEvent;}});})();
	var DOM=(function(){var EventDispatcher=(function(){var h=(function(c,d){this.constructor=arguments.callee;this.initEvent=(function(a,b){this.target=a;this.type=b;this.timeStamp=new Date()});this.initEvent.apply(this,arguments)});var i=(function(b,c,d){this.constructor=arguments.callee;var e=new h(b,c);this.handleEvent=(function(a){if(typeof a==="string"){a={target:e.target,type:e.type,timeStamp:e.timeStamp}}else{a.target=((a.target&&(typeof a.target==="object")&&(a.target instanceof j))?(a.target):(e.target));a.type=((a.type&&((typeof a.type==="string")||(a.type instanceof String)))?(a.type):(e.type));a.timeStamp=e.timeStamp}d(a)})});var j=(function(){this.constructor=arguments.callee;var g={};this.addEventListener=(function(a,b){if(a&&b&&((typeof a==="string")||(a instanceof String))&&(typeof b==="function")){var c=new i(this,a,b);if(g[a]){var d=g[a].handlers;var e=g[a].listeners;if(!d.contains(b)){d.push(b);e.push(c)}}else{var f=g[a]={};f.handlers=[];f.listeners=[];f.handlers.push(b);f.listeners.push(c)}c=null;delete c}});this.removeEventListener=(function(a,b){if(a&&b&&((typeof a==="string")||(a instanceof String))&&(typeof b==="function")){if(g[a]){var c=g[a].handlers;var d=g[a].listeners;var e=c.indexOf(b);c.remove(b);d.remove(d[e])}}});this.dispatchEvent=(function(b){var c=false;var d;d=((b)?((typeof b==="object")?((typeof b.type==="string")?(b.type):(d)):((typeof b==="string")?(b):(d))):(d));if(d){var e=(g[d]&&g[d].listeners);if(e&&(e.length>=1)){e.forEach(function(a){a.handleEvent(b)});c=true}}return c})});return{register:(function(a){j.call(a)}),unsubscribe:(function(a){if(typeof a.addEventListener==="function"){delete a.addEventListener}if(typeof a.removeEventListener==="function"){delete a.removeEventListener}if(typeof a.dispatchEvent==="function"){delete a.dispatchEvent}})}})();var dom={};var dispatchContentLoaded,dispatchDocumentReady;var isDomContentLoaded;var liveElementList=document.getElementsByTagName("*");var docRoot=(document.documentElement||liveElementList[0]||document.getElementsByTagName("html")[0]);var timeoutIdObserve,isElementsObserving,isImageElementLoaded,elementsSubscribersMap={};EventDispatcher.register(dom);if(window.removeEventListener){dispatchContentLoaded=(function(){window.removeEventListener("load",dispatchContentLoaded,false);clearTimeout(timeoutIdObserve);isDomContentLoaded=true;observeElementsLoadingState(false);dom.dispatchEvent("onContentLoaded");});dispatchDocumentReady=(function(){dom.dispatchEvent("onDocumentReady");});}else if(window.detachEvent){dispatchContentLoaded=(function(){window.detachEvent("onload",dispatchContentLoaded);clearTimeout(timeoutIdObserve);isDomContentLoaded=true;if(arguments.callee.hasAlreadyBeenRun){return;}arguments.callee.hasAlreadyBeenRun=true;observeElementsLoadingState(false);dom.dispatchEvent("onContentLoaded");});dispatchDocumentReady=(function(){if(!isDomContentLoaded){dispatchContentLoaded();}dom.dispatchEvent("onDocumentReady");});}isImageElementLoaded=(function(elm){return elm.complete;});var isElementLoaded=(function(elm){var isLoaded=false;if(elm===docRoot){isLoaded=isDomContentLoaded;}else{if(elm.nodeName.toLowerCase()=="img"){isLoaded=isImageElementLoaded(elm);}else{isLoaded=((elm.parentNode.lastChild!==elm)||isElementLoaded(elm.parentNode));}}return isLoaded;});var observeElementsLoadingState=(function(isRecursive){clearTimeout(timeoutIdObserve);var obj;Array.forEach(liveElementList,(function(elm){obj=elementsSubscribersMap[String(elm.id)];if(obj){if(obj.onAvailableCallback&&!obj.isAvailableAlreadyCalled){obj.isAvailableAlreadyCalled=true;obj.onAvailableCallback(elm);}if(obj.onLoadedCallback&&!obj.isLoadedAlreadyCalled&&isElementLoaded(elm)){obj.isLoadedAlreadyCalled=true;obj.onLoadedCallback(elm);}}}));if(isRecursive){timeoutIdObserve=setTimeout((function(){observeElementsLoadingState(true);}),20);}});dom.onElementAvailable=(function(elmId,callback){if(typeof callback=="function"){elmId=String(elmId);var obj=elementsSubscribersMap[elmId];if(obj){obj.onAvailableCallback=callback;}else{elementsSubscribersMap[elmId]={"onAvailableCallback":callback,"isAvailableAlreadyCalled":false};}if(!isElementsObserving){observeElementsLoadingState(true);isElementsObserving=true;}}});dom.onElementLoaded=(function(elmId,callback){if(typeof callback=="function"){elmId=String(elmId);var obj=elementsSubscribersMap[elmId];if(obj){obj.onLoadedCallback=callback;}else{elementsSubscribersMap[elmId]={"onLoadedCallback":callback,"isLoadedAlreadyCalled":false};}if(!isElementsObserving){observeElementsLoadingState(true);isElementsObserving=true;}}});if(window.addEventListener){window.addEventListener("DOMContentLoaded",dispatchContentLoaded,false);window.addEventListener("load",dispatchContentLoaded,false);window.addEventListener("load",dispatchDocumentReady,false);}else if(window.attachEvent){document.write("<scr"+"ipt type=\"text/javascript\" defer=\"defer\" id=\"deferedTriggerOfOnContentLoaded\" src=\"\/\/:\"><\/scr"+"ipt>");var elm=document.getElementsByTagName("script")["deferedTriggerOfOnContentLoaded"];if(elm){elm.onreadystatechange=(function(){if(this.readyState=="complete"){dispatchContentLoaded();this.parentNode.removeChild(this);}});}else{dom.triggerOnContentLoaded=(function(){dispatchContentLoaded();delete arguments.callee;});document.write("<scr"+"ipt type=\"text/javascript\" defer=\"defer\">DOM.triggerOnContentLoaded();<\/scr"+"ipt>");}window.attachEvent("onload",dispatchContentLoaded);window.attachEvent("onload",dispatchDocumentReady);}return dom;})();


	var Application = (YAHOO.AOWLB || YAHOO.namespace("AOWLB")); // var Application = YAHOO.namespace("AOWLB");
	//	Application.importSlideShowData;
	//	Application.importShortlistWording;
	//	Application.importDestinationServiceUrl;

	var Logger, Lang, Get, Dom, Evt, Elm, Anim, Easing/*, Slct*/, Calendar, IntervalCalendar;

	var elmBody, elmResultList, elmOverlay;

	var valueOfOneDaysDurationInMSec = (60 * 60 * 24 * 1000);

	var regXTrim = (/^\s+|\s+$/), regXShrink = (/\s+/g), regXSplitAtComma = (/,/);



//console = (((typeof console != "undefined") && console.log) ? (console) : ({log:(function(msg){/*alert(msg);*/})}));
	if (typeof console == "undefined") { // the oneliner above does not work anymore within mozilla firefox 3.x

		var console = {log:(function(msg){/*alert(msg);*/})};
	}



	var ViewController = (function () { // [ViewController] Singleton.


		var elmViews, elmResultsYahoo, forceRerendering = document.isRenderEngineMSIE();
		var initialViewType, transaction, serviceUrl = "/search"; // actually this service address should be imported as it is already practiced by the [[AutocompleteController]]


		var changeView = (function (elm) {

			var elmLiYahoo = new Elm(elm.parentNode);
			if (!elmLiYahoo.hasClass("selected")) {

				var viewType = elmLiYahoo.get("className");
				elmResultsYahoo.set("className", (viewType));

				Array.forEach(elmViews.getElementsByTagName("li"), (function (elm/*, idx, arr*/) {

					 Dom.removeClass(elm, "selected");
				}));
				elmLiYahoo.addClass("selected");


				ViewController.dispatchEvent({type: "onViewChanged", viewType: viewType});


				if (forceRerendering) {
					setTimeout((function () {elmResultsYahoo.setStyle("zoom", "");}), 30);
					setTimeout((function () {elmResultsYahoo.setStyle("zoom", 1);}), 50);
					document.getElementById("volume").style.display = "";
					document.getElementById("volume").style.display = "block";
				}
				
				transaction = YAHOO.util.Connect.asyncRequest("POST", (serviceUrl + (((Array.filter(elm.parentNode.parentNode.getElementsByTagName("li"), (function (elmLi/*, idx, arr*/) {return Dom.hasClass(elmLi, "compare");})).length >= 1) ? ("?compareList=") : ("?openedList=")) + encodeURIComponent(viewType))), {success: (function (obj) {return;}), failure: (function (obj) {return;})}, null);
			}
		});


		return {

			getInitialViewType: (function () {

				return initialViewType;
			}),
			initialize: (function (elm) {

				if (forceRerendering) {
					setTimeout((function () {elmResultsYahoo.setStyle("zoom", "");}), 30);
					setTimeout((function () {elmResultsYahoo.setStyle("zoom", 1);}), 50);
				}

				var regXViewTypes = (/(?:\s+|^)(gallery|list|compact\s+map|map\s+compact|compact|map|compare)(?:\s+|$)/);

				elmViews = elm.getElementsByTagName("ul")["viewController"];
				var elmResults = document.getElementById("resultView");

				if (elmViews && elmResults) {

					elmResultsYahoo = (new Elm(elmResults));

					initialViewType = elmResultsYahoo.get("className");
					initialViewType = ((regXViewTypes.test(initialViewType)) ? (regXViewTypes.exec(initialViewType)[1]) : ("list"));

					Array.forEach(elmViews.getElementsByTagName("li"), (function (elm/*, idx, arr*/) {

						 Dom.removeClass(elm, "selected");
					}));
					(new Elm(Dom.getElementsByClassName(initialViewType, "li", elmViews)[0])).addClass("selected");


					Array.forEach(elmViews.getElementsByTagName("a"), (function (elm/*, idx, arr*/) {

						Evt.on(elm, "click", (function () {changeView(elm);return false;}));
					}));
				}

				delete ViewController.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [ViewController.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};

	})(); // [ViewController] Singleton.


	EventDispatcher.register(ViewController); // applying signal slot konzept onto [ViewController] and all elements that have subscribed to it.



	var SlideshowFactory = (function () { // [SlideshowFactory] Singleton. // is [SlideshowGenerator] an even better wording?


		var initialViewType, slideshowData, slideshowList = [], counterDivider = " / ";


		var Slideshow = (function (elm, idxOfSlideshowElm) { // [Slideshow] Constructor (no public properties at all).


			var slideList, amountOfSlides, idxSlide = -1, isDoSkipFading = (window.attachEvent && (typeof XMLHttpRequest == "undefined")); // detect msie 6.x

			var elmSlide = elm.getElementsByTagName("img")[0]; // Dom.getElementsByClassName("slide", "img", elm)[0];
			var elmControl = elm.getElementsByTagName("span")[0]; // Dom.getElementsByClassName("control", "span", elm)[0];

			if (!elmControl || (Dom.getStyle(elmControl, "display") === "none")) {

				return;
			}
			var elmPrevious = Dom.getElementsByClassName("previous", "a", elmControl)[0];
			var elmNext = Dom.getElementsByClassName("next", "a", elmControl)[0];
			elmPrevious.href = "javascript:\/\/";
			elmNext.href = "javascript:\/\/";

			var elmCounterCopy = elmControl.appendChild(document.createElement("span"));
			elmCounterCopy = elmCounterCopy.appendChild(document.createTextNode("n" + counterDivider + "m"));

			var elmSlideBlend, animFadeOut;
			if (!isDoSkipFading) { // due to performance problems of msie 6.x

				elmSlideBlend = elmSlide.cloneNode(true);
				Dom.addClass(elmSlideBlend, "blend");
				elmSlide.parentNode.insertBefore(elmSlideBlend, elmControl);

				animFadeOut = new Anim(elmSlideBlend, {opacity: {to: 0, units: "%"}}, 0.3, Easing.easeOut);

			} else {

				delete elmSlideBlend; delete animFadeOut;

				Dom.setStyle(elmSlide, "display", "block");
				Dom.setStyle(elmSlide, "opacity", "1");
			}
		//Evt.on([elmSlide, elmSlideBlend], "click", (function () {window.location.href = Dom.getElementsByClassName("continue", "a", this.parentNode.parentNode.getElements)[0].href;}));


			var update = (function (viewType) { // update internal as well as external slideshow state in order to synchronize both with the currently changed view state/view type.

			//alert("viewType : " + viewType + "\nidxOfSlideshowElm : " + idxOfSlideshowElm + "\n\nslideList : " + slideshowData[viewType][idxOfSlideshowElm] + "\namountOfSlides : " + slideshowData[viewType][idxOfSlideshowElm].length);
				slideList = slideshowData[viewType][idxOfSlideshowElm];
				amountOfSlides = slideList.length;

				elmSlideBlend.src = slideList[idxSlide];
			//elmSlideBlend.style.top = ("-" + elmSlideBlend.offsetHeight + "px");
				Dom.setStyle(elmSlideBlend, "top", ("-" + elmSlideBlend.offsetHeight + "px"));
				elmSlide.src = slideList[idxSlide];

				elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);/*

				console.log("Slideshow :: update - viewType : " + viewType);
				console.log("Slideshow :: update - idxSlide : " + idxSlide);
				console.log("Slideshow :: update - amountOfSlides : " + amountOfSlides);
				console.log("Slideshow :: update - idxOfSlideshowElm : " + idxOfSlideshowElm);
				console.log("Slideshow :: update - src : " + slideshowData[viewType][idxOfSlideshowElm][idxSlide]);*/
			});/*
			var onNext = (function () {

				idxSlide = idxSlide + 1; // IMPORTANT: this one is far faster than the better looking increment like "++idxSlide" / "idxSlide++"
				idxSlide = ((idxSlide >= amountOfSlides) ? (0) : (idxSlide));

				elmSlide.src = slideList[idxSlide];

				elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
			//console.log("Slideshow :: onNext");
			});*/
			var onNext = (function (evt) {

			//LoaderController.preventLoaderWhilstSlideshow();
				elmSlideBlend.src = slideList[idxSlide];
				Dom.setStyle(elmSlideBlend, "opacity", "1");

				idxSlide = idxSlide + 1; // IMPORTANT: this one is far faster than the better looking increment like "++idxSlide" / "idxSlide++"
				idxSlide = ((idxSlide >= amountOfSlides) ? (0) : (idxSlide));
				elmSlide.src = slideList[idxSlide];
				animFadeOut.animate();

				elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
			//console.log("Slideshow :: onNext");

			//Evt.preventDefault(evt || window.event)
				return false;
			});
			var onPrevious = (function (evt) {

			//LoaderController.preventLoaderWhilstSlideshow();
				elmSlideBlend.src = slideList[idxSlide];
				Dom.setStyle(elmSlideBlend, "opacity", "1");

				idxSlide = idxSlide - 1; // IMPORTANT: this one is far faster than the better looking increment like "--idxSlide" / "idxSlide--"
				idxSlide = ((idxSlide <= -1) ? (amountOfSlides - 1) : (idxSlide));
				elmSlide.src = slideList[idxSlide];
				animFadeOut.animate();

				elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
			//console.log("Slideshow :: onPrevious");

			//Evt.preventDefault(evt || window.event)
				return false;
			});

			if (isDoSkipFading) { // due to performance problems of msie 6.x

				update = (function (viewType) { // update internal as well as external slideshow state in order to synchronize both with the currently changed view state/view type.

					slideList = slideshowData[viewType][idxOfSlideshowElm];
					amountOfSlides = slideList.length;

				//elmSlide.src = (slideList[idxSlide] + ("?" + (new Date()).getTime()));
					elmSlide.src = slideList[idxSlide];

					elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
				});
				onNext = (function (evt) {

					idxSlide = idxSlide + 1;
					idxSlide = ((idxSlide >= amountOfSlides) ? (0) : (idxSlide));

				//elmSlide.src = (slideList[idxSlide] + ("?" + (new Date()).getTime()));
					elmSlide.src = slideList[idxSlide];

					elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
				//Evt.preventDefault(evt || window.event)
					return false;
				});
				onPrevious = (function () {

					idxSlide = idxSlide - 1;
					idxSlide = ((idxSlide <= -1) ? (amountOfSlides - 1) : (idxSlide));

				//elmSlide.src = (slideList[idxSlide] + ("?" + (new Date()).getTime()));
					elmSlide.src = slideList[idxSlide];

					elmCounterCopy.data = ((idxSlide + 1) + counterDivider + amountOfSlides);
				//Evt.preventDefault(evt || window.event)
					return false;
				});
			}
			var onViewChanged = (function (evt) {

			//console.log("Slideshow :: onViewChanged - evt.type: \"" + evt.type + "\"evt.viewType : \"" + evt.viewType + "\"");
				if ((evt.viewType == "gallery") || (evt.viewType == "list")) {

					update(evt.viewType);
				}
			});


			(function () { // kind of [initialize] - it's a good enough hot fix in case there are any broken image-references or mismatches between default rendered image data as of the native html(DOM)-structure and image data that is part of the imported JavaScript-object data-structure.

				for (var regXDataSrc = (/\s/), src = elmSlide.src, arr = ((slideshowData[initialViewType] || slideshowData["list"])[idxOfSlideshowElm]), len = arr.length, i = 0; i<len; ++i) {/*

					console.log("i : " + i + " - regXDataSrc : " + regXDataSrc.compile(arr[i].toRegExpString(), "i"));
					console.log("regXDataSrc.test(\"" + src + "\") : " + regXDataSrc.compile(arr[i].toRegExpString(), "i").test(src));*/
					if (regXDataSrc.compile(arr[i].toRegExpString(), "i").test(src)) {

						idxSlide = i;
						break;
					}
				}
				idxSlide = ((idxSlide == -1) ? (0) : (idxSlide));


				if (slideshowData[initialViewType]) {
					update(initialViewType);
				}

				ViewController.addEventListener("onViewChanged", onViewChanged);

				Evt.on(elmPrevious, "click", onPrevious);
				Evt.on(elmNext, "click", onNext);


				delete arguments.callee;
			})();

		});


		return {

			importData: (function (obj) {

				slideshowData = obj;

			//console.log("SlideshowFactory :: importData :: slideshowData.dump() : " + Lang.dump(slideshowData));
			//console.log("SlideshowFactory :: importData - slideshowData.dump() : " + slideshowData.toSource());
			//console.log("SlideshowFactory :: importData - (SlideshowFactory.importData === arguments.callee) ? " + (SlideshowFactory.importData === arguments.callee));

				delete Application.importSlideShowData;
				delete SlideshowFactory.importData;
				delete arguments.callee; // [arguments.callee] should be identic to [SlideshowFactory.importData], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			}),
			initialize: (function (elm) {

				var regXViewTypes = (/(?:\s+|^)(gallery|list|compact\s+map|map\s+compact|compact|map|compare)(?:\s+|$)/);

				var elmResults = document.getElementById("resultView");
				if (elmResults) {/*

					initialViewType = (new Elm(elmResults)).get("className");
					initialViewType = ((regXViewTypes.test(initialViewType)) ? (regXViewTypes.exec(initialViewType)[1]) : ("list"));*/
					initialViewType = ViewController.getInitialViewType();

					Array.forEach(Dom.getElementsByClassName("slideshow", "div", elmResults), (function (elm, idx/*, arr*/) {

						slideshowList.push(new Slideshow(elm, idx));
					}));
				}
			//console.log("SlideshowFactory - Application.importSlideShowData : " + Application.importSlideShowData);
			//console.log("SlideshowFactory :: importData : " + SlideshowFactory.importData);

				delete SlideshowFactory.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [SlideshowFactory.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};

	})(); // [SlideshowFactory] Singleton.

	Application.importSlideShowData = SlideshowFactory.importData;



	var MapController = (function () { // [MapController] Singleton.

		var wording;
		var mappingSourcesEmbedded, mappingSourcesLoader, mappingSources = [/*"http://maps.google.com/maps?file=api&amp;v=2&amp;key=abcdefg", *//*"/aowlb/extensions/markermanager_packed.js",*/ "/aowlb/extensions/labeledmarker_packed.js"];
		var elmResults, arrResults, arrMarkers, viewType;
		var mapData, map, icon,/* mgr,*/ points;
		var	elmToggle;

		var onViewChanged = (function (evt) {

			viewType = evt.viewType;

			if (viewType == "map") {
				var mapContainer = document.getElementById('aowlbMap');
				var loadParagraph = document.createElement("p");
				loadParagraph.appendChild(document.createTextNode("Loading Map..."));
				mapContainer.appendChild(loadParagraph);
				Dom.addClass(mapContainer, 'visible');
			} else {
				Dom.removeClass('aowlbMap', 'visible');
			}
			if ((viewType == "map") && !mappingSourcesEmbedded) {

				mappingSourcesLoader = Get.script(mappingSources, { // [http://developer.yahoo.com/yui/get/]

					onSuccess: (function () {

						mappingSourcesEmbedded = true;
						initializeMapping();

					//console.log("MapController :: onViewChanged :: mappingSourcesLoader - onSuccess : mapping sources successfully loaded.")
					}),
					onFailure: (function () {
					//console.log("MapController :: onViewChanged :: mappingSourcesLoader - onFailure : loading mapping sources did fail.")
						return;
					})
				});/*
				mappingSourcesEmbedded = true;
				initializeMapping();*/
			}
			else if ((viewType == "map") && mappingSourcesEmbedded) {

				refreshMarkerVisibility();
			}
		});
		var lightboxMapLoad = (function () {

			var mapContainer = document.getElementById('aowlbMap');
			var loadParagraph = document.createElement("p");
			loadParagraph.appendChild(document.createTextNode("Loading Map..."));
			mapContainer.appendChild(loadParagraph);

			if (!mappingSourcesEmbedded) {

				mappingSourcesLoader = Get.script(mappingSources, { // [http://developer.yahoo.com/yui/get/]

					onSuccess: (function () {

						mappingSourcesEmbedded = true;
						initializeMapping();
					}),
					onFailure: (function () {
					//console.log("MapController :: onViewChanged :: mappingSourcesLoader - onFailure : loading mapping sources did fail.")
					})
				});
			}
			else {
				initializeMapping();
			}
		});
		var refreshMarkerVisibility = (function () {
		  //display only results that are visible in list
		  if (arrResults && arrResults.length > 1 && arrMarkers) {
		    Array.forEach(arrResults, (function (elm, idx) {
		      if (elm.style.display == "none" || elm.style.visibility == "hidden") {
		        //hideMarker(idx);
		        arrMarkers[idx].hide();
		      }
		      else {
		        //showMarker(idx);
		        arrMarkers[idx].show();
		      }
		    }));
		  }
		});

		var showMarker = (function (idx) {

			if (points){
		    var point = points[idx];
		    if (arrMarkers) {
		      if (point.getPoint() == arrMarkers[idx].getPoint() ) {
		        //arrMarkers[idx].show();
		        //mgr.addMarker(arrMarkers[idx], 1, 17);
		      }
		    }
		  }
		});

		var hideMarker = (function (idx) {
		  if (points){
		    var point = points[idx];
		    if (arrMarkers) {
		      if (point.getPoint() == arrMarkers[idx].getPoint() ) {
		        //arrMarkers[idx].hide();
		        //mgr.removeMarker(arrMarkers[idx]);
		      }
		    }
		  }
		});

		var initializeMapping = (function () {/*

			Array.max = (function (array) {
				return Math.max.apply( Math, array );
			});

			Array.min = (function (array) {
				return Math.min.apply( Math, array );
			});*/

			var setActiveLiElement = (function (elm) {

				Array.forEach(arrResults, function (li) {
					Dom.removeClass(li, 'active');
				});
				if (elm) {
					Dom.addClass(elm, 'active');
				}
			});
			var setLiElementHover = (function (elm) {

				Array.forEach(arrResults, function (li) {
					Dom.removeClass(li, 'over');
				});
				if (elm) {
					Dom.addClass(elm, 'over');
				}
			});
			var handleMapEvents = (function (elm, marker, content, evt) {

				var elmTarget = (evt.target || evt.srcElement);

				if (viewType == "map") {

					if ( (elmTarget.nodeName.toLowerCase() == "a" && Dom.hasClass(elmTarget, "shortlist")) || (elmTarget.nodeName.toLowerCase() == "span" && Dom.hasClass(Dom.getAncestorByTagName(elmTarget, "a"), "shortlist")) ) { //map view link 'remove from shortlist'

						if (map.getInfoWindow().getPoint() == marker.getPoint() ) {

							map.getInfoWindow().hide();
						}
						//marker.hide();
						Evt.stopEvent(evt);
						return;
					}
					else if ((elmTarget.nodeName.toLowerCase() != "a") && !Dom.hasClass(Dom.getAncestorByTagName(elmTarget, "li"), "hidden")) {

						/* //falls bei nochmal klicken bubble aufbleiben soll so:
						GEvent.trigger(marker, "click");*/

						//falls bei nochmal klicken die bubble wieder weggehen soll so:
						if (map.getInfoWindow().getPoint() != marker.getPoint() ) {

							marker.openInfoWindow(content);
							setActiveLiElement(elm);

						} else {

							if (map.getInfoWindow().isHidden()) {

								map.getInfoWindow().show();
								setActiveLiElement(elm);
							} else {
								map.getInfoWindow().hide();
								setActiveLiElement();
							}
						}
					}
				}
			});

			var toggleVisibility = (function (elm, marker, evt, link) {

				if (Dom.hasClass(elm, "hidden")) {

					Dom.removeClass(elm, "hidden");
					//mgr.addMarker(marker, 1, 17);
					marker.show();
					Dom.getFirstChild(link).innerHTML = wording.hide;

				} else {

					Dom.addClass(elm, "hidden");
					Dom.removeClass(elm, 'active');
					marker.hide();
					//mgr.removeMarker(marker);
					Dom.getFirstChild(link).innerHTML = wording.show;
				}
				Evt.stopEvent(evt);
			});

			var createStandardMarker = (function (point) {

				var marker = new GMarker(point,icon);
				return marker;
			});

			var createLabledMarker = (function (point, label, content, idx) {

				var opts = { 
				  "icon": icon,
				  "clickable": true,
				  "labelText": label,
				  "labelClass": "markerLabel",
				  "labelOffset": new GSize(-9, -30)
				};
				var marker = new LabeledMarker(point, opts);
				arrMarkers.push(marker);

				//map event to hide/show bubbles
				GEvent.addListener(marker, "click", function() {
					marker.openInfoWindow(content);
				});
				//marker events for highlights in resultlist
				GEvent.addListener(marker, "infowindowopen", function() {
					setActiveLiElement(arrResults[idx]);
				});
				GEvent.addListener(marker, "infowindowclose", function() {
					setActiveLiElement();
				});

				//list events for highlights in resultlist
				Evt.on(arrResults[idx], "mouseover", (function (evt) {
					if (viewType == "map") {
						setLiElementHover(arrResults[idx]);
					}
				}));
				Evt.on(arrResults[idx], "mouseout", (function (evt) {
					if (viewType == "map") {
						setLiElementHover();
					}
				}));

				//list event to hide/show bubbles 
				Evt.on(arrResults[idx], "click", (function (evt) {handleMapEvents(arrResults[idx], marker,content,(evt || window.event));}));

				//list event to hide/show markers
				elmToggle = Dom.getElementsByClassName("toggleVisibility", "a", arrResults[idx])[0];
				if (elmToggle) {

					Evt.on(elmToggle, "click", (function (evt) { toggleVisibility(arrResults[idx], marker, evt, this); }));
				}

				return marker;
			});

			var processMapData = (function () {

				markersObj = mapData;
				var bounds = new GLatLngBounds;
				points = [];
				var lats = [];
				var lngs = [];
				arrMarkers = [];

				if (markersObj.results && markersObj.results.length>0) {
					for (var i=0;i<markersObj.results.length;i++) {

						var point  = new GLatLng(markersObj.results[i].lat,markersObj.results[i].lng);
						lats.push(markersObj.results[i].lat);
						lngs.push(markersObj.results[i].lng);
						bounds.extend(point);
						if (arrResults) {
							if (arrResults[i]) {
								var bubbleContent = document.createElement("ol");
								bubbleContent.className = "infoBubble";
								bubbleContent.appendChild(arrResults[i].cloneNode(true));
								var labledMarker = createLabledMarker(point, i+1, bubbleContent, i);
								points.push(labledMarker);
							}
						}
						else {
							var singleMarker = createStandardMarker(point);
							points.push(singleMarker);
							var defaultZoom = markersObj.defaults.zoom;
						}
					}
				} else {

					var point = new GLatLng(markersObj.defaults.lat, markersObj.defaults.lng);
					lats.push(markersObj.defaults.lat);
					lngs.push(markersObj.defaults.lng)
					bounds.extend(point);
					/*
					var bubbleContent = document.createElement("p");
					bubbleContent.className = "infoBubble";
					bubbleContent.appendChild(document.createTextNode("Es ist ein Fehler aufgetreten."));
					var labledMarker = createLabledMarker(point, 1, bubbleContent);
					points.push(labledMarker);
					*/
					var defaultZoom = markersObj.defaults.zoom;
				}
				var mapCenter = bounds.getCenter(); 
				var minZoom = defaultZoom ? defaultZoom : ( (map.getBoundsZoomLevel(bounds) < 14) ? map.getBoundsZoomLevel(bounds) : 14 );

				return {points: points, center: mapCenter, zoom: minZoom};
			});

			var placeMarkers = (function () {

				var processedMapData = processMapData();
				if (processedMapData.points.length > 1 ) {

					//mgr.addMarkers(processedMapData.points, 1, 17);
				} 
				else if (processedMapData.points.length == 1 ) {

					//mgr.addMarker(processedMapData.points[0], 1, 17);
				}

				Array.forEach(processedMapData.points, (function(elm, idx) {
					map.addOverlay(elm);
				}));

				refreshMarkerVisibility();

				//mgr.refresh(); //mgr.refresh;
				map.setZoom(processedMapData.zoom);
				map.setCenter(processedMapData.center);
				map.savePosition();
			});
			if (GBrowserIsCompatible()) {

				map = new GMap2(document.getElementById("aowlbMap"));
				map.setCenter(new GLatLng(53.5526, 9.9352), 13, G_HYBRID_MAP);

				map.addControl(new GLargeMapControl());
				map.enableScrollWheelZoom();
				map.enableDoubleClickZoom();
				map.addMapType(G_PHYSICAL_MAP);

				var mapcontrol = new GHierarchicalMapTypeControl();
				mapcontrol.clearRelationships();
				mapcontrol.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, " Labels", true);
				map.addControl(mapcontrol);

				//mgr = new MarkerManager(map, {trackMarkers: true});

				// create own marker icon
				icon = new GIcon();
				icon.image = "/aowlb/images/elements/el_mapmarker.png";
				icon.iconSize = new GSize(22, 34);
				icon.iconAnchor = new GPoint(10, 34);
				icon.infoWindowAnchor = new GPoint(5, 1);

				placeMarkers();
			}				
		});


		return {

			importWording: (function (obj) {

				wording = obj;

				delete Application.importMapWording;
				delete MapController.importWording;
				delete arguments.callee; // [arguments.callee] should be identic to [MapController.importWording], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			}),
			importMapData: (function (obj) {

				mapData = obj;
				delete Application.importMapData;
				delete MapController.importMapData;
				delete arguments.callee; 
			}),
			initialize: (function (elm) {

				elmResults = elm.getElementsByTagName("ol")[0];
				if (elmResults) {

					arrResults = [];
					var elmShortlist;

					Array.forEach(elmResults.childNodes, (function (elm/*, idx, arr*/) {
						if (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, 'advertisement') && !Dom.hasClass(elm, 'noResult')) {

							arrResults.push(elm);

							elmShortlist = Dom.getElementsByClassName("shortlist", "a", elm)[0];
							if (elmShortlist) {

								elmToggle = elmShortlist.cloneNode(true);
								elmToggle.removeAttribute("title");
								elmToggle.className = "toggleVisibility";
								Dom.getFirstChild(elmToggle).innerHTML = wording.hide;
								Dom.insertAfter(elmToggle, elmShortlist);
							}

						}
					}));


					ViewController.addEventListener("onViewChanged", onViewChanged);

					if (ViewController.getInitialViewType() == "map") {
						onViewChanged({viewType: "map"});
					}
				}

				delete MapController.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [MapController.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			}),

			initializeLightboxMap : (function (obj) {
				mapData = obj;
				lightboxMapLoad();
			}),
			hideMarker: (function (idx) {
				hideMarker(idx);
			}),
			refreshMarkerVisibility: (function () {
				refreshMarkerVisibility();
			})
		};

	})(); // [MapController] Singleton.

	Application.importMapData = MapController.importMapData;
	Application.importMapWording = MapController.importWording;



	var ShortlistManager = (function () { // [ShortlistManager] Singleton.


		var elmShortlist, elmShortlistCopy, elmShortlistClear, elmSendAll, elmShortlistToggle, shortlistLocator, wording, page, elmProductId, entryCounter = 0;
		var backLink;

		var clearShortlist = (function () {

			var removeAllFromShortlist = YAHOO.util.Connect.asyncRequest('GET', ("/search?clearShortlist=true&amp;timestamp=" + ((new Date()).getTime())), {

				success: (function (obj) {
					if (page=="shortlist") {
					//redirect to searchresults
						window.location.pathname = backLink.pathname;
					}
				}),
				failure: (function (obj) {
					if (page=="shortlist") {
					//redirect to searchresults
						window.location.pathname = backLink.pathname;
					}
				})
			}, null);

			if (page=="shortlist") {
				//redirect to searchresults
				//window.location.pathname = backLink.pathname;
				
				Dom.setStyle(Dom.get("resultView"), "display", "none");
				Dom.addClass(elmSendAll, "hidden");
				Dom.addClass(Dom.get("noShortlistItems"), "visible");
			}
			entryCounter = 0;			
			refreshStatus();
		});
		var refreshStatus = (function () {

			elmShortlistCopy.data = entryCounter;
		});
		var updateShortlist = (function (elm, idx, pid) {

			var elmSpanElement = Dom.getFirstChild(elm);

			if (Dom.hasClass(elm, "addTo")) {/*
				if (pid) {
					var addToShortlist = YAHOO.util.Connect.asyncRequest('GET', "/search?addToShortlistByProductId="+pid, function(){});
				}
				else {
					var addToShortlist = YAHOO.util.Connect.asyncRequest('GET', "/search?addToShortlist="+idx, function(){});	
				}*/
				var addToShortlist = YAHOO.util.Connect.asyncRequest('GET', ("/search?addToShortlistByProductId=" + pid + "&amp;timestamp=" + ((new Date()).getTime())), (function(){}));

				Dom.replaceClass(elm, "addTo", "removeFrom");
				++entryCounter;
				elmSpanElement.innerHTML = wording.removeFrom;
				
				HintsContoller.unsubscribe(elm);
				elm.title = wording.titleRemoveFrom;
				HintsContoller.register(elm);

			} else if (Dom.hasClass(elm, "removeFrom")) {/*
				if (pid) {
					var removeFromShortlist = YAHOO.util.Connect.asyncRequest('GET', "/search?removeFromShortlistByProductId="+pid, function(){});
				}
				else {
					var removeFromShortlist = YAHOO.util.Connect.asyncRequest('GET', "/search?removeFromShortlist="+idx, function(){});	
				}*/
				var removeFromShortlist = YAHOO.util.Connect.asyncRequest('GET', ("/search?removeFromShortlistByProductId=" + pid + "&amp;timestamp=" + ((new Date()).getTime())), (function(){}));

				Dom.replaceClass(elm, "removeFrom", "addTo");
				--entryCounter;
				elmSpanElement.innerHTML = wording.addTo;
				
				HintsContoller.unsubscribe(elm);
				elm.title = wording.titleAddTo;
				HintsContoller.register(elm);
				//MapController.hideMarker(idx);

				if (page=="shortlist") {
					Dom.setStyle(Dom.getAncestorByTagName(elm,'li'), 'display', 'none');
					if (entryCounter < 1 ){
						//redirect to searchresults
						window.location.pathname = backLink.pathname;
						
						Dom.setStyle(Dom.get("resultView"), "display", "none");
						Dom.addClass(elmSendAll, "hidden");
						Dom.addClass(Dom.get("noShortlistItems"), "visible");
					}
				}

				MapController.refreshMarkerVisibility();
			}/*
			if (elm.blur) {
				elm.blur();
			}*/
			if ( elmShortlist ) {
				if (entryCounter >= 1) {
					elmShortlist.href = shortlistLocator;
				} else if (entryCounter <= 0) {
					elmShortlist.href = "javascript:\/\/";
					elmShortlist.title = elmShortlist.rel;
					HintsContoller.register(elmShortlist);
				}
				if (entryCounter == 1){
					HintsContoller.unsubscribe(elmShortlist);
					if (elmShortlist.title != undefined && elmShortlist.title != "") {
						elmShortlist.rel = elmShortlist.title;
						elmShortlist.removeAttribute("title");
					}
				}
				refreshStatus();
			}
		});


		return {

			importWording: (function (obj) {

				wording = obj;

				delete Application.importShortlistWording;
				delete ShortlistManager.importWording;
				delete arguments.callee; // [arguments.callee] should be identic to [ShortlistManager.importWording], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			}),

			initialize: (function (elm) {

				// finde die Produkt-Id in der "datails"-ansicht
				elmProductId = (Dom.get("productId") || false);

				//anzeige der gesamtzahl, auf index_datastream oder shortlist oder detailseite
				elmShortlist = elm.getElementsByTagName("a")["shortlistIndicator"] || elm.getElementsByTagName("span")["shortlistIndicator"];
				if (elmShortlist) {

					if (elmShortlist.nodeName.toLowerCase() == "a") {
						page = "index";
						elmShortlistCopy = elmShortlist.getElementsByTagName("span")[0].firstChild;
						shortlistLocator = elmShortlist.href;
						entryCounter = parseInt(elmShortlistCopy.data,10);

						if (entryCounter <= 0) {
							elmShortlist.href = "javascript:\/\/";
						}
						Dom.setStyle(elmShortlist, "display", "block");
					}
					else if (elmShortlist.nodeName.toLowerCase() == "span") {
						page = "shortlist";
						elmShortlistCopy = elmShortlist.firstChild;
						entryCounter = parseInt(elmShortlistCopy.data,10);
						backLink = Dom.getElementsByClassName("back","a","volumeHead")[0];
					}

					refreshStatus();
				}
				if ( elmShortlist && entryCounter <= 0 ) {
					HintsContoller.register(elmShortlist);
				}
				else if (elmShortlist && entryCounter >=1 ) {
					elmShortlist.rel = elmShortlist.title;
					elmShortlist.removeAttribute("title");
				}
				
				// eventhandling for add and remove
				elmShortlistToggle = Dom.getElementsByClassName("shortlist", "a");
				Array.forEach(elmShortlistToggle, (function (elm, idx/*, arr*/) {

					elm.href = "javascript:\/\/";

					var elmSpanElement = Dom.getFirstChild(elm);

					if (Dom.hasClass(elm, "removeFrom")) {
						elmSpanElement.innerHTML = wording.removeFrom;
						elm.title = wording.titleRemoveFrom;
					} else if (!Dom.hasClass(elm, "addTo")) {
						Dom.addClass(elm, "addTo");
						elmSpanElement.innerHTML = wording.addTo;
						elm.title = wording.titleAddTo;
					} else {
						elmSpanElement.innerHTML =  wording.addTo;
						elm.title = wording.titleAddTo;
					}
					Evt.on(elm, "click", (function () {updateShortlist(elm, idx, (elmProductId || Dom.getElementsByClassName("productId", "p", elm.parentNode)[0] || {}).innerHTML);return false;}));

					HintsContoller.register(elm);
				}));

				elmShortlistClear = Dom.get("shortlistRemoveAll"); 
				if (elmShortlistClear) {
					Evt.on(elmShortlistClear, "click", (function () {clearShortlist();return false;}));
				}
				
				elmSendAll = Dom.getElementsByClassName("send", "li", "shortlistTools")[0];
				
				delete ShortlistManager.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [ShortlistManager.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};

	})(); // [ShortlistManager] Singleton.

	Application.importShortlistWording = ShortlistManager.importWording;



	var CollapseContoller = (function () { // [CollapseContoller] Singleton.


		var toggleCollapse = (function (elm) {

			if (Dom.hasClass(elm, "collapsed")) {

				Dom.removeClass(elm, "collapsed");
			} else {
				Dom.addClass(elm, "collapsed");
			}
			
		});


		return {

			initialize: (function (elm) {

				Array.forEach(Dom.getElementsByClassName("toggleCollapse", "a", elm.getElementsByTagName("ol")[0]), (function (elm/*, idx, arr*/) {

					Evt.on(elm, "click", (function () {toggleCollapse(elm.parentNode.parentNode)}));
				}));

				delete CollapseContoller.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [CollapseContoller.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};

	})(); // [CollapseContoller] Singleton.



	var HintsContoller = (function () { // [HintsContoller] Singleton.


		var offsetXHint = 10, offsetYHint = 15;
		var clearanceX = 10, clearanceY = 10;

		var pos, pageX, pageY;

		var animFadeIn, animFadeOut, listenerMouseMove, isHintsActivated;
		var elmSource, elmTarget, elmWrapper, elmWrapperCopy;


		var generateHints = (function (evt, elm) {

			if (isHintsActivated) {

				return;
			}
			isHintsActivated = true;
		//console.log("HintsContoller :: generateHints");

			// clean up elements that explicitely get called.
			Array.forEach(elmWrapper.getElementsByTagName("h3"), (function (elm/*, idx, arr*/) {
				elmWrapper.removeChild(elm);
			}));
			// clean up elements that explicitely get called.
			Array.forEach(elmWrapper.getElementsByTagName("ul"), (function (elm/*, idx, arr*/) {
				elmWrapper.removeChild(elm);
			}));
			// clean up leftovers in a generic way. (while developing this generic solution was the only one clean up that by all logic means should do it - but [elmWrapper] was not empty in every case - with the two explicitely called clean ups before it does work ven though there is no rational reason to it.
			Array.forEach(elmWrapper.childNodes, (function (elm/*, idx, arr*/) {
			//if (elm && elm.nodeType && ((elm.nodeType == 1) || (elm.nodeType == 3)) && (elm !== elmWrapperCopy)) {
				if (elm && (elm !== elmWrapperCopy)) {
					elmWrapper.removeChild(elm);
				}
			}));

			if ((elm.tagName.toLowerCase() == "ul") && Dom.hasClass(elm, "features")) {

				elmWrapperCopy.data = "";
			//elmWrapper.innerHTML = "";

				var elmHeader = document.createElement("h3");
				elmHeader.appendChild(document.createTextNode(elm.defaultTitle));
			//elmHeader.innerHTML = elm.defaultTitle;

				var elmList = elm.cloneNode(true);
			//Dom.replaceClass(elmList, "hintsSource", "newClassName");
				Dom.removeClass(elmList, "hintsSource");
				elmList.title = "";

				elmWrapper.appendChild(elmHeader);
				elmWrapper.appendChild(elmList);

			} else {

				elmWrapperCopy.data = elm.defaultTitle;
			//elmWrapper.innerHTML = elm.defaultTitle;
			}

			pos = Dom.getRegion(elm); //document.getElmPosAbsolute(elm) gives different values for ie>=7
			
			elm.posLeft = (pos.left - clearanceX);
			elm.posTop = (pos.top - clearanceY);
			elm.posRight = (elm.posLeft + elm.offsetWidth + (2 * clearanceX));
			elm.posBottom = (elm.posTop + elm.offsetHeight + (2 * clearanceY));


			elmSource = elm;

			Dom.setStyle(elmTarget, "display", "block");
			
			Dom.setStyle(elmTarget, "left", ((Evt.getPageX(evt) - elmTarget.offsetWidth - offsetXHint) + "px"));
			Dom.setStyle(elmTarget, "top", ((Evt.getPageY(evt) - offsetYHint) + "px"));

		//animFadeOut.stop();
		//animFadeIn.animate();

			Dom.setStyle(elmBody, "cursor", "help");
		//Dom.addClass(elmBody, "help"); // still to do: generate css-rule according to all casses that might be effected;

			listenerMouseMove = (function (evt) {moveHints(evt);});
			Evt.addListener(elmBody, "mousemove", listenerMouseMove); // "Evt.on" is an alias for "Evt.addListener"
		});
		var moveHints = (function (evt) {

		//console.log("HintsContoller :: moveHints - hovering - display : \"" + Dom.getStyle(elmSource, "display") + "\" - opacity : \""  + Dom.getStyle(elmSource, "opacity") + "\"");
			if ((Dom.getStyle(elmSource, "display") == "none") || !isHintsActivated) {

				clearHints();
				generateHints(evt, elmSource);
			//console.log("HintsContoller :: moveHints - (supervising [isHintsActivated]) - elmSource : " + elmSource);
			}
			pageX = Evt.getPageX(evt);
			pageY = Evt.getPageY(evt);

			if ((pageX >= elmSource.posLeft) && (pageX <= elmSource.posRight) && (pageY >= elmSource.posTop) && (pageY <= elmSource.posBottom)) {

				Dom.setStyle(elmTarget, "left", ((Evt.getPageX(evt) - elmTarget.offsetWidth - offsetXHint) + "px"));
				Dom.setStyle(elmTarget, "top", ((Evt.getPageY(evt) - offsetYHint) + "px"));

			} else {

				clearHints();
			}
		});
		var clearHints = (function () {

		//console.log("HintsContoller :: clearHints");
			Evt.removeListener(elmBody, "mousemove", listenerMouseMove);
			listenerMouseMove = null;

		//animFadeIn.stop();
		//animFadeOut.animate();
			Dom.setStyle(elmTarget, "display", "none");

			isHintsActivated = false;

		//Dom.setStyle(elmTarget, "display", "none");
			Dom.setStyle(elmBody, "cursor", "default");
		//Dom.removeClass(elmBody, "help"); // still to do: generate css-rule according to all casses that might be effected;
		});


		return {

			register: (function (elm) {

				var elmYahoo = new Elm(elm);
				elm.defaultTitle = elmYahoo.get("title");
			//elmYahoo.set("title", "");
				elm.title = "";

				elm.listenerMouseOver = (function (evt) {generateHints(evt, elm);});
				Evt.addListener(elm, "mouseover", elm.listenerMouseOver); // "Evt.on" is an alias for "Evt.addListener"
			}),
			unsubscribe: (function (elm) {

			//(new Elm(elm)).set("title", elm.defaultTitle);
				if (elm.title != undefined && elm.defaultTitle) {
					elm.title = elm.defaultTitle;
					//ie6 doesn't like this deletion.
					//delete elm.defaultTitle;

					Evt.removeListener(elm, "mouseover", elm.listenerMouseOver);
				}
			}),
			initialize: (function () {

				elmTarget = document.createElement("div");
				Dom.addClass(elmTarget, "hintsTarget");

			//elmWrapper = (Dom.getElementsByClassName("cornerWrapper", "div", elmBody)[0]).cloneNode(true);
				elmWrapper = (Dom.getElementsByClassName("cornerWrapper", "div", elmBody)[0]);
				if (elmWrapper) {
					elmWrapper = elmWrapper.cloneNode(true);
				} else {
					elmWrapper = document.createElement("div");
					elmWrapper.className = "cornerWrapper";
					elmWrapper.innerHTML = "<div class=\"topLeft\"></div><div class=\"topRight\"></div><div class=\"bottomRight\"></div><div class=\"bottomLeft\"></div>"; // do not touch this alternative ... never ... ever.
				}
				elmTarget.appendChild(elmWrapper);

				var elmArrow = document.createElement("div");
				Dom.addClass(elmArrow, "rightArrow");

				elmWrapper.insertBefore(elmArrow, elmWrapper.getElementsByTagName("div")[0]);

				elmWrapper = elmTarget.insertBefore(document.createElement("div"), elmWrapper);
				Dom.addClass(elmWrapper, "hintsWrapper");

				elmWrapperCopy = elmWrapper.appendChild(document.createTextNode(""));

				elmBody.appendChild(elmTarget);/*

				<div class="hintsTarget">
					<div class="hintsWrapper"></div>
					<div class="cornerWrapper"><div class="rightArrow"></div><div class="topLeft"></div><div class="topRight"></div><div class="bottomRight"></div><div class="bottomLeft"></div></div><!-- class="cornerWrapper" //-->
				</div>*/ /*

			//console.log("HintsContoller :: initialize - elm : " + elmBody);
			//console.log("HintsContoller :: initialize - hintsSourceList.length : " + Dom.getElementsByClassName("hintsSource", "*", elmBody).length);*/

			//Dom.setStyle(elmTarget, "opacity", "0");
			//Dom.setStyle(elmTarget, "display", "block");

			//animFadeIn = new Anim(elmTarget, {opacity: {to: 100, units: "%"}}, 1.8, Easing.easeIn);
			//animFadeOut = new Anim(elmTarget, {opacity: {to: 0, units: "%"}}, 0.3, Easing.easeOut);

			//animFadeIn.onTween.subscribe(function () {console.log("fadeIn - " + this.getEl() + ".opacity : " + Dom.getStyle(this.getEl(), "opacity"));});
			//animFadeOut.onTween.subscribe(function () {console.log("fadeOut - " + this.getEl() + ".opacity : " + Dom.getStyle(this.getEl(), "opacity"));});
			//animFadeOut.onComplete.subscribe(function () {Dom.setStyle(this.getEl(), "display", "none");});


				Array.forEach(Dom.getElementsByClassName("hintsSource", "*", elmBody), (function (elm/*, idx, arr*/) {

				//if (!((elm.tagName.toLowerCase() == "ul") && Dom.hasClass(elm, "features") && (elm.getElementsByTagName("li").length === 1))) {
					if ((elm.tagName.toLowerCase() != "ul") || !Dom.hasClass(elm, "features") || (elm.getElementsByTagName("li").length >= 1)) {

						HintsContoller.register(elm);
					}
				}));


				delete HintsContoller.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [HintsContoller.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};

	})(); // [HintsContoller] Singleton.


	var AutocompleteController = (function () { // [AutocompleteController] Singleton.

		var elmForm, elmInput, elmInputYahoo, elmDestinationId, elmDestinationType, elmSubmit, elmNextToElmInput, elmResults, elmResultsYahoo, timeoutIdHideResults, recentlyTypedValue, initiallyGiven, displayState = "suggest"; // "apply".
		var serviceUrl, transaction, list, results = [];

		var focusedListElmIdx;

		var currentKeyEvent, KeyListener, KEY;
		var klMoveToPrviousListEntry, klMoveToNextListEntry/*, klMoveToNextListEntrySafari*/, isUserAgentSafari;

		var regXReplace = (/\s/);
		var regXLeftNumberTrim = (/^(?:(?:\s*\d+\s+)|(?:\s+))/);
		var regXEntityNBSGlobal = (/\u00a0/g); // due to msie render engines only that can not handle "&nbsp;"-html-entities within textnodes.

		var getPlainText = (function (elm, str) {

			str = ((typeof str == "string") ? (str) : (""));
			if (elm.childNodes) {
				Array.forEach(elm.childNodes, (function (obj/*, idx, arr*/) {
					if (obj.nodeType == 3) {
					//alert(obj.data.length + "\n" + obj.data.charCodeAt(0); //&#160; //&#x00A0;
						str = (str + obj.data.replace(regXEntityNBSGlobal, " "));
					} else if (obj.nodeType == 1) {
						str = (str + getPlainText(obj));
					}
				}));
			}
			return str;
		});
		var suggestEntry = (function (elmLink) {

			clearTimeout(timeoutIdHideResults);

			elmInput.value = getPlainText(elmLink).replace(regXLeftNumberTrim, "");
			displayState = "suggest";

			focusedListElmIdx = Array.map(Dom.getChildren(elmResults), (function (elm/*, idx, arr*/) {return elm.getElementsByTagName("a")[0];})).indexOf(elmLink);
		});
		var applyEntry = (function (elmLink) {

			suggestEntry(elmLink);
			displayState = "apply";

			elmDestinationId.value = elmLink.id;
			elmDestinationType.value = results.filter(function (elm/*, idx, arr*/) {return (elm.id == elmLink.id);})[0].type;

			disableKeylistening();
			elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");
			elmNextToElmInput.focus();

			// this special case needs a special treatment.
			// if valid input values have not been placed into this searchfield it always gets marked by each validation process. such a marker needs to be removed again if some data gets pasted into this field.
			Dom.removeClass(((Dom.hasClass(elmInput.parentNode, "formrow") || Dom.hasClass(elmInput.parentNode, "formRow")) ? (elmInput.parentNode) : (elmInput)), "error");
		});


		var updateResults = (function (str) {

			recentlyTypedValue = str;
		//regXReplace.compile(("\\b(" + str + ")"), "gi");
			regXReplace = regXReplace.compile(( str.toRegExpString() ), "gi");
			list = [];
			Array.forEach(results, (function (obj/*, idx, arr*/) {		
				if (obj.destination.match(regXReplace)) { /* don't use regXReplace.test(obj.destination) here as the IEs won't find every occurance */
					list.push({
					/*destination: obj.destination.replace(regXReplace, "<strong>$1<\/strong>"),*/																							// errorprone within webkit based browsers even google chrome - resulting in a brolen result list design.
						destination: obj.destination.replace(regXReplace, (function () {return ("<strong>" + arguments[0] + "<\/strong>");})),	// not even better within webkit based browsers including google chrome, though at least there is no broken result list design anymore.
						occurence: obj.occurence,
						id: obj.id,
						type: obj.type
					});
				} else {
					list.push({
						destination: obj.destination,
						occurence: obj.occurence,
						id: obj.id,
						type: obj.type
					});
				}
				
			}));

			Array.forEach(Dom.getChildren(elmResults), (function (elm/*, idx, arr*/) {
				elmResultsYahoo.removeChild(elm);
			}));

			if (list.length >= 1) {

				elmDestinationId.value = "";
				elmResults.style.display = "block"; Dom.addClass(elmForm, "resultListOnDisplay");

				Array.forEach(list, (function (obj/*, idx, arr*/) {

					var elmLi = document.createElement("li");
					elmResults.appendChild(elmLi);
					elmLi.innerHTML = ("<a id=\"" + obj.id + "\" href=\"javascript:\/\/\"><strong class=\"occurence" + ((obj.type == "HOTEL") ? (" hotel\">&nbsp;") : ("\">" + obj.occurence)) + "<\/strong> " + obj.destination + "<\/a>");

					var elmLink = elmLi.getElementsByTagName("a")[0];/*

				- see: jira task TUIWLB-257: >>AJAX search "on click" not hover<< - [https://webperfect.sinnerschrader.de/jira/browse/TUIWLB-257].
				- but: can be easily switched back anytime if necessary.

					if (document.isRenderEngineKHTML()) {
						Evt.on(elmLink, "mouseover", (function () {elmLink.focus();}));
					} else {
						Evt.on(elmLink, "mouseover", (function () {suggestEntry(elmLink);}));
					}*/ /* css/javascript testcase beneath: */
					if (isUserAgentSafari) {

						Evt.on(elmLink, "blur", (function () {rerenderListItem(this);}));
					//Evt.on(elmLink, "blur", (function () {elmLink.style.display = "none"; setTimeout((function () {elmLink.style.display = "block";}), 5);}));
					/*
						Evt.on(elmLink, "blur", (function () {elmLink.style.outline = "none";}));
						Evt.on(elmLink, "focus", (function () {elmLink.style.outline = "";}));*/ /*
					//Evt.on(elmLink, "blur", (function () {elmLink.style.visibility = "hidden"; setTimeout((function () {elmLink.style.visibility = "visible";}), 20);}));
						Evt.on(elmLink, "blur", (function () {elmLink.className = "";}));
					//Evt.on(elmLink, "over", (function () {elmLink.className = "highlight";}));
						Evt.on(elmLink, "focus", (function () {elmLink.className = "highlight";}));*/
					}
					Evt.on(elmLink, "focus", (function () {suggestEntry(elmLink);}));
					Evt.on(elmLink, "click", (function () {applyEntry(elmLink);}));
				}));
				

				focusedListElmIdx = -1;
				enableKeylistening();

			} else {

				disableKeylistening();
				elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");
			}
		});


		var notifyFailure = (function (str) {

			return;
		});


		var getNewResultList = (function (str) {

			if (displayState == "apply") {

				displayState = "suggest";
			//return;
			}
			if (str.length < 3) {

				disableKeylistening();
				elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");

			} else if (str.length >= 3) {

				transaction = YAHOO.util.Connect.asyncRequest("POST", (serviceUrl + ("?searchTerm=" + encodeURIComponent(str))), {

					success: (function (obj) {

						results = eval(obj.responseText);
						updateResults(str);
					}),
					failure: (function (obj) {

						notifyFailure(obj.statusText);
					})/*,
					argument: []*/

				}, null);
			}
		});


		var onFocusWithResults = (function (str) {

			if (displayState == "apply") {

				disableKeylistening();
				elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");

			} else if (displayState == "suggest") {

				elmInput.value = recentlyTypedValue;
				getNewResultList(str);
			}
		});/*
		var onBlurWithResults = (function (str) {/ *

			elmInput.value = recentlyTypedValue;
		//getNewResultList(str);
			disableKeylistening();
			elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");* /
		});*/
		var onBlurWithResults = (function (str) {

			timeoutIdHideResults = setTimeout((function () {disableKeylistening(); elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");}), 100);
		});


		var catchCurrentKeyEvent = (function (evt) {/*

			var charCode = Evt.getCharCode(evt || window.event);
		//document.title = "charCode : " + charCode;
			if (charCode == KEY.UP) {

			} else if (charCode == KEY.DOWN) {

			}*/
			currentKeyEvent = (evt || window.event);
		});
		var rerenderListItem = (function (elmLink) { // dirty hack according to a serious safari mal rendering bug.

			var charCode = Evt.getCharCode(currentKeyEvent);
			if ((charCode == KEY.DOWN) || (charCode == KEY.UP)) {
				elmLink.style.display = "none";
				setTimeout((function () {elmLink.style.display = "block";}), 5);
			}
		//document.title = ("charCode : " + charCode);
		});
		var enableKeylistening = (function () {

			Evt.addListener(document, "keyup", catchCurrentKeyEvent);/*

			klMoveToPreviousListEntryByArrowKeys.enable();
			klMoveToPreviousListEntryByTabulator.enable();
			klMoveToNextListEntry.enable();*/

			klMoveToPrviousListEntry.enable();
			klMoveToNextListEntry.enable();
		//klMoveToNextListEntrySafari.enable();
		});
		var disableKeylistening = (function () {

			Evt.removeListener(document, "keyup", catchCurrentKeyEvent);/*

			klMoveToPreviousListEntryByArrowKeys.disable();
			klMoveToPreviousListEntryByTabulator.disable();
			klMoveToNextListEntry.disable();*/

			klMoveToPrviousListEntry.disable();
			klMoveToNextListEntry.disable();
		//klMoveToNextListEntrySafari.disable();
		});


		var moveToPreviousListEntry = (function (evt) {

		//Evt.stopPropagation(currentKeyEvent);
		//Evt.preventDefault(currentKeyEvent);
		//Evt.stopEvent(currentKeyEvent);

			elmResults.style.display = "block"; Dom.addClass(elmForm, "resultListOnDisplay");

			focusedListElmIdx = Math.min((list.length - 1), ((--focusedListElmIdx <= -1) ? (list.length - 1) : (focusedListElmIdx)));
			Dom.getChildren(elmResults)[focusedListElmIdx].getElementsByTagName("a")[0].focus();

		});
		var moveToNextListEntry = (function (evt) {

		//Evt.stopEvent(currentKeyEvent);

			elmResults.style.display = "block"; Dom.addClass(elmForm, "resultListOnDisplay");

			focusedListElmIdx = Math.max(0, ((++focusedListElmIdx >= list.length) ? (0) : (focusedListElmIdx)));
			Dom.getChildren(elmResults)[focusedListElmIdx].getElementsByTagName("a")[0].focus();

		});/*
		var moveToNextListEntrySafari = (function (evt) {

		//Evt.stopEvent(currentKeyEvent);

			elmResults.style.display = "block"; Dom.addClass(elmForm, "resultListOnDisplay");
		//elmResultsYahoo.setStyle("zoom", 0.9);

			focusedListElmIdx = Math.max(0, ((++focusedListElmIdx >= list.length) ? (0) : (focusedListElmIdx)));
		//Dom.getChildren(elmResults)[focusedListElmIdx].getElementsByTagName("a")[0].focus();

			var listEntries = Dom.getChildren(elmResults);
			listEntries[focusedListElmIdx].getElementsByTagName("a")[0].focus();/ *

			elmResults.style.display = "none";
			setTimeout((function () {elmResults.style.display = "block";}), 5);* /
		//setTimeout((function () {elmResultsYahoo.setStyle("zoom", 1);}), 20);

		});*/


		return {

			importServiceUrl: (function (str) {

				serviceUrl = String(str);

				delete Application.importDestinationServiceUrl;
				delete AutocompleteController.importServiceUrl;
				delete arguments.callee;
			}),
			validateEntry: (function () {

				var str = elmInput.value.replace(regXTrim, "").replace(regXShrink, " ");
			//elmInput.value = getPlainText(elmLink).replace(regXLeftNumberTrim, "");

			//{destination: "Balearische Inseln (Spanien)", occurence: 365, id: 50096, type: "REGION"}
				var isValidEntry = (Array.filter(results, (function (obj/*, idx, arr*/) {

				//alert(elmDestinationId.value + "\n" + obj.id + "\n\n" + elmDestinationType.value + "\n" + obj.type + "\n\n]" + str + "[\n]" + obj.destination.replace(regXTrim, "").replace(regXShrink, " ") + "[\n\n" + ((elmDestinationId.value === String(obj.id)) && (elmDestinationType.value === String(obj.type)) && (str === obj.destination.replace(regXTrim, "").replace(regXShrink, " "))));
					return ((elmDestinationId.value === String(obj.id)) && (elmDestinationType.value === String(obj.type)) && (str === obj.destination.replace(regXTrim, "").replace(regXShrink, " ")));

				})).length >= 1);

				if (!isValidEntry && (str === initiallyGiven.destinationValue)) { // applies only in case there has not been taken place any searchrequest yet, so the [results] list still remained empty. this countercheck prevents unnecessary form error handling for it will not set [isValidEntry] to false but will let pass this validation check.

					elmDestinationId.value = initiallyGiven.destinationId;
					elmDestinationType.value = initiallyGiven.destinationType;

					isValidEntry = ((initiallyGiven.destinationId !== "") && (initiallyGiven.destinationType !== ""));
				}
				elmInput.value = ((isValidEntry) ? (str) : (""));

				return isValidEntry;
			}),
			initialize: (function (elm) { // is now: "searchForHotels" - was before : "destinationAutocomplete".


				KeyListener = YAHOO.util.KeyListener, KEY = KeyListener.KEY;
			//YAHOO.util.KeyListener.KEY = {ALT: 18, BACK_SPACE: 8, CAPS_LOCK: 20, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, META: 224, NUM_LOCK: 144, PAGE_DOWN: 34, PAGE_UP: 33, PAUSE: 19, PRINTSCREEN: 44, RIGHT: 39, SCROLL_LOCK: 145, SHIFT: 16, SPACE: 32, TAB: 9,UP: 38};

			//klMoveToPreviousListEntryByArrowKeys = new KeyListener(document, {/*shift: true, alt: true, ctrl: true, */keys: [KEY.LEFT, KEY.UP]}, moveToPreviousListEntry, KeyListener.KEYDOWN);
			//klMoveToPreviousListEntryByTabulator = new KeyListener(document, {shift: true, /*alt: true, ctrl: true, */keys: [KEY.TAB]}, moveToPreviousListEntry, KeyListener.KEYDOWN);
			//klMoveToNextListEntry = new KeyListener(document, {/*shift: true, alt: true, ctrl: true, */keys: [KEY.RIGHT, KEY.DOWN, KEY.TAB]}, moveToNextListEntry, KeyListener.KEYDOWN);
				klMoveToPrviousListEntry = new KeyListener(document, {/*shift: true, alt: true, ctrl: true, */keys: [KEY.LEFT, KEY.UP]}, moveToPreviousListEntry, KeyListener.KEYDOWN);
				klMoveToNextListEntry = new KeyListener(document, {/*shift: true, alt: true, ctrl: true, */keys: [KEY.RIGHT, KEY.DOWN]}, moveToNextListEntry, KeyListener.KEYDOWN);

			//(/AppleWebKit[^K]+KHTML[^G]+Gecko[^C]+Chrome[^S]+Safari/).test("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19");
				isUserAgentSafari = (document.isRenderEngineKHTML() && !((/AppleWebKit[^K]+KHTML[^G]+Gecko[^C]+Chrome[^S]+Safari/).test(navigator.userAgent))); // NOT: "google chrome"
			/*if (isUserAgentSafari) {
					klMoveToNextListEntry = new KeyListener(document, {/ *shift: true, alt: true, ctrl: true, * /keys: [KEY.RIGHT]}, moveToNextListEntry, KeyListener.KEYDOWN);
					klMoveToNextListEntrySafari = new KeyListener(document, {/ *shift: true, alt: true, ctrl: true, * /keys: [KEY.DOWN]}, moveToNextListEntrySafari, KeyListener.KEYDOWN);
				} else {
					klMoveToNextListEntrySafari = {
						enable: (function () {return;}),
						disable: (function () {return;})
					};
				}*/
				disableKeylistening();// delete KEY; delete KeyListener;


			//elmInput = elm;
				elmForm = elm.form;
				elmInput = elmForm.elements["destinationAutocomplete"];
				elmInput.autocomplete = "off";

				elmInputYahoo = new Elm(elmInput);
				elmInputYahoo.set("autocomplete", "off");

			//elmDestinationId = elmInput.parentNode.getElementsByTagName("input")["destinationId"];
			//elmDestinationType = elmInput.parentNode.getElementsByTagName("input")["destinationType"];
				elmDestinationId = (elmInput.form.elements["searchTermId"] || elmInput.form.elements["destinationId"] || document.getElementById("destinationId"));
				elmDestinationType = (elmInput.form.elements["searchTermType"] || elmInput.form.elements["destinationType"] || document.getElementById("destinationType"));
			//elmDestinationId.value = "";
			//elmDestinationType.value = "";

				initiallyGiven = {
					destinationValue: elmInput.value,
					destinationId: elmDestinationId.value,
					destinationType: elmDestinationType.value
				};
				recentlyTypedValue = elmInput.value;

			//elmSubmit = elmInput.form.elements["searchForHotels"];
				elmSubmit = elm;
				Evt.on(elmSubmit, "focus", (function () {disableKeylistening(); elmResults.style.display = "none"; Dom.removeClass(elmForm, "resultListOnDisplay");}));

			//elmNextToElmInput = (elmForm.elements[Array.indexOf(elmForm, elmInput) + 1] || elmSubmit);
			//elmNextToElmInput = (elmForm.elements["checkInDay"] || elmForm.elements["datesCheckInDay"] || document.getElementById("datesCheckInDay"));
			//elmNextToElmInput = (elmForm.elements[Array.indexOf(elmForm, elmInput) + 1] || (elmForm.elements["checkInDay"] || elmForm.elements["datesCheckInDay"] || document.getElementById("datesCheckInDay")) || elmSubmit);
				elmNextToElmInput = (elmForm.elements["checkInDay"] || elmForm.elements["datesCheckInDay"] || document.getElementById("datesCheckInDay"));

				elmResults = document.createElement("ul");

				elmResultsYahoo = new Elm(elmResults);
				elmResultsYahoo.set("id", "autocompleteResults");

				elmInput.parentNode.appendChild(elmResults);

				Evt.on(elmInput, "keyup", (function () {getNewResultList(elmInput.value);}));
				Evt.on(elmInput, "focus", (function () {onFocusWithResults(elmInput.value);}));
			//Evt.on(elmInput, "blur", (function () {onBlurWithResults(elmInput.value);}));
				Evt.on(elmInput, "blur", (function () {onBlurWithResults();}));

				if (elmInput.value.replace(regXShrink, " ").replace(regXTrim, "") === "") {

					try {
						elmInput.focus();						// set focus into *autosuggest* filed only in case there was no default set value.
					} catch (evt) {
						return;
					}
				} else {
					try {
						elmNextToElmInput.focus();	// ... otherwise set focus to the next available date selection control.
					} catch (evt) {
						return;
					}
				}


				delete AutocompleteController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [AutocompleteController] Singleton.

	Application.importDestinationServiceUrl = AutocompleteController.importServiceUrl;



	var DatesController = (function () { // [DatesController] Singleton.


		var elmDates, elmDatePicker, objDatePicker;

		var dateToday, dateTodayDayValue, dateTodayMonthValue, dateTodayYearValue;
		var dateCheckIn, elmDateCheckInDay, elmDateCheckInMonth, elmDateCheckInYear;
		var dateCheckOut, elmDateCheckOutDay, elmDateCheckOutMonth, elmDateCheckOutYear;
		var elmInOut, elmInCopy, elmOutCopy, elmFeedbackWrapper, elmInFeedbackCopy, elmOutFeedbackCopy, elmDurationCopy, isRangeSelectionAllowed;

		var MONTHS_LONG, WEEKDAYS_LONG, WEEKDAYS_SHORT = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];


		var getDoubleDigit = (function (digit) {

			digit = String(digit);
			return ((digit.length == 1) ? ("0" + digit) : (digit));
		});
		var updateFormData = (function () {

				elmDateCheckInDay.value = dateCheckIn.getDate();
				elmDateCheckInMonth.value = (dateCheckIn.getMonth() + 1);
				elmDateCheckInYear.value = dateCheckIn.getFullYear();

				elmDateCheckOutDay.value = dateCheckOut.getDate();
				elmDateCheckOutMonth.value = (dateCheckOut.getMonth() + 1);
				elmDateCheckOutYear.value = dateCheckOut.getFullYear();

				elmInCopy.data = (WEEKDAYS_SHORT[dateCheckIn.getDay()] + ".\u00a0" + getDoubleDigit(dateCheckIn.getDate()) + "." + getDoubleDigit(dateCheckIn.getMonth() + 1) + "." + dateCheckIn.getFullYear());
				elmOutCopy.data = (WEEKDAYS_SHORT[dateCheckOut.getDay()] + ".\u00a0" + getDoubleDigit(dateCheckOut.getDate()) + "." + getDoubleDigit(dateCheckOut.getMonth() + 1) + "." + dateCheckOut.getFullYear());

				hideDatePicker();
		});
		var updateFeedbackCopy = (function () {

			elmDurationCopy.data = Math.round((dateCheckOut - dateCheckIn) / 86400000); // (86400000 == (1000 * 60 * 60 * 24))

			elmInFeedbackCopy.data = (WEEKDAYS_LONG[dateCheckIn.getDay()] + ",\u00a0" + dateCheckIn.getDate() + ".\u00a0" + MONTHS_LONG[dateCheckIn.getMonth()] + "\u00a0" + dateCheckIn.getFullYear());
			elmOutFeedbackCopy.data = (WEEKDAYS_LONG[dateCheckOut.getDay()] + ",\u00a0" + dateCheckOut.getDate() + ".\u00a0" + MONTHS_LONG[dateCheckOut.getMonth()] + "\u00a0" + dateCheckOut.getFullYear());
		});
		var updateSelection = (function (interval) {

		//alert("interval.length : " + interval.length/* + "arguments.length : " + arguments.length*/);
			if (interval.length == 2) {
				if (objDatePicker) {
					if (isRangeSelectionAllowed) {

						dateCheckIn = interval[0];
						dateCheckOut = ((dateCheckIn.getTime() != interval[1].getTime()) ? (interval[1]) : (new Date(dateCheckIn.getFullYear(), dateCheckIn.getMonth(), (dateCheckIn.getDate() + 1)))); // (dateCheckOut || dateTomorrow)

						updateFeedbackCopy();

					} else {
						isRangeSelectionAllowed = true;

						if (interval[0].getTime() <= dateCheckIn.getTime()) {
							objDatePicker.select(interval[0]);
						} else/* if (interval[1].getTime() >= dateCheckIn.getTime())*/ {
							objDatePicker.select(interval[1]);
						}
					}
				} else {

					updateFormData();
				}
			}
		});
		var showDatePicker = (function () {

				if (!objDatePicker) {

					objDatePicker = new IntervalCalendar("datePicker", {

						pages: 3,

					//today: dateToday,
						MINDATE: dateToday,
						MAXDATE: new Date((dateTodayYearValue + 2), dateTodayMonthValue, dateTodayDayValue),
					//SELECTED: [dateToday/*, new Date(dateTodayYearValue, dateTodayMonthValue, (dateTodayDayValue + 1))*/],
					//SELECTED: [dateCheckIn, dateCheckOut],
						pagedate: new Date(dateCheckIn.getFullYear(), (dateCheckIn.getMonth() - 1), 1),

						LOCALE_WEEKDAYS: "short",
						START_WEEKDAY: 1,/*,
						MULTI_SELECT: true*/
						MULTI_SELECT: false
					});

					// Correct formats for Germany: dd.mm.yyyy, dd.mm, mm.yyyy
					objDatePicker.cfg.setProperty("DATE_FIELD_DELIMITER", ".");

					objDatePicker.cfg.setProperty("MDY_DAY_POSITION", 1);
					objDatePicker.cfg.setProperty("MDY_MONTH_POSITION", 2);
					objDatePicker.cfg.setProperty("MDY_YEAR_POSITION", 3);

					objDatePicker.cfg.setProperty("MD_DAY_POSITION", 1);
					objDatePicker.cfg.setProperty("MD_MONTH_POSITION", 2);

					// Date labels for German locale
					objDatePicker.cfg.setProperty("MONTHS_SHORT",    ["Jan", "Feb", "M\u00E4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]);
					objDatePicker.cfg.setProperty("MONTHS_LONG",     ["Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
					objDatePicker.cfg.setProperty("WEEKDAYS_1CHAR",  ["S", "M", "D", "M", "D", "F", "S"]);
					objDatePicker.cfg.setProperty("WEEKDAYS_SHORT",/*["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]*/WEEKDAYS_SHORT);
					objDatePicker.cfg.setProperty("WEEKDAYS_MEDIUM", ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"]);
					objDatePicker.cfg.setProperty("WEEKDAYS_LONG",   ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]);


					MONTHS_LONG = objDatePicker.cfg.getProperty("MONTHS_LONG");
					WEEKDAYS_LONG = objDatePicker.cfg.getProperty("WEEKDAYS_LONG");

					objDatePicker.selectEvent.subscribe((function() {updateSelection(this.getInterval());}), objDatePicker, true);
					objDatePicker.select([dateCheckIn, dateCheckOut]);
				//objDatePicker.select([dateCheckIn, (((dateCheckOut - dateCheckIn) > valueOfOneDaysDurationInMSec) ? (dateCheckOut) : (dateCheckIn))]);
					objDatePicker.render();

					Dom.addClass(elmDatePicker, "yui-skin-sam");


					elmDatePicker.appendChild(elmDates.removeChild(elmFeedbackWrapper)); // make [elmFeedbackWrapper] part of [elmDatePicker] // den knoten "selectionFeedbackWrapper" einfach umhaengen.

					updateFeedbackCopy();
				}


				elmDatePicker.style.display = ((Dom.getStyle(elmDatePicker, "display") == "none") ? ("block") : ("none"));
		});
		var hideDatePicker = (function () {

			elmDatePicker.style.display = "none";
		});

		return {

			initialize: (function (elm) {

				elmDates = elm;

				var list = elmDates.getElementsByTagName("div"), dateTodayFallback = new Date();

				var elmDateToday = (list["dateToday"] || document.getElementById("dateToday"));
				var elmDateCheckIn = (list["checkin"] || document.getElementById("checkin"));
				var elmDateCheckOut = (list["checkout"] || document.getElementById("checkout"));

				list = elmDateToday.getElementsByTagName("input");

				dateTodayDayValue = parseInt((list["dateTodayDay"] && list["dateTodayDay"].value), 10);
				dateTodayMonthValue = parseInt((list["dateTodayMonth"] && list["dateTodayMonth"].value), 10);
				dateTodayYearValue = parseInt((list["dateTodayYear"] && list["dateTodayYear"].value), 10);

				dateTodayDayValue = (isNaN(dateTodayDayValue) ? (dateTodayFallback.getDate()) : (dateTodayDayValue));
				dateTodayMonthValue = (isNaN(dateTodayMonthValue) ? (dateTodayFallback.getMonth()) : (dateTodayMonthValue - 1));
				dateTodayYearValue = (isNaN(dateTodayYearValue) ? (dateTodayFallback.getFullYear()) : (dateTodayYearValue));

				dateToday = new Date(dateTodayYearValue, dateTodayMonthValue, dateTodayDayValue);

				list = elmDateCheckIn.getElementsByTagName("select");

				elmDateCheckInDay = (list["checkInDay"] || list["datesCheckInDay"] || document.getElementById("datesCheckInDay"));
				elmDateCheckInMonth = (list["checkInMonth"] || list["datesCheckInMonth"] || document.getElementById("datesCheckInMonth"));
				elmDateCheckInYear = (list["checkInYear"] || list["datesCheckInYear"] || document.getElementById("datesCheckInYear"));

				dateCheckIn = new Date(parseInt(elmDateCheckInYear.value, 10), (parseInt(elmDateCheckInMonth.value, 10) - 1), parseInt(elmDateCheckInDay.value, 10));

				list = elmDateCheckOut.getElementsByTagName("select");

				elmDateCheckOutDay = (list["checkOutDay"] || list["datesCheckOutDay"] || document.getElementById("datesCheckOutDay"));
				elmDateCheckOutMonth = (list["checkOutMonth"] || list["datesCheckOutMonth"] || document.getElementById("datesCheckOutMonth"));
				elmDateCheckOutYear = (list["checkOutYear"] || list["datesCheckOutYear"] || document.getElementById("datesCheckOutYear"));

				dateCheckOut = new Date(parseInt(elmDateCheckOutYear.value, 10), (parseInt(elmDateCheckOutMonth.value, 10) - 1), parseInt(elmDateCheckOutDay.value, 10));

				delete dateTodayFallback; delete elmDateToday; delete elmDateCheckIn; delete elmDateCheckOut;


				elmInOut = elmDates.getElementsByTagName("ul")["checkInCheckOut"]; list = elmInOut.getElementsByTagName("li");
				elmInCopy = list["checkIn"].getElementsByTagName("span")[1].firstChild; // .firstChild.data
				elmOutCopy = list["checkOut"].getElementsByTagName("span")[1].firstChild; // .firstChild.data

				elmFeedbackWrapper = elmDates.getElementsByTagName("div")["selectionFeedbackWrapper"]; list = elmFeedbackWrapper.getElementsByTagName("li");
				elmInFeedbackCopy = list["checkInFeedback"].getElementsByTagName("span")[1].firstChild; // .firstChild.data
				elmOutFeedbackCopy = list["checkOutFeedback"].getElementsByTagName("span")[1].firstChild; // .firstChild.data
				elmDurationCopy = list["durationFeedback"].getElementsByTagName("span")[1].firstChild; // .firstChild.data

				list = elmFeedbackWrapper.getElementsByTagName("a");
				elmConfirmSelection = list["confirmSelection"];
				elmCloseCalendar = list["closeCalendar"];
				delete list;


				elmDatePicker = document.createElement("div");
				(new Elm(elmDatePicker)).set("id", "datePicker");

				elmDates.appendChild(elmDatePicker);


				updateSelection([dateCheckIn, dateCheckOut]);
			//updateSelection([dateToday, dateToday]);

				Evt.on(elmInOut, "click", showDatePicker);
				Evt.on(elmCloseCalendar, "click", hideDatePicker);
				Evt.on(elmConfirmSelection, "click", updateFormData);


				delete DatesController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [DatesController] Singleton.



	var RoomsController = (function () { // [RoomsController] Singleton.


		var elmRooms, elmAmountOfRooms, elmAmountOfAdults, elmAmountOfChildren, elmForm, elmFormYahoo, elmWrapper, elmBefore;
		var blueprintOccupancy, mostRecentlyRemovedOccupancy, currentOccupancyList;
		var blueprintAgeOfChild;
		var genericKeys = {};

		var forceRerendering = document.isRenderEngineMSIE();

		var regXRightDigitTrim = (/\s+\d+$/);
		var regXRightDigitOnly = (/\d+$/);


		var renumberRoomControls = (function () {

			var i, list, elmYahoo;
			Array.forEach(currentOccupancyList, (function (elm, idx/*, arr*/) {

				elmYahoo = new Elm(elm);
				i = (idx + 1);/*

				var success = elmYahoo.set("id", "room1");
				alert(success);*/

				elmYahoo.set("id", ("room" + i));
				elmYahoo.set("name", ("room" + i));

				elmYahoo.getElementsByTagName("legend")[0].firstChild.data = (genericKeys.legendRoom + " " + i);

				list = elm.getElementsByTagName("label");

				(new Elm(list[0])).set("htmlFor", (genericKeys.amountOfAdults + i));
				(new Elm(list[1])).set("htmlFor", (genericKeys.amountOfChildren + i));/*
				list[0].for = (genericKeys.amountOfAdults + i);
				list[1].for = (genericKeys.amountOfChildren + i);*/

				list = elm.getElementsByTagName("select");

				elm = list[1];
				elmYahoo = new Elm(elm);
				elmYahoo.set("id", (genericKeys.amountOfChildren + i));
			//elmYahoo.set("name", (genericKeys.amountOfChildren + i));

			//adaption according to backend requirements:
			//elmYahoo.set("name", (genericKeys.amountOfChildren + i));
				elmYahoo.set("name", ("roomOccupancies[" + idx + "].noKids"));
				elm = list[0];
				elmYahoo = new Elm(elm);

				elmYahoo.set("id", (genericKeys.amountOfAdults + i));
			//elmYahoo.set("name", (genericKeys.amountOfAdults + i));
		
			//adaption according to backend requirements:
				elmYahoo.set("name", ("roomOccupancies[" + idx + "].noAdults"));


				renumberAgeControls(); // newly and afterwards of all other methods implemented.
			}));
		});
		var normalizeRoomControls = (function () {

			var list, elmAmountOfAdults, elmAmountOfChildren, amountOfAdults, amountOfChildren;
			currentOccupancyList = elmFormYahoo.getElementsByClassName("occupancy", "fieldset");

			Array.forEach(currentOccupancyList, (function (elm/*, idx, arr*/) {

				list = elm.getElementsByTagName("select");
				elmAmountOfAdults = list[0];
				elmAmountOfChildren = list[1];
				amountOfAdults = parseInt(elmAmountOfAdults.options[elmAmountOfAdults.selectedIndex].value, 10);
				amountOfChildren = parseInt(elmAmountOfChildren.options[elmAmountOfChildren.selectedIndex].value, 10);

				if ((amountOfAdults < 1) && (amountOfChildren < 1)) {
					mostRecentlyRemovedOccupancy = elm.parentNode.removeChild(elm);
				}
			}));
			currentOccupancyList = elmFormYahoo.getElementsByClassName("occupancy", "fieldset");
			renumberRoomControls();/*

		//not supposed to happen ever.
			if (currentOccupancyList.length === 0) {
				alert("normalizeRoomControls ::\n\ncurrentOccupancyList.length : " + currentOccupancyList.length);
				elmForm.insertBefore(blueprintOccupancy.cloneNode(true), elmBefore);
			}*/
			if (forceRerendering) {

				setTimeout((function () {elmFormYahoo.setStyle("display", "");}), 30);
				setTimeout((function () {elmFormYahoo.setStyle("display", "block");}), 50);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "");}), 60);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "block");}), 70);
			}
		});
		var readjustRoomControls = (function () {

			normalizeRoomControls();

			currentOccupancyList = elmFormYahoo.getElementsByClassName("occupancy", "fieldset");

			var num = parseInt(elmAmountOfRooms.options[elmAmountOfRooms.selectedIndex].value, 10);
			var len = currentOccupancyList.length;
		//alert("option value : " + num + "\ncurrentOccupancyList.length : " + len + "\ncurrentOccupancyList : " + currentOccupancyList);

			if (num > len) { // add room controls.

				var i = len, k, val, txt, obj, list, elm, elmYahoo, elmInsert, elmInsertYahoo;
				while (++i <= num) {

					elmInsert = blueprintOccupancy.cloneNode(true);
					elmInsert.getElementsByTagName("select")[1].options[0].selected = true; // reset default selection of amountOfChildren-dropdown.

					elm = elmInsert.getElementsByTagName("select")[0];

					k = 0;
					val = parseInt(elm.options[elm.options.length - 1].value, 10);

					elm.options.length = 0;
					elm.options.length = val;

					while (k < val) {

						obj = new Option();
						obj.value = k+1;
						obj.text = k+1;

						elm.options[k++] = obj;
					}
					elmForm.insertBefore(elmInsert, elmBefore);
				}
			} else if (--num < --len) { // remove room controls.

				num = Math.max(0, num);

				var elm;
				while (--len >= num) {

					elm = currentOccupancyList[len];
					mostRecentlyRemovedOccupancy = elm.parentNode.removeChild(elm);
				}
				if (num === 0) { // reinitialize the new first dropdown related to the room occupancies.
					currentOccupancyList = elmFormYahoo.getElementsByClassName("occupancy", "fieldset"); // refreshing [currentOccupancyList] is necessary here even though it is supposed to behave as a "live node list".
					elmAmountOfAdults = currentOccupancyList[0].getElementsByTagName("select")[0];
					if (parseInt(elmAmountOfAdults.options[0].value, 10) === 0) {
						var idx = elmAmountOfAdults.selectedIndex;
						elmAmountOfAdults.removeChild(elmAmountOfAdults.options[0]);
						elmAmountOfAdults.options[Math.max(0, (idx - 1))].selected = true;
					}
				}
			}
			if (forceRerendering) {

				setTimeout((function () {elmFormYahoo.setStyle("display", "");}), 30);
				setTimeout((function () {elmFormYahoo.setStyle("display", "block");}), 50);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "");}), 60);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "block");}), 70);
				
			}
			currentOccupancyList = elmFormYahoo.getElementsByClassName("occupancy", "fieldset");

			renumberRoomControls();
			reassignAgeControlsBehavior();
		});


		var checkRoomControlsBeforeSubmit = (function () {

			normalizeRoomControls();
			elmAmountOfRooms.options[Array.map(elmAmountOfRooms.options, (function (elm/*, idx, arr*/) {return parseInt(elm.value, 10);})).indexOf(currentOccupancyList.length)].selected = true;
			return true;
		});


		var renumberAgeControls = (function () {

			var amountOfChildrenElmList = elmFormYahoo.getElementsByClassName("amountOfChildren", "div").map(function (elm/*, idx, arr*/) {return elm.getElementsByTagName("select")[0];});
			Array.forEach(amountOfChildrenElmList, (function (elmAmountOfChildren, roomIdx/*, arr*/) {

				var elmFieldset = elmAmountOfChildren.parentNode.parentNode;
				var ageOfChildElmList = Dom.getElementsByClassName("ageOfChild", "div", elmFieldset);

				var/* elmAgeOfChild,*/ elmLabel, elmSelect, elmYahoo;

				Array.forEach(ageOfChildElmList, (function (elmAgeOfChild, idx/*, arr*/) {

					elmLabel = elmAgeOfChild.getElementsByTagName("label")[0];
					elmSelect = elmAgeOfChild.getElementsByTagName("select")[0];

					(new Elm(elmLabel)).set("htmlFor", ("roomOccupancies[" + roomIdx + "].kids[" + idx + "].age"));

					elmYahoo = new Elm(elmSelect);
					elmYahoo.set("id", ("roomOccupancies[" + roomIdx + "].kids[" + idx + "].age"));
					elmYahoo.set("name", ("roomOccupancies[" + roomIdx + "].kids[" + idx + "].age"));
				}));
			}));
		});


		var reassignAgeControlsBehavior = (function () {

			Array.forEach(elmFormYahoo.getElementsByClassName("amountOfChildren", "div"), (function (elm, idx/*, arr*/) {

			//alert("reassignAgeControlsBehavior - idx : " + idx + " - elm : " + elm);
				elm.getElementsByTagName("select")[0].onchange = (function () {readjustAgeControls(this);});
			}));
		});
		var readjustAgeControls = (function (elm) { // elmAmountOfChildren

		//alert("readjustAgeControls - elm.id : " + elm.id + " - elm : " + elm + " - test : " + (elm && (typeof elm.nodeName == "string") && (elm.nodeName.toLowerCase() == "select") && Dom.hasClass(elm.parentNode, "amountOfChildren")));
		//elmAmountOfChildren -> amountOfChildrenElmList
			var amountOfChildrenElmList = elmFormYahoo.getElementsByClassName("amountOfChildren", "div").map(function (elm/*, idx, arr*/) {return elm.getElementsByTagName("select")[0];});
			((elm && (typeof elm.nodeName == "string") && (elm.nodeName.toLowerCase() == "select") && Dom.hasClass(elm.parentNode, "amountOfChildren")) ? ([elm]) : (amountOfChildrenElmList)).forEach(function (elmAmountOfChildren/*, idx, arr*/) {

				var elmFieldset = elmAmountOfChildren.parentNode.parentNode;
				var amountOfChildren = parseInt(elmAmountOfChildren.options[elmAmountOfChildren.selectedIndex].value, 10);
				var ageOfChildElmList = Dom.getElementsByClassName("ageOfChild", "div", elmFieldset);
				var len = ageOfChildElmList.length, cycles = (len - amountOfChildren), idx = 0;
				if (cycles >= 1) { // remove

					while (++idx <= cycles) {

						elmFieldset.removeChild(ageOfChildElmList.pop());
					}
				} else if (cycles <= -1) { // append

					var roomIdx = amountOfChildrenElmList.indexOf(elmAmountOfChildren);
					var valueChildsAge = (elmForm.getElementsByTagName("input")["genericWordingChildsAge"] || elmForm.elements["genericWordingChildsAge"] || document.getElementById("genericWordingChildsAge")).value;
					var maxChildsYears = parseInt((elmForm.getElementsByTagName("input")["maxAmountOfAChildsYears"] || elmForm.elements["maxAmountOfAChildsYears"] || document.getElementById("maxAmountOfAChildsYears")).value, 10);/*

		<label for="roomOccupancies[0].kids[0].age">Kind 1</label>
		<select name="roomOccupancies[0].kids[0].age" id="roomOccupancies[0].kids[0].age" class="selectDigits1" size="1">
*/
					var elmAgeOfChild, elmLabel, elmSelect, elmYahoo, obj, k;

					while (--idx >= cycles) {

						elmAgeOfChild = blueprintAgeOfChild.cloneNode(true);
						elmLabel = elmAgeOfChild.getElementsByTagName("label")[0];
						elmSelect = elmAgeOfChild.getElementsByTagName("select")[0];

						elmLabel.firstChild.data = (valueChildsAge + " " + (len + Math.abs(idx)));
						(new Elm(elmLabel)).set("htmlFor", ("roomOccupancies[" + roomIdx + "].kids[" + (len + Math.abs(idx) - 1) + "].age"));

						elmYahoo = new Elm(elmSelect);
						elmYahoo.set("id", ("roomOccupancies[" + roomIdx + "].kids[" + (len + Math.abs(idx) - 1) + "].age"));
						elmYahoo.set("name", ("roomOccupancies[" + roomIdx + "].kids[" + (len + Math.abs(idx) - 1) + "].age"));

						elmSelect.options.length = 0;
						k = 0;

						while (k <= maxChildsYears) {

							obj = new Option();
							obj.value = k;
							obj.text = k;

							elmSelect.options[k++] = obj;
						}
						elmFieldset.appendChild(elmAgeOfChild);
					}
				}
			});
			if (forceRerendering) {

				setTimeout((function () {elmFormYahoo.setStyle("display", "");}), 30);
				setTimeout((function () {elmFormYahoo.setStyle("display", "block");}), 50);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "");}), 60);
				setTimeout((function () {Dom.setStyle(elmWrapper, "display", "block");}), 70);
			}
		});


		return {/*

			importAmountOfRoomsElement: (function (elm) {

				elmAmountOfRooms = elm;

			//RoomsController.initialize();

				delete RoomsController.importAmountOfRoomsElement;
				delete arguments.callee;
			}),
			importAmountOfAdultsElement: (function (elm) {

				elmAmountOfAdults = elm;

				delete RoomsController.importAmountOfAdultsElement;
				delete arguments.callee;
			}),
			importAmountOfChildrenElement: (function (elm) {

				elmAmountOfChildren = elm;

				delete RoomsController.importAmountOfChildrenElement;
				delete arguments.callee;
			}),
			onAmountOfRoomsChanged: (function (p_sType, p_aArgs, p_oItem) {

			//onMenuItemClick(p_sType, p_aArgs, p_oItem, elmAmountOfRooms);
				elmAmountOfRooms.set("label", p_oItem.cfg.getProperty("text"));
			}),
			onAmountOfAdultsChanged: (function (p_sType, p_aArgs, p_oItem) {

				elmAmountOfAdults.set("label", p_oItem.cfg.getProperty("text"));
			}),
			onAmountOfChildrenChanged: (function (p_sType, p_aArgs, p_oItem) {

				elmAmountOfChildren.set("label", p_oItem.cfg.getProperty("text"));
			}),*/


			initialize: (function (elm) {

				elmRooms = elm;
				elmAmountOfRooms = elmRooms.getElementsByTagName("select")["noRooms"];

				elmForm = elmAmountOfRooms.form;
				elmFormYahoo = new Elm(elmForm);
				
				elmWrapper = Dom.get("searchAndbookWrapper");

				Evt.on(elmForm, "submit", (function () {return checkRoomControlsBeforeSubmit();}));

			//elmBefore = elmForm.getElementsByTagName("div")["hotelsRating"];
				elmBefore = elmForm.getElementsByTagName("fieldset")["stars"];

				var elmFirstOccupancy = elmFormYahoo.getElementsByClassName("occupancy", "fieldset")[0];
				if (elmFirstOccupancy) {

					var elmAmountOfAdults = elmFirstOccupancy.getElementsByTagName("select")[0];
					if (elmAmountOfAdults) {

						if ((parseInt(elmAmountOfAdults.options[0].value, 10) === 0) ||  (parseInt(elmAmountOfAdults.options[0].text, 10) === 0)) {
							elmAmountOfAdults.removeChild(elmAmountOfAdults.options[0]);
						}
						blueprintOccupancy = elmFirstOccupancy.cloneNode(true);

						Array.forEach(Dom.getElementsByClassName("ageOfChild", "div", blueprintOccupancy), (function (elm/*, idx, arr*/) { // cleanup of [blueprintOccupancy]
							blueprintOccupancy.removeChild(elm);
						}));
					//blueprintOccupancy.getElementsByTagName("select")[1].options[0].selected = true; // reset default selection of amountOfChildren-dropdown of course does not work.

						delete elmFirstOccupancy; delete elmAmountOfAdults;
					/*
						var elm = blueprintOccupancy.getElementsByTagName("legend")[0];
						var txt = (elm.firstChild.data || elm.innerHTML || elm.innerText);
						alert("txt : " + txt);
					*/
						genericKeys.legendRoom = blueprintOccupancy.getElementsByTagName("legend")[0].firstChild.data.replace(regXRightDigitTrim, "");

						var list = blueprintOccupancy.getElementsByTagName("select");

						genericKeys.amountOfAdults = list[0].id.replace(regXRightDigitOnly, "");
						genericKeys.amountOfChildren = list[1].id.replace(regXRightDigitOnly, "");

					//alert("genericKeys.legendRoom : " + genericKeys.legendRoom + "\ngenericKeys.amountOfAdults : " + genericKeys.amountOfAdults + "\ngenericKeys.amountOfChildren : " + genericKeys.amountOfChildren + "\n");
					//console.log("genericKeys.legendRoom : " + genericKeys.legendRoom + "\ngenericKeys.amountOfAdults : " + genericKeys.amountOfAdults + "\ngenericKeys.amountOfChildren : " + genericKeys.amountOfChildren + "\n");

						Evt.on(elmAmountOfRooms, "change", readjustRoomControls);
					}
				}/*
	"<div class=\"ageOfChild\"><label for=\"roomOccupancies[0].kids[0].age\">Kind 1</label><select name=\"roomOccupancies[0].kids[0].age\" id=\"roomOccupancies[0].kids[0].age\" class=\"selectDigits1\" size=\"1\"><option value=\"0\">0</option></select></div>"

	<div class="ageOfChild">
		<label for="roomOccupancies[0].kids[0].age">Kind 1</label>
		<select name="roomOccupancies[0].kids[0].age" id="roomOccupancies[0].kids[0].age" class="selectDigits1" size="1">
			<option value="0">0</option>
			<option value="17">17</option>
		</select>
	</div>
*/
				blueprintAgeOfChild = elmFormYahoo.getElementsByClassName("ageOfChild", "div")[0];
				if (blueprintAgeOfChild) {
					blueprintAgeOfChild = blueprintAgeOfChild.cloneNode(true);
				} else {
					blueprintAgeOfChild = document.createElement("div");
					blueprintAgeOfChild.className = "ageOfChild";
					blueprintAgeOfChild.innerHTML = "<label>Age of Child</label><select size=\"1\"></select>"; // do not touch this alternative ... never ... ever.
				}
				reassignAgeControlsBehavior();


				delete RoomsController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [RoomsController] Singleton.



	var PriceRangeController = (function () { // [PriceRangeController] Singleton.


		var elmFieldset, elmPriceRangeStatus, defaultMinVal, defaultMaxVal, defaultPriceCoefficient;
		var priceSlider, priceSliderCurrency, priceSliderOverallPixelRange = 183;
	//(currentValue[y] / (defaultMaxVal - defaultMinVal)) === ((sliderMinValue||sliderMaxValue)[x] / priceSliderOverallPixelRange)


		var updatePriceRange = (function (minValue, maxValue) {

			elmPriceRangeStatus.innerHTML = (minValue + priceSliderCurrency + " - " + maxValue + priceSliderCurrency);
		});
		var applyPriceRangeFilter = (function (minValue, maxValue) {

			updatePriceRange(minValue, maxValue);

			ResultFilterController.applyPriceRangeFilter(minValue, maxValue);
		});


		var applyDefaultOptions = (function () {

		//alert("applyDefaultOptions");
			var sortedTotalCostsRange = Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement")/* && (Dom.getStyle(elm, "display") != "none")*/);

			})).map(function (elm/*, idx, arr*/) {

				return (parseFloat(Dom.getElementsByClassName("costsTotal", "input", elm)[0].value, 10)); // totalCostsValue.

			}).sort(function (a, b) {

				return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
			});
		//alert("sortedTotalCostsRange.length : " + sortedTotalCostsRange.length);
			if (sortedTotalCostsRange.length >= 1) {

				defaultMinVal = Math.floor(sortedTotalCostsRange[0]);
				defaultMaxVal = Math.ceil(sortedTotalCostsRange[sortedTotalCostsRange.length - 1]);
			//alert("defaultMinVal : " + defaultMinVal + "\ndefaultMaxVal : " + defaultMaxVal);

				defaultPriceCoefficient = ((defaultMaxVal - defaultMinVal) / priceSliderOverallPixelRange);

				if (ResultFilterController.setInitialPriceRange) {

					ResultFilterController.setInitialPriceRange(defaultMinVal, defaultMaxVal);
				}
			}
			else { // there was no result
				defaultMinVal = 0;
				defaultMaxVal = 0;
			}

			delete applyDefaultOptions;
			delete arguments.callee;
		});


		return {


			setDefaultRange: (function () {

			//alert("PriceRangeController.setDefaultRange");
				if (applyDefaultOptions && defaultPriceCoefficient) {

					applyDefaultOptions();
				}

				delete PriceRangeController.setDefaultRange;
				delete arguments.callee;
			}),
			initialize: (function (elm) {


				elmFieldset = elm;

				priceSliderCurrency = (elmFieldset.getElementsByTagName("input")["TUI-AOWLB"] || document.getElementById("priceSliderCurrency") || {value:"EUR"}).value;
			//alert("priceSliderCurrency : " + priceSliderCurrency);


				if (elmResultList && applyDefaultOptions) {

					applyDefaultOptions();
				}


				//create priceslider
				var createPriceSlider = (function (element, id, range, outputdiv) {

					var slider = element;
					elmPriceRangeStatus  = outputdiv; //  // [priceOutput] was labeled [elmPriceRangeStatus] before.

					//create slider dom elements 
					var highlight_bg = document.createElement("SPAN");
					highlight_bg.id = "priceSlider_highlight_"+id;
					highlight_bg.className = "dual_slider_highlight";
					var slider_min = document.createElement("DIV");
					slider_min.id = "priceSlider_min_thumb_"+id;
					slider_min.className = "dual_slider_min_thumb";
					var slider_max = document.createElement("DIV");
					slider_max.id = "priceSlider_max_thumb_"+id;
					slider_max.className = "dual_slider_max_thumb";
					var slider_min_output = document.createElement("DIV");
					slider_min_output.id = "priceSlider_min_output_"+id;
					slider_min_output.className = "priceSlider_min_output";
					slider_min_output.innerHTML = (defaultMinVal + " " + priceSliderCurrency);
					var slider_max_output = document.createElement("DIV");
					slider_max_output.id = "priceSlider_max_output_"+id;
					slider_max_output.className = "priceSlider_max_output";
					slider_max_output.innerHTML = (defaultMaxVal + " " + priceSliderCurrency);

					//write slider dom elements 
					Dom.addClass(slider, "dual_slider");
					slider.appendChild(highlight_bg);
					slider.appendChild(slider_min);
					slider.appendChild(slider_max);
					slider.appendChild(slider_min_output);
					slider.appendChild(slider_max_output);

				//if (priceOutput) {priceOutput.innerHTML = "Any";} // [priceOutput] now is labeled [elmPriceRangeStatus]
					updatePriceRange(defaultMinVal, defaultMaxVal);

					//create the DualSlider
					var tickSize = 0;
					var priceSlider = YAHOO.widget.Slider.getHorizDualSlider(
						slider, 
						"priceSlider_min_thumb_"+id, 
						"priceSlider_max_thumb_"+id, 
						range, 
						tickSize
					);
					priceSlider._highlight = Dom.get("priceSlider_highlight_"+id);
					priceSlider.updateHighlight = (function () {
						var delta = this.maxVal - this.minVal;	
						Dom.setStyle(this._highlight,'left', (this.minVal + 12)-10 + 'px');
						Dom.setStyle(this._highlight,'width', Math.max(delta - 12,0)+20 + 'px');
					});
					priceSlider.reset = (function () {
						this.setValues(0,range); 
					});
					priceSlider.subscribe('change', priceSlider.updateHighlight, priceSlider, true);
					priceSlider.subscribe('change', (function () {

						updatePriceRange(Math.round((this.minVal * defaultPriceCoefficient) + defaultMinVal), Math.round((this.maxVal * defaultPriceCoefficient) + defaultMinVal));
					}));

					Dom.setStyle(slider, "visibility", "visible");		

					return priceSlider;
				});


				var ps_div = Dom.getElementsByClassName('yui-priceslider', 'div', elm)[0];
				var ps_output = Dom.getElementsByClassName('yui-priceslider-output', 'div', elm)[0];


				//create priceslider
				priceSlider = createPriceSlider(ps_div, 'ps', priceSliderOverallPixelRange, ps_output);
				priceSlider.subscribe("slideEnd", (function () {

					applyPriceRangeFilter(Math.round((this.minVal * defaultPriceCoefficient) + defaultMinVal), Math.round((this.maxVal * defaultPriceCoefficient) + defaultMinVal));
				}));

				delete ps_div; delete ps_output; delete createPriceSlider;


				PriceRangeController.priceSlider = priceSlider;


				delete PriceRangeController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [PriceRangeController] Singleton.


 
	var CategoryController = (function () { // [CategoryController] Singleton.


		var elmFieldset, defaultMinVal, defaultMaxVal, elmCategoryRangeStatus;
		var starSlider, starSliderInitialRangeValues = [0, 131];
		var copyNToMStarsTo, copyNToMStarsStars;

		var updateCategoryRange = (function (minValue, maxValue) {

			elmCategoryRangeStatus.innerHTML = (minValue + " " + copyNToMStarsTo + " " + maxValue + " " + copyNToMStarsStars);
			ResultFilterController.applyCategoriesFilter(((minValue <= 1) ? (0) : (minValue)), maxValue); // a 1 star minimum is supposed to be equal to a zero star filter.
		});


		var applyDefaultSelected = (function () {

			if (elmResultList && elmResultList.childNodes) {
				if (ResultFilterController.setInitialCategoriesRange) {

					ResultFilterController.setInitialCategoriesRange(((defaultMinVal <= 1) ? (0) : (defaultMinVal)), defaultMaxVal);
				}
				ResultFilterController.applyCategoriesFilter(((defaultMinVal <= 1) ? (0) : (defaultMinVal)), defaultMaxVal);
			}

			delete applyDefaultSelected;
			delete arguments.callee;
		});

		var resetSlider = (function() {
			
			if (defaultMinVal >= 2) {
				this.minVal = starSliderInitialRangeValues[0];
				this.activeSlider = this.minSlider;
			}
			if (defaultMaxVal <= 4) {
				this.maxVal = starSliderInitialRangeValues[1];
				this.activeSlider = this.maxSlider;
			}
			this.updateHighlight();
			updateCategoryRange(defaultMinVal, defaultMaxVal);

			this.setValues(starSliderInitialRangeValues[0], starSliderInitialRangeValues[1]);			
		});
		
		var updateSliderHighlight = (function () {
			var delta = this.maxVal - this.minVal,
			newStatus = 'ok',
			hlWidth = Dom.getStyle(this._highlight,'width'),
			hlWidth = hlWidth.slice(0, (hlWidth.length-2));

			if (this.activeSlider === this.minSlider) {
				Dom.setStyle(this._highlight,'width', Math.max(delta - 12,0)+12 + 'px');
			}
			if (this.activeSlider === this.maxSlider) {
				Dom.setStyle(this._highlight,'width', delta + 'px');
			}
			Dom.setStyle(this._highlight,'left', (this.minVal + 8) + 'px');
			Dom.setStyle(this._highlight,'backgroundPosition', 0 - (8 + this.minVal) + 'px -280px');
	
			//updateCategoryRange(Math.floor((this.minVal/this.tickSize) + 1), Math.floor(this.maxVal/this.tickSize));
		});

		return {

			setDefaultRange: (function () {

				if (applyDefaultSelected && (typeof defaultMinVal == "number") && (typeof defaultMaxVal == "number")) {
					applyDefaultSelected();
				}

				delete CategoryController.setDefaultRange;
				delete arguments.callee;
			}),
			initialize: (function (elm) {

				elmFieldset = elm;

				var elmStarsMin = (elmFieldset.getElementsByTagName("input")["starsMinFilter"] || document.getElementById("starsMinFilter"));
				var elmStarsMax = (elmFieldset.getElementsByTagName("input")["starsMaxFilter"] || document.getElementById("starsMaxFilter"));

			//NOT a very nice solution but ...
			//sometimes the DOM suffers from *hickups* - even though the parent element is fully accessible some of its child nodes seem to be not - though just try again (this problem occurs only with that bunch of inluded tracking scripts).
				if (!elmStarsMin || !elmStarsMax) {
					setTimeout((function () {CategoryController.initialize(elmFieldset);}), 200);
					return;
				}

				defaultMinVal = Number(parseInt(elmStarsMin.value, 10));
				defaultMaxVal = Number(parseInt(elmStarsMax.value, 10));

				defaultMinVal = ((isNaN(defaultMinVal)) ? (1) : (Math.max(1, defaultMinVal))); // (0, defaultMinVal); // in case there should be search for 0/none rated hotels.
				defaultMaxVal = ((isNaN(defaultMaxVal)) ? (5) : (Math.min(5, defaultMaxVal)));
				
				if (defaultMaxVal < defaultMinVal) {
					var newMin = defaultMaxVal;
					defaultMaxVal = defaultMinVal;
					defaultMinVal = newMin;
				}
				elmStarsMin.value = defaultMinVal;
				elmStarsMax.value = defaultMaxVal;

				var htmlSpanCollection = elmFieldset.getElementsByTagName("span");
				copyNToMStarsTo = (htmlSpanCollection["nToMStars2CopyTo"] || document.getElementById("nToMStars2CopyTo")).firstChild.data;
				copyNToMStarsStars = (htmlSpanCollection["nToMStars2CopyStars"] || document.getElementById("nToMStars2CopyStars")).firstChild.data;


				//create starslider
				var createStarSlider = (function (element, id, initValues, outputdiv) {

					var slider = element;
					elmCategoryRangeStatus = outputdiv; // [elmCategoryRangeStatus] was labeled [starOutput] before

					//create starslider dom elements 
					var highlight_bg = document.createElement("SPAN");
					highlight_bg.id = "starChooser_highlight_"+id;
					highlight_bg.className ="dual_slider_highlight";
					highlight_bg.appendChild(document.createTextNode(" "));

					var slider_min = document.createElement("DIV");
					slider_min.id = "starChooser_min_thumb_"+id;
					slider_min.className = "dual_slider_min_thumb";
					var slider_min_image = document.createElement("IMG");
					slider_min_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
					slider_min_image.setAttribute("width", "14");
					slider_min_image.setAttribute("height", "18");
					slider_min_image.setAttribute("alt", "");
					slider_min.appendChild(slider_min_image);

					var slider_max = document.createElement("DIV");
					slider_max.id = "starChooser_max_thumb_"+id;
					slider_max.className = "dual_slider_max_thumb";
					var slider_max_image = document.createElement("IMG");
					slider_max_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
					slider_max_image.setAttribute("width", "14");
					slider_max_image.setAttribute("height", "18");
					slider_max_image.setAttribute("alt", "");
					slider_max.appendChild(slider_max_image);

					//write slider dom elements 
					Dom.addClass(slider, "dual_slider_rating");
					slider.appendChild(highlight_bg);
					slider.appendChild(slider_min);
					slider.appendChild(slider_max);


					// Create the DualSlider
					var range = starSliderInitialRangeValues[1]; // 131;
					var tickSize = 26;
					var initialRangeValueMin = ((defaultMinVal >= 2) ? ((defaultMinVal - 1) * tickSize) : (starSliderInitialRangeValues[0]));
					var initialRangeValueMax = ((defaultMaxVal <= 4) ? (range - ((5 - defaultMaxVal) * tickSize)) : (starSliderInitialRangeValues[1]));

					starSliderInitialRangeValues = [initialRangeValueMin, initialRangeValueMax];

					starChooser = YAHOO.widget.Slider.getHorizDualSlider(slider.id, "starChooser_min_thumb_"+id, "starChooser_max_thumb_"+id, range, tickSize, starSliderInitialRangeValues/*initValues*/);
					
					YAHOO.lang.augmentObject(starChooser, {
						_status : 'ok',
						_highlight: Dom.get("starChooser_highlight_"+id),
						getStatus: function () { return this._status;},
						reset: resetSlider,
						updateHighlight: updateSliderHighlight,
						tickSize: tickSize
					},true);
					
					
					starChooser.subscribe('change', starChooser.updateHighlight, starChooser, true);
					Dom.setStyle(slider,"visibility", "visible");		

					return starChooser;
				});


				var ss_div = Dom.getElementsByClassName('yui-starslider', 'div', elmFieldset)[0];
				var ss_output = Dom.getElementsByClassName('yui-starslider-output', 'div', elmFieldset)[0];

				//init starslider
				starSlider = createStarSlider(ss_div, 'ss2', starSliderInitialRangeValues, ss_output);
				starSlider.subscribe("slideEnd", (function () { // formerly was [setStarsForSearch]
					updateCategoryRange(Math.floor((this.minVal/this.tickSize) + 1), Math.floor(this.maxVal/this.tickSize));
				}));

				//starSlider.reset();
				starSlider.updateHighlight();

				delete ss_div; delete ss_output; delete createStarSlider;


				CategoryController.starSlider = starSlider;


				if (elmResultList && applyDefaultSelected) {

					applyDefaultSelected();
				}

				delete CategoryController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [CategoryController] Singleton.



	var CategorySearchController = (function () { // [CategorySearchController] Singleton.


		var elmFieldset, elmStarsMin, elmStarsMax, defaultMinVal, defaultMaxVal, elmCategoryRangeStatus;
		var starSlider, starSliderInitialRangeValues = [0, 131];
		var copyNToMStarsTo, copyNToMStarsStars;

		var elmSearchAndbookWrapper;

		var updateCategoryRange = (function (minValue, maxValue) {

			elmStarsMin.value = minValue;
			elmStarsMax.value = maxValue;

			elmCategoryRangeStatus.innerHTML = (minValue + " " + copyNToMStarsTo + " " + maxValue + " " + copyNToMStarsStars);
		});
		
		var resetSlider = (function() {
			
			if (defaultMinVal >= 2) {
				this.minVal = starSliderInitialRangeValues[0];
				this.activeSlider = this.minSlider;
			}
			if (defaultMaxVal <= 4) {
				this.maxVal = starSliderInitialRangeValues[1];
				this.activeSlider = this.maxSlider;
			}
			this.updateHighlight();
			updateCategoryRange(defaultMinVal, defaultMaxVal);

			this.setValues(starSliderInitialRangeValues[0], starSliderInitialRangeValues[1]);			
		});
		
		var updateSliderHighlight = (function () {
			
			var delta = this.maxVal - this.minVal,
			newStatus = 'ok',
			hlWidth = Dom.getStyle(this._highlight,'width'),
			hlWidth = hlWidth.slice(0, (hlWidth.length-2));

			if (this.activeSlider === this.minSlider) {
				Dom.setStyle(this._highlight,'width', Math.max(delta - 12,0)+12 + 'px');
			}
			if (this.activeSlider === this.maxSlider) {
				Dom.setStyle(this._highlight,'width', delta + 'px');
			}
			Dom.setStyle(this._highlight,'left', (this.minVal + 8) + 'px');
			Dom.setStyle(this._highlight,'backgroundPosition', 0 - (8 + this.minVal) + 'px -280px');
	
			updateCategoryRange(Math.floor((this.minVal/this.tickSize) + 1), Math.floor(this.maxVal/this.tickSize));
		});


		return {
			
			initialize: (function (elm) {

				elmSearchAndbookWrapper = (document.getElementsByTagName("div")["searchAndbookWrapper"] || document.getElementById("searchAndbookWrapper"));
				if (elmSearchAndbookWrapper && (Dom.getStyle(elmSearchAndbookWrapper, "display") == "none")) {

					return;
				}

				elmFieldset = elm;

				elmStarsMin = (elmFieldset.getElementsByTagName("input")["starsMin"] || document.getElementById("starsMin"));
				elmStarsMax = (elmFieldset.getElementsByTagName("input")["starsMax"] || document.getElementById("starsMax"));
				
			//NOT a very nice solution but ...
			//sometimes the DOM suffers from *hickups* - even though the parent element is fully accessible some of its child nodes seem to be not - though just try again (this problem occurs only with that bunch of inluded tracking scripts).
				if (!elmStarsMin || !elmStarsMax) {
					setTimeout((function () {CategorySearchController.initialize(elmFieldset);}), 200);
					return;
				}

				defaultMinVal = Number(parseInt(elmStarsMin.value, 10));
				defaultMaxVal = Number(parseInt(elmStarsMax.value, 10));

				defaultMinVal = ((isNaN(defaultMinVal)) ? (1) : (Math.max(1, defaultMinVal))); // (0, defaultMinVal); // in case there should be search for 0/none rated hotels.
				defaultMaxVal = ((isNaN(defaultMaxVal)) ? (5) : (Math.min(5, defaultMaxVal)));

				if (defaultMaxVal < defaultMinVal) {
					var newMin = defaultMaxVal;
					defaultMaxVal = defaultMinVal;
					defaultMinVal = newMin;
				}
				elmStarsMin.value = defaultMinVal;
				elmStarsMax.value = defaultMaxVal;

				var htmlSpanCollection = elmFieldset.getElementsByTagName("span");
				copyNToMStarsTo = (htmlSpanCollection["nToMStarsCopyTo"] || document.getElementById("nToMStarsCopyTo")).firstChild.data;
				copyNToMStarsStars = (htmlSpanCollection["nToMStarsCopyStars"] || document.getElementById("nToMStarsCopyStars")).firstChild.data;

				//create starslider
				var createStarSlider = (function (element, id, initValues, outputdiv) {

					var slider = element;
					elmCategoryRangeStatus = outputdiv; // [elmCategoryRangeStatus] was labeled [starOutput] before

					//create starslider dom elements 
					var highlight_bg = document.createElement("SPAN");
					highlight_bg.id = "starChooser_highlight_"+id;
					highlight_bg.className ="dual_slider_highlight";
					highlight_bg.appendChild(document.createTextNode(" "));

					var slider_min = document.createElement("DIV");
					slider_min.id = "starChooser_min_thumb_"+id;
					slider_min.className = "dual_slider_min_thumb";
					var slider_min_image = document.createElement("IMG");
					slider_min_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
					slider_min_image.setAttribute("width", "14");
					slider_min_image.setAttribute("height", "18");
					slider_min_image.setAttribute("alt", "");
					slider_min.appendChild(slider_min_image);

					var slider_max = document.createElement("DIV");
					slider_max.id = "starChooser_max_thumb_"+id;
					slider_max.className = "dual_slider_max_thumb";
					var slider_max_image = document.createElement("IMG");
					slider_max_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
					slider_max_image.setAttribute("width", "14");
					slider_max_image.setAttribute("height", "18");
					slider_max_image.setAttribute("alt", "");
					slider_max.appendChild(slider_max_image);

					//write slider dom elements 
					Dom.addClass(slider, "dual_slider_rating");
					slider.appendChild(highlight_bg);
					slider.appendChild(slider_min);
					slider.appendChild(slider_max);

					// Create the DualSlider
					var range = starSliderInitialRangeValues[1]; // 131;
					var tickSize = 26;
					var initialRangeValueMin = ((defaultMinVal >= 2) ? ((defaultMinVal - 1) * tickSize) : (starSliderInitialRangeValues[0]));
					var initialRangeValueMax = ((defaultMaxVal <= 4) ? (range - ((5 - defaultMaxVal) * tickSize)) : (starSliderInitialRangeValues[1]));

					starSliderInitialRangeValues = [initialRangeValueMin, initialRangeValueMax];

					starChooser = YAHOO.widget.Slider.getHorizDualSlider(slider.id, "starChooser_min_thumb_"+id, "starChooser_max_thumb_"+id, range, tickSize, starSliderInitialRangeValues/*initValues*/);
					
					YAHOO.lang.augmentObject(starChooser, {
						_status : 'ok',
						_highlight: Dom.get("starChooser_highlight_"+id),
						getStatus: function () { return this._status;},
						reset: resetSlider,
						updateHighlight: updateSliderHighlight,
						tickSize: tickSize
					},true);
					
					starChooser.subscribe('change', starChooser.updateHighlight, starChooser, true);
					Dom.setStyle(slider,"visibility", "visible");		

					return starChooser;
				});


				var ss_div = Dom.getElementsByClassName('yui-starslider', 'div', elmFieldset)[0];
				var ss_output = Dom.getElementsByClassName('yui-starslider-output', 'div', elmFieldset)[0];

				//init starslider
				starSlider = createStarSlider(ss_div, 'ss1', starSliderInitialRangeValues, ss_output);
				starSlider.subscribe("slideEnd", (function () { // formerly was [setStarsForSearch]
					updateCategoryRange(Math.floor((this.minVal/this.tickSize) + 1), Math.floor(this.maxVal/this.tickSize));
				}));

				//starSlider.reset();
				starSlider.updateHighlight();
				
				delete ss_div; delete ss_output; delete createStarSlider;

				delete CategorySearchController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [CategorySearchController] Singleton.



	var ResultFilterController = (function () { // [ResultFilterController] Singleton.


		var elmCustomizeForm, elmWrapper, elmFilterReset, filterGroupElements, checkboxElements, timeoutIdFilter;
		var starsMinDefault, starsMaxDefault, starsMinRecently, starsMaxRecently;
		var costsMinDefault, costsMaxDefault, costsMinRecently, costsMaxRecently;
		var elmCollectionSize, collectionSizeValue;
		var elmVolume;

		var forceRerendering = document.isRenderEngineMSIE();

		var reRenderListEntries = (function () {return;});
		if (window.attachEvent && !window.XMLHttpRequest) {
			reRenderListEntries = (function () {
				setTimeout((function () {Dom.setStyle(elmResultList, "display", "");}), 30);
				setTimeout((function () {Dom.setStyle(elmResultList, "display", "block");}), 50);
			});
		}/*
		var updateCollectionSizeValue = (function () {

			var resultFilterSizeValue = Array.filter(elmResultList.childNodes, (function (elm/ *, idx, arr * /) {
				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement") && (Dom.getStyle(elm, "display") != "none"));
			})).length;
			if (resultFilterSizeValue === collectionSizeValue) {
				elmCollectionSize.firstChild.data = collectionSizeValue;
			} else {
				elmCollectionSize.firstChild.data = (resultFilterSizeValue + " / " + collectionSizeValue);
			}
		});*/
		var reClassifyListEntries = (function () {

			Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && (Dom.getStyle(elm, "display") != "none"));

			})).forEach(function (elm, idx, arr) {

				if (idx == (arr.length - 1)) {
					Dom.removeClass(elm, "firstChild");
					Dom.addClass(elm, "lastChild");
				} else if (idx === 0) {
					Dom.removeClass(elm, "lastChild");
					Dom.addClass(elm, "firstChild");
				} else {
					Dom.removeClass(elm, "firstChild");
					Dom.removeClass(elm, "lastChild");
				}
			});
      
			MapController.refreshMarkerVisibility();
			
			if (forceRerendering) {

				setTimeout((function () {Dom.setStyle(elmVolume, "display", "");}), 30);
				setTimeout((function () {Dom.setStyle(elmVolume, "display", "block");}), 50);
			}
      
		});
		var filterByPriceRange = (function (costsMin, costsMax) {

			var isCalledInternally = (arguments.length === 0); // ((typeof costsMin == "undefined") && (typeof costsMax == "undefined"));

			costsMin = ((typeof costsMin == "undefined") ? (costsMinRecently) : (costsMin));
			costsMax = ((typeof costsMax == "undefined") ? (costsMaxRecently) : (costsMax));

		//alert("costsMin : " + costsMin + "\ncostsMax : " + costsMax);
			Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement") && ((isCalledInternally) ? (Dom.getStyle(elm, "display") != "none") : (true)));

			})).forEach(function (elm/*, idx, arr*/) {

				var costs = (parseFloat(Dom.getElementsByClassName("costsTotal", "input", elm)[0].value, 10)); // totalCostsValue.
			//alert("costs : " + costs);
				if ((costs >= costsMin) && (costs <= costsMax)) {

					elm.style.display = "";
				} else {
					elm.style.display = "none";
				}
			});
			if (!isCalledInternally) {

				filterByCategories();
				filterByFeatures();
			}
			reRenderListEntries();
		//updateCollectionSizeValue();
			reClassifyListEntries();

			costsMinRecently = costsMin;
			costsMaxRecently = costsMax;
		});


		var filterByCategories = (function (starsMin, starsMax) {

			var isCalledInternally = (arguments.length === 0); // ((typeof starsMin == "undefined") && (typeof starsMax == "undefined"));

			starsMin = ((typeof starsMin == "undefined") ? (starsMinRecently) : (starsMin));
			starsMax = ((typeof starsMax == "undefined") ? (starsMaxRecently) : (starsMax));

		//alert("starsMin : " + starsMin + "\nstarsMax : " + starsMax);
			Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement") && ((isCalledInternally) ? (Dom.getStyle(elm, "display") != "none") : (true)));

			})).forEach(function (elm/*, idx, arr*/) {

				var amountOfStars = parseFloat(Dom.getElementsByClassName("amountOfStars", "input", elm)[0].value, 10); // categoryValue.
			//alert("amountOfStars : " + amountOfStars);
				if ((amountOfStars >= starsMin) && (amountOfStars <= starsMax)) {

					elm.style.display = "";
				} else {
					elm.style.display = "none";
				}
			});
			if (!isCalledInternally) {

				filterByPriceRange();
				filterByFeatures();
			}
			reRenderListEntries();
		//updateCollectionSizeValue();
			reClassifyListEntries();

			starsMinRecently = starsMin;
			starsMaxRecently = starsMax;
		});


		var filterByFeatures = (function (elmCheckbox) {

			clearTimeout(timeoutIdFilter);

			var isCalledInternally = !elmCheckbox;
			var activeFilters = Array.filter(checkboxElements, (function (elm/*, idx, arr*/) { // signatureActiveFilters >>.. .join(", ");<<

				return elm.checked;

			})).map((function (elm/*, idx, arr*/) {

				return elm.value;

			})).sort(function (a, b) {

				return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
			});
		//alert("elmCheckbox.checked : " + elmCheckbox.checked + "\nelmCheckbox.value : " + elmCheckbox.value + "\ncheckboxElements.length : " + checkboxElements.length + "\nactiveFilters : " + activeFilters);

			Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

				return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement") && ((isCalledInternally) ? (Dom.getStyle(elm, "display") != "none") : (true)));

			})).forEach(function (elm/*, idx, arr*/) {

			//alert(Dom.getElementsByClassName("availableFilters", "input", elm)[0].value + "\n\n" + Dom.getElementsByClassName("availableFilters", "input", elm)[0].value.split(/\b\s*,\s+/));
			//var availableFilters = Dom.getElementsByClassName("availableFilters", "input", elm)[0].value.split(/\b\s*,\s+/).sort(function (a, b) {return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));});
			//alert("\"" + Dom.getElementsByClassName("availableFilters", "input", elm)[0].value.replace(regXTrim, "").replace(regXShrink, "").split(regXSplitAtComma).join("\",\"") + "\"");
			//var availableFilters = Dom.getElementsByClassName("availableFilters", "input", elm)[0].value.replace(regXTrim, "").replace(regXShrink, "").split(regXSplitAtComma).sort(function (a, b) {return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));});

				var availableFilters = Dom.getElementsByClassName("availableFilters", "input", elm)[0].value.split(regXSplitAtComma).sort(function (a, b) {return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));}); // improved performance due to [ResultFilterController.disableUnavailableFeatures].
			//alert("availableFilters : " + availableFilters);

				var availabilityList = [];
				activeFilters.forEach(function (elmActive/*, idx, arr*/) {
					availabilityList.push(availableFilters.some(function (elmAvailable/*, idx, arr*/) {

						return (elmAvailable == elmActive);
					}));
				});
				if (availabilityList.every(function (isAvailable/*, idx, arr*/) {return isAvailable;})) {

					elm.style.display = "";
				} else {
					elm.style.display = "none";
				}
			});
			if (!isCalledInternally) {

				filterByPriceRange();
				filterByCategories();
			}
			reRenderListEntries();
		//updateCollectionSizeValue();
			reClassifyListEntries();
		});


		var setFiltersToDefault = (function () {

			clearTimeout(timeoutIdFilter);

		//alert("setFiltersToDefault");
			var elmFieldset = (elmCustomizeForm.getElementsByTagName("fieldset")["price"] || elmCustomizeForm.getElementsByTagName("fieldset")[0]);
/*
			elmCostsMin = (elmFieldset.getElementsByTagName("select")["priceFrom"] || elmFieldset.getElementsByTagName("select")[0]);
			elmCostsMax = (elmFieldset.getElementsByTagName("select")["priceTo"] || elmFieldset.getElementsByTagName("select")[1]);

			elmCostsMin.options[0].selected = true;
			elmCostsMax.options[elmCostsMax.options.length - 1].selected = true;
*/
			PriceRangeController.priceSlider.reset();
			CategoryController.starSlider.reset();

			elmFieldset = (elmCustomizeForm.getElementsByTagName("fieldset")["stars"] || elmCustomizeForm.getElementsByTagName("fieldset")[1]);
			var elmStarList = elmFieldset.getElementsByTagName("ul")[0];
			if (elmStarList) {

				var starElements = elmStarList.getElementsByTagName("input");
				Array.forEach(starElements, (function (elm/*, idx, arr*/) {

					var val = parseInt(elm.value, 10);
					elm.checked = ((val >= starsMinDefault) && (val <= starsMaxDefault));
				}));
			}

			filterByPriceRange(costsMinDefault, costsMaxDefault);
			filterByCategories(starsMinDefault, starsMaxDefault);
			filterByFeatures(true);
		});


		return {

			reClassifyResultListEntries: (function () {

				reClassifyListEntries();
			}),
			applyPriceRangeFilter: (function (costsMin, costsMax) {

				filterByPriceRange(costsMin, costsMax);
			}),
			applyCategoriesFilter: (function (starsMin, starsMax) {

				filterByCategories(starsMin, starsMax);
			}),
			setInitialPriceRange: (function (costsMin, costsMax) {

				costsMinDefault = costsMin;
				costsMaxDefault = costsMax;
				costsMinRecently = costsMin;
				costsMaxRecently = costsMax;

				delete ResultFilterController.setInitialPriceRange;
				delete arguments.callee;
			}),
			setInitialCategoriesRange: (function (starsMin, starsMax) {

				starsMinDefault = starsMin;
				starsMaxDefault = starsMax;
				starsMinRecently = starsMin;
				starsMaxRecently = starsMax;

				delete ResultFilterController.setInitialCategoriesRange;
				delete arguments.callee;
			}),
			disableUnavailableFeatures : (function () {

				if (elmResultList && elmCustomizeForm && checkboxElements) {

					var allAvailableFilters = [];
					Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

						return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement")/* && ((isCalledInternally) ? (Dom.getStyle(elm, "display") != "none") : (true))*/);

					})).forEach(function (elm/*, idx, arr*/) {

						var elmAvailableFilters = Dom.getElementsByClassName("availableFilters", "input", elm)[0];
						elmAvailableFilters.value = elmAvailableFilters.value.replace(regXTrim, "").replace(regXShrink, "");

						allAvailableFilters = allAvailableFilters.concat(elmAvailableFilters.value.split(regXSplitAtComma).sort(function (a, b) {return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));}));
						allAvailableFilters.normalize();
					});
				//alert("allAvailableFilters : " + allAvailableFilters);

					checkboxElements.forEach(function (elm/*, idx, arr*/) {

					//elm.disabled = !allAvailableFilters.contains(elm.value);
						elm.parentNode.style.display = ((allAvailableFilters.contains(elm.value)) ? ("") : ("none"));
					});
					filterGroupElements.forEach(function (filterGroupElem/*, idx, arr*/) {

						filterGroupElem.style.display = ((Array.filter(filterGroupElem.getElementsByTagName("input"), (function (elm/*, idx, arr*/) {return (elm.type == "checkbox");})).every(function (elm/*, idx, arr*/) {return (Dom.getStyle(elm.parentNode, "display") == "none");})) ? ("none") : (""));
					});
					
					if (forceRerendering && (Dom.getStyle(elmWrapper, "display") != "none")) {

						setTimeout((function () {Dom.setStyle(elmWrapper, "display", "");}), 60);
						setTimeout((function () {Dom.setStyle(elmWrapper, "display", "block");}), 70);
					}
					
					delete ResultFilterController.disableUnavailableFeatures;
					delete arguments.callee;
				}
			}),
			initialize: (function (elm) {

				elmCustomizeForm = elm.getElementsByTagName("form")[0];
				if (elmCustomizeForm) {

					filterGroupElements = Dom.getElementsByClassName("featureFilters", "fieldset", elmCustomizeForm);
					checkboxElements = [];

					Array.forEach(filterGroupElements, (function (elm/*, idx, arr*/) {

						checkboxElements = checkboxElements.concat(Array.filter(elm.getElementsByTagName("input"), (function (elm/*, idx, arr*/) {

							return (elm && (typeof elm.type == "string") && (elm.type == "checkbox"));
						})));
					}));
					checkboxElements.forEach(function (elm/*, idx, arr*/) {

						Evt.on(elm, "click", (function () {timeoutIdFilter = setTimeout((function () {filterByFeatures(elm);}), 20);}));
					});

					elmFilterReset = Dom.getElementsByClassName("reset", "button", elmCustomizeForm)[0];
					Evt.on(elmFilterReset, "click", (function () {timeoutIdFilter = setTimeout((function () {setFiltersToDefault();}), 20);}));/*

					elmCollectionSize = document.getElementById("collectionSize");
					elmCollectionSize = (elmCollectionSize && elmCollectionSize.getElementsByTagName("span")[0]);
					collectionSizeValue = (elmCollectionSize && parseInt(elmCollectionSize.firstChild.data, 10));
					collectionSizeValue = ((elmResultList && Array.filter(elmResultList.childNodes, (function (elm/ *, idx, arr* /) {
						return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement") && (Dom.getStyle(elm, "display") != "none"));
					})).length) || collectionSizeValue);*/
				//alert("collectionSizeValue : " + collectionSizeValue);
				}
				elmWrapper = Dom.get("customizeResultsWrapper");
				if (ResultFilterController.disableUnavailableFeatures && elmResultList) {

					ResultFilterController.disableUnavailableFeatures();
				}/*

				//init checkboxes	-	DROP IT!
				var cbg_divs = [];
				Array.forEach(Dom.getElementsByClassName("yui-checkboxes", "ul", elm), (function (ulElm) {
					Array.forEach(ulElm.getElementsByTagName("li"), (function (liElm) {
						cbg_divs.push(liElm);
					}));
				}));
				checkBoxGroups = YUIControlsManager.createCheckBoxes(cbg_divs);
				checkBoxes = [];
				Array.forEach(checkBoxGroups, (function (elm, idx, arr) {
					Array.forEach(elm, (function (elmi, idx, arr) {
						checkBoxes.push(elmi);
						Evt.on(elmi._button, 'click', filterByFeatures, elmi);
					}));
				}));*/
				
				elmVolume = Dom.get("volume");
				
				delete ResultFilterController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [ResultFilterController] Singleton.



	var ResultSortController = (function () { // [ResultSortController] Singleton.


		var elmSelect;


		var getResortedListBy = {

			helpers : {

				getHotelName : (function (elm) {

				//return elm.getElementsByTagName("h2")[0].firstChild.data.replace(regXTrim, "").replace(regXShrink, " ");
					return elm.getElementsByTagName("h2")[0].getElementsByTagName("a")[0].firstChild.data.replace(regXTrim, "").replace(regXShrink, " ");
				}),
				getHotelLocation : (function (elm) {

					return Dom.getElementsByClassName("hotelLocation", "input", elm)[0].value.replace(regXTrim, "").replace(regXShrink, " ");
				}),
				getTotalPrice : (function (elm) {

					return parseFloat(Dom.getElementsByClassName("costsTotal", "input", elm)[0].value, 10);
				}),
				getAmountOfStars : (function (elm) {

					return parseFloat(Dom.getElementsByClassName("amountOfStars", "input", elm)[0].value, 10);
				})
			},
			nameAscending : (function (arr) {

				arr.sort(function (a, b) {

					a = getResortedListBy.helpers.getHotelName(a);
					b = getResortedListBy.helpers.getHotelName(b);

					return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
				});
				return arr;
			}),
			nameDescending : (function (arr) {

				arr.sort(function (a, b) {

					a = getResortedListBy.helpers.getHotelName(a);
					b = getResortedListBy.helpers.getHotelName(b);

					return ((a < b) ? (1) : ((a > b) ? (-1) : (0)));
				});
				return arr;
			}),
			locationAscending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					a = getResortedListBy.helpers.getHotelLocation(a);
					b = getResortedListBy.helpers.getHotelLocation(b);

					return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
				});
				return arr;
			}),
			locationDescending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					a = getResortedListBy.helpers.getHotelLocation(a);
					b = getResortedListBy.helpers.getHotelLocation(b);

					return ((a < b) ? (1) : ((a > b) ? (-1) : (0)));
				});
				return arr;
			}),
			priceAscending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					return (getResortedListBy.helpers.getTotalPrice(a) - getResortedListBy.helpers.getTotalPrice(b));
				});
				return arr;
			}),
			priceDescending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					return (getResortedListBy.helpers.getTotalPrice(b) - getResortedListBy.helpers.getTotalPrice(a));
				});
				return arr;
			}),
			starsAscending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					return (getResortedListBy.helpers.getAmountOfStars(a) - getResortedListBy.helpers.getAmountOfStars(b));
				});
				return arr;
			}),
			starsDescending : (function (arr) {

				arr = getResortedListBy.nameAscending(arr);
				arr.sort(function (a, b) {

					return (getResortedListBy.helpers.getAmountOfStars(b) - getResortedListBy.helpers.getAmountOfStars(a));
				});
				return arr;
			})
		};
		var sortResultList = (function () {

			var getResortedList = getResortedListBy[elmSelect.options[elmSelect.selectedIndex].value];
			if (typeof getResortedList == "function") {

				getResortedList(Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

					return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement")/* && (Dom.getStyle(elm, "display") != "none")*/);

				}))).map(function (elm/*, idx, arr*/) {

					return elmResultList.removeChild(elm);

				}).forEach(function (elm, idx/*, arr*/) {

					elmResultList.insertBefore(elm, (elmResultList.childNodes[idx] || elmResultList.appendChild(document.createTextNode(""))));
				});

				ResultFilterController.reClassifyResultListEntries();
			}
		});


		return {

			applySortDefault: (function (elm) {

				elmSelect.options[elmSelect.defaultSelectedIndex].selected = true;
				sortResultList();
			}),
			initialize: (function (elm) {

				elmSelect = document.getElementById("sortByOptions");
				if (elmSelect) {

					elmSelect.defaultSelectedIndex = Array.map(elmSelect.options, (function (elm/*, idx, arr*/) {return ((elm.defaultSelected) ? ("defaultSelected") : (""));})).indexOf("defaultSelected");
					elmSelect.defaultSelectedIndex = ((elmSelect.defaultSelectedIndex == -1) ? (0) : (elmSelect.defaultSelectedIndex));

					Evt.on(elmSelect, "change", sortResultList);
				}

				delete ResultSortController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [ResultSortController] Singleton.



	var FormValidationController = (function () { // [FormValidationController] Singleton.


		var elmDateToday, dateToday, dateTodayFallback = new Date();


		var getParentFormGroupElm = (function (elm) {

			elm = elm.parentNode;
			while (elm && ((elm.nodeName.toLowerCase() != "fieldset") && (elm.nodeName.toLowerCase() != "form"))) {
				elm = elm.parentNode;
			}
			return elm;
		});
		var applyFlashlight = (function (elm) {

			elm.playFlashlight = (function (elm, counter, showError) {

				clearTimeout(this.timeoutIdFlashlight);

				elm = (elm || this);
				showError = !showError;
				counter = (counter || 0);
				++counter;

				if (counter <= 1) { // 5, 3, 1

					if (showError) {
						Dom.addClass(elm, "error");
					} else {
						Dom.removeClass(elm, "error");
					}
					var self = this;

					this.timeoutIdFlashlight = setTimeout((function () {self.playFlashlight(elm, counter, showError);}), 666);
				}
			});
			if (elm.id == "destinationAutocomplete") { // this special case needs a special treatment.
				Evt.on(elm, "keyup", (function () {

					this.timeoutIdFlashlight = null; this.playFlashlight = null; // not necessary if cleanup as seen in the line beneath was supported by all browsers.
				//delete this.timeoutIdFlashlight; delete this.playFlashlight; // causes errors within msie 7.x so far as it got tested.

					Dom.removeClass(((Dom.hasClass(this.parentNode, "formrow") || Dom.hasClass(this.parentNode, "formRow")) ? (this.parentNode) : (this)), "error");
				}));
			} else {
				Evt.on(elm, "focus", (function () {

					this.timeoutIdFlashlight = null; this.playFlashlight = null; // not necessary if cleanup as seen in the line beneath was supported by all browsers.
				//delete this.timeoutIdFlashlight; delete this.playFlashlight; // causes errors within msie 7.x so far as it got tested.

					Dom.removeClass(((Dom.hasClass(this.parentNode, "formrow") || Dom.hasClass(this.parentNode, "formRow")) ? (this.parentNode) : (this)), "error");
				}));
			}
			elm.playFlashlight((Dom.hasClass(elm.parentNode, "formrow") || Dom.hasClass(elm.parentNode, "formRow")) ? (elm.parentNode) : (elm));
		});

/*
	[http://www.siteexperts.com/tips/functions/ts23/page1.asp]

	\xxx		Matches the ASCII character expressed by the octal number xxx.
					"\50" matches left parentheses character "("

	\xdd		Matches the ASCII character expressed by the hex number dd.
					"\x28"	matches left parentheses character "("

	\uxxxx 	Matches the ASCII character expressed by the UNICODE xxxx.
					"\u00A3" matches "£".
*/
	//var regXShrink = (/\s+/g);
		var regXShrinkName = (/[^0-9a-zA-Z\u00c0-\u0233-.,'\s]+/g);
		var regXShrinkTravellerName = (/[^a-zA-Z-.\s]+/g);
		var regXShrinkNumberOnly = (/[^\d]+/g);
		var regXShrinkPhoneNumber = (/[^\d+]+/g);
		var regXTrimPhoneNumberPP = (/(?:\+)+/g);
		var regXTrimPhoneNumberNP = (/(\d)\+/g);
		var regXTrimCardNumber = (/[-\s]/g);
		var regXTrimEmailAddress = (/(\.+|@+)/g);

		var regXWhiteSpaceOnly = (/^\s+$/);
	//var regXNumbersOnly = (/^[0-9]+$/);

		var regXValidateIsName = (/^[0-9a-zA-Z\u00c0-\u0233-.,'\s]+$/); // decimal/html: &#192;-&#563; - octal/RegExp: \300-\1063 - hexadecimal/RegExp: \xc0-\x233 - unicode-hexadecimal/RegExp: \u00c0-\u0233
		var regXValidateIsTravellerName = (/^[a-zA-Z\u00c0-\u0233-.\s]+$/);
		var regXValidateIsPhone = (/^\+{0,1}\d+$/);
		var regXValidateIsNumberOnly = (/^\d+$/);
		var regXValidateIsNotSelected = (/^\-{0,9}$/);

		var cardTypeData = {

			shortcutMapper : {

				"mc"							: "mc",
				"master"					: "mc",
				"mastercard"			: "mc",
				"vi"							: "vi",
				"visa"						: "vi",
				"visacard"				: "vi",
				"ax"							: "ax",
				"american"				: "ax",
				"americanexpress"	: "ax",
				"dc"							: "dc",
				"diners"					: "dc",
				"dinersclub"			: "dc",
				"tui"							: "tui",
				"tuicard"					: "tui",
				"debit"						: "debit",
				"debitadvice"			: "debit",
				"debitbalance"		: "debit",
				"debitentry"			: "debit",
				"debitmemo"				: "debit",
				"debitnote"				: "debit",
				"directdebit"			: "debit",
				"lastschrift"			: "debit"
			},
			validationPatterns : {

				"mc"	: "5[1-5][0-9]{14}",
				"vi"	: "4([0-9]{12}|[0-9]{15})",
				"tui"	: "4([0-9]{12}|[0-9]{15})", // TUIcard's validation process is identical to Visa Card's one
				"ax"	: "3[47][0-9]{13}",
				"dc"	: "3(0[0-5][0-9]{11}|[68][0-9]{12})"
			},
			securityCodePatterns : {

				"mc"	: "[0-9]{3}",
				"vi"	: "[0-9]{3}",
				"tui"	: "[0-9]{3}",
				"ax"	: "[0-9]{3,4}",
				"dc"	: "[0-9]{3}"
			},
			regXValidate : (/(?:)/)
		};
		var isValidLuhn = (function (val) {

			val = String(val).replace(regXTrimCardNumber, "");
			var idx = 0, len = val.length, num, sum = 0, parity = (len % 2);

			while (idx < len) {

				num = parseInt(val.charAt(idx), 10);
				if((idx % 2) == parity) {
					num *= 2;
				}
				if(num > 9) {
					num -= 9;
				}
				sum += num;
				++idx;
			}
			return !(sum % 10);
		});
		var isFeasibleCreditCardNumber = (function (val, cardType) {

			val = String(val).replace(regXTrimCardNumber, ""); cardType = cardTypeData.shortcutMapper[cardType.replace(regXShrink, "").toLowerCase()];
			return ((val && cardType && isValidLuhn(val) && (cardTypeData.regXValidate.compile(("^" + cardTypeData.validationPatterns[cardType] + "$"), "")).test(val)) ? (true) : (false));
		});
		var isFeasibleSecurityCode = (function (val, cardType) {

			val = String(val).replace(regXTrimCardNumber, ""); cardType = cardTypeData.shortcutMapper[cardType.replace(regXShrink, "").toLowerCase()];
			return ((val && cardType && (cardTypeData.regXValidate.compile(("^" + cardTypeData.securityCodePatterns[cardType] + "$"), "")).test(val)) ? (true) : (false));
		});
		var isFeasibleCreditCard = (function (cardNumber, securityCode, cardType) {

			return ((isFeasibleCreditCardNumber(cardNumber, cardType) && isFeasibleSecurityCode(securityCode, cardType)) ? (true) : (false));
		});/*

		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", 123, "Master Card"); // true
		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", 1234, "Master Card"); // false
		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", "x23", "Master Card"); // false
		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", "023", "Master Card"); // true
		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", "02a", "Master Card"); // false
		isFeasibleCreditCard("54 83 - 46 05 - 0022 - 5025", "023", "Master Card"); // true
		isFeasibleCreditCard(5232520018437893, 579, "Master Card"); // true
		isFeasibleCreditCard(5232520018437893, 5799, "Master Card"); // false
		isFeasibleCreditCard(5232520018437893, "57x", "Master Card"); // false
		isFeasibleCreditCard(5232520018437893, "571", "Master Card"); // true
		isFeasibleCreditCard(5332520018437893, "571", "Master Card"); // false
		isFeasibleCreditCard(5232520018437893, "571", "Master Card"); // true
	*/
		var parseEmail = (function() { // also see : [http://www.pseliger.de/jsExtendedApi/jsApi.String.parseEmail.dev.js]

			var tldStr = "|aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|";
			var protocol = "(mailto\\:)";
			var userName = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"(?:[^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
			var domainName = "((?:[a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*)";
			var tldName = "([a-zA-Z]{2,6})";
			var regXParser = new RegExp("^" + protocol + "?" + userName + "@" + domainName + "\\." + tldName + "$","");
			var regXTldStrict = (/(?:)/);
		//alert(regXParser);

			return (function (val, isTldStrict) {

				var obj = null;
				val = String(val);
				if (regXParser.test(val)) {

					var regXResults = regXParser.exec(val);
					if (!Boolean(isTldStrict) || (regXTldStrict.compile("\\|" + regXResults[4] + "\\|", "i")).test(tldStr)) {

						obj = {protocol: regXResults[1], user: regXResults[2], domain: regXResults[3], tld: regXResults[4]};
					}
				}
				return obj;
			});
		})();
		var isFeasibleEmail = (function(val, isTldStrict) {

			var obj = parseEmail(val, isTldStrict);
			return (((typeof obj == "object") && obj) ? (true) : (false));
		});


		var validateOnBeforeSubmit = (function (elmForm) {

		//alert("validateOnBeforeSubmit - elmForm : " + elmForm);
			elmForm.serviceUrl = (elmForm.serviceUrl || elmForm.action);
			elmForm.action = "javascript:\/\/"; // workaround due to malfunctionality of "onsubmit return [boolean]" as in mozilla and webkit.

			var elmFirstlyFailed;

			var validationPassed = true;
			Array.forEach(elmForm.elements, (function (elm/*, idx, arr*/) {

				var isValidEntry = true;
				if (elm && (typeof elm.nodeName == "string") && (Dom.getStyle(elm, "display") != "none") && !elm.disabled) {

					var elmNodeName = elm.nodeName.toLowerCase();
					if (((elmNodeName == "input") && (elm.type == "text")) || (elmNodeName == "textarea")) {	// INPUT type TEXT or TEXTAREA

						elm.value = elm.value.replace(regXTrim, "");

						if (Dom.hasClass(elm, "validateIsTravellerName")) {

							elm.value = elm.value.replace(regXShrink, " ")/*.replace(regXShrinkTravellerName, "")*/;
							isValidEntry = regXValidateIsTravellerName.test(elm.value);

						} else if (Dom.hasClass(elm, "validateIsName")) {

							elm.value = elm.value.replace(regXShrink, " ").replace(regXShrinkName, "");
							isValidEntry = regXValidateIsName.test(elm.value);

						} else if (Dom.hasClass(elm, "validateIsEmail")) {

							elm.value = elm.value.replace(regXShrink, "").replace(regXTrimEmailAddress, "$1");
							isValidEntry = isFeasibleEmail(elm.value);				// loose tld-parsing
						//isValidEntry = isFeasibleEmail(elm.value, true);	// strict tld-parsing

						} else if (Dom.hasClass(elm, "validateIsPhone")) {

							elm.value = elm.value.replace(regXShrinkPhoneNumber, "").replace(regXTrimPhoneNumberPP, "+").replace(regXTrimPhoneNumberNP, "$1");
							isValidEntry = regXValidateIsPhone.test(elm.value);

						} else if (Dom.hasClass(elm, "validateIsNumberOnly")) {

							elm.value = elm.value.replace(regXShrinkNumberOnly, "");
							isValidEntry = regXValidateIsNumberOnly.test(elm.value);

						} else if (Dom.hasClass(elm, "validateIsCCNumber") || Dom.hasClass(elm, "validateIsCCCode")) {

							var parentFormGroupElm = getParentFormGroupElm(elm);
							var cardTypeElm = (parentFormGroupElm.getElementsByTagName("select")["payment.method"] || (parentFormGroupElm.elements && (parentFormGroupElm.elements["payment.method"] || parentFormGroupElm.elements["cardType"])) || parentFormGroupElm.getElementsByTagName("select")["cardType"] || document.getElementById("cardType"));
							if (cardTypeElm) {
								elm.value = elm.value.replace(regXTrimCardNumber, "");
								if (Dom.hasClass(elm, "validateIsCCNumber")) {
									isValidEntry = isFeasibleCreditCardNumber(elm.value, cardTypeElm.options[cardTypeElm.selectedIndex].value);
								} else {
									isValidEntry = isFeasibleSecurityCode(elm.value, cardTypeElm.options[cardTypeElm.selectedIndex].value);
								}
							} else {
								isValidEntry = false;
							}
						}
						if (Dom.hasClass(elm, "validateIsRequired")) {

							isValidEntry = ((elm.value !== "") && !regXWhiteSpaceOnly.test(elm.value));
							if (!isValidEntry) {
								elm.value = "";
							}
						}
						if (elm.id == "destinationAutocomplete") { // this special case needs a special treatment.

							isValidEntry = AutocompleteController.validateEntry();
						}
						if (!isValidEntry) {

							applyFlashlight(elm);
						}
						validationPassed = (isValidEntry && validationPassed);
						elmFirstlyFailed = (elmFirstlyFailed || (!isValidEntry && elm));


					} else if ((elmNodeName == "input") && (elm.type == "checkbox")) {												// INPUT type CHECKBOX
						if (Dom.hasClass(elm, "validateIsRequired")) {

							isValidEntry = elm.checked;
						}
						if (!isValidEntry) {

							applyFlashlight(elm);
						}
						validationPassed = (isValidEntry && validationPassed);
						elmFirstlyFailed = (elmFirstlyFailed || (!isValidEntry && elm));


					} else if (elmNodeName == "select") {																											// SELECT
						if (Dom.hasClass(elm, "validateIsCCExpiry")) {

							var list, dateExpiry;
							if (!dateToday) { // lazy initialization within the next lines of code.

								elmDateToday = (elmDateToday || elm.parentNode.getElementsByTagName("div")["dateToday"] || document.getElementById("dateToday"));
								list = elmDateToday.getElementsByTagName("input");

								var dateTodayDayValue = parseInt((list["dateTodayDay"] && list["dateTodayDay"].value), 10);
								var dateTodayMonthValue = parseInt((list["dateTodayMonth"] && list["dateTodayMonth"].value), 10);
								var dateTodayYearValue = parseInt((list["dateTodayYear"] && list["dateTodayYear"].value), 10);

								dateToday = new Date((isNaN(dateTodayYearValue) ? (dateTodayFallback.getFullYear()) : (dateTodayYearValue)), (isNaN(dateTodayMonthValue) ? (dateTodayFallback.getMonth()) : (dateTodayMonthValue - 1)), (isNaN(dateTodayDayValue) ? (dateTodayFallback.getDate()) : (dateTodayDayValue)));
								delete dateTodayDayValue; delete dateTodayMonthValue; delete dateTodayYearValue;
							}
							list = elm.parentNode.getElementsByTagName("select");

							var elmDateExpiryDay = (list["payment.expiryDateDay"] || document.getElementById("expiryDay"));
							var elmDateExpiryMonth = (list["payment.expiryDateMonth"] || document.getElementById("expiryMonth"));
							var elmDateExpiryYear = (list["payment.expiryDateYear"] || document.getElementById("expiryYear"));

							dateExpiry = new Date((elmDateExpiryYear && parseInt(elmDateExpiryYear.options[elmDateExpiryYear.selectedIndex].value, 10)), (elmDateExpiryMonth && (parseInt(elmDateExpiryMonth.options[elmDateExpiryMonth.selectedIndex].value, 10) - 1)), ((elmDateExpiryDay && parseInt(elmDateExpiryDay.options[elmDateExpiryDay.selectedIndex].value, 10)) || 1));
							if (!elmDateExpiryDay) {
								dateExpiry.setMonth((elmDateExpiryMonth && parseInt(elmDateExpiryMonth.options[elmDateExpiryMonth.selectedIndex].value, 10)), 1);
								dateExpiry.setTime(Date.parse(dateExpiry) - valueOfOneDaysDurationInMSec);
							}
							isValidEntry = (dateExpiry >= dateToday);

							if (!isValidEntry) {

								applyFlashlight(elm);
							}
						}
						if (Dom.hasClass(elm, "validateIsRequired")) {

							var val = elm.options[elm.selectedIndex].value.replace(regXShrink, "");
							isValidEntry =  (!regXValidateIsNotSelected.test(val) && (val !== ""));
						}
						if (!isValidEntry) {

							applyFlashlight(elm);
						}
						validationPassed = (isValidEntry && validationPassed);
						elmFirstlyFailed = (elmFirstlyFailed || (!isValidEntry && elm));
					}
				}
			}));
			if (validationPassed) {

				elmForm.action = elmForm.serviceUrl;

			} else {
				if (elmFirstlyFailed.scrollIntoView/* && (elmFirstlyFailed.id != "destinationAutocomplete")*/) {
					if (elmFirstlyFailed.id == "destinationAutocomplete") { // this special case needs a special treatment.
						elmFirstlyFailed.focus();
						elmFirstlyFailed.value = "";
					}
					elmFirstlyFailed.scrollIntoView(true);
				} else if (elmFirstlyFailed.focus) {
					elmFirstlyFailed.focus();
				}
			}
			return validationPassed; // does work in msie only so far as it has been tested - mozilla and webkit fail with this simple job.
		});


		return {

			initialize: (function () {

				Array.forEach(document.forms, (function (elm/*, idx, arr*/) {

					if (Dom.hasClass(elm, "validate")) { // "validateOnBeforeSubmit"

						Evt.on(elm, "submit", (function () {return validateOnBeforeSubmit(elm);}));
					}
				}));

				delete FormValidationController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [FormValidationController] Singleton.



	var YUIControlsManager = (function () { // [YUIControlsManager] Singleton.


		var /*priceSlider, starSlider, */selectButton, checkBoxes;	

		return {/*

			createPriceSlider: (function (element, id, range, outputdiv) {
			
				var slider = element;
				var priceOutput  = outputdiv;
				
				//create slider dom elements 
				var highlight_bg = document.createElement("SPAN");
				highlight_bg.id = "priceSlider_highlight_"+id;
				highlight_bg.className = "dual_slider_highlight";
				var slider_min = document.createElement("DIV");
				slider_min.id = "priceSlider_min_thumb_"+id;
				slider_min.className = "dual_slider_min_thumb";
				var slider_max = document.createElement("DIV");
				slider_max.id = "priceSlider_max_thumb_"+id;
				slider_max.className = "dual_slider_max_thumb";
				var slider_min_output = document.createElement("DIV");
				slider_min_output.id = "priceSlider_min_output_"+id;
				slider_min_output.className = "priceSlider_min_output";
				slider_min_output.innerHTML = "0 €";
				var slider_max_output = document.createElement("DIV");
				slider_max_output.id = "priceSlider_max_output_"+id;
				slider_max_output.className = "priceSlider_max_output";
				slider_max_output.innerHTML = "Any";
							
				//write slider dom elements 
				Dom.addClass(slider, "dual_slider");
				slider.appendChild(highlight_bg);
				slider.appendChild(slider_min);
				slider.appendChild(slider_max);
				slider.appendChild(slider_min_output);
				slider.appendChild(slider_max_output);
				if (priceOutput) {priceOutput.innerHTML = "Any";}
				
				// create the DualSlider
				var range = range || 183; //176;
				var tickSize = 0;
				priceSlider = YAHOO.widget.Slider.getHorizDualSlider(
					slider, 
					"priceSlider_min_thumb_"+id, 
					"priceSlider_max_thumb_"+id, 
					range, 
					tickSize
				);

				priceSlider._highlight = Dom.get("priceSlider_highlight_"+id);
				priceSlider.updateHighlight = (function () {
					var delta = this.maxVal - this.minVal;	
					Dom.setStyle(this._highlight,'left', (this.minVal + 12)-10 + 'px');
					Dom.setStyle(this._highlight,'width', Math.max(delta - 12,0)+20 + 'px');
				});
				priceSlider.updateValues = (function () {
					if (priceOutput) {
						priceOutput.innerHTML = this.minVal + '€ - ' + this.maxVal + '€';
					}
				});
				priceSlider.reset = (function () {
					this.setValues(0,range); 
				});
			
				priceSlider.subscribe('change', priceSlider.updateHighlight, priceSlider, true);
				priceSlider.subscribe('change', priceSlider.updateValues);
				Dom.setStyle(slider,"visibility", "visible");		
				
				return priceSlider;				
			}),*/ /*
			
			
			createStarSlider: (function (element, id, initvalues, outputdiv) {
				
				var slider = element;
				var starOutput  = outputdiv;
				
				//create starslider dom elements 
				var highlight_bg = document.createElement("SPAN");
				highlight_bg.id = "starChooser_highlight_"+id;
				highlight_bg.className ="dual_slider_highlight";
				highlight_bg.appendChild(document.createTextNode(" "));
				
				var slider_min = document.createElement("DIV");
				slider_min.id = "starChooser_min_thumb_"+id;
				slider_min.className = "dual_slider_min_thumb";
				var slider_min_image = document.createElement("IMG");
				slider_min_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
				slider_min_image.setAttribute("width", "14");
				slider_min_image.setAttribute("height", "18");
				slider_min_image.setAttribute("alt", "");
				slider_min.appendChild(slider_min_image);
				
				var slider_max = document.createElement("DIV");
				slider_max.id = "starChooser_max_thumb_"+id;
				slider_max.className = "dual_slider_max_thumb";
				var slider_max_image = document.createElement("IMG");
				slider_max_image.setAttribute("src", "/aowlb/images/elements/el_slider_handle.png");
				slider_max_image.setAttribute("width", "14");
				slider_max_image.setAttribute("height", "18");
				slider_max_image.setAttribute("alt", "");
				slider_max.appendChild(slider_max_image);
				
				//write slider dom elements 
				Dom.addClass(slider, "dual_slider_rating");
				slider.appendChild(highlight_bg);
				slider.appendChild(slider_min);
				slider.appendChild(slider_max);
				if (starOutput) {starOutput.innerHTML = "Any";}
				
				// Create the DualSlider
				var range = 131;
				var tickSize = 26;
				var initValues = initValues || [0,131];

				starChooser = YAHOO.widget.Slider.getHorizDualSlider(slider.id, "starChooser_min_thumb_"+id, "starChooser_max_thumb_"+id, range, tickSize, initValues);

				starChooser._status  = 'ok',
				starChooser._highlight = Dom.get("starChooser_highlight_"+id);				
				
				starChooser.getStatus = function () { 
					return this._status; 
				}
				
				starChooser.reset = (function () {
					this.setValues(initValues[0],initValues[1]); 
				});

				starChooser.updateHighlight = function () {
					var delta = this.maxVal - this.minVal,
						newStatus = 'ok',
						hlWidth = Dom.getStyle(this._highlight,'width'),
						hlWidth = hlWidth.slice(0, (hlWidth.length-2));
						
					if (this.activeSlider === this.minSlider) {
						Dom.setStyle(this._highlight,'width', Math.max(delta - 12,0)+12 + 'px');
					}
					if (this.activeSlider === this.maxSlider) {
						Dom.setStyle(this._highlight,'width', delta + 'px');
					}
					Dom.setStyle(this._highlight,'left', (this.minVal + 8) + 'px');
					Dom.setStyle(this._highlight,'backgroundPosition', 0 - (8 + this.minVal) + 'px -280px');
					
					starOutput.innerHTML = Math.floor((this.minVal/tickSize) + 1) + " to " + Math.floor(this.maxVal/tickSize) + " Stars";
				}
				
				starChooser.tickSize = tickSize;
				starChooser.subscribe('change', starChooser.updateHighlight, starChooser, true);
				Dom.setStyle(slider,"visibility", "visible");		
			
				return starChooser;
				
			}),*/
			
			createMenuButton: (function (element, id, callback) {
				
				var noscript = Dom.getNextSibling(element);
				var select = noscript.getElementsByTagName('select')[0];
				var options = select.getElementsByTagName('option');
				var menuItems = [];
				
				/*
				var onMenuItemClick = (function (p_sType, p_aArgs, p_oItem) {
					selectButton.set("label", p_oItem.cfg.getProperty("text"));
				});*/
				var onMenuItemClick = callback;
				
				//TODO: anderer import der inhalte
				for(i=0; i < options.length; i++) {
					menuItems[i] = {text: options[i].innerHTML, value: i, originalValue: options[i].value, onclick: { fn: onMenuItemClick }};
				}
				
				selectButton = new YAHOO.widget.Button({
					type: "menu", 
					label: options[0].innerHTML, 
					name: element.id,
					menu: menuItems,
					focusmenu: true,
					container: element.id
				});
					
				selectButton.reset = (function () {
					var defaultLabel = this._menu.itemData[0].text;
					if (this.get("label") != defaultLabel) {
						this.set("label", defaultLabel);
					}
				});
				selectButton.menuItems = menuItems;
				return selectButton;
					
			}),
			
			createCheckBoxes: (function (elements) {
				checks = [];	
				Array.forEach(elements, (function (elm, idx/*, arr*/) {
				//var noscript = Dom.getNextSibling(elm);
					var inputs = elm.getElementsByTagName('input');
					var labels = elm.getElementsByTagName('label');
					
					checks[idx] = [];
					for(i=0; i < inputs.length; i++) {
						checks[idx][i] = new YAHOO.widget.Button({ 
							type: "checkbox",
							container: elm.id,
							label: "<span>" + labels[i].innerHTML + "</span>",
							value: inputs[i].value,
							name: inputs[i].name
						});
					}
				}));
				
				
				return checks;
			}),
			
			initialize: (function (elm) {

				//delete YUIControlsManager.initialize;
				//delete arguments.callee;
			})
		};

	})(); // [YUIControlsManager] Singleton.



	var SearchControlsManager = (function () { // [SearchControlsManager] Singleton.


		var starSlider, savedSearches, sortByButton;	
		
		var setStarsForSearch = (function () {
			var minValue = Math.floor((this.minVal/this.tickSize) + 1);
			var maxValue = Math.floor(this.maxVal/this.tickSize);
			//TODO: auswahl verarbeiten
		});
		
		var reloadSavedSearch = (function (itemIndex, button) {
			var searchId = button.menuItems[itemIndex].originalValue;
			var savedSearchForm = button.getForm();
			var hiddenField = Dom.getElementsBy( function (elm) {
				return elm.id == "savedSearchId";
			} , 'input' , savedSearchForm )
			if (hiddenField && (searchId != "choose")) {
				hiddenField[0].value = searchId;
				savedSearchForm.submit();
			}
		});
		var onMenuItemClick = (function (p_sType, p_aArgs, p_oItem, button) {
			 button.set("label", p_oItem.cfg.getProperty("text"));
		});
		var loadSavedSearch = (function (p_sType, p_aArgs, p_oItem) {

			onMenuItemClick(p_sType, p_aArgs, p_oItem, savedSearches);
			reloadSavedSearch(this.index,savedSearches);
		});
		var sortResultList = (function (p_sType, p_aArgs, p_oItem) {


			onMenuItemClick(p_sType, p_aArgs, p_oItem, sortByButton);


			var getResortedListBy = {

				helpers : {

					getHotelName : (function (elm) {

					//return elm.getElementsByTagName("h2")[0].firstChild.data.replace(regXTrim, "").replace(regXShrink, " ");
						return elm.getElementsByTagName("h2")[0].getElementsByTagName("a")[0].firstChild.data.replace(regXTrim, "").replace(regXShrink, " ");
					}),
					getHotelLocation : (function (elm) {

						return Dom.getElementsByClassName("hotelLocation", "input", elm)[0].value.replace(regXTrim, "").replace(regXShrink, " ");
					}),
					getTotalPrice : (function (elm) {

						return parseFloat(Dom.getElementsByClassName("costsTotal", "input", elm)[0].value, 10);
					}),
					getAmountOfStars : (function (elm) {

						return parseFloat(Dom.getElementsByClassName("amountOfStars", "input", elm)[0].value, 10);
					})
				},
				nameAscending : (function (arr) {

					arr.sort(function (a, b) {

						a = getResortedListBy.helpers.getHotelName(a);
						b = getResortedListBy.helpers.getHotelName(b);

						return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
					});
					return arr;
				}),
				nameDescending : (function (arr) {

					arr.sort(function (a, b) {

						a = getResortedListBy.helpers.getHotelName(a);
						b = getResortedListBy.helpers.getHotelName(b);

						return ((a < b) ? (1) : ((a > b) ? (-1) : (0)));
					});
					return arr;
				}),
				locationAscending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						a = getResortedListBy.helpers.getHotelLocation(a);
						b = getResortedListBy.helpers.getHotelLocation(b);

						return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));
					});
					return arr;
				}),
				locationDescending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						a = getResortedListBy.helpers.getHotelLocation(a);
						b = getResortedListBy.helpers.getHotelLocation(b);

						return ((a < b) ? (1) : ((a > b) ? (-1) : (0)));
					});
					return arr;
				}),
				priceAscending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						return (getResortedListBy.helpers.getTotalPrice(a) - getResortedListBy.helpers.getTotalPrice(b));
					});
					return arr;
				}),
				priceDescending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						return (getResortedListBy.helpers.getTotalPrice(b) - getResortedListBy.helpers.getTotalPrice(a));
					});
					return arr;
				}),
				starsAscending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						return (getResortedListBy.helpers.getAmountOfStars(a) - getResortedListBy.helpers.getAmountOfStars(b));
					});
					return arr;
				}),
				starsDescending : (function (arr) {

					arr = getResortedListBy.nameAscending(arr);
					arr.sort(function (a, b) {

						return (getResortedListBy.helpers.getAmountOfStars(b) - getResortedListBy.helpers.getAmountOfStars(a));
					});
					return arr;
				})
			};
			var elmOption = document.getElementById("sortByOptions").options[p_oItem.value];
			var elmResultList = elmBody.getElementsByTagName("ol")[0];
			var getResortedList = getResortedListBy[elmOption.value];
			if (typeof getResortedList == "function") {

				getResortedList(Array.filter(elmResultList.childNodes, (function (elm/*, idx, arr*/) {

					return (elm && elm.nodeType && (elm.nodeType == 1) && (elm.nodeName.toLowerCase() == "li") && !Dom.hasClass(elm, "advertisement")/* && (Dom.getStyle(elm, "display") != "none")*/);

				}))).map(function (elm/*, idx, arr*/) {

					return elmResultList.removeChild(elm);

				}).forEach(function (elm, idx/*, arr*/) {

					elmResultList.insertBefore(elm, (elmResultList.childNodes[idx] || elmResultList.appendChild(document.createTextNode(""))));
				});

				ResultFilterController.reClassifyResultListEntries();
			}
		});

		return {

			initialize: (function (elm) {/*

				//init starslider
				var ss_div = Dom.getElementsByClassName('yui-starslider', 'div', elm)[0];
				var ss_output = Dom.getElementsByClassName('yui-starslider-output', 'div', elm)[0];
				if (ss_div) {
					starSlider = YUIControlsManager.createStarSlider(ss_div, 'ss1', [0,129], ss_output);
					starSlider.subscribe("slideEnd", setStarsForSearch);
				}*/
				//init saved searches Button
				var menuButton = Dom.getElementsByClassName('yui-button-container', 'div', elm)[0];
			//alert("elm.id : " +  elm.id);
				if (menuButton) {
					if (elm.id == "rooms") {

						elm = YUIControlsManager.createMenuButton(menuButton, 'bt1', RoomsController.onAmountOfRoomsChanged);
						RoomsController.importAmountOfRoomsElement(elm);

					} else if (elm.id == "adults") {

					//YUIControlsManager.createMenuButton(menuButton, 'bt4', (function (p_sType, p_aArgs, p_oItem) {alert("(p_oItem === this) ? " + (p_oItem === this));this.set("label", this.cfg.getProperty("text"));}));
						elm = YUIControlsManager.createMenuButton(menuButton, 'bt4', RoomsController.onAmountOfAdultsChanged);
						RoomsController.importAmountOfAdultsElement(elm);

					} else if (elm.id == "children") {

					//YUIControlsManager.createMenuButton(menuButton, 'bt5', (function (p_sType, p_aArgs, p_oItem) {this.set("label", p_oItem.cfg.getProperty("text"));}));
						elm = YUIControlsManager.createMenuButton(menuButton, 'bt1', RoomsController.onAmountOfChildrenChanged);
						RoomsController.importAmountOfChildrenElement(elm);

					} else if (elm.id=="searchSummaryWrapper") {

						savedSearches = YUIControlsManager.createMenuButton(menuButton, 'bt2', loadSavedSearch);/*

						if (window.attachEvent && (typeof XMLHttpRequest != "object")) { // really dirty hotfix of msie-6 render-behavior
							savedSearches.elmCustomizeResultsWrapper = (document.getElementsByTagName("div")["customizeResultsWrapper"] || document.getElementById("customizeResultsWrapper"));
							savedSearches.elmSearchSummaryWrapper = (document.getElementsByTagName("div")["searchSummaryWrapper"] || document.getElementById("searchSummaryWrapper"));
							savedSearches.elmCornerWrapper = Dom.getElementsByClassName("cornerWrapper", "div", savedSearches.elmSearchSummaryWrapper)[0];
							savedSearches.elmCornerBottomLeft = Dom.getElementsByClassName("bottomLeft", "div", savedSearches.elmCornerWrapper)[0];
							savedSearches.elmCornerBottomRight = Dom.getElementsByClassName("bottomRight", "div", savedSearches.elmCornerWrapper)[0];
							savedSearches.elmMenuButton = Dom.getElementsByClassName("yui-menu-button", "span", menuButton)[0];
							savedSearches.addListener("click", (function () { // <span id="yui-gen0" class="yui-button yui-menu-button yui-button-active yui-menu-button-active">
								if (Dom.hasClass(savedSearches.elmMenuButton, "yui-menu-button-active")) {
									Dom.addClass(savedSearches.elmCustomizeResultsWrapper, "hideFromOverlays");
									savedSearches.elmCornerBottomRight.style.display = "none";
									savedSearches.elmCornerBottomLeft.style.display = "none";
								} else {
									Dom.removeClass(savedSearches.elmCustomizeResultsWrapper, "hideFromOverlays");
									savedSearches.elmCornerBottomRight.style.display = "block";
									savedSearches.elmCornerBottomLeft.style.display = "block";
								}
							}));
						} else if (window.attachEvent && (typeof XMLHttpRequest == "object") && !window.opera) { // really dirty hotfix of msie-7 render-behavior
							savedSearches.elmSearchSummaryWrapper = (document.getElementsByTagName("div")["searchSummaryWrapper"] || document.getElementById("searchSummaryWrapper"));
							savedSearches.elmCornerWrapper = Dom.getElementsByClassName("cornerWrapper", "div", savedSearches.elmSearchSummaryWrapper)[0];
						//savedSearches.elmCornerBottomLeft = Dom.getElementsByClassName("bottomLeft", "div", savedSearches.elmCornerWrapper)[0];
							savedSearches.elmCornerBottomRight = Dom.getElementsByClassName("bottomRight", "div", savedSearches.elmCornerWrapper)[0];
							savedSearches.elmMenuButton = Dom.getElementsByClassName("yui-menu-button", "span", menuButton)[0];
							savedSearches.addListener("click", (function () { // <span id="yui-gen0" class="yui-button yui-menu-button yui-button-active yui-menu-button-active">
								if (Dom.hasClass(savedSearches.elmMenuButton, "yui-menu-button-active")) {
									savedSearches.elmCornerBottomRight.style.display = "none";
								} else {
									savedSearches.elmCornerBottomRight.style.display = "block";
								}
							}));
						}*/
					} else if (elm.id=="volumeHead") {

						sortByButton = YUIControlsManager.createMenuButton(menuButton, 'bt3', sortResultList);
					}
				}
				//delete SearchControlsManager.initialize;
				//delete arguments.callee;
			})
		};

	})(); // [SearchControlsManager] Singleton.


/*
	var DialogController = (function () { // [DialogController] Singleton.


		var shortlistForm, shortlistFormHeader, bluePrintDialogTitleCopy, bluePrintAllHotelsList, bluePrintSingleHotelItem, bluePrintAllHotelsHeaderHTML, bluePrintSingleHotelHeaderHTML;
		var overlay, dialogContainer, dialogTarget, dialogBody, dialogHead, closeLink;

		var hideDialog = (function () {

			Dom.removeClass(elmBody, "lightbox");
		});
		var showDialog = (function () {

			Dom.addClass(elmBody, "lightbox");
			//Dom.setStyle(overlay, "height", (Dom.getDocumentHeight() + "px"));
			Dom.setStyle(overlay, "height", (elmBody.offsetHeight + "px"));
		});

		var setDialogTitle = (function (title) {

			if (Dom.getFirstChild(dialogHead).nodeName.toLowerCase() == "p") {

				Dom.getFirstChild(dialogHead).innerHTML = title;

			} else {

				var dialogTitle = document.createElement("p");

				dialogTitle.appendChild(document.createTextNode(title));
				Dom.insertBefore(dialogTitle, closeLink);
			}
		});


		var showPictureDialog = (function (params) {			

			if (dialogBody.hasChildNodes()) {
				//todo: besser elemente wiederverwenden
				dialogBody.innerHTML = "";
			}

			var headline = Dom.get("main").getElementsByTagName("h2")[0];
			var imageTitle = params.trigger.title ? params.trigger.title : (params.title ? params.title : "");

			var subline = document.createElement("h3");
			subline.appendChild(document.createTextNode(imageTitle));
			var bigImage = document.createElement("img");
			bigImage.src = params.trigger.href;

			dialogBody.appendChild(headline);
			dialogBody.appendChild(subline);
			dialogBody.appendChild(bigImage);

			Dom.addClass(dialogTarget, "pictureDialog");
			var dialogBodyPL = Dom.getStyle(dialogBody, "paddingLeft");
			var dialogBodyPR = Dom.getStyle(dialogBody, "paddingRight");
			var dialogBodyBL = Dom.getStyle(dialogBody, "borderLeftWidth");
			var dialogBodyBR = Dom.getStyle(dialogBody, "borderRightWidth");

			var dialogWidth = parseFloat(bigImage.width, 10) + parseFloat(dialogBodyPL.slice(0,dialogBodyPL.length-2), 10) + parseFloat(dialogBodyPR.slice(0,dialogBodyPR.length-2), 10) + parseFloat(dialogBodyBL.slice(0,dialogBodyBL.length-2), 10) + parseFloat(dialogBodyBR.slice(0,dialogBodyBR.length-2), 10);
			Dom.setStyle(dialogTarget, "width", (dialogWidth + "px"));

			showDialog();
		});

		return {

			initialize: (function (elm) {
return;
				shortlistForm = document.forms["sendShortlist"];
				bluePrintAllHotelsList = Dom.getElementsByClassName("allhotels", "ul", shortlistForm)[0];
				bluePrintSingleHotelItem = Dom.getElementsByClassName("singlehotel", "ul", shortlistForm)[0];
				bluePrintAllHotelsList = bluePrintAllHotelsList.parentNode.removeChild(bluePrintAllHotelsList);
				bluePrintSingleHotelItem = bluePrintSingleHotelItem.parentNode.removeChild(bluePrintSingleHotelItem);

				shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[0];

				bluePrintDialogTitleCopy = shortlistFormHeader.title;
				bluePrintAllHotelsHeaderHTML = shortlistFormHeader.innerHTML;

				shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[1];
				if (shortlistFormHeader) {

					bluePrintSingleHotelHeaderHTML = shortlistFormHeader.innerHTML;

					shortlistFormHeader.parentNode.removeChild(shortlistFormHeader);
					shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[0];
				} else {
					bluePrintSingleHotelHeaderHTML = "";
				}

				overlay = document.createElement("div");
				overlay.id = "overlay";

				dialogContainer = document.createElement("div");
				dialogContainer.id = "dialogContainer";

				dialogTarget = document.createElement("div");
				dialogTarget.id = "dialogTarget";

				dialogHead = document.createElement("div");
				Dom.addClass(dialogHead, "hd");

				dialogBody = document.createElement("div");
				Dom.addClass(dialogBody, "bd");

				var dialogFoot = document.createElement("div");
				Dom.addClass(dialogFoot, "ft");

				var cornerWrapper = document.createElement("div");
				Dom.addClass(cornerWrapper, "cornerWrapper");
				cornerWrapper.innerHTML = '<div class="topLeft"></div><div class="topRight"></div><div class="bottomRight"></div><div class="bottomLeft"></div>';

				closeLink = document.createElement("a");
				Dom.addClass(closeLink, "closeLayer");
				closeLink.href = "javascript:\/\/";
				closeLink.innerHTML = "<span>close</span>";
				
				dialogContainer.appendChild(dialogTarget);
				dialogTarget.appendChild(dialogHead);
				dialogTarget.appendChild(dialogBody);
				dialogTarget.appendChild(dialogFoot);

				dialogHead.appendChild(closeLink);

				dialogTarget.appendChild(cornerWrapper);
				
				elmBody.appendChild(overlay);
				elmBody.appendChild(dialogContainer);
			
				//<div id="overlay"></div>
				//<div id="dialogContainer">
				//	<div id="dialogTarget" >
				//		<div class="hd"><p>Send your shortlist</p> <a href="javascript:\/\/" class="closeLayer"><span>close</span></a></div> 
				//		<div class="bd"></div>
				//		<div class="ft"></div>
				//		<div class="cornerWrapper"><div class="topLeft"></div><div class="topRight"></div><div class="bottomRight"></div><div class="bottomLeft"></div></div>
				//	</div>
				//</div>
			

				// events for closing lightbox 
				Evt.on(overlay, "click", (function(evt) {

					hideDialog();
				}));
				Evt.on(dialogContainer, "click", (function(evt) {

					var elmTarget = (evt.target || evt.srcElement);
					if (elmTarget && (elmTarget.id == "overlay" || elmTarget.id =="dialogContainer" || elmTarget.className == "closeLayer")) {

						hideDialog();

						if (elmTarget.className == "closeLayer") {

							if (evt.preventDefault) {

								evt.preventDefault();
							} else {
								evt.returnValue = false;
							}
						}
					}
				}));



				//beispiel fuer img im layer (noch nicht fertig)
				Evt.on(Dom.getElementsByClassName("pictureDialog", "a", "contentBody"), "click", (function (evt) {
			
					if (evt.preventDefault) {

						evt.preventDefault();
					} else {
						evt.returnValue = false;
					}
					showPictureDialog({trigger: this});
				}));


				delete DialogController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [DialogController] Singleton.
*/
	var LightboxGenerator = (function () { // [LightboxGenerator] Singleton.
		var overlay, dialogContainer, dialogBody;
		
		var hideDialog = (function () {
			Dom.removeClass(elmBody, "lightbox");
		});
		var showDialog = (function () {
			Dom.addClass(elmBody, "lightbox");/*
			Dom.setStyle(overlay, "height", (Dom.getDocumentHeight() + "px"));*/
			Dom.setStyle(overlay, "height", (elmBody.offsetHeight + "px"));
		});

		return {

			initialize: (function (elm) {
				overlay = Dom.get("overlay");
				dialogContainer = Dom.get("dialogContainer");
				dialogBody = Dom.getElementsByClassName("bd", "div", "dialogContainer");
				
				// events for closing lightbox 
				Evt.on(overlay, "click", (function(evt) {
					hideDialog();
				}));
				Evt.on(dialogContainer, "click", (function(evt) {
					var elmTarget = (evt.target || evt.srcElement);
					if (elmTarget && (elmTarget.id == "overlay" || elmTarget.id =="dialogContainer" || elmTarget.className.indexOf("closeLayer") != -1)) {
						hideDialog();
						if (elmTarget.className == "closeLayer") {
							if (evt.preventDefault) {
								evt.preventDefault();
							} else {
								evt.returnValue = false;
							}
						}
					}
				}));

				delete LightboxGenerator.initialize;
				delete arguments.callee;
			}),
			
			hide: (function () {hideDialog();}),
			show: (function () {showDialog();})
		};

	})(); // [LightboxGenerator] Singleton.

	var LightboxController = (function () { // [LightboxController] Singleton.
		var dialogBody, dialogTarget;
		var slideshowBigImage, slideshowImagesList;
		var arrImages = [];
		
		var openMapLightbox = (function (elm) {
			var triggerLink = elm;
			var mapPreview = Dom.getFirstChild(triggerLink);
			
			if (!Dom.get('aowlbMap')) {
				dialogBody.innerHTML = "";
			}
			else {
				LightboxGenerator.show();
				return;
			}

			var headline = (document.createElement('h2'));
			headline.appendChild(document.createTextNode(triggerLink.getAttribute('title')));
			var subline = document.createElement("h3");
			var locationText = mapPreview.alt;
			subline.appendChild(document.createTextNode(locationText));
			var mapDiv = document.createElement("div");
			mapDiv.id = "aowlbMap";

			dialogBody.appendChild(headline);
			dialogBody.appendChild(subline);
			dialogBody.appendChild(mapDiv);
			
			Dom.removeClass(dialogTarget, "slideshowDialog");
			Dom.addClass(dialogTarget, "mapDialog");
			Dom.setStyle(dialogTarget, "width", "797px");
			
			//important: first make mapdiv visible, then load map
			LightboxGenerator.show();
			//window.scrollTo(100, 100);
			
			var geocoords = elm.href.match(/q=([0-9\-.,]+)/)[1];
			geocoords = geocoords.split(',');
			var geoObj = {defaults: {lat: 53.5526, lng: 9.9352, zoom: 15},results:[{lat: geocoords[0], lng: geocoords[1]}]};
			MapController.initializeLightboxMap(geoObj);
		});
		
		var openSlideshowLightbox = (function (elm) {
			var triggerLink = elm;
			
			if (Dom.get("selfserviceContainer")) { //selfservice page "ihre buchung" - resolve conflict with second lightbox
				Dom.setStyle(Dom.get("selfserviceContainer"),"visibility","hidden");
				Dom.setStyle(Dom.get("dialogContainer"),"visibility","visible");
			}
			
			if (!Dom.get('slideshow')) {
				dialogBody.innerHTML = "";
			}
			else {
				LightboxGenerator.show();
				window.scrollTo(0, 0);
				return;
			}

			arrImages = slideshowImagesList.getElementsByTagName("img");
			var arrListElements = slideshowImagesList.getElementsByTagName("li");
			var arrImageTitles = slideshowImagesList.getElementsByTagName("p");
			var listElementWidth = 76;
			
			var toggleBigImage = (function (img,txt) {
				
				Array.forEach(arrListElements, (function (elm, idx) {
					if (Dom.isAncestor(elm, img)) {
						
						Dom.addClass(elm, "selected");
					}
					else {
						
						Dom.removeClass(elm, "selected");
					}
				}));
				slideshowBigImage.src = img.src;
				imageTitle.innerHTML = txt.innerHTML;
			});

			var slideThumbList = (function (dir) {
				
				var selectedListElm = Dom.getElementsByClassName('selected', 'li',slideshowImagesList)[0];
				if (dir == "next") { // click next
					var newCurrentListElm = Dom.getNextSibling(selectedListElm);
					if (!newCurrentListElm) {
						newCurrentListElm = Dom.getFirstChild(slideshowImagesList);
					}
				}				
				else { // click previous
					var newCurrentListElm = Dom.getPreviousSibling(selectedListElm);
					if (!newCurrentListElm) {
						newCurrentListElm = Dom.getLastChild(slideshowImagesList);
					}
				}
				var newCurrentImage = Dom.getFirstChild(newCurrentListElm);
				var newCurrentText = Dom.getLastChild(newCurrentListElm);
				
				var currentLeftOffset = Dom.getX(slideshowListContainer) - Dom.getX(slideshowImagesList);
				if ( Dom.getX(newCurrentListElm) < Dom.getX(slideshowListContainer) ) { //zu weit links
					var newLeftOffset = ((currentLeftOffset - listElementWidth) <= 0 ) ? (currentLeftOffset - listElementWidth) : 0 ;
					Dom.setStyle(slideshowImagesList, "left", newLeftOffset + "px");
				}
				else if (Dom.getX(newCurrentListElm) >= (Dom.getX(slideshowListContainer) + slideshowListContainer.clientWidth) ) {//zu weit rechts 
					var newLeftOffset = (-(currentLeftOffset + listElementWidth) <= 0 ) ? -(currentLeftOffset + listElementWidth) : 0 ;
					if (dir == "prev") {
						newLeftOffset = -((arrImages.length*listElementWidth) - (4*listElementWidth));
					}
					Dom.setStyle(slideshowImagesList, "left", newLeftOffset + "px");
				}
				toggleBigImage(newCurrentImage,newCurrentText);
			});
			
			var headline = document.createElement('h2');
			headline.appendChild(document.createTextNode( Dom.getFirstChild(triggerLink).getAttribute('alt')));
			var imageTitle = document.createElement('span');
			imageTitle.innerHTML = Dom.getLastChild(Dom.getFirstChild(slideshowImagesList)).innerHTML;
			headline.appendChild(imageTitle);
			var slideshowDiv = document.createElement("div");
			slideshowDiv.id = "slideshow";
			slideshowBigImage = document.createElement("img");
			slideshowBigImage.src = Dom.getFirstChild(Dom.getFirstChild(slideshowImagesList)).src;
			slideshowBigImage.id = "slideshowBigImage";
			var slideshowControlDiv = document.createElement("div");
			slideshowControlDiv.id = "slideshowControl";
			var slideshowPrevious = document.createElement("a");
			Dom.addClass(slideshowPrevious, "previous");
			slideshowPrevious.innerHTML = "<span>previous</span>";
			var slideshowNext = document.createElement("a");
			Dom.addClass(slideshowNext, "next");
			slideshowNext.innerHTML = "<span>next</span>";
			var slideshowListContainer = document.createElement("div");
			slideshowListContainer.id = "listContainer";
			
			dialogBody.appendChild(headline);
			dialogBody.appendChild(slideshowDiv);
			slideshowDiv.appendChild(slideshowBigImage);
			slideshowDiv.appendChild(slideshowControlDiv);
			slideshowControlDiv.appendChild(slideshowPrevious);
			slideshowControlDiv.appendChild(slideshowNext);
			slideshowControlDiv.appendChild(slideshowListContainer);
			slideshowListContainer.appendChild(slideshowImagesList);
			/* need to assign this again for ie6 !? */
			arrImages = slideshowImagesList.getElementsByTagName("img");
			arrListElements = slideshowImagesList.getElementsByTagName("li");
			/* end ie6 fix */
			
			Dom.addClass(Dom.getFirstChild(slideshowImagesList), "selected");
			Dom.removeClass(dialogTarget, "mapDialog");
			Dom.addClass(dialogTarget, "slideshowDialog");
			Dom.setStyle(dialogTarget, "width", "460px");
			Dom.setStyle(slideshowImagesList, "width", (arrImages.length * listElementWidth) + "px");

			window.scrollTo(0, 0);
			LightboxGenerator.show();
			
			Evt.on(arrImages, 'click', function (evt) {
				toggleBigImage(this, Dom.getNextSibling(this));
			});
			Evt.on(slideshowPrevious, 'click', function (evt) {
				slideThumbList("prev");
			});
			Evt.on(slideshowNext, 'click', function (evt) {
				slideThumbList("next");
			});
			
		});
		
		var preventDefaultAction = (function (evt) {
			if (evt.preventDefault) {
				evt.preventDefault();
			} else {
				evt.returnValue = false;
			}
		});
		
		return {

			initialize: (function (elm) {
				dialogBody = Dom.getElementsByClassName("bd", "div", "dialogContainer")[0];
				dialogTarget = Dom.get("dialogTarget");
				slideshowImagesList = Dom.get("hotelLightboxImages") ? (Dom.get("hotelLightboxImages")).cloneNode(true) : false;
				var lightboxLinks = Dom.getElementsByClassName('lightbox');
				var mapLightboxes = [];
				var slideshowLightboxes = [];
				
				Array.forEach(lightboxLinks, function (elm) {
					if (Dom.hasClass(elm, 'map')) {
						mapLightboxes.push(elm);
					}
					else if (Dom.hasClass(elm, 'slideshow')) {
						slideshowLightboxes.push(elm);
					}
				});
				
				Evt.on(mapLightboxes, 'click', function (evt) {
					preventDefaultAction(evt);
					openMapLightbox(this);
				});
				Evt.on(slideshowLightboxes, 'click', function (evt) {
					preventDefaultAction(evt);
					openSlideshowLightbox(this);
				});

				delete LightboxController.initialize;
				delete arguments.callee;
			})
		};
	})(); // [LightboxController] Singleton.
	
	/*
	var ThumbTwiddler = (function () { // [ThumbTwiddler] Singleton.
		var twidOverlay, twidBody;
		
		var hideDialog = (function () {
			Dom.removeClass(elmBody, "twiddlebox");
		});
		var showDialog = (function () {
			Dom.addClass(elmBody, "twiddlebox");
			Dom.setStyle(twidOverlay, "height", (elmBody.offsetHeight + "px"));
		});
		
		var placeLoadingMsg = (function (msg) {
			var twiddleText = msg ? msg : "Loading...";
			var textElement = document.createElement("p");
			textElement.appendChild(document.createTextNode(twiddleText));
			twidBody.appendChild(textElement);
		});

		return {
			initialize: (function (elm) {
				if (!Dom.get("overlay")) {
					return;
				}
				twidOverlay = Dom.get("overlay").cloneNode(false);
				twidOverlay.id = "twiddleOverlay";
				var twidContainer = Dom.get("dialogContainer").cloneNode(false);
				twidContainer.id = "twiddleContainer";
				var twidTarget = Dom.get("dialogTarget").cloneNode(true);
				twidTarget.id = "twiddleTarget";
				Dom.addClass(twidTarget, "twiddleDialog");
				twidContainer.appendChild(twidTarget);
				
				elmBody.appendChild(twidOverlay);
				Dom.insertAfter(twidContainer, twidOverlay);
				twidBody = Dom.getElementsByClassName("bd", "div", "twiddleContainer")[0];
				
				// nur zum testen 
				//var sendButtons = Dom.getElementsByClassName("booknow", "a", "extra");
				//Evt.on(sendButtons, "click", (function() {
				//	ThumbTwiddler.start();
				//}));
				
				delete ThumbTwiddler.initialize;
				delete arguments.callee;
			}),
			start:(function (msg) {
				placeLoadingMsg(msg);
				showDialog();
			}),
			stop:(function () {
				hideDialog();
			})
		};
	})(); // [ThumbTwiddler] Singleton.
		*/
		
	
	var ColumnFixer = (function () { // [ColumnFixer] Singleton.
		var columns, maxHeight;
		
		Array.max = (function (array) {
			return Math.max.apply( Math, array );
		});
		
		var onViewChanged = (function (evt) {

			viewType = evt.viewType;
			
			if (viewType == "map") {
				Array.forEach(columns, function (elm) {
					Dom.setStyle(elm, "height", "");
				});
			} else if (viewType == "compare") {
				Array.forEach(columns, function (elm) {
					Dom.setStyle(elm, "height", maxHeight + "px");
				});
			}
			
		});
		
		return {
			initialize: (function (elm) {
				if (!Dom.hasClass(Dom.get("resultView"),"compare")) {
					return;
				}
				
				columns = Dom.getElementsByClassName("entryWrapper", "div", "resultView");
				var heights = [];
				
				if (columns.length > 0) {
					
					Array.forEach(columns, function (elm) {
						var region = Dom.getRegion(elm);
						heights.push(region.bottom - region.top);
					});
					maxHeight = Array.max(heights);
					
					Array.forEach(columns, function (elm) {
						Dom.setStyle(elm, "height", maxHeight + "px");
					});
					
					ViewController.addEventListener("onViewChanged", onViewChanged);
				}
			
			delete ColumnFixer.initialize;
			delete arguments.callee;
			})
		};
	})(); // [ColumnFixer] Singleton.
	
	/*
	var SendShortListController = (function () { // [SendShortListController] Singleton.


		var shortlistForm, shortlistFormHeader, bluePrintDialogTitleCopy, bluePrintAllHotelsList, bluePrintSingleHotelItem, bluePrintAllHotelsHeaderHTML, bluePrintSingleHotelHeaderHTML;
		var overlay, dialogContainer, dialogTarget, dialogBody, dialogHead, closeLink;

		var hideDialog = (function () {

			Dom.removeClass(elmBody, "lightbox");
		});
		var showDialog = (function () {

			Dom.addClass(elmBody, "lightbox");
			//Dom.setStyle(overlay, "height", (Dom.getDocumentHeight() + "px"));
			Dom.setStyle(overlay, "height", (elmBody.offsetHeight + "px"));
		});

		var setDialogTitle = (function (title) {

			if (Dom.getFirstChild(dialogHead).nodeName.toLowerCase() == "p") {

				Dom.getFirstChild(dialogHead).innerHTML = title;

			} else {

				var dialogTitle = document.createElement("p");

				dialogTitle.appendChild(document.createTextNode(title));
				Dom.insertBefore(dialogTitle, closeLink);
			}
		});


		var buildSendShortlistDialog = (function (params) {

			//set title of dialogbox in case it wasn't generated yet.
			setDialogTitle(bluePrintDialogTitleCopy);

			//build list of hotel(s) according to this methods trigger type.
			if (params.type == "all") {

				shortlistFormHeader.innerHTML = bluePrintAllHotelsHeaderHTML;

				Dom.batch(shortlistForm.getElementsByTagName("input"), (function (elm) {

					elm.value = "";
				}));
				Dom.batch(shortlistForm.getElementsByTagName("textarea"), (function (elm) {

					elm.value = "";
				}));
				Dom.removeClass(shortlistForm, "single");

			} else if (params.type == "single") {

				var itemWrapper = Dom.getAncestorByClassName(params.trigger, "entryWrapper");
				var hotelName = itemWrapper.getElementsByTagName("h2")[0].innerHTML;

				shortlistFormHeader.innerHTML = bluePrintSingleHotelHeaderHTML + "\"" + hotelName + "\"";

				Dom.batch(shortlistForm.getElementsByTagName("input"), (function (elm) {

					elm.value = elm.defaultValue;
				}));
				Dom.batch(shortlistForm.getElementsByTagName("textarea"), (function (elm) {

					elm.value = elm.defaultValue;
				}));

				var hotelImageSrc = (Dom.getElementsByClassName("slide", "img", itemWrapper)[0].src || "");
				var hotelPlace = "?";
				var hotelStars = (Dom.getElementsByClassName("hotelsRating", "div", itemWrapper)[0]).cloneNode(true);

				Dom.getFirstChild(singleHotelListItem).src = hotelImageSrc;
				singleHotelListItem.getElementsByTagName("h2")[0].innerHTML = hotelName;
				singleHotelListItem.getElementsByTagName("p")[0].innerHTML = hotelPlace;
				var ratingDiv = Dom.getElementsByClassName("hotelsRating", "div", singleHotelListItem)[0];
				singleHotelListItem.replaceChild(hotelStars,ratingDiv);

				Dom.addClass(shortlistForm, "single");
			}
			//append content to dialogbox and show
			dialogBody.appendChild(shortlistForm);
			showDialog();
		});

		var showPictureDialog = (function (params) {			

			if (dialogBody.hasChildNodes()) {
				//todo: besser elemente wiederverwenden
				dialogBody.innerHTML = "";
			}

			var headline = Dom.get("main").getElementsByTagName("h2")[0];
			var imageTitle = params.trigger.title ? params.trigger.title : (params.title ? params.title : "");

			var subline = document.createElement("h3");
			subline.appendChild(document.createTextNode(imageTitle));
			var bigImage = document.createElement("img");
			bigImage.src = params.trigger.href;

			dialogBody.appendChild(headline);
			dialogBody.appendChild(subline);
			dialogBody.appendChild(bigImage);

			Dom.addClass(dialogTarget, "pictureDialog");
			var dialogBodyPL = Dom.getStyle(dialogBody, "paddingLeft");
			var dialogBodyPR = Dom.getStyle(dialogBody, "paddingRight");
			var dialogBodyBL = Dom.getStyle(dialogBody, "borderLeftWidth");
			var dialogBodyBR = Dom.getStyle(dialogBody, "borderRightWidth");

			var dialogWidth = parseFloat(bigImage.width, 10) + parseFloat(dialogBodyPL.slice(0,dialogBodyPL.length-2), 10) + parseFloat(dialogBodyPR.slice(0,dialogBodyPR.length-2), 10) + parseFloat(dialogBodyBL.slice(0,dialogBodyBL.length-2), 10) + parseFloat(dialogBodyBR.slice(0,dialogBodyBR.length-2), 10);
			Dom.setStyle(dialogTarget, "width", (dialogWidth + "px"));

			showDialog();
		});

		return {

			initialize: (function (elm) {
return;
				shortlistForm = document.forms["sendShortlist"];
				bluePrintAllHotelsList = Dom.getElementsByClassName("allhotels", "ul", shortlistForm)[0];
				bluePrintSingleHotelItem = Dom.getElementsByClassName("singlehotel", "ul", shortlistForm)[0];
				bluePrintAllHotelsList = bluePrintAllHotelsList.parentNode.removeChild(bluePrintAllHotelsList);
				bluePrintSingleHotelItem = bluePrintSingleHotelItem.parentNode.removeChild(bluePrintSingleHotelItem);

				shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[0];

				bluePrintDialogTitleCopy = shortlistFormHeader.title;
				bluePrintAllHotelsHeaderHTML = shortlistFormHeader.innerHTML;

				shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[1];
				if (shortlistFormHeader) {

					bluePrintSingleHotelHeaderHTML = shortlistFormHeader.innerHTML;

					shortlistFormHeader.parentNode.removeChild(shortlistFormHeader);
					shortlistFormHeader = shortlistForm.getElementsByTagName("h1")[0];
				} else {
					bluePrintSingleHotelHeaderHTML = "";
				}

				overlay = document.createElement("div");
				overlay.id = "overlay";

				dialogContainer = document.createElement("div");
				dialogContainer.id = "dialogContainer";

				dialogTarget = document.createElement("div");
				dialogTarget.id = "dialogTarget";

				dialogHead = document.createElement("div");
				Dom.addClass(dialogHead, "hd");

				dialogBody = document.createElement("div");
				Dom.addClass(dialogBody, "bd");

				var dialogFoot = document.createElement("div");
				Dom.addClass(dialogFoot, "ft");

				var cornerWrapper = document.createElement("div");
				Dom.addClass(cornerWrapper, "cornerWrapper");
				cornerWrapper.innerHTML = '<div class="topLeft"></div><div class="topRight"></div><div class="bottomRight"></div><div class="bottomLeft"></div>';

				closeLink = document.createElement("a");
				Dom.addClass(closeLink, "closeLayer");
				closeLink.href = "javascript:\/\/";
				closeLink.innerHTML = "<span>close</span>";
				
				dialogContainer.appendChild(dialogTarget);
				dialogTarget.appendChild(dialogHead);
				dialogTarget.appendChild(dialogBody);
				dialogTarget.appendChild(dialogFoot);

				dialogHead.appendChild(closeLink);

				dialogTarget.appendChild(cornerWrapper);
				
				elmBody.appendChild(overlay);
				elmBody.appendChild(dialogContainer);
			
				//<div id="overlay"></div>
				//<div id="dialogContainer">
				//	<div id="dialogTarget" >
				//		<div class="hd"><p>Send your shortlist</p> <a href="javascript:\/\/" class="closeLayer"><span>close</span></a></div> 
				//		<div class="bd"></div>
				//		<div class="ft"></div>
				//		<div class="cornerWrapper"><div class="topLeft"></div><div class="topRight"></div><div class="bottomRight"></div><div class="bottomLeft"></div></div>
				//	</div>
				//</div>
			

				// events for closing lightbox 
				Evt.on(overlay, "click", (function(evt) {

					hideDialog();
				}));
				Evt.on(dialogContainer, "click", (function(evt) {

					var elmTarget = (evt.target || evt.srcElement);
					if (elmTarget && (elmTarget.id == "overlay" || elmTarget.id =="dialogContainer" || elmTarget.className == "closeLayer")) {

						hideDialog();

						if (elmTarget.className == "closeLayer") {

							if (evt.preventDefault) {

								evt.preventDefault();
							} else {
								evt.returnValue = false;
							}
						}
					}
				}));


				// events for opening dialogbox			
				Evt.on(Dom.getElementsByClassName("dialogTrigger", "a", "shortlistTools"), "click", (function (evt) {

					buildSendShortlistDialog({type: "all", trigger: this});
				}));
				Evt.on(Dom.getElementsByClassName("dialogTrigger", "a", "resultView"), "click", (function (evt) {

					buildSendShortlistDialog({type: "single", trigger: this});
				}));


				delete SendShortListController.initialize;
				delete arguments.callee;
			})
		};

	})(); // [SendShortListController] Singleton.
*/

	
	/*
	var TruncateController = (function () { // [TruncateController] Singleton.
		var elmWidth, elmHeight, innerWrapper, truncElements, viewType;
		var truncatedElements = [];
			
		var hasTooMuchContent = (function (elm) {
			
			var elmOriginalContent = elm.innerHTML;
			
			innerWrapper = document.createElement("span");			
			innerWrapper.innerHTML = elmOriginalContent;
			elm.innerHTML = '';
			elm.appendChild(innerWrapper);
			
			var elmRegion = Dom.getRegion(elm);
			elmWidth = elmRegion.right - elmRegion.left;
			elmHeight = elmRegion.bottom - elmRegion.top;
			
			if ( elm.scrollHeight > elm.offsetHeight) {
				return true;
			}
			else {
				elm.innerHTML = elmOriginalContent;
				return false;
			}
		});
		
		var getCSSValue = (function (element,cssname) {
			var originalCSSValue = Dom.getStyle(element, cssname);
			if ( originalCSSValue.indexOf('px') != -1 ) {
				var CSSValue = originalCSSValue.substring(0,originalCSSValue.length-2);
			}
			return CSSValue;
		});

		var truncateText = (function (elm) {
			Dom.addClass(elm,'truncTrue');
			Dom.setStyle(innerWrapper,'height',elmHeight + 'px');
			if ( getCSSValue(innerWrapper,'lineHeight')*2 < elmHeight) {
				var stopit;
				//zweizeilig
			}
			else {
				var stopit2;
				//einzeilig
				Dom.setStyle(innerWrapper, 'whiteSpace', 'nowrap');
			}
			Dom.setStyle(elm,'width',elmWidth-20 + 'px');
			Dom.setStyle(elm,'paddingRight', '20px');
		});
		
		var truncateElementIfTooLong = (function () {
			Array.forEach(truncElements, (function (elm) {
				if (hasTooMuchContent(elm)) {
					truncateText(elm);
					truncatedElements.push(elm);
				}
			}));
			return truncatedElements;
		});
		
		var resetTruncateStyles = (function () {
			Array.forEach(truncatedElements, (function (elm) {
				var innerWrapper = Dom.getFirstChild(elm);
				if(innerWrapper.nodeName.toLowerCase() == 'span') {
					Dom.removeClass(elm,'truncTrue');
					elm.removeAttribute('style');
					innerWrapper.removeAttribute('style');
				}
			}));
			truncatedElements = [];
		});
		
		var onViewChanged = (function (evt) {
			if (viewType && (viewType=="map") && (evt.viewType == 'compact')) {
				return;
			}
			if (viewType && (viewType=="compact") && (evt.viewType == 'map')) {
				return;
			}
			viewType = evt.viewType;
			resetTruncateStyles();
			truncateElementIfTooLong();			
		});
		
		
		return {

			initialize: (function (elm) {
				
				truncElements = Dom.getElementsByClassName('truncate');
				truncateElementIfTooLong();
				
				ViewController.addEventListener("onViewChanged", onViewChanged);
				
				delete TruncateController.initialize;
				delete arguments.callee; // [arguments.callee] should be identic to [TruncateController.initialize], even though deletion only takes place if called directly by label instead by the more generic [arguments.callee].
			})
		};
	})(); // [TruncateController] Singleton.
	*/



	var LoaderController = (function () { // [LoaderController] Singleton.


		var elmLoader, elmLoaderCover, elmLoaderMedia/*, timeoutIdHideLoader*/, isShowLoader = true;


		var hideLoader = (function () {

		//clearTimeout(timeoutIdHideLoader);
			Dom.setStyle(elmLoader, "display", "none");

			isShowLoader = true;
		});
		var showLoader = (function () {

			if (isShowLoader) {/*

				Dom.setStyle(elmLoader, "height", (Dom.getDocumentHeight() + "px"));*/
				var elmHeight = (Math.max(elmBody.offsetHeight, ((window.innerHeight) ? (window.innerHeight) : (document.documentElement.clientHeight))) + "px");/*
				var elmLeft = (Math.round((elmBody.offsetWidth - elmLoaderMedia.style.width) / 2) + "px");
				var elmTop = (Math.round((((window.innerHeight) ? (window.innerHeight) : (document.documentElement.clientHeight)) - elmLoaderMedia.style.height) / 2) + "px");*/

				Dom.setStyle(elmLoader, "height", elmHeight);
				Dom.setStyle(elmLoaderCover, "height", elmHeight);/*

				if (!YAHOO.env.ua.ie || (YAHOO.env.ua.ie >= 7)) {

					Dom.setStyle(elmLoaderMedia, "left", elmLeft);
					Dom.setStyle(elmLoaderMedia, "top", elmTop);
				}*/
				Dom.setStyle(elmLoader, "display", "block");
			}
			isShowLoader = true;
		});


		return {

		//preventLoader : ((YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) ? (function () {alert("msie 6");isShowLoader = false;}) : (function () {alert("not msie 6");return;})),
			preventLoaderWithinDialogs : ((document.isRenderEngineMSIE()) ? (function () {isShowLoader = false;}) : (function () {return;})),
			preventLoaderWhilstSlideshow : ((document.isRenderEngineMSIE()) ? (function () {isShowLoader = false;}) : (function () {return;})),
			preventLoaderWhilstFormValidation : ((YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) ? (function () {isShowLoader = false;}) : ((YAHOO.env.ua.ie && YAHOO.env.ua.ie >= 7) ? (function () {isShowLoader = !!document.getElementById("searchAndbookWrapper");}) : (function () {return;}))),
/*
			initalHide : (function () {

				hideLoader();

				delete LoaderController.initalHide;
				delete arguments.callee;
			}),*/
			initialize : (function () {

				elmLoader = (elmLoader || document.getElementsByTagName("div")["loader"] || document.getElementById("loader"));
				if (elmLoader) {

					elmLoaderCover = (elmLoaderCover || elmLoader.getElementsByTagName("div")["loaderCover"] || document.getElementById("loaderCover"));
					elmLoaderMedia = (elmLoaderMedia || elmLoader.getElementsByTagName("img")["loaderMedia"] || document.getElementById("loaderMedia"));

					if (window.addEventListener) {
						window.addEventListener("beforeunload", showLoader, false);
					//window.addEventListener("beforeunload", (function (evt) {showLoader(evt);}), false);
					//window.addEventListener("unload", showLoader, false);
					} else if (window.attachEvent) {
						window.attachEvent("onbeforeunload", showLoader);
					//window.attachEvent("onbeforeunload", (function () {showLoader(window.event);}));
					//window.attachEvent("onunload", showLoader, false);
					}/*
					Evt.on(window, "beforeunload", showLoader);*/

					if (document.isRenderEngineMSIE()) {
					//var elmInput = (document.forms[0].elements["destinationAutocomplete"] || document.getElementById("destinationAutocomplete"));
						var elmNextToElmInput = (document.forms[0].elements["checkInDay"] || document.forms[0].elements["datesCheckInDay"] || document.getElementById("datesCheckInDay"));
						if (elmNextToElmInput) {
						//Evt.on(elmInput, "blur", (function () {timeoutIdHideLoader = setTimeout((function () {hideLoader();}), 500);}));
						//Evt.on(elmNextToElmInput, "focus", (function () {timeoutIdHideLoader = setTimeout((function () {hideLoader();}), 20);}));
							Evt.on(elmNextToElmInput, "focus", hideLoader);
						}
					}/*
					var elmBody = (document.body || document.getElementsByTagName("body")[0]);
					var elmHeight = (Math.max(elmBody.offsetHeight, ((window.innerHeight) ? (window.innerHeight) : (document.documentElement.clientHeight))) + "px");
					var elmLeft = (Math.round((elmBody.offsetWidth - elmLoaderMedia.style.width) / 2) + "px");
					var elmTop = (Math.round((((window.innerHeight) ? (window.innerHeight) : (document.documentElement.clientHeight)) - elmLoaderMedia.style.height) / 2) + "px");
					Dom.setStyle(elmLoader, "height", elmHeight);
					Dom.setStyle(elmLoaderCover, "height", elmHeight);
					Dom.setStyle(elmLoaderMedia, "margin", "0 0 0 0");
					if (!YAHOO.env.ua.ie || (YAHOO.env.ua.ie >= 7)) {
						Dom.setStyle(elmLoaderMedia, "left", elmLeft);
						Dom.setStyle(elmLoaderMedia, "top", elmTop);
					}
					Dom.setStyle(elmLoader, "display", "block");*/
					hideLoader();
				}

			//delete Application.initializeLoader;
				delete LoaderController.initialize;
				delete arguments.callee;
			})
		};
	})(); // [LoaderController] Singleton.

//Application.initializeLoader = LoaderController.initialize;



	var initialize = (function () {


		if (window.attachEvent) {
			window.onerror = (function () {return true;});
		}
		Logger = YAHOO.widget.Logger;
		Lang = YAHOO.lang;
		Get = YAHOO.util.Get;
		Dom = YAHOO.util.Dom; /* singleton */
		Evt = YAHOO.util.Event; /* interface */
		Elm = YAHOO.util.Element; /* constructor */
		Anim = YAHOO.util.Anim; /* constructor */
		Easing = YAHOO.util.Easing; /* singleton */
	//Slct = YAHOO.util.Selector; /* singleton */

		Calendar = YAHOO.widget.Calendar;
/*
		var iCalendarLoader = Get.script("/aowlb/extensions/yui-interval-calendar.js", {

			onSuccess: (function () {

				IntervalCalendar = YAHOO.example.calendar.IntervalCalendar;
				console.log("iCalendarLoader - onSuccess : [[IntervalCalendar]] successfully loaded.");

				var elmLink = document.createElement("link");
				elmLink.type = "text/css";
				elmLink.rel = "stylesheet";
				elmLink.media = "all";
				elmLink.charset = "utf-8";
				elmLink.href = "/aowlb/extensions/tui-aowlb-calendar.css";
				document.getElementsByTagName("head")[0].appendChild(elmLink);
			}),
			onFailure: (function () {
				console.log("iCalendarLoader - onFailure : loading [[IntervalCalendar]] sources did fail.");
			})
		});
*/
		(function () {

			if (YAHOO.example && YAHOO.example.calendar && YAHOO.example.calendar.IntervalCalendar) {

				IntervalCalendar = YAHOO.example.calendar.IntervalCalendar;
			//console.log("iCalendarLoader - onSuccess : [[IntervalCalendar]] successfully loaded.");

				var elmLink = document.createElement("link");
				elmLink.type = "text/css";
				elmLink.rel = "stylesheet";
				elmLink.media = "all";
				elmLink.charset = "utf-8";
				elmLink.href = "/aowlb/extensions/tui-aowlb-calendar.css";
				document.getElementsByTagName("head")[0].appendChild(elmLink);
			}
		})();


	//Logger.enableBrowserConsole();
	//console = (((typeof console != "undefined") && console.log) ? (console) : ({log:(function(msg){alert(msg);})}));

/*
		Evt.onContentReady("viewController", (function () {

			ViewController.initialize(this);
		}));
		Evt.onContentReady("resultView", (function () {

			MapController.initialize(this);
		}));*/

/*
		Evt.onContentReady("volume", (function () {

			ViewController.initialize(this);
			SlideshowFactory.initialize(this);
			//ShortlistManager.initialize(this);
			//CollapseContoller.initialize(this);

			ResultSortController.initialize(this);

			MapController.initialize(this);
			
			//ColumnFixer.initialize(this);
		}));
*/ /*

		Evt.onContentReady("searchForHotels", (function () { // "destinationAutocomplete"

			AutocompleteController.initialize(this);
		}));
		Evt.onContentReady("dates", (function () {

			DatesController.initialize(this);
		}));
		Evt.onContentReady("rooms", (function () {

		//SearchControlsManager.initialize(this);
			RoomsController.initialize(this);
		}));
*/ /*
		Evt.onContentReady("adults", (function () {
			SearchControlsManager.initialize(this);
		//RoomsController.initialize(this);
		}));
		Evt.onContentReady("children", (function () {
			SearchControlsManager.initialize(this);
		//RoomsController.initialize(this);
		}));*/

/*
		Evt.onContentReady("price", (function () {

			PriceRangeController.initialize(this);
		}));
		Evt.onContentReady("stars", (function () {

			CategorySearchController.initialize(this);
		}));
		Evt.onContentReady("stars2", (function () {

			CategoryController.initialize(this);
		}));
*/ /*

		Evt.onContentReady("searchAndbookWrapper", (function () {

			SearchControlsManager.initialize(this);
		})); 
		Evt.onContentReady("searchSummaryWrapper", (function () {

			SearchControlsManager.initialize(this);
		})); 
		Evt.onContentReady("volumeHead", (function () {

			SearchControlsManager.initialize(this);
		}));
		Evt.onContentReady("customizeResultsWrapper", (function () {

			ResultFilterController.initialize(this);
		}));
*/

	//Evt.onDOMReady(function () {
		DOM.addEventListener("onDocumentReady", (function () {

			elmBody = (document.body || document.getElementsByTagName("body")[0]);

			elmResultList = elmBody.getElementsByTagName("ol")[0];
			elmOverlay = document.getElementById("overlay");


			var htmlDivElmColl = document.getElementsByTagName("div");
			var htmlFieldsetElmColl = document.getElementsByTagName("fieldset");

			var elm = (htmlDivElmColl["volume"] || document.getElementById("volume"));
			if (elm) {

				ViewController.initialize(elm);
				SlideshowFactory.initialize(elm);
				//ShortlistManager.initialize(elm);
				//CollapseContoller.initialize(elm);

				ResultSortController.initialize(elm);

				MapController.initialize(elm);
				
				ColumnFixer.initialize(elm);
			}
			elm = Dom.get("volume") || Dom.get("content");
			if(elm) {
				ShortlistManager.initialize(elm);
			}
			
			elm = (document.getElementsByTagName("input")["searchForHotels"] || document.getElementById("searchForHotels")); // "destinationAutocomplete"
			if (elm) {
				AutocompleteController.initialize(elm);
			}
			elm = (htmlFieldsetElmColl["dates"] || document.getElementById("dates"));
			if (elm) {
				DatesController.initialize(elm);
			}
			elm = (htmlFieldsetElmColl["rooms"] || document.getElementById("rooms"));
			if (elm) {
			//SearchControlsManager.initialize(elm);
				RoomsController.initialize(elm);
			}

			elm = (htmlDivElmColl["customizeResultsWrapper"] || document.getElementById("customizeResultsWrapper"));
			if (elm) {

				ResultFilterController.initialize(elm);

				Evt.on((document.getElementsByTagName("input")["changeSearch"] || document.getElementById("changeSearch")), "click", (function (evt) {

					Evt.preventDefault(evt || window.event);

					Dom.setStyle((document.getElementsByTagName("div")["searchSummaryWrapper"] || document.getElementById("searchSummaryWrapper")), "display", "none"); // elmSummary
					Dom.setStyle((document.getElementsByTagName("div")["searchAndbookWrapper"] || document.getElementById("searchAndbookWrapper")), "display", "block"); // elmSearch
					Dom.setStyle((document.getElementsByTagName("div")["customizeResultsWrapper"] || document.getElementById("customizeResultsWrapper")), "display", "none"); // elmFilters

					setTimeout((function () {CategorySearchController.initialize(elm.getElementsByTagName("fieldset")["stars"] || document.getElementById("stars"));}), 100);
				}));
			}

			elm = (htmlFieldsetElmColl["price"] || document.getElementById("price"));
			if (elm) {
				PriceRangeController.initialize(elm);
			}
			elm = (htmlFieldsetElmColl["stars"] || document.getElementById("stars"));
			if (elm) {
				CategorySearchController.initialize(elm);
			}
			elm = (htmlFieldsetElmColl["stars2"] || document.getElementById("stars2"));
			if (elm) {
				CategoryController.initialize(elm);
			}

			elm = (htmlDivElmColl["searchAndbookWrapper"] || document.getElementById("searchAndbookWrapper"));
			if (elm) {
				SearchControlsManager.initialize(elm);
			}
			elm = (htmlDivElmColl["searchSummaryWrapper"] || document.getElementById("searchSummaryWrapper"));
			if (elm) {
				SearchControlsManager.initialize(elm);
			}
			elm = (htmlDivElmColl["volumeHead"] || document.getElementById("volumeHead"));
			if (elm) {
				SearchControlsManager.initialize(elm);
			}/*

			elm = (htmlDivElmColl["customizeResultsWrapper"] || document.getElementById("customizeResultsWrapper"));
			if (elm) {

				ResultFilterController.initialize(elm);
			}*/


		//elmBody = (document.body || document.getElementsByTagName("body")[0]);


			var elmAowlb = (document.getElementsByTagName("div")["aowlb"] || document.getElementById("overlay"));
			if (elmAowlb && Dom.hasClass(elmAowlb, "booking") && Dom.hasClass(elmAowlb, "payment")) {

			//LoaderController.initialize();
			//LoaderController.initalHide();

			//HintsContoller.initialize(); // there are al leats one, but needs to be maintained yet.
				FormValidationController.initialize();

				return;
			}


		//elmResultList = elmBody.getElementsByTagName("ol")[0];
		//elmOverlay = document.getElementById("overlay");
				//elmDialogContainer = document.getElementById("dialogContainer");
				//windowInstructionsDialog = window.frames["bookingDetailDialog"];


		//ResultSortController.applySortDefault();
		//ResultFilterController.disableUnavailableFeatures();
		//very strange msie bahavior/msie render bug: some kind of delayed or skipped or even *forgotten at all* access of the HTMLElement identifying itself as "customizeResultsWrapper".
		/*if (ResultFilterController.initialize && !ResultFilterController.initialize.blocked && document.getElementById("customizeResultsWrapper")) {
				ResultFilterController.initialize(document.getElementById("customizeResultsWrapper"));
			}*/
		//ResultFilterController.initialize(document.getElementById("customizeResultsWrapper"));


		//PriceRangeController.setDefaultRange();
			if (PriceRangeController.setDefaultRange) {
				PriceRangeController.setDefaultRange();
			}
		//CategoryController.setDefaultRange();
			if (CategoryController.setDefaultRange) {
				CategoryController.setDefaultRange();
			}


		//LoaderController.initialize();
		//LoaderController.initalHide();

			HintsContoller.initialize();

			//DialogController.initialize();
			//SendShortListController.initialize();

			LightboxGenerator.initialize();
			LightboxController.initialize();
			//ThumbTwiddler.initialize();

			FormValidationController.initialize();
			//TruncateController.initialize();

			
			
			//var myLogReader = new YAHOO.widget.LogReader();
			
		}));

	//alert("initialize");
	});


/* no loader anymore.

	var loader = new YAHOO.util.YUILoader({

		require: ["logger", "lang", "get", "dom", "event", "element", "anim", "easing"/ *, "selector"* /, "button", "slider", "connection", "container", "calendar"],
	//base: "/aowlb/extensions/lib/yui/2.5.2/build",
		loadOptional: true/ *,

		skin: {
			defaultSkin: "tui-aowlb",
			base: "assets/skins/",
			path: "skin.css"	
		}* /,

		onSuccess: (function () {

			initialize();
		})
	});
	loader.insert();
*/

	initialize();

})();
