
      /**
 * project: messe frankfurt - web
 * type: javascript
 * @description: loader for component based javascript part 1
 * @author: Stefan Heimann, 03.02.2009
 * @copyright: Day Software 2008-2009. All rights reserved.
 */



/**
 * component: none
 * @description: create a namespace for the "Messe Frankfurt"
 */

Ext.namespace('mf');
/**
 * component: none
 * @description: generic array/object functions
 */

mf.array = {

	/**
	 * merge two associative objects to one and override keys in first object if necessary
	 * @param firstObject {Object} object which key/value pairs
	 * @param secondObject {Object} object which key/value pairs
	 * @return {Object} merged object
	 */
	mergeObjects: function(firstObject, secondObject){
		var mergedObject = new Object();
		for (var i in firstObject) {
			if (isNaN(i)) {
				mergedObject[i] = firstObject[i];
			}
		}
		for (var i in secondObject) {
			if (isNaN(i)) {
				mergedObject[i] = secondObject[i];
			}
		}
		return mergedObject;
	}
}

/**
 * component: none
 * @description: cookie handling
 */

mf.cookie = {
	
	/**
	 * create a cookie
	 * @param name {String} name of cookie
	 * @param value {Sring} value of cookie
	 * @param days {Int} days until the cookie expires
	 */
	createCookie: function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name + "=" + value + expires + "; path=/";
	},
	
	/**
	 * read a cookie
	 * @param name {String} name of cookie
	 */
	readCookie: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	
	/**
	 * delete a cookie
	 * @param name {String} name of cookie
	 */
	eraseCookie: function(name) {
		mf.cookie.createCookie(name,"",-1);
	}
};
/**
 * component: none
 * @description: generic function to determine if a component exists in the page and retrieves the component
 */
mf.components = {
	/**
	 * selects the component
	 * @param none
	 * @return Ext.CompositeElement || Ext.Element || null
	 */
	getComp: function(containerId, componentClass) {
		var component = null;
		var container = Ext.get(containerId);
		if (container) {
			if (componentClass) {
				if (container.select('.' + componentClass).elements.length > 0) {
					component = container.select('.' + componentClass);
				}
			} else {
				component = container;
			}
		}
		return component;
	}
};
/**
 * component: none
 * @description: adds container classes to restyle the shadow boxes
 */

// init component
Ext.onReady(function() {
	mf.shadow.init();
});

mf.shadow = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.shadow.rightComp = mf.components.getComp('mfContentRight')) {
			mf.shadow.rightShadow();
		}
	},
	
	/**
	 * 	reset css settings for the shadow in right column
	 *  @param: none
	 */
	rightShadow: function() {
		mf.shadow.rightComp.addClass('mfContentRightShadow');
	}
}

/**
 * component: none
 * @description: generic window functions
 */

Ext.onReady(function() {
	mf.window.init();
});

mf.window = {
	
	init: function() {
		this.checkAnchor();
		this.setScrollToListener();
	},
	
	/**
	 * gets a given parameter from the URL of the browser window
	 * @param parameterName {String} parameter to search for
	 * @return {String} extracted value for the URL parameter
	 */
	getParameterFromURL: function(parameterName) {
		var regex = new RegExp("[\\?&]" + parameterName + "=([^&#]*)");
		var results = regex.exec(window.location.href);
		
		if (results == null) {
			return "";
		} else {
			return results[1];
		}
	},
	
	/**
	 * check url for anchor hashes and jump to this anchor if found some
	 */
	checkAnchor: function() {
		mf.window.scrollTo(window.location.href.split('#')[1]);
	},
	
	/**
	 * set onclick listener for scrolling to anchor
	 */
	setScrollToListener: function() {
		//scann links for hashes
		Ext.get('mfContentMain').select('a').each(function(el) {
			var href = Ext.get(el).dom.href;
			if (href && href.indexOf('#') != -1) {
				el.on('click', function(e,t) {				
					mf.window.scrollTo(href.split('#')[1],t.href);
				},this,{stopEvent: true});
			}				
		});
	},
	
	/**
	 * scroll to 
	 */
	scrollTo: function(name,target) {
		if(!name || name == "") return;
				
		//offset fixed header
		var offset = (Ext.isIE) ? 65 : 70;
		var wrapper;
		if(wrapper = mf.components.getComp('mfWrapper')) {
			//offeset fixed banner advertising
			if(wrapper.hasClass('mfSuperbanner') || wrapper.hasClass('mfHockeystick')) {
				offset += 90;
			}
		}
		//get anchor target and scroll
		var anchor = Ext.get(Ext.query("*[name=" + name + "]")).first();
		if(anchor && anchor.hasClass('mfRTEAnchor')) {
			window.scrollTo(0,(anchor.getY() - offset));	
			if(Ext.isIE6) {
				Ext.get('mfContentWrapper').scroll('b',(anchor.getY() - offset));
			}
		} else {
			//no anchor on this page - follow href
			if(target) window.location.href = target;
		}
	}
}
/**
 * component:
 * 
 * @description: Emulate an mailto: link
 */
mf.mailAddress= {

    /**
     * Renders an ectypal 'mailto' link start tag that can't be scanned by mail
     * harvesters.
     * 
     * <b>Attention!</b>
     * This functionality usually should be automatically be done by 
     * MailAddressProtector.java.
     * The Java Script version is just for places that can't be reached from the
     * server engine, because the mail address is generated at client side using 
     * Java Script for instance.
     * 
     * This start tag has to be terminated by {@link #renderMailtoEnd()}!
     * 
     * @param mailAddress
     *            The email address to be called
     * @return String to be included into HTML code instead of
     *         <code>&lt;a href:"mailto:<i>mailaddress</i>"&gt;</code>
     * @see renderMailtoEnd()
     */
     renderMailtoStart: function (mailaddress) {
        // Split mail address in multiple parts to 
        // mailaddress = recipient1 + recipient2 + '@' + domain1 + domain2
        var topSplit = marker.contactData.email.split("@");
        var recipient = topSplit[0];
        var domain = topSplit[1];
        var split = recipient.length / 2;
        var recipient1 = recipient.substring(0, split);
        var recipient2 = recipient.substring(split);
        split = domain.length / 2;
        var domain1 = domain.substring(0, split);
        var domain2 = domain.substring(split);
        var methodCall = 'mf.mailAddress.openMailTool(\'' 
            + recipient1 + '\', \'' + recipient2 + '\', \'' + domain1 + '\', \'' + domain2 + '\')';

        return '<span onclick=\"' + methodCall + '\" class=\"mfMailaddress\">';
    },

    /**
     * Renders the termination of {@link #renderMailtoStart(String)}
     * 
     * <b>Attention!</b>
     * This functionality usually should be automatically be done by 
     * MailAddressProtector.java.
     * The Java Script version is just for places that can't be reached from the
     * server engine, because the mail address is generated at client side using 
     * Java Script for instance.
     *
     * @return String to be included into HTML code to terminate the
     *         {@link #renderMailtoStart(String)} tag.
     */
    renderMailtoEnd: function () {
        return '</span>';
    },

    /**
     * Open the mail tool. 
     * The email address is split into four parts: 
     * [firstAddress][secondAddress]@[firstDomain][secondDomain]
     * @param firstAddress 
     * @param secondAddress
     * @param firstDomain
     * @param secondDomain
     */
     openMailTool: function (firstAddress, secondAddress, firstDomain, secondDomain) {
        window.location.href="ma" + "il" + "to" + ":" 
        + firstAddress + secondAddress + "@" + firstDomain + secondDomain;
     }

};


/**
 * component: none
 * @description: banner functions
 */

Ext.onReady(function() {
	mf.banner.init();
});

mf.banner = {
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			advert: "Anzeige"
		}
	},

	init: function() {
		this.check();
		this.move();
		this.label();
		//this.shadow();
	},
	
	/**
	 * check for superbanner or hockeystick - B04 and B05
	 */
	check: function() {
		//superbanner
		if(mf.banner.comp =  mf.components.getComp('B10')) {
			if (mf.banner.comp.dom.children.length > 3) {
				mf.components.getComp('mfWrapper').addClass('mfSuperbanner');
			}
		} 
		//hockeystick
		if(mf.banner.comp =  mf.components.getComp('B08')) {
			if (mf.banner.comp.dom.children.length > 3) {
				mf.components.getComp('mfWrapper').addClass('mfHockeystick');
			}
		}
		//B04
		if(mf.banner.comp =  mf.components.getComp('B04')) {
			if (mf.banner.comp.dom.children.length > 2) {
				mf.banner.comp.up('.mfBannerWrapper',1).addClass('mfBannerShow');
			}
		}
		//B05
		if(mf.banner.comp =  mf.components.getComp('B05')) {
			if (mf.banner.comp.dom.children.length > 2) {
				mf.banner.comp.up('.mfBannerWrapper',1).addClass('mfBannerShow');
			}
		}
		
	},
	
	/**
	 * move banner B05 to second component
	 * attention: dont works in Prototype because there is no .mainParsys div
	 */
	move: function() {
		if (mf.banner.comp = mf.components.getComp('B05wrapper')) {
			if(mf.banner.parsys =  mf.components.getComp('mfContentMain','mfContentMainParsys .mainParsys')) {
				var comp = mf.banner.parsys.first().select('div');
				if(comp.first()) mf.banner.comp.insertAfter(comp.first());
			}
		}
	},
	
	/**
	 * wrap a shadow around banner in right and left parsys if advertising is available
	 */
	shadow: function() {
		if (mf.banner.comp = mf.components.getComp('mfContentRight', 'mfBanner')) {
			if(mf.banner.comp.first().dom.children.length > 2) {
				mf.banner.comp.boxWrap('mfBoxShadow');
			}
		}
		if (mf.banner.comp = mf.components.getComp('mfContentLeft', 'mfBanner')) {
			if(mf.banner.comp.first().dom.children.length > 2) {
				mf.banner.comp.boxWrap('mfBoxShadow');
			}
		}
	},
	
	/**
	 * set the advertising label to all banners
	 */
	label: function() {
		var label = mf.banner.lang.cat.advert;
		if(label == "") label = "Advertising";
		if(mf.banner.comp = mf.components.getComp('mfWrapper','mfBannerWrapper span.mfLabel')) {
			mf.banner.comp.each(function(el) {
				if(el.up('.mfBannerWrapper').down('.mfBanner').dom.children.length > 2) {
					el.insertHtml('afterBegin',label);
				}
			});
		}
	}
}



/**
 * component: shadowbox
 * @description: Shadowbox configuration (skin, language, options)
 */

// set page language and map it to shadowbox language abbreviation
mfConfig.pageLanguage = {
	lang: 'de',
	shadowboxLang: 'de'
};

switch(mfConfig.pageLanguage.lang) {
	case 'de':
		mfConfig.pageLanguage.shadowboxLang = 'de-DE';
		break;
	case 'pt':
		mfConfig.pageLanguage.shadowboxLang = 'pt-PT';
		break;
	case 'zh':
		mfConfig.pageLanguage.shadowboxLang = 'zh-CN';
		break;
	case 'hs':
		// temporary language switch
		mfConfig.pageLanguage.shadowboxLang = 'de-DE';
		break;
}

// load skin and language file
Shadowbox.loadSkin('skin', '/js/libs/Shadowbox_2.0/_mf');
Shadowbox.loadLanguage(mfConfig.pageLanguage.shadowboxLang, '/js/libs/Shadowbox_2.0/lang');


// init component
Ext.onReady(function() {
	mf.shadowbox.init();
});	


mf.shadowbox = {

	/**
	 * object to store localized strings
	 */
	lang: {
		redirect: {
			headline: "Bitte beachten",
			text: "Sie verlassen nun die aktuelle Messe Frankfurt Website und werden auf die Website im bisherigen Design weitergeleitet."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		Shadowbox.init({
			skipSetup: true 
		});

		if (mf.shadowbox.comp = mf.components.getComp('mfContentArea')) {
			// setup shadowbox for images
			mf.shadowbox.setupSelection('.mfShadowbox', null, {
				height: '',
				onFinish: mf.shadowbox.addCloseListener,
				onClose: mf.shadowbox.removeCloseListener,
				player: 'img',
				width: ''
			});

			// setup shadowbox for images (ToDo: Temporary code - to be removed!)
			mf.shadowbox.setupSelection('.mfShadowboxResize', null, {
				height: 150,
				width: 300
			});

			// setup shadowbox for coverflow
			mf.shadowbox.setupSelection('.mfCoverFlow', null, {
				height: 520,
				width: 950
			});

			//setup shadowbox for experience
			mf.shadowbox.setupSelection('.mfExperience', null, mf.shadowbox.specificOptions.mfExperience = {
				height: 575,
				width: 968,
				viewportPadding: 0
			});

			//setup shadowbox for exhibition ground
			mf.shadowbox.setupSelection('.mfExhibitionground', null, {
				height: 484,
				width: 968
			});
			
			//setup shadowbox for fairground
			mf.shadowbox.setupSelection('.mfFairground', null, {
				height: 484,
				width: 968
			});

			//setup shadowbox for worldmap
			mf.shadowbox.setupSelection('.mfWorldMap', null, {
				height: 535,
				width: 948
			});

			//setup shadowbox for citymap
			mf.shadowbox.setupSelection('.mfCityMap');

			//setup shadowbox for routemap
			mf.shadowbox.setupSelection('.mfRouteMap');

			//setup shadowbox for webcam
			mf.shadowbox.setupSelection('.mfWebcamLink', null, {
				height: 576,
				width: 704
			});
			
			//setup shadowbox for downloads
			mf.shadowbox.setupSelection('.mfDownloadsLink', null, {
				width: 440
			});

			//setup shadowbox for send to a friend
			mf.shadowbox.setupSelection('.mfPageFunctionRecommend', 'mfPageFunctions', {
				width: 445
			});
			
			//setup shadowbox for send to a friend in share bar
			mf.shadowbox.setupSelection('.mfSendAFriend', null, {
				width: 445
			});

			//setup shadowbox for SPICE redirects
			mf.shadowbox.setRedirectMessage();
		}

		// check autoload cookie
		mf.shadowbox.autoStart();
	},

	/**
	 * shadowbox config
	 * Inner height by 1024x768px resolution
	 * - FF3: 627px (without tabs) => 565px (max. posssible for iframe)
	 *        598px (with tabs) => 536px
	 * - IE6: 624px => 562px
	 * - IE7: 616px => 554px
	 */
	options: {
		continuous: true,
		displayNav: false,
		fadeDuration: 0.2,
		handleOversize: 'resize',
		height: 500,
		initialHeight: 150,
		initialWidth: 200,
		overlayColor: '#fff',
		overlayOpacity: 0.7,
		player: 'iframe',
		resizeDuration: 0.35,
		width: 848
	},

	/**
	 * shadowbox config for specific links
	 */
	specificOptions: {},

	/**
	 * return the options for a specific object
	 * @param obj {String} obj to search for
	 * @return {Object} options for specific css class
	 */
	getSpecificOptions: function(obj) {
		return eval('mf.shadowbox.specificOptions.' + obj);
	},

	/**
	 * calls the setup function for the shadowbox for a given selection of links
	 * @param cssClass {String} css class of links to search for
	 * @param searchAreaId {String} ID of DOM Element to start the search
	 * @param setupOptions {Object} settings for the shadowbox for this selection
	 */
	setupSelection: function(cssClass, searchAreaId, setupOptions) {
		var selection = (searchAreaId && Ext.get(searchAreaId)) ? Ext.get(searchAreaId).query(cssClass) : mf.shadowbox.comp.query(cssClass);
		var options = setupOptions ? mf.array.mergeObjects(mf.shadowbox.options, setupOptions) : mf.shadowbox.options;

		if (selection.length > 0) {
			Shadowbox.setup(selection, options);
		}
	},

	/**
	 * adds an additional close listener to the shadowbox
	 * @param none
	 */
	addCloseListener: function() {
		var elem = Ext.get('shadowbox_body_inner');
		elem.insertHtml('afterBegin','<span id="shadowbox_img_layer_close"></span>')
		elem.on('click', function() {
			window.parent.Shadowbox.close();
		});
	},
	
	/**
	 * removes an additional close listener from the shadowbox
	 * @param none
	 */
	removeCloseListener: function() {
		Ext.get('shadowbox_body_inner').un('click', function() {
			window.parent.Shadowbox.close();
		});
	},

	/**
	 * resizes the shadowbox after loading an iframe
	 * @param width {Int} new width of iframe
	 * @param height {Int} new height of iframe
	 */
	resize: function(width, height) {
		var sbox = Ext.get('shadowbox');
		var sboxInnerOffset = sbox.getBorderWidth('lr') + sbox.getPadding('lr');
		var sboxOuterPadding = Shadowbox.getOptions().viewportPadding * 2;

		var bodySize = Ext.getBody().getSize();

		if (width) {
			var maxWidth = bodySize.width - sboxOuterPadding - sboxInnerOffset;
			width = width > maxWidth ? maxWidth : width;
			sbox.setWidth(width, true);
		}

		if (height) {
			var maxHeight = bodySize.height - sboxOuterPadding - sboxInnerOffset;
			height = height > maxHeight ? maxHeight : height;
			Ext.get('shadowbox_body').setHeight(height, true);
		} else {
			height = 0;
		}

		var top = (bodySize.height - height - sboxInnerOffset) / 2;
		sbox.setTop(top, true);
	},

	/**
	 * settings for the redirect message layer for SPICE links and the shadowbox autoload cookie
	 * @param none
	 */
	settings: {
		redirectMessage: {
			cookie: 'mf-spice-redirect',
			timeout: 5000
		},
		autoStart: {
			cookie: 'mf-layer-autostart',
			separator: '|',
			timeout: 1000
		}
	},

	/**
	 * setup a redirect message layer for SPICE links
	 * @param none
	 */
	setRedirectMessage: function() {
		Ext.get('mfWrapper').select('.mfRedirect').on('click', function(e, t) {
			var cookie = mf.cookie.readCookie(mf.shadowbox.settings.redirectMessage.cookie);
			var url = Ext.get(t);
			if (url.dom.tagName != 'A') {
				url = url.up('a');
			}
			url = url.dom.href;

			if (!cookie || cookie == 'undefined') {
				mf.cookie.createCookie(mf.shadowbox.settings.redirectMessage.cookie, true);
	
				window.setTimeout(function() {
					window.location.href = url;
				}, mf.shadowbox.settings.redirectMessage.timeout);
	
				Shadowbox.open({
					content: mf.shadowbox.getMessage(url),
					height: '150',
					player: 'html',
					width: '400'
				}, mf.shadowbox.options);
			} else {
				window.setTimeout(function() {
					window.location.href = url;
				}, 200);
			}
		},this,{stopEvent: true});
	},

	/**
	 * create a redirect message for SPICE links
	 * @param url {String} url of redirect target
	 */
	getMessage: function(url) {
		return Ext.DomHelper.markup({
			tag: 'div', cls: 'mfSpiceRedirect', children: [
				{tag: 'h1', html: mf.shadowbox.lang.redirect.headline},
				{tag: 'p', cls: 'mfMessage', html: mf.shadowbox.lang.redirect.text},
				{tag: 'p', children: [
					{tag: 'strong', html: url}
				]}
			]
		});
	},

	/**
	 * autoStart a layer component
	 * @param layerComp {String} class of layer component
	 * @param layerUrl {String} url for the iframe in the shadowbox
	 */
	autoStart: function(layerComp, layerUrl) {
		var settings = mf.shadowbox.settings.autoStart;
		var options;

		// get cookie if it is there and get its values
		var autoStartCookie = mf.cookie.readCookie(settings.cookie);

		// get options
		if (autoStartCookie && autoStartCookie != '') {
			var parts = autoStartCookie.split(settings.separator);
			options = mf.shadowbox.getSpecificOptions(parts[1]);
			options.content = parts[0];

			// clear cookie
			if (autoStartCookie) {
				mf.cookie.eraseCookie(settings.cookie);
			}
		} else if (layerComp) {
			options = mf.shadowbox.getSpecificOptions(layerComp);
			if (layerUrl && layerUrl != '') {
				options.content = layerUrl;
			}
		}

		if (!mf.shadowbox.autoStartTimer && options && options.content) {
			var mfMergedOptions = mf.array.mergeObjects(mf.shadowbox.options, options);
	
			mf.shadowbox.autoStartTimer = window.setInterval(function() {
				if (typeof(Shadowbox) != 'undefined') {
					window.clearInterval(mf.shadowbox.autoStartTimer);
	
					// open shadowbox
					Shadowbox.open(mfMergedOptions, mfMergedOptions);
				}
			}, settings.timeout);
		}
	}
};



/**
 * component: page functions
 * @description: create the pagefunctions for users, which have js enabled
 */

// init component
Ext.onReady(function() {
	mf.pageFunctions.init();
});


mf.pageFunctions = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pageFunctions.comp = mf.components.getComp('mfPageFunctions')) {
			mf.pageFunctions.display();
			mf.pageFunctions.setPrintListener();
			mf.pageFunctions.setRecommendListener();
			// FontsizeSwitcher + cookie checker
			mf.fontSize.init();
		}
	},

	/**
	 * displays font-size-switcher, print and recommendation link
	 * @param none
	 */
	display: function() {
		mf.pageFunctions.comp.addClass('mfPageFunctionsComplete');
		mf.pageFunctions.comp.select('#mfFontsizeSwitcher').removeClass('mfHd');
		mf.pageFunctions.comp.select('.mfPageFunctionPrint').removeClass('mfHd');
		mf.pageFunctions.comp.select('.mfPageFunctionSocialRecommend').removeClass('mfHd');
	},
	
	/**
	 * set listener on link and print the window content
	 * @param none
	 */
	setPrintListener: function() {
		mf.pageFunctions.comp.select('.mfPageFunctionPrint').on('click', function() {
			window.print();
		}, this, {stopEvent: true}); 
	},
	
	/**
	 * set listener on recommend link for social networks
	 */
	 setRecommendListener: function() {
	 	
	 	var el = mf.pageFunctions.comp.select('.mfPageFunctionSocialRecommend');//the trigger link
	 	var sl = mf.pageFunctions.comp.select('.mfRecommend');//the social link layer
	 	
		//show
	 	el.on('mouseover', function() {
	 		sl.removeClass('mfHd');
	 		el.addClass('over');
	 		//hide after 1 sec
	 		mf.pageFunctions.setTimeoutHide(el,sl);
		}, this, {stopEvent: true}); 
		
		//toggles
		el.on('mouseout', function() {
	 		el.removeClass('over');
		}, this, {stopEvent: true}); 

		sl.on('mouseover', function() {
	 		sl.addClass('over');
		}, this, {stopEvent: true}); 

		sl.on('mouseout', function() {
	 		sl.removeClass('over');
		}, this, {stopEvent: true}); 

	},
	
	/**
	 * hides social layer after 1 sec if mouse not over
	 */
	setTimeoutHide: function(el,sl) {
		window.setTimeout(function() {
			var over = el.first().dom.className + sl.first().dom.className;
			if(over.indexOf("over") > 0) {
				mf.pageFunctions.setTimeoutHide(el,sl);
			} 
			else {
				sl.addClass('mfHd');
			}
		}, 1000);
	}
};


mf.fontSize = {

	/**
	 * set listener / read cookie / set old font-size
	 * @param e {Object} event
	 */
	init: function(e) {
		// listener at links
		Ext.get('mfFontsizeSwitcher').select('a').on('click', function(e, t) { 
			mf.fontSize.set(t);	
		},this,{stopEvent: true});
		// read cookie
		mf.fontSize.cookieValue = mf.fontSize.getCookieValue();
		// set font-size
		if (mf.fontSize.cookieValue && mf.fontSize.cookieValue != mf.fontSize.settings.defaultValue) {
			mf.fontSize.setBodyFontSize(mf.fontSize.cookieValue);
		}
	},

	/**
	 * set the font-size of the body element
	 * @param cookieValue {Int} current value of body font-size in px
	 */
	setBodyFontSize: function(cookieValue) {
		var bodyFontSize = cookieValue;
		if(Ext.isIE6){
			bodyFontSize = bodyFontSize / 16 * 100;
		}
		Ext.getBody().setStyle(mf.fontSize.settings.key, bodyFontSize + mf.fontSize.settings.unit);

		// explicitly set font-size on some components for better scaling results
		if (Ext.isGecko) {
			 // header topnavigation
			if (Ext.get('mfTopNavigation')) {
				Ext.get('mfTopNavigation').setStyle(mf.fontSize.settings.key, cookieValue + mf.fontSize.settings.unit);
			}
			// footer
			if (Ext.get('mfFooter')) {
				Ext.get('mfFooter').setStyle(mf.fontSize.settings.key, cookieValue + mf.fontSize.settings.unit);
			}
		}
		 // footer language switcher
		if (Ext.get('mfLanguageSwitcher')) {
			Ext.get('mfLanguageSwitcher').select('ul').setWidth(parseInt(59 * cookieValue / mf.fontSize.settings.defaultValue), {
				animate: true
			});
		}
	},

	/**
	 * default settings for cookie and font-size
	 */
	settings: {
		cookie: 'mf-font-size',
		key: 'font-size',
		defaultValue: 10,
		exp: 7,
		unit: Ext.isIE6 ? '%' : 'px',
		maxValue: 13,
		minValue: 9
	},

	/**
	 * get the current fontsize set in the cookie
	 * @param none
	 * @return {Int} font-size value in cookie
	 */
	getCookieValue: function() {
		return parseInt(mf.cookie.readCookie(mf.fontSize.settings.cookie));
	},

	/**
	 * set the new fontsize and save in cookie
	 * @param t {Object} event target
	 */
	set: function(t) {
		// read cookie
		mf.fontSize.cookieValue = mf.fontSize.getCookieValue() || mf.fontSize.settings.defaultValue;
		// zoom
		Ext.get(t).dom.className == 'mfFontsizeMinus' ? mf.fontSize.cookieValue-- : mf.fontSize.cookieValue++;
		// max
		if (mf.fontSize.cookieValue > mf.fontSize.settings.maxValue) {
			mf.fontSize.cookieValue = mf.fontSize.settings.maxValue;
		}
		// min
		if (mf.fontSize.cookieValue < mf.fontSize.settings.minValue) {
			mf.fontSize.cookieValue = mf.fontSize.settings.minValue;
		}
		// cookie save
		mf.cookie.createCookie(mf.fontSize.settings.cookie, mf.fontSize.cookieValue, mf.fontSize.settings.exp);
		// set font-size
		mf.fontSize.setBodyFontSize(mf.fontSize.cookieValue);
	}
};
/**
 * component: top teaser tracking
 * @description: track the clicks
 */

// init component
Ext.onReady(function() {
	mf.topTeaserTracker.init();
});


mf.topTeaserTracker = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.topTeaserTracker.comp = mf.components.getComp('mfTopTeaser')) {
			var teaserLink = mf.topTeaserTracker.comp.down('a');
			if (teaserLink!=null){			
				teaserLink.on('click',function(){
				if(this.dom.rel != "") {
					var params = this.dom.rel.split('#');
					mf.topTeaserTracker.trackIt(params[0],params[1]);
				}
			});
			}
		}
	},
	/**
	 * starts the tracker
	 * @param string number of the action
	 */
	trackIt: function(actionnumber,documentgroup) {
		var tracking_object = createITT(); 
		tracking_object.ACTION = actionnumber; 
		tracking_object.DOCUMENTGROUP = documentgroup;
		tracking_object.submit_action(); 
	}
};
/**
 * component: left navigation
 * @description: adds a shadow to all the links on the first level of the navigation
 */

// init component
Ext.onReady(function() {
	mf.leftNavigation.init();
});


mf.leftNavigation = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.leftNavigation.comp = mf.components.getComp('mfLeftNavigation')) {
			mf.leftNavigation.comp.select('a:has(span)').each(function(el) {
				el.boxWrap('mfBoxShadow');
				el.on({
					'mouseover': function(e, t) {
						var li = Ext.get(t).up('li');
						if (li && !li.hasClass('mfCurrent')) {
							li.setWidth('100%');
							var span = li.select('a span');
							if (li.hasClass('mfLast')) {
								span.setStyle('padding-right', Ext.isIE6 ? '7.8182em' : '7.7273em'); 
							} else if(li.hasClass('mfPenultimate')) {
								span.setStyle('padding-right', '5.4545em'); 
							} else {
								span.setStyle('padding-right', '3.1818em'); 
							}
						}
					},
					'mouseout': function(e, t) {
						var li = Ext.get(t).up('li');
						if (li && !li.hasClass('mfCurrent')) {
							li.setWidth('');
							li.select('a span').setStyle('padding-right', ''); 
						}
					}
				});
				mf.leftNavigation.setCss();
			});
		}
	},
	
	/**
	 * reset needed css for non js user
	 * @param: none
	 */
	setCss: function() {
		mf.leftNavigation.comp.select('a:has(span)').setStyle('border','none');
	}
};

/**
 * component: fast access
 * @description: registers listener and adds toggle functionality
 */

// init component
Ext.onReady(function() {
	mf.fastAccess.init();
});

mf.fastAccess = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.fastAccess.comp = mf.components.getComp('mfFastAccesses')) {
			// workaround to avoid duplicate content - google
			if (mf.fastAccess.JSDomSearch = mf.components.getComp('mfFastAccessSearch').select('.mfFastAccessBody').first()) {
				mf.fastAccess.JSDomSearch.insertHtml('beforeEnd',mfConfig.fastAccess.fastAccessSearch);	
			}
			if(mf.components.getComp('mfFastAccessFairs')){
				if (mf.fastAccess.JSDomFairs = mf.components.getComp('mfFastAccessFairs').select('.mfFastAccessBody').first()) {
					mf.fastAccess.JSDomFairs.insertHtml('beforeEnd',mfConfig.fastAccess.fastAccessFairs);
				}
			}
			if(mf.components.getComp('mfFastAccessEvents')){
				if (mf.fastAccess.JSDomEvents = mf.components.getComp('mfFastAccessEvents').select('.mfFastAccessBody').first()) {
					mf.fastAccess.JSDomEvents.insertHtml('beforeEnd',mfConfig.fastAccess.fastAccessEvents);
				}
			}
			mf.fastAccess.setListener();
		}
	},

	/**
	 * selects the Ext Element with an id starting with "mfFastAccess"
	 * and the Ext Element with the class "mfFastAccessBody" underneath
	 * @param el {Ext.Element} Element to get parent and body for
	 * @return {Object} object which contains two Ext.Elements for parent and body of el  ||  null
	 */
	getFastAccessParts: function(el) {
		var parts = {
			parent: el.up('div[id^=mfFastAccess]')
		}

		if (parts.parent && (parts.parent.id != 'mfFastAccesses')) {
			parts.body = parts.parent.child('.mfFastAccessBody');
		} else {
			parts = null;
		}
		
		return parts;
	},

	/**
	 * activate all listener
	 * @param none
	 */
	setListener: function() {
		// link in headline
		mf.fastAccess.comp.select('h3 a').on('click', function(e, t) {
			var parts = mf.fastAccess.getFastAccessParts(Ext.get(t));
			if (parts && !parts.parent.hasClass('mfSliding')) {
				parts.body.hasClass('mfHd') ? mf.fastAccess.openComp(parts) : mf.fastAccess.closeComp(parts);
				if (parts.parent.id == 'mfFastAccessFairs' && typeof mf.fastAccess.keyMap == "undefined") {
					mf.fastAccess.addKeyMap(); // create keymapper
				}
			}
		}, this,{stopEvent: true});


		// fast access body
		mf.fastAccess.comp.on('mouseout', function(e, t) {
			var parts = mf.fastAccess.getFastAccessParts(Ext.get(t));

			if (parts && !parts.parent.getRegion().contains(e.getPoint()) && !parts.parent.hasClass('mfSliding') && !parts.body.hasClass('mfHd')) {
				mf.fastAccess.closeComp(parts);
			}
		}, this,{stopEvent: true});


		// search input field
		mf.fastAccess.comp.select('#mfFastAccessSearchInput').first().on({
			'click': function(e, t) {
				var parts = mf.fastAccess.getFastAccessParts(Ext.get(t));
				if (parts && parts.body.hasClass('mfHd')) {
					mf.fastAccess.openComp(parts);
				}
			},
			'focus': function(e, t) {
				mf.fastAccess.searchFieldFocus(e, t);
				
				var parts = mf.fastAccess.getFastAccessParts(Ext.get(t));
				if (parts && parts.body.hasClass('mfHd')) {
					mf.fastAccess.openComp(parts);
				}
			},
			'blur': function(e, t) {
				//mf.fastAccess.searchFieldBlur(e, t);
			}
		});


		// search submit button
		/*
		mf.fastAccess.comp.select('#mfFastAccessSearchSubmit').first().on({
			'mouseover': function(e, t) {
				Ext.get(t).setStyle('background-position', '-1px -500px');
			},
			'mouseout': function(e, t) {
				var input = Ext.get(t);
			
				var parts = mf.fastAccess.getFastAccessParts(Ext.get(t));
				if (parts && parts.body.hasClass('mfHd')) {
					input.setStyle('background-position', '-1px -300px');
				} else {
					input.setStyle('background-position', '-1px -100px');
				}
			}
		});
		*/
				
		// fair list toggle
		mf.fastAccess.comp.select('#mfFastAccessFairs .mfFastAccessBodyTop a.mfSort').on('click', function(e, t) {
			Ext.get(t).up('.mfFastAccessBodyTop').select('a.mfSort').toggleClass('mfHd');
			Ext.get(t).up('.mfFastAccessBody').select('div').toggleClass('mfHd');
			// re-init keymap
			mf.fastAccess.keyMap.disable();
			mf.fastAccess.keyMap = false;
			mf.fastAccess.addKeyMap(); 
		});
		
		// delete cookie on click @ link to fair to prevent backlinks in results fair page
		/*
		mf.fastAccess.comp.select('#mfFastAccessFairs .mfFastAccessBody div[class!=mfHd] a').on('click', function(){
			var cookieValue = mf.cookie.readCookie(mf.searchResultsFairs.settings.key);
			mf.cookie.createCookie(mf.searchResultsFairs.settings.key, ' ', 0);	
		});
		*/
	},
	
	/**
	 * adds a key listener to fairs list
	 * @param none
	 */
	addKeyMap: function(){
		
		var countpress = 0; // count the keys
		var lastkey; //saves the last key
		var scrolldiv = Ext.get('mfFastAccessFairs').select('.mfFastAccessBody div[class!=mfHd]'); // the div to scroll
		var letters = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
		var lettercodes = new Array();
			lettercodes[48]='0';lettercodes[49]='1';lettercodes[50]='2';lettercodes[51]='3';lettercodes[52]='4';
			lettercodes[53]='5';lettercodes[54]='6';lettercodes[55]='7';lettercodes[56]='8';lettercodes[57]='9';
			lettercodes[65]='a';lettercodes[66]='b';lettercodes[67]='c';lettercodes[68]='d';lettercodes[69]='e';
			lettercodes[70]='f';lettercodes[71]='g';lettercodes[72]='h';lettercodes[73]='i';lettercodes[74]='j';
			lettercodes[75]='k';lettercodes[76]='l';lettercodes[77]='m';lettercodes[78]='n';lettercodes[79]='o';
			lettercodes[80]='p';lettercodes[81]='q';lettercodes[82]='r';lettercodes[83]='s';lettercodes[84]='t';
			lettercodes[85]='u';lettercodes[86]='v';lettercodes[87]='w';lettercodes[88]='x';lettercodes[89]='y';
			lettercodes[90]='z';
		
		// change the first letter to uppercase
		Ext.get('mfFastAccessFairs').select('.mfFastAccessBody div[class!=mfHd] a').each(function(e){
			var text = e.dom.innerHTML;
			var firstletter = text.slice(0,1).toUpperCase();
			var lastletters = text.substr(1,text.length-1);
			e.dom.innerHTML = firstletter + lastletters;
		});
		
		// create keyconfig object
		var letter = new Array();
		for(var i = 0; i < letters.length; i++){
			
			letter[i] = new Object();
			letter[i]['key'] = letters[i];
			letter[i]['fn'] = function(e,o) {
				
				var offset = new Array();
				var element = new Array();
				var current = lettercodes[e];
				
				Ext.get('mfFastAccessFairs').select('.mfFastAccessBody div[class!=mfHd] a:contains('+current.toUpperCase()+')').each(function(e){
					if (e.dom.innerHTML.slice(0, 1) == current.toUpperCase()) {
						offset.push(e.dom.offsetTop);
						element.push(e.dom);
						if(lastkey != current) {
							lastkey = current;
							countpress = 0;
						} 
					}
				});
				
				if (countpress < offset.length) {
					var scrolloffset = (Ext.isIE) ? 100 : 200;
					scrolldiv.scrollTo('top', 0); //reset
					scrolldiv.scroll('b', offset[countpress] - scrolloffset); //scroll
					
					Ext.get('mfFastAccessFairs').select('.mfFastAccessBody div[class!=mfHd] a').removeClass('mfActive'); //reset
					var el = Ext.get(element[countpress])
						el.focus();
						el.addClass('mfActive');
					countpress += 1; //count
				}
			}
		}
		
		// create keymapper
		mf.fastAccess.keyMap = new Ext.KeyMap("mfFastAccessFairs",letter);
	},
	
	/**
	 * slides the box out
	 * @param parts {Object} object which contains the two current Ext.Elements for parent and body
	 */
	openComp: function(parts) {
		parts.parent.addClass('mfSliding');
		parts.body.removeClass('mfHd');

		parts.body.slideIn('t',{
			easing: 'easeOut',
			duration: .5,
			callback: function(){
				parts.parent.removeClass('mfSliding');
				if (parts.parent.id == 'mfFastAccessSearch') {
					//parts.parent.child('form h3 input').setStyle('background-position', '-1px -100px');
				} else {
					parts.parent.select('h3 a').addClass('mfFastAccessesUp');
				}
			}
		});
	},

	/**
	 * slides the box in
	 * @param parts {Object} object which contains the two current Ext.Elements for parent and body
	 */
	closeComp: function(parts) {
		parts.parent.addClass('mfSliding');

		parts.body.slideOut('t',{
			easing: 'easeOut',
			duration: .5,
			callback: function(){
				parts.body.addClass('mfHd');
				parts.parent.removeClass('mfSliding');
				if (parts.parent.id == 'mfFastAccessSearch') {
					//parts.parent.child('form h3 input').setStyle('background-position', '-1px -300px');
				} else {
					parts.parent.select('h3 a').removeClass('mfFastAccessesUp');
				}
			}
		});
	},

	/**
	 * checks if the default text is displayed in the search field and removes it
	 * @param e {event} event
	 * @param t {Object} target
	 */
	searchFieldFocus: function(e, t) {
		var field = Ext.get(t);
		if (field.dom.value == mfConfig.fastAccess.searchDefault) {
			field.dom.value = '';
		}
	},

	/**
	 * checks if no text is displayed in the search field and adds the default text
	 * @param e {event} event
	 * @param t {Object} target
	 */
	searchFieldBlur: function(e, t) {
		var field = Ext.get(t);
		if (field.dom.value == '') {
			field.dom.value = mfConfig.fastAccess.searchDefault;
		}
	}
};


/**
 * component: page title for search results
 * @description: displays a link to the search results in the page title
 */
// init component
Ext.onReady(function() {
	mf.pageTitleExhibitor.init();
});

mf.pageTitleExhibitor = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pageTitleExhibitor.comp = mf.components.getComp('mfPageTitleExhibitor')) {
			mf.pageTitleExhibitor.setListener();
		}		
	},

	/**
	 * Selects the component
	 * @param none
	 * @return Ext.CompositeElement
	 */
	setListener: function() {
		var cookieValue = mf.cookie.readCookie(mf.searchResultsExhibitor.settings.key);

		if (cookieValue && cookieValue != "") {
			mf.pageTitleExhibitor.comp.select('p').first().removeClass('mfHd');

			mf.pageTitleExhibitor.comp.select('p a').on('click', function(e, t) {
				window.location.href = cookieValue;
			},this,{stopEvent: true});
		}
	}
}
/**
 * component: page title for search results
 * @description: displays a link to the search results in the page title
 */
// init component
Ext.onReady(function() {
	mf.pageTitleFairs.init();
});

mf.pageTitleFairs = {
	
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			backlink: "zurück zu den Suchergebnissen"
		}
	},
	
	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pageTitleFairs.comp = mf.components.getComp('mfContentMain','mfContentTeaserEventDetails')) {
			mf.pageTitleFairs.setListener();
		}		
	},

	/**
	 * Selects the component
	 * @param none
	 * @return Ext.CompositeElement
	 */
	setListener: function() {
		var cookieValue = mf.cookie.readCookie(mf.searchResultsFairs.settings.key);
		
		if (cookieValue && cookieValue != "") {
			
			if(mf.pageTitleFairs.articleFunctions = mf.components.getComp('mfContentMain','mfArticleFunctions p a.mfBack')) {
				var link = mf.pageTitleFairs.articleFunctions.first()
				link.dom.innerHTML = mf.pageTitleFairs.lang.cat.backlink; // change txt
				//set url
				link.on('click', function(e, t) {
					window.location.href = cookieValue;
				},this,{stopEvent: true});
			}
			else {
				if (mf.pageTitleFairs.articleFunctions = mf.components.getComp('mfContentMain')) {
				
					Ext.DomHelper.insertFirst(mf.pageTitleFairs.articleFunctions, {
						tag: 'div',
						cls: 'mfArticleFunctions mfCl',
						html: '<p><a class="mfBack" href="'+ cookieValue +'">' + mf.pageTitleFairs.lang.cat.backlink + '</a></p>'
					});
				}
			}
			mf.cookie.createCookie(mf.searchResultsFairs.settings.key, ' ', 0);	
		}
	}
}
/**
 * component: page title for search events
 * @description: displays a link to the search results in the page title
 */
// init component
Ext.onReady(function() {
	mf.pageTitleEvents.init();
});

mf.pageTitleEvents = {
	
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			backlink: "zurück zu den Suchergebnissen"
		}
	},
	
	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pageTitleEvents.comp = mf.components.getComp('mfContentMain','mfContentTeaserEventDetails')) {
			mf.pageTitleEvents.setListener();
		}		
	},

	/**
	 * Selects the component
	 * @param none
	 * @return Ext.CompositeElement
	 */
	setListener: function() {
		var cookieValue = mf.cookie.readCookie(mf.searchResultsEvents.settings.key);
		
		if (cookieValue && cookieValue != "") {
			
			if(mf.pageTitleEvents.articleFunctions = mf.components.getComp('mfContentMain','mfArticleFunctions p a.mfBack')) {
				var link = mf.pageTitleEvents.articleFunctions.first()
				link.dom.innerHTML = mf.pageTitleEvents.lang.cat.backlink; // change txt
				//set url
				link.on('click', function(e, t) {
					window.location.href = cookieValue;
				},this,{stopEvent: true});
			}
			else {
				if (mf.pageTitleEvents.articleFunctions = mf.components.getComp('mfContentMain')) {
				
					Ext.DomHelper.insertFirst(mf.pageTitleEvents.articleFunctions, {
						tag: 'div',
						cls: 'mfArticleFunctions mfCl',
						html: '<p><a class="mfBack" href="'+ cookieValue +'">' + mf.pageTitleEvents.lang.cat.backlink + '</a></p>'
					});
				}
			}
			mf.cookie.createCookie(mf.searchResultsEvents.settings.key, ' ', 0);	
		}
	}
}
/**
 * component: page title for search exhibitor news
 * @description: displays a link back to the search results in the page title
 */
// init component
Ext.onReady(function() {
	mf.pageTitleExhibitorNews.init();
});

mf.pageTitleExhibitorNews = {
	
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			backlink: "zurück zu den Suchergebnissen"
		}
	},
	
	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pageTitleExhibitorNews.comp = mf.components.getComp('mfContentMain','mfExhibitorNews')) {
			mf.pageTitleExhibitorNews.setListener();
		}		
	},

	/**
	 * Selects the component
	 * @param none
	 * @return Ext.CompositeElement
	 */
	setListener: function() {
		var cookieValue = mf.cookie.readCookie(mf.searchResultsExhibitornews.settings.key);
		
		if (cookieValue && cookieValue != "") {
			
			if(mf.pageTitleExhibitorNews.articleFunctions = mf.components.getComp('mfContentMain','mfArticleFunctions p a.mfBack')) {
				var link = mf.pageTitleExhibitorNews.articleFunctions.first()
				link.dom.innerHTML = mf.pageTitleExhibitorNews.lang.cat.backlink; // change txt
				//set url
				link.on('click', function(e, t) {
					window.location.href = cookieValue;
				},this,{stopEvent: true});
			}
			else {
				if (mf.pageTitleExhibitorNews.articleFunctions = mf.components.getComp('mfContentMain', 'articleFunctions')) {
				
					Ext.DomHelper.insertFirst(mf.pageTitleExhibitorNews.articleFunctions.first(), {
						tag: 'div',
						cls: 'mfArticleFunctions mfCl',
						html: '<p><a class="mfBack" href="'+ cookieValue +'">' + mf.pageTitleExhibitorNews.lang.cat.backlink + '</a></p>'
					});
				}
			}
			mf.cookie.createCookie(mf.searchResultsExhibitornews.settings.key, ' ', 0);	
		}
	}
}
/**
 * component: content tab (navigation + block)
 * @description: creates tab style navigation for content parts
 */

// init component
Ext.onReady(function(){
	mf.contentTab.init();
});


mf.contentTab = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		// create tab navigation
		if (mf.contentTab.navigation = mf.components.getComp('mfContentTabNavigation')) {
			mf.contentTab.createNavigation();
		}

		// create tab block
		if (mf.contentTab.block = mf.components.getComp('mfContentMain', 'mfContentTabBlock')) {
			mf.contentTab.createBlock();
		}
	},

	/**
	 * default settings for tabs
	 */
	settings: {
		autoHeight: true,
		autoWidth: true,
		border: false,
		deferredRender: false,
		enableTabScroll: true,
		scrollDuration: .25,
		scrollIncrement: 150,
		scrollRepeatInterval: 50,
		tabMargin: 8
	},

	/**
	 * remove fallback list of links
	 * @param parent {Ext.Element} element to start selection
	 */
	removeFallback: function(parent){
		parent.select('ul.mfContentTabFallback').remove();
	},

	/**
	 * get index of active tab
	 * @param els {Ext.CompositeElement} elements to check css class
	 * @return {Int} active tab index or null as default
	 */
	getActiveTab: function(els){
		// default active tab index
		var activeTabIndex = null;
		els.each(function(el, ths, index) {
			if (el.hasClass('mfContentTabActive')) {
				activeTabIndex = index;
			};
		});
		return activeTabIndex;
	},

	/**
	 * create navigation tabs
	 * @param none
	 */
	createNavigation: function(){
		// hide fallback "tab" list"
		mf.contentTab.navigation.select('ul').first().setStyle('display', 'none');
		// get all the fallback "tab" links
		var tabLinks = mf.contentTab.navigation.select('li a');
		// insert a div element with class "x-tab", set title to link text and fill rel attribute with URL
		tabLinks.each(function(el, ths, index) {
			el.insertSibling({
					tag: 'div', cls: 'x-tab', title: el.dom.firstChild.nodeValue, rel: el.dom.getAttribute('href')
				}, 'after'
			);
		});

		// local settings for tab generation
		var settings = {
			activeTab: mf.contentTab.getActiveTab(tabLinks),
			applyTo: 'mfContentTabNavigation',
			autoTabs: true,
			autoTabSelector: 'div.x-tab'
		};

		// create tab panel
		mf.contentTab.tabPanel = new Ext.TabPanel(
			mf.array.mergeObjects(mf.contentTab.settings, settings)
		);

		// remove fallback version from DOM
		mf.contentTab.removeFallback(mf.contentTab.navigation);
		
		// cancel tab change action and reload page with given URL
		mf.contentTab.tabPanel.on('beforetabchange', function(tabPanel, newTab) {
			window.setTimeout(function(){
				window.location.href = newTab.initialConfig.el.getAttribute('rel');
			}, 200);
			return false;
		});

		// add click functionality to active tab
		var activeTab = mf.contentTab.tabPanel.getActiveTab();
		if (activeTab) {
			Ext.get(mf.contentTab.tabPanel.getTabEl(activeTab)).on('click', function() {
				mf.contentTab.tabPanel.activate(activeTab);
			});
		}
	},

	/**
	 * create tab block with serverside generated id
	 * @param none
	 */
	createBlock: function(){
		mf.contentTab.block.each(function(el){
			if (el.select('ul.mfContentTabFallback').first()) {
				// create tab block based on Ajax calls
				mf.contentTab.blockAjax(el.dom.id);
			} else {
				// create tab block based on DOM
				mf.contentTab.blockDOM(el.dom.id);
			}
		});
	},

	/**
	 * create tab block: tab panels filled by ajax calls
	 * @param tabBlockId {String} id of tab container
	 */
	blockAjax: function(tabBlockId){
		// get all the fallback "tab" lists and all the links
		var tabLinks = Ext.get(tabBlockId).select('li a');

		// init tab titles and content
		var tabItems = [];
		tabLinks.each(function(el, ths, index) {
			tabItems.push({
				title: el.dom.firstChild.nodeValue,
				autoLoad: {
					url: el.dom.getAttribute('href')
				}
			});
		});			

		// local settings for tab generation
		var settings = {
			activeTab: mf.contentTab.getActiveTab(tabLinks),
			applyTo: tabBlockId,
			items: tabItems
		};

		// create tab panel
		var mfTabPanel = new Ext.TabPanel(
			mf.array.mergeObjects(mf.contentTab.settings, settings)
		);

		// remove fallback version from DOM
		mf.contentTab.removeFallback(Ext.get(tabBlockId));
	},

	/**
	 * create tab block: tab panels filled with existing DOM content
	 * @param tabBlockId {String} id of tab container
	 */
	blockDOM: function(tabBlockId){
		// detect active tab
		var activeTabNum = mf.contentTab.getActiveTab(Ext.get(tabBlockId).select('div.x-tab'));
		if (activeTabNum == null) {
			activeTabNum = 0;
		}
 
		// local settings for tab generation
		var settings = {
			activeTab: activeTabNum, 
			applyTo: tabBlockId,
			autoTabs: true,
			autoTabSelector: 'div.x-tab'
		};

		// create tab panel
		var mfTabPanel = new Ext.TabPanel(
			mf.array.mergeObjects(mf.contentTab.settings, settings)
		);
	}
};
/**
 * component: article functions
 * @description: enables functionality to show/hide the download box
 * Attention: is connected to media gallery
 */

// init component
Ext.onReady(function() {
	mf.articleFunctions.init();
});


mf.articleFunctions = {	

	/**
	 * initialize function
	 * @param mediaGalleryDomContainer {Object} HTML block "div.mediaGallery", which contains a full view image and links
	 * @param mediaGalleryDomOverview {Object} HTML block, which contains the thumbnail view of the images and links
	 */
	init: function(mediaGalleryDomContainer, mediaGalleryDomOverview) {
		if (mf.articleFunctions.comp = mf.components.getComp('mfContentMain', 'mfArticleFunctions')) {
			mf.articleFunctions.resetDownloadBoxListener();
			mf.articleFunctions.setDownloadBoxListener();
			mf.articleFunctions.setPrintListener();
			
			if(mediaGalleryDomContainer) {		
				mediaGalleryDomContainer.down('div.mfArticleFunctions p a.mfBack').on('click', function(e){
					mediaGalleryDomContainer.dom.innerHTML = mediaGalleryDomOverview;
					mf.articleFunctions.resetDownloadBoxListener();
					mf.articleFunctions.setDownloadBoxListener();
					mf.mediaGallery.init();
				},this,{stopEvent: true});
			} 
			
			if(Ext.isIE7) {
				mf.articleFunctions.comp.setStyle('z-index','-1');
			}
		}
	},

	/**
	 * set listener on link and print the window content
	 * @param none
	 */
	setPrintListener: function() {
		mf.articleFunctions.comp.each(function(el) {
			if (el.down('p a.mfPrintArticle')) {
				el.down('p a.mfPrintArticle').on('click', function(e) {
					window.print();
				},this,{stopEvent: true}); 
			}
		});		
	},

	/**
	 * set listener on link and display or hide download "popup"
	 * @param none
	 */
	setDownloadBoxListener: function() {
		mf.articleFunctions.comp.each(function(el) {
			// show download box
			el.select('p a.mfDownloadArticle').on('click', function(e, t){
				Ext.get(t).up('div.mfArticleFunctions').down('div.mfArticleDownloads').removeClass('mfHd').setOpacity(0).setOpacity(1,{animate: true});
				if (Ext.isIE) {
					Ext.get(t).up('div.mfArticleFunctions').setStyle('z-index', '1');
				}
			},this,{stopEvent: true});

			// hide download box
			el.select('.mfArticleDownloads h2 a').on('click', function(e, t){
				Ext.get(t).up('div.mfArticleDownloads').addClass('mfHd');
				if (Ext.isIE) {
					Ext.get(t).up('div.mfArticleFunctions').setStyle('z-index', '-1');
				}
			},this,{stopEvent: true});
		});
	},

	/**
	 * reset listeners
	 * @param none
	 */
	resetDownloadBoxListener: function() {
		mf.articleFunctions.comp.each(function(el) {
			el.select('.mfArticleDownloads h2 a').removeAllListeners();
			el.select('.mfDownloadArticle').removeAllListeners();
		});
	}
};

/**
 * component: exhibitor event data
 * @description: ToDo
 */
// init component
Ext.onReady(function() {
	mf.exhibitorEventData.init();
});

mf.exhibitorEventData = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.exhibitorEventData.comp = mf.components.getComp('mfContentMain', 'mfExhibitorEventData')) {
			mf.exhibitorEventData.setFairListener();
		}
	},

	/**
	 * set a listener on the links of the fair name to open/close the corresponding infos
	 * @param none
	 */
	setFairListener: function() {
		mf.exhibitorEventData.comp.each(function(el){
			el.select('div.mfFair h3 a').on('click', function(e, t) {
				var fairLink = Ext.get(t);
				var fair = fairLink.up('.mfFair').child('.mfFairInfo');

				if (fair.hasClass('mfHd')) {
					fair.removeClass('mfHd');
					fair.slideIn('t', {
						easing: 'easeOut',
						duration: 1,
						callback: function() {
							fairLink.addClass('mfOpen');
						},
						useDisplay: true
					});
				} else {
					fair.slideOut('t', {
						easing: 'easeOut',
						duration: 1,
						callback: function(box) {
							box.addClass('mfHd');
							fairLink.removeClass('mfOpen');
						},
						useDisplay: true
					});
				}
			},this,{stopEvent: true});
		});
	}
};
/**
 * component: text + image
 */
Ext.onReady(function() {
	mf.textImage.init();
});

mf.textImage = {

	/**
	 * add zoom icons to linked images	  
	 */
	init: function() {
		
		if(mf.textImage.comp = Ext.get('mfContentMain').select('div.mfTextImage div.mfImage a, div.mfExhibitorNewsItem div.mfImage a')) {
			mf.textImage.comp.each(function(el){
				Ext.get(el).insertHtml('beforeEnd', '<span></span>');
			});
		}
	}
};
/**
 * component: media gallery
 * @description: adds preview und full view functionality (AJAX) to thumbnails in media gallery
 */

// init component
Ext.onReady(function() {
	mf.mediaGallery.init();
});

mf.mediaGallery = {
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			maximumReached: "Die maximale Anzahl an Bildern in Ihrer Auswahl ist erreicht."
		}
	},
	
	/**
	 * object to store tooltip information
	 */
	ttConf: {
		ttCounter: 0,
		ttHyphenated: false
	},
	
	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		if (mf.mediaGallery.comp = mf.components.getComp('mfContentMain', 'mfMediaGallery')) {
			
			mf.mediaGallery.reset();
			mf.mediaGallery.tip();
			mf.mediaGallery.click();
			mf.mediaGallery.readCookie();
			//no Hyphenator in prototyp
			if(typeof Hyphenator !== "undefined") {
				mf.mediaGallery.setTipListener();
				mf.mediaGallery.resetHeight();
			}
		}
	},

	/**
	 * click listener - loads the big img
	 * @param none
	 */
	click: function(){
		mf.mediaGallery.comp.each(function(el) {
			el.select('p.mfWrap a').on('click', function(e, t){
				var url = Ext.get(t);
				//listener for downloads
				if(url.hasClass('mfAdd2Dl')) {
					mf.mediaGallery.add2dl(url);
					return false;
				}
				if (url.dom.tagName.indexOf('A') == -1) {
					url = url.up('a');
				}
				url = url.dom.href;
				if (url && url.indexOf('#') == -1) {
					var mediaGalleryDomContainer = Ext.get(t).up('div.mfMediaGallery');
					var mediaGalleryDomOverview = mediaGalleryDomContainer.dom.innerHTML;
					mediaGalleryDomContainer.load({
						url: url,
						callback : function() {
							//set article functions
							mf.articleFunctions.init(mediaGalleryDomContainer, mediaGalleryDomOverview);
						}
					});
					mediaGalleryDomContainer.show();
				}
			}, this,{stopEvent: true});
		});
	},

	/**
	 * loads the tooltip
	 * @param none
	 */
	tip: function(){
		mf.mediaGallery.comp.each(function(el) {
			el.select('p.mfWrap a.mfToolTipMedia').each(function(item){				
				var url = item.dom.getAttribute('rel');
				if (url && url.indexOf('#') == -1) {
					mf.mediaGallery.ttConf.ttCounter++;
					var tt = new Ext.ToolTip({
						target: item,
						width: 200,
						hideDelay: 0,
						showDelay: 500,
						//trackMouse: true,
						//mouseOffset: [70,0] ,
						shadow: "frame",
						shadowOffset: 5,
						//floating: true,
						floating: {shadow:"frame",shim:true,useDisplay:true,constrain:false},
						autoLoad: {
							url: url
						},
						dismissDelay: 15000,
						constrainPosition: true,
						id :'mfGalleryTip' + mf.mediaGallery.ttConf.ttCounter
						
						,autoHeight:true
						,autoRender:true
					});					
					// render tooltip DIVs into body (render immediately for hyphenating)
					tt.render('messefrankfurt-com');
				}
			});
			Ext.QuickTips.init();
		});
	},
	
	/**
	 * reset height of container to maxHeight per gallery row
	 * @param none
	 */
	resetHeight: function() {
		var maxHeight = 0;
		var mediaCounter = 1;
		
		mf.mediaGallery.comp.each(function(el) {
			var galleryId = el.dom.id;
			el.select('div.group').each(function(group) {
			    var groupId = group.dom.id;
    			
    			el.select('div.mfMediaGalleryRow').each(function (row){
    				
    				row.select('p.mfWrap a.mfToolTipMedia').each(function(item){
    					Hyphenator.hyphenate(document.getElementById('mfMedia_' +galleryId + '_' + groupId + '_'  + mediaCounter), 'de');
    					
    					mediaCounter++;
    					if(item.getHeight() > maxHeight){
    						maxHeight = item.getHeight();
    					}
    				});
    				row.select('p.mfWrap a.mfToolTipMedia').each(function(item){
    					if(item.getHeight() <= maxHeight){
    						item.setHeight(maxHeight / 11 + 'em');
    					}
    				});
    				maxHeight = 0;
    			});
    			mediaCounter = 1;
    		});
		});
	},

	/**
	 * reset listner
	 * @param none
	 */
	reset: function() {
		mf.mediaGallery.comp.each(function(el) {
			el.select('p.mfWrap a').removeAllListeners();
		});
	},
	
	/**
	 * adds the img to downloadselection
	 */
	add2dl: function(link) {
		var cookie;
		var selection;
		var pathstore =  escape(link.dom.getAttribute('rel'));
		if (link.hasClass('mfActive')) {
			link.removeClass('mfActive');
			if (cookie = mf.cookie.readCookie('mfDownloads')) {
				selection = cookie.replace(pathstore + '#','');
			}
		} 
		else {
			
			if(cookie = mf.cookie.readCookie('mfDownloads')) {
				// check ob noch platz
				if((cookie.length + pathstore.length) > 3100){
					alert(mf.mediaGallery.lang.cat.maximumReached);
					selection = cookie;
				} else {
					selection = cookie + pathstore + '#';
					link.addClass('mfActive');
				}
			} 
			else {
				link.addClass('mfActive');
				selection = pathstore + '#';
			}
		}
		//write cookie
		mf.cookie.createCookie('mfDownloads',selection,1);
		//count values
		mf.rightDownloadCounter.init();
	},
	
	/**
	 * reads the cookie with img paths and set links to active 
	 * @param: none
	 */
	readCookie: function() {
		if (cookie = mf.cookie.readCookie('mfDownloads')){
			var paths = cookie.split('#');
			var images;
			if (images = mf.components.getComp('mfContentMain', 'mfMediaGalleryRow img')) {	
				images.each(function(el, sel, index){
					for(var i=0; i<paths.length; i++){
						var link = el.up('p.mfWrap').down('a.mfAdd2Dl');
						if(link.dom.getAttribute('rel') == unescape(paths[i])){
							link.addClass('mfActive');
						}
					}
				});
			}
			
		}
	},
	
	/**
	 * resets all download selection, used prior to readCookie, called from download layer
	 * @param: none
	 */
	setAllDisabled: function() {
		var images = mf.components.getComp('mfContentMain', 'mfMediaGalleryRow img');
		images.each(function(el, sel, index){
			var link = el.up('p.mfWrap').down('a.mfAdd2Dl');
			link.removeClass('mfActive');
		});
	},
	
	/**
	 * hyphenates all tooltip titles when first time a tooltip is called per mouseover
	 * @param: none
	 */
	setTipListener: function() {
		mf.mediaGallery.comp.each(function(el) {
			el.select('p.mfWrap a.mfToolTipMedia').on('mouseover', function(e, t){
				for(var i=1; (i<=mf.mediaGallery.ttConf.ttCounter && mf.mediaGallery.ttConf.ttHyphenated == false); i++){			
					Hyphenator.hyphenate(document.getElementById('mfGalleryTip' + i), 'de');
				}
				mf.mediaGallery.ttConf.ttHyphenated = true;
			});
		});
	}
};
/**
 * component: download box
 * @description: creates tooltips in the download box
 */

// init component
Ext.onReady(function() {
	mf.downloadBox.init();
});


mf.downloadBox = {

	/**
	 * tooltips initialisation
	 * @param none
	 */
	init: function() {
		if (mf.downloadBox.comp = mf.components.getComp('mfContentMain', 'mfDownloadBox')) {
			mf.downloadBox.createTooltips();
		}
	},

	/**
	 * creates the tooltips
	 * @param none
	 * @return {Ext.CompositeElement} collection of HTML container, with the class "mfDownload"
	 */
	createTooltips: function() {
		mf.downloadBox.comp.each(function(el) {
			el.select('div[class=mfDownload]').each(function(dwl) {
				var tipTarget = dwl.select('a').first();
				var tipBody = Ext.getDom(dwl).cloneNode(true);
				for (var i = 0; i < tipBody.childNodes.length; i++) {
					if (tipBody.childNodes[i].nodeName.toLowerCase() == 'p') {
						tipBody.removeChild(tipBody.childNodes[i]);
						break;
					}
				}
				new Ext.ToolTip({
					target: tipTarget,
					width: 300,
					dismissDelay: 0, //default 5000
					hideDelay: 0, //default 200
					showDelay: 100, //default 500
					html: tipBody.innerHTML,
					trackMouse: true,
					shadow: "frame",
					shadowOffset: 5,
					floating: true
				});
			});
			Ext.QuickTips.init();
		});
	}
};
/**
 * component: pager
 * @description: reloads the page after select in the dropdown
 */
// init component
Ext.onReady(function() {
	mf.pager.init();
});

mf.pager = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.pager.comp = mf.components.getComp('mfContentMain', 'mfPager')) {
			mf.pager.comp.each(function(el) {
				el.select('form select').on('change', function(e, t) {
					Ext.get(t).up('form').dom.submit();
				});
			});
		}
	}
}
/**
 * component: ReCAPTCHA
 * @description: shows formerly hidden parts of the ReCAPTCHA component
 */
// init component
Ext.onReady(function() {
	mf.recaptcha.init();
});

mf.recaptcha = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (Ext.get('recaptcha_image')) {
			Ext.select('.mfReCaptureImage').first().removeClass('mfHd');
			Ext.select('.mfReCaptureInput').first().removeClass('mfHd');
			
			Ext.select('.mfReCaptureImage p a').first().on('click', function() {
				Recaptcha.reload();
			}, this,{stopEvent: true});
		}
	}
}
/**
 * component: experience element
 * @description: helper object to automatically open the experience
 *               element and load URLs from within the flash element
 */

// init component
Ext.onReady(function(){
	mf.experience.init();
});


mf.experience = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		if (mfConfig.experience && mfConfig.experience.html5url) {
			// write cookie after loading layer, load only if no cookie exists
			var urlParts = mfConfig.experience.html5url.split('/');
			var site = urlParts[2]; // mfConfig.experience.url = /content/_xxx_/... 
			var cookie = mf.cookie.readCookie('mfExperience_'+site);
			if (!cookie){
				mf.shadowbox.autoStart('mfExperience', mfConfig.experience.html5url);				
				mf.cookie.createCookie('mfExperience_'+site,1,0);
			}
		}
		if (mfConfig.experience && mfConfig.experience.flashurl) {
			// write cookie after loading layer, load only if no cookie exists
			var urlParts = mfConfig.experience.flashurl.split('/');
			var site = urlParts[2]; // mfConfig.experience.url = /content/_xxx_/... 
			var cookie = mf.cookie.readCookie('mfExperience_'+site);
			if (!cookie){
				mf.shadowbox.autoStart('mfExperience', mfConfig.experience.flashurl);				
				mf.cookie.createCookie('mfExperience_'+site,1,0);
			}
		}
	},

	/**
	 * gets an URL, closes the shadowbox and loads the URL
	 * @param url {String} url to load in the parent document
	 */
	loadUrl: function(url) {
		window.mf.experienceURL = url;
		Shadowbox.close();

		window.setTimeout(function() {
			window.location.href = window.mf.experienceURL;
		}, 300);
	}
}
/**
 * component: expandable sitemap - used in cp_ca_exhebitor_general.inc
 * @description: enables functionality to expand listelements
 */

// init component
Ext.onReady(function() {
	mf.sitemap.init();
});


mf.sitemap = {	

	/**
	 * init cmp / set listener / prepare dom
	 */
	init: function() {
		
		if (mf.sitemap.comp = mf.components.getComp('mfContentMain', 'mfSiteMap.mfExpandable')) {
			
			mf.sitemap.comp.each(function(el,cmp,idx){
				//unexpand
				el.select('ul li ul').addClass('mfDn');
				//set icons to + 
				el.select('ul a').removeClass('mfActive').on('click',function(e,t){ //set toggle listener
					e.preventDefault();
					mf.sitemap.toggleList(t);
				}).each(function(el1){ //remove + if no childs
					if(!el1.next('ul')) {
						el1.addClass('mfNoChilds');
					}
				});
				// show expand links and set listener for this
				el.down('h2').select('a').removeClass('mfDn').on('click',function(e,t){
					e.preventDefault();
					mf.sitemap.toggleList(t);
				});
			});
		}
	},
	
	/**
	 * toggle list and icons
	 * @param {Object} t
	 */
	toggleList: function(t) {
		
		var t = Ext.get(t);
		var cur =  t.up('.mfExpandable');
		
		//expand all ?
		if(t.hasClass('mfOpen')) {
			cur.select('ul').removeClass('mfDn').select('li ul').each(function(e,c,i) {
				 try {
				 	e.up('li').down('a').addClass('mfActive');
				 } catch (e) {}
			});
			return;
		}
		
		//close all ?
        if(t.hasClass('mfClose')) {
            cur.select('ul li ul').addClass('mfDn');
			cur.select('ul a').removeClass('mfActive');
			return;
        }
		
		//allready open ?
        if(t.hasClass('mfActive')) {	
		  try {
                t.up('li').down('ul').addClass('mfDn');
				t.removeClass('mfActive');
            } 
			catch (e) {}
        }
		else {
			try {
				t.up('li').down('ul').removeClass('mfDn');
				t.addClass('mfActive');
			} 
			catch (e) {}
		}
	}
};
/**
 * component: pageable imges
 * @description: navigate through img
 */

// init component
Ext.onReady(function(){
	mf.images.init();
});


mf.images = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		
	   if (mf.images.comp = mf.components.getComp('mfContentMain', 'mfImages')) {
	       mf.images.comp.each(function(e,c,i) {
          
			    var current =e.select('.mfImage:not(.mfDn)',true).first(); //visible img
                if(current.down('a.mfShadowbox')) {
					current.down('a.mfShadowbox').insertHtml('beforeEnd', '<span></span>');
				}
				// create pager         
                var count = e.select('.mfImage').getCount();
				if ( count > 1) {
					var pager = [{
						tag: 'p',
						cls: 'mfPager',
						children: [
						  {tag: 'a', cls: 'mfLeft'},
						  {tag: 'span', html: 1, cls: 'mfCurrent'}
						]
					}];
					for(n=2;n<=count;n++){
					   pager[0]['children'].push({tag: 'span', html: n});	
					}
					pager[0]['children'].push({tag: 'a', cls: 'mfRight'});
					var dh = Ext.DomHelper; //append html to dom 
					dh.append(e, pager);
				}
		   });
		   
		  // set listener
		  if (mf.images.pagercomp = mf.components.getComp('mfContentMain', 'mfImages .mfPager a')) {
		  		mf.images.pagercomp.on('click', function(e){
		  		var link = Ext.get(e.target);
		  		var selection = link.up('.mfImages').select('.mfImage', true);
		  		var max = selection.getCount() - 1;
		  		var current = link.up('.mfImages').select('.mfImage:not(.mfDn)', true).first(); //visible img
						var index = selection.indexOf(current);
						selection.addClass('mfDn'); //hide img
						if (link.hasClass('mfLeft')) 
							index--; //left
						else 
							index++; //right
						if (index < 0) 
							index = 0;//min
						if (index > max) 
							index = max; //max
						if (selection.item(index).down('a.mfShadowbox')) { // add lense if zoomable
							selection.item(index).down('a.mfShadowbox').insertHtml('beforeEnd', '<span></span>');
						}
						selection.item(index).setOpacity(0).removeClass('mfDn').setOpacity(1, true); //show img
						link.up('.mfPager').select('span').removeClass('mfCurrent').item(index).addClass('mfCurrent');//set actice in pager
						if(Ext.isIE6) selection.item(index).parent().setWidth(selection.item(index).child('img').getWidth()); //ie6
					});
				}
		
	   }
	}
}


      /**
 * project: messe frankfurt - web
 * type: javascript
 * @description: loader for component based javascript part 2
 * @author: Stefan Heimann, 03.02.2009
 * @copyright: Day Software 2008-2009. All rights reserved.
 */



/**
 * component: search for exhibitors
 * @description: search form with AJAX featured product category and scope selection
 */

// init component
Ext.onReady(function() {
	mf.searchFormExhibitor.init();
});


mf.searchFormExhibitor = {

	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			label: "Kategorie",
			defaultOption: "Alle",
			ajaxFailure: "Verbindungsfehler: Die Kategorien konnten nicht geladen werden!",
			loading: "Laden..."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchFormExhibitor.comp = mf.components.getComp('mfContentMain', 'mfSearchFormExhibitor')) {
			// get product category container
			mf.searchFormExhibitor.categoryContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdProductCategories);
			// get scope category container
			mf.searchFormExhibitor.scopeContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdScopes);
			// get directory category container
			mf.searchFormExhibitor.directoryContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdDirectories);

			if (mf.searchFormExhibitor.categoryContainer) {
				mf.searchFormExhibitor.autoFillCategories();
				mf.searchFormExhibitor.setResetListener();
			}
			if (mf.searchFormExhibitor.scopeContainer) {
				mf.searchFormExhibitor.autoFillScopes();
				mf.searchFormExhibitor.setResetListenerScopes();
			}
			if (mf.searchFormExhibitor.directoryContainer) {
				mf.searchFormExhibitor.autoFillDirectories();
				mf.searchFormExhibitor.setResetListenerDirectories();
			}
		}
	},
	
	/**
	 * category dropdown settings: css ids, labels, AJAX url etc.
	 */
	settings: {
		categoryUrl: mfConfig.searchFormExhibitor ? mfConfig.searchFormExhibitor.categoryUrl : null,
		scopeUrl: mfConfig.searchFormExhibitor ? mfConfig.searchFormExhibitor.scopeUrl : null,
		directoryUrl: mfConfig.searchFormExhibitor ? mfConfig.searchFormExhibitor.directoryUrl : null,
		idPrefixProductCategories: 'mfSFEProductGroup',
		idPrefixScopes: 'mfSFEScope',
		idPrefixDirectories: 'mfSFEDirectory',
		namePrefixProductCategories: 'sfK',
		namePrefixScopes: 'sfS',
		namePrefixDirectories: 'sfD',
		containerIdProductCategories: 'mfSFEProductGroups',
		containerIdScopes: 'mfSFEScopes',
		containerIdDirectories: 'mfSFEDirectories',
		maxLevel: 4
	},

	/**
	 * get level of category
	 * @param categoryId {Sting} ID to extract the category level from
	 */
	getCategoryLevel: function(categoryId) {
		return parseInt(categoryId.substring(categoryId.length-1, categoryId.length));
	},

	/**
	 * create product group dropdowns and select formerly selected options (if any)
	 * @param none
	 */
	autoFillCategories: function() {
		if (mfConfig.searchFormExhibitor) {
			var config = mfConfig.searchFormExhibitor;

			if (config.categories) {
				mf.searchFormExhibitor.getCategoryOptions(1, config.categories[1], null, true);
				if(config.categoryContractBusiness) {
					// set listener for contract business option
					mf.searchFormExhibitor.setContractBusinessListener();

					// autoselect contract business checkbox
					if (config.categoryContractBusiness != '' && config.categoryContractBusiness == config.categories[1]) {
						mf.searchFormExhibitor.setContractBusinessState(true);
					}
				}
			} else {
				mf.searchFormExhibitor.getCategoryOptions(1);
				if(config.categoryContractBusiness) {
					// set listener for contract business option
					mf.searchFormExhibitor.setContractBusinessListener();
				}
			}
		}
	},
	
	/**
	 * create scope dropdowns and select formerly selected options (if any)
	 * @param none
	 */
	autoFillScopes: function() {
		if (mfConfig.searchFormExhibitor) {
			var config = mfConfig.searchFormExhibitor;

			if (config.scopes) {
				mf.searchFormExhibitor.getScopeOptions(1, config.scopes[1], null, true);
			} else {
				mf.searchFormExhibitor.getScopeOptions(1);
			}
		}
	},
	
	/**
	 * create directory dropdowns and select formerly selected options (if any)
	 * @param none
	 */
	autoFillDirectories: function() {
		if (mfConfig.searchFormExhibitor) {
			var config = mfConfig.searchFormExhibitor;

			if (config.directories) {
				mf.searchFormExhibitor.getDirectoryOptions(1, config.directories[1], null, true);
			} else {
				mf.searchFormExhibitor.getDirectoryOptions(1);
			}
		}
	},

	/**
	 * loads new categories depending on user selection
	 * @param level {Int} level of category selection
	 * @param selectedOption {String} value of selected category option
	 * @param requestUrl {String} url of AJAX request
	 * @param autoFill {Boolean} true if formerly selected categories shoud be restored on page load
	 */
	getCategoryOptions: function(level, selectedOption, requestUrl, autoFill) {
		var options = [{
			tag: 'option',
			value: '',
			html: mf.searchFormExhibitor.lang.cat.defaultOption
		}];
		
		if (!selectedOption) {
			options[0].selected = true;
		} 

		// add loading indicator
		Ext.DomHelper.append(mf.searchFormExhibitor.categoryContainer, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormExhibitor.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
			url: requestUrl ? mf.searchFormExhibitor.settings.categoryUrl + requestUrl : mf.searchFormExhibitor.settings.categoryUrl,
			success: function(response) {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.categoryContainer);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						options.push({
							tag: 'option',
							value: i,
							html: responseText[i]
						});
						
						if (selectedOption && selectedOption == i) {
							options[options.length-1].selected = true;
						}
					}

					mf.searchFormExhibitor.createCategory(level, options);

					if (autoFill && mfConfig.searchFormExhibitor.categories) {
						var nextLevel = parseInt(level) + 1;
						if (mfConfig.searchFormExhibitor.categories[nextLevel]) {
							mf.searchFormExhibitor.getCategoryOptions(nextLevel, mfConfig.searchFormExhibitor.categories[nextLevel], mfConfig.searchFormExhibitor.categories[parseInt(level)], true);
						} else if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
							mf.searchFormExhibitor.getCategoryOptions(nextLevel, null, mfConfig.searchFormExhibitor.categories[parseInt(level)], false);
						}
					}
				}
			},
			failure: function() {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.categoryContainer);

				Ext.DomHelper.append(mf.searchFormExhibitor.categoryContainer, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormExhibitor.lang.cat.ajaxFailure
				});
			}
		});
	},
	
	/**
	 * loads new categories depending on user selection
	 * @param level {Int} level of category selection
	 * @param selectedOption {String} value of selected category option
	 * @param requestUrl {String} url of AJAX request
	 * @param autoFill {Boolean} true if formerly selected categories shoud be restored on page load
	 */
	getScopeOptions: function(level, selectedOption, requestUrl, autoFill) {
		var options = [{
			tag: 'option',
			value: '',
			html: mf.searchFormExhibitor.lang.cat.defaultOption
		}];
		
		if (!selectedOption) {
			options[0].selected = true;
		} 

		// add loading indicator
		Ext.DomHelper.append(mf.searchFormExhibitor.scopeContainer, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormExhibitor.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
			url: requestUrl ? mf.searchFormExhibitor.settings.scopeUrl + requestUrl : mf.searchFormExhibitor.settings.scopeUrl,
			success: function(response) {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.scopeContainer);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						options.push({
							tag: 'option',
							value: i,
							html: responseText[i]
						});
						
						if (selectedOption && selectedOption == i) {
							options[options.length-1].selected = true;
						}
					}

					mf.searchFormExhibitor.createScope(level, options);

					if (autoFill && mfConfig.searchFormExhibitor.scopes) {
						var nextLevel = parseInt(level) + 1;
						if (mfConfig.searchFormExhibitor.scopes[nextLevel]) {
							mf.searchFormExhibitor.getScopeOptions(nextLevel, mfConfig.searchFormExhibitor.scopes[nextLevel], mfConfig.searchFormExhibitor.scopes[parseInt(level)], true);
						} else if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
							mf.searchFormExhibitor.getScopeOptions(nextLevel, null, mfConfig.searchFormExhibitor.scopes[parseInt(level)], false);
						}
					}
				}
			},
			failure: function() {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.scopeContainer);

				Ext.DomHelper.append(mf.searchFormExhibitor.scopeContainer, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormExhibitor.lang.cat.ajaxFailure
				});
			}
		});
	},
	
	/**
	 * loads new categories depending on user selection
	 * @param level {Int} level of category selection
	 * @param selectedOption {String} value of selected category option
	 * @param requestUrl {String} url of AJAX request
	 * @param autoFill {Boolean} true if formerly selected categories shoud be restored on page load
	 */
	getDirectoryOptions: function(level, selectedOption, requestUrl, autoFill) {
		var options = [{
			tag: 'option',
			value: '',
			html: mf.searchFormExhibitor.lang.cat.defaultOption
		}];
		
		if (!selectedOption) {
			options[0].selected = true;
		} 

		// add loading indicator
		Ext.DomHelper.append(mf.searchFormExhibitor.directoryContainer, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormExhibitor.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
			url: requestUrl ? mf.searchFormExhibitor.settings.directoryUrl + requestUrl : mf.searchFormExhibitor.settings.directoryUrl,
			success: function(response) {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.directoryContainer);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						options.push({
							tag: 'option',
							value: i,
							html: responseText[i]
						});
						
						if (selectedOption && selectedOption == i) {
							options[options.length-1].selected = true;
						}
					}

					mf.searchFormExhibitor.createDirectory(level, options);

					if (autoFill && mfConfig.searchFormExhibitor.directories) {
						var nextLevel = parseInt(level) + 1;
						if (mfConfig.searchFormExhibitor.directories[nextLevel]) {
							mf.searchFormExhibitor.getDirectoryOptions(nextLevel, mfConfig.searchFormExhibitor.directories[nextLevel], mfConfig.searchFormExhibitor.directories[parseInt(level)], true);
						} else if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
							mf.searchFormExhibitor.getDirectoryOptions(nextLevel, null, mfConfig.searchFormExhibitor.directories[parseInt(level)], false);
						}
					}
				}
			},
			failure: function() {
				mf.searchFormExhibitor.removeTempItems(mf.searchFormExhibitor.directoryContainer);

				Ext.DomHelper.append(mf.searchFormExhibitor.directoryContainer, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormExhibitor.lang.cat.ajaxFailure
				});
			}
		});
	},

	/**
	 * creates the DOM for a new product group select and appends it to the page
	 * @param level {Int} level of category selection
	 * @param options {Object} object with DomHelper style option elements
	 */
	createCategory: function(level, options) {
		var elId = mf.searchFormExhibitor.settings.idPrefixProductCategories + level;
		Ext.DomHelper.append(Ext.get(mf.searchFormExhibitor.settings.containerIdProductCategories), {
			tag: 'p',
			cls: 'mfSelect mfCl',
			children: [{
				tag: 'label',
				'for': elId,
				html: level + '. ' + mf.searchFormExhibitor.lang.cat.label
			}, {
				tag: 'select',
				id: elId,
				name: mf.searchFormExhibitor.settings.namePrefixProductCategories + level,
				size: '1',
				children: options
			}]
		});

		var select = Ext.get(elId);
		select.highlight('ffff9c', {
			duration: 1
		});

		mf.searchFormExhibitor.setCategoryListener(select);
	},
	
	/**
	 * creates the DOM for a new scope select and appends it to the page
	 * @param level {Int} level of category selection
	 * @param options {Object} object with DomHelper style option elements
	 */
	createScope: function(level, options) {
		var elId = mf.searchFormExhibitor.settings.idPrefixScopes + level;
		Ext.DomHelper.append(Ext.get(mf.searchFormExhibitor.settings.containerIdScopes), {
			tag: 'p',
			cls: 'mfSelect mfCl',
			children: [{
				tag: 'label',
				'for': elId,
				html: level + '. ' + mf.searchFormExhibitor.lang.cat.label
			}, {
				tag: 'select',
				id: elId,
				name: mf.searchFormExhibitor.settings.namePrefixScopes + level,
				size: '1',
				children: options
			}]
		});

		var select = Ext.get(elId);
		select.highlight('ffff9c', {
			duration: 1
		});

		mf.searchFormExhibitor.setScopeListener(select);
	},
	
	/**
	 * creates the DOM for a new directory select and appends it to the page
	 * @param level {Int} level of category selection
	 * @param options {Object} object with DomHelper style option elements
	 */
	createDirectory: function(level, options) {
		var elId = mf.searchFormExhibitor.settings.idPrefixDirectories + level;
		Ext.DomHelper.append(Ext.get(mf.searchFormExhibitor.settings.containerIdDirectories), {
			tag: 'p',
			cls: 'mfSelect mfCl',
			children: [{
				tag: 'label',
				'for': elId,
				html: level + '. ' + mf.searchFormExhibitor.lang.cat.label
			}, {
				tag: 'select',
				id: elId,
				name: mf.searchFormExhibitor.settings.namePrefixDirectories + level,
				size: '1',
				children: options
			}]
		});

		var select = Ext.get(elId);
		select.highlight('ffff9c', {
			duration: 1
		});

		mf.searchFormExhibitor.setDirectoryListener(select);
	},

	/**
	 * registers a listener on the category dropdowns to create or remove select fields
	 * @param none
	 */
	setCategoryListener: function(select) {
		select.on('change', function(e, t) {
			var requestUrl = null;
			// get option value
			Ext.get(t).select('option').each(function(el) {
				if (el.dom.selected) {
					requestUrl = el.dom.value;
				}
			});
			// get category level
			var level = mf.searchFormExhibitor.getCategoryLevel(Ext.get(t).dom.id);
			var nextLevel = level + 1;
			// remove old category dropdowns and trigger new category call
			if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
				mf.searchFormExhibitor.removeCategories(nextLevel, mf.searchFormExhibitor.categoryContainer, mf.searchFormExhibitor.settings.containerIdProductCategories);
				if (requestUrl && requestUrl != '') {
					if (level == 1) {
						// check or uncheck contract business checkbox
						if (mfConfig.searchFormExhibitor.categoryContractBusiness && mfConfig.searchFormExhibitor.categoryContractBusiness != ''){							
							if (requestUrl == mfConfig.searchFormExhibitor.categoryContractBusiness) {
								mf.searchFormExhibitor.setContractBusinessState(true);
							} else {
								mf.searchFormExhibitor.setContractBusinessState(false);
							}
						}
					}
					// get new categories
					mf.searchFormExhibitor.getCategoryOptions(nextLevel, null, requestUrl);
				}
			}
		});
	},
	
	/**
	 * registers a listener on the scope dropdowns to create or remove select fields
	 * @param none
	 */
	setScopeListener: function(select) {
		select.on('change', function(e, t) {
			var requestUrl = null;
			// get option value
			Ext.get(t).select('option').each(function(el) {
				if (el.dom.selected) {
					requestUrl = el.dom.value;
				}
			});
			// get category level
			var level = mf.searchFormExhibitor.getCategoryLevel(Ext.get(t).dom.id);
			var nextLevel = level + 1;
			// remove old scope dropdowns and trigger new category call
			if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
				mf.searchFormExhibitor.removeCategories(nextLevel, mf.searchFormExhibitor.scopeContainer, mf.searchFormExhibitor.settings.containerIdScopes);
				if (requestUrl && requestUrl != '') {
					// get new categories
					mf.searchFormExhibitor.getScopeOptions(nextLevel, null, requestUrl);
				}
			}
		});
	},
	
	/**
	 * registers a listener on the directory dropdowns to create or remove select fields
	 * @param none
	 */
	setDirectoryListener: function(select) {
		select.on('change', function(e, t) {
			var requestUrl = null;
			// get option value
			Ext.get(t).select('option').each(function(el) {
				if (el.dom.selected) {
					requestUrl = el.dom.value;
				}
			});
			// get category level
			var level = mf.searchFormExhibitor.getCategoryLevel(Ext.get(t).dom.id);
			var nextLevel = level + 1;
			// remove old directory dropdowns and trigger new category call
			if (nextLevel <= mf.searchFormExhibitor.settings.maxLevel) {
				mf.searchFormExhibitor.removeCategories(nextLevel, mf.searchFormExhibitor.directoryContainer, mf.searchFormExhibitor.settings.containerIdDirectories);
				if (requestUrl && requestUrl != '') {
					// get new categories
					mf.searchFormExhibitor.getDirectoryOptions(nextLevel, null, requestUrl);
				}
			}
		});
	},
	
	/**
	 * remove loading indicator and error message of given container
	 * @param none
	 */
	removeTempItems: function(container) {
		container.select('.mfLoadingIndicator').remove();
		container.select('.mfError').remove();
	},

	/**
	 * removes select fields
	 * @param level {Int} level of selection
	 */
	removeCategories: function(level, container, containerId) {
		mf.searchFormExhibitor.removeTempItems(container);

		Ext.get(containerId).select('p.mfSelect').each(function(item) {
			if(mf.searchFormExhibitor.getCategoryLevel(item.child('select').dom.id)>=level) {
				item.remove();
			}
		});
	},

	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	resetCategories: function() {
		mf.searchFormExhibitor.removeCategories(0, mf.searchFormExhibitor.categoryContainer, mf.searchFormExhibitor.settings.containerIdProductCategories);
		mf.searchFormExhibitor.setContractBusinessState(false);
		mf.searchFormExhibitor.getCategoryOptions(1);
	},
	
	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	resetScopes: function() {
		if(mf.searchFormExhibitor.scopeContainer) {
			mf.searchFormExhibitor.removeCategories(0, mf.searchFormExhibitor.scopeContainer, mf.searchFormExhibitor.settings.containerIdScopes);
			mf.searchFormExhibitor.getScopeOptions(1);
		}
	},
	
	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	resetDirectories: function() {
		if (mf.searchFormExhibitor.directoryContainer) {
			mf.searchFormExhibitor.removeCategories(0, mf.searchFormExhibitor.directoryContainer, mf.searchFormExhibitor.settings.containerIdDirectories);
			mf.searchFormExhibitor.getDirectoryOptions(1);
		}
	},

	/**
	 * mark the checkbox for contract business as selected
	 * @param none
	 */
	setContractBusinessListener: function() {
		var cBusiness = Ext.get('mfSFEContractBusiness');
		
		if (cBusiness) {
			cBusiness.on('click', function() {
				// act only when checkbox is marked
				if (mf.searchFormExhibitor.getContractBusinessState()) {
					// remove categories
					mf.searchFormExhibitor.removeCategories(2, mf.searchFormExhibitor.categoryContainer, mf.searchFormExhibitor.settings.containerIdProductCategories);
					// selected entry on first level
					Ext.get(mf.searchFormExhibitor.settings.idPrefixProductCategories + '1').select('option').each(function(el) {
						if (el.dom.value == mfConfig.searchFormExhibitor.categoryContractBusiness) {
							el.dom.selected = true;
						}
					});
					// get new category options
					mf.searchFormExhibitor.getCategoryOptions(2, null, mfConfig.searchFormExhibitor.categoryContractBusiness, false);
				}
			});
		}
	},

	/**
	 * get the state of the contract business checkbox
	 * @param none
	 * @return {Boolean} state of selection
	 */
	getContractBusinessState: function() {
		var cBusiness = Ext.get('mfSFEContractBusiness');
		
		return cBusiness && cBusiness.dom.checked ? true : false;
	},

	/**
	 * mark or unmark the checkbox for contract business
	 * @param state {Boolean} state of selection
	 */
	setContractBusinessState: function(state) {
		var cBusiness = Ext.get('mfSFEContractBusiness');
		
		if (cBusiness) {
			cBusiness.dom.checked = state;
		}
	},

	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	setResetListener: function() {
		mf.searchFormExhibitor.comp.each(function(el) {
			el.select('.mfSubmitBlock span a.mfResetPG').on('click', mf.searchFormExhibitor.resetCategories, this, {stopEvent: true});
		});
	},
	
	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	setResetListenerScopes: function() {
		mf.searchFormExhibitor.comp.each(function(el) {
			el.select('.mfSubmitBlock span a.mfResetS').on('click', mf.searchFormExhibitor.resetScopes, this, {stopEvent: true});
		});
	},
	
	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	setResetListenerDirectories: function() {
		mf.searchFormExhibitor.comp.each(function(el) {
			el.select('.mfSubmitBlock span a.mfResetD').on('click', mf.searchFormExhibitor.resetDirectories, this, {stopEvent: true});
		});
	}
};

/**
 * component: search for exhibitors news
 * @description: search form with AJAX featured product category selection
 */

// init component
Ext.onReady(function() {
	mf.searchFormExhibitorNews.init();
});


mf.searchFormExhibitorNews = {

	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			label: "Produktgruppe",
			defaultOption: "Bitte wählen Sie eine Produktgruppe",
			defaultOptionShort: "Bitte auswählen",
			ajaxFailure: "Connection error: product groups could not be retrieved!",
			loading: "Laden..."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchFormExhibitorNews.comp = mf.components.getComp('mfContentMain', 'mfSearchFormExhibitorNews')) {
			// get product category container
			mf.searchFormExhibitorNews.categoryContainer = Ext.get(mf.searchFormExhibitorNews.settings.containerId);

			if (mf.searchFormExhibitorNews.categoryContainer) {
				mf.searchFormExhibitorNews.autoFillCategories();
			}
		}
	},
	
	/**
	 * category dropdown settings: css ids, labels, AJAX url etc. ...
	 */
	settings: {
		url: mfConfig.searchFormExhibitorNews ? mfConfig.searchFormExhibitorNews.productgroupsurl : null,
	    defaultOption: mfConfig.searchFormExhibitorNews ? mfConfig.searchFormExhibitorNews.defaultOption : "Bitte wählen Sie eine Produktgruppe",
	    defaultOptionShort: mfConfig.searchFormExhibitorNews ? mfConfig.searchFormExhibitorNews.defaultOptionShort : "Bitte auswählen",
		idPrefix: 'mfSFENProductGroup',
		namePrefix: 'sfK',
		containerId: 'mfSFENProductGroup',
		maxLevel: 4
	},

	/**
	 * get level of category
	 * @param categoryId {Sting} ID to extract the category level from
	 */
	getCategoryLevel: function(categoryId) {
		return parseInt(categoryId.substring(categoryId.length-1, categoryId.length));
	},

	/**
	 * create categories dropdowns and select formerly selected options (if any)
	 * @param none
	 */
	autoFillCategories: function() {
		if (mfConfig.searchFormExhibitorNews) {
			mf.searchFormExhibitorNews.getCategoryOptions(1);
		}
	},

	/**
	 * loads new categories depending on user selection
	 * @param level {Int} level of category selection
	 * @param selectedOption {String} value of selected category option
	 * @param requestUrl {String} url of AJAX request
	 * @param autoFill {Boolean} true if formerly selected categories shoud be restored on page load
	 */
	getCategoryOptions: function(level) {
		mf.rightSearchForm = mf.components.getComp('mfContentRight', 'mfRightSearchFormExhibitorNews');
		var options = [{
			tag: 'option',
			value: '',
			html: mf.rightSearchForm ? mf.searchFormExhibitorNews.settings.defaultOptionShort : mf.searchFormExhibitorNews.settings.defaultOption
				
				
		}];
		
		var selectedOption = "";
		if(mfConfig.searchFormExhibitorNews && mfConfig.searchFormExhibitorNews.categories){
			selectedOption = mfConfig.searchFormExhibitorNews.categories[1];
		}
		if (selectedOption == "") {
			options[0].selected = true;
		}

		// add loading indicator
		Ext.DomHelper.append(mf.searchFormExhibitorNews.categoryContainer, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormExhibitorNews.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
			url: mf.searchFormExhibitorNews.settings.url,
			success: function(response) {
				mf.searchFormExhibitorNews.removeTempItems();

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						if(typeof(responseText[i].value) != "undefined"){
							options.push({
								tag: 'option',
								value: responseText[i].value,
								html: responseText[i].text
							});
						}				
						
						if (selectedOption && selectedOption == responseText[i].value) {
							options[options.length-1].selected = true;
						}
					}

					mf.searchFormExhibitorNews.createCategory(level, options);
				}
			},
			failure: function() {
				mf.searchFormExhibitorNews.removeTempItems();

				Ext.DomHelper.append(mf.searchFormExhibitorNews.categoryContainer, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormExhibitorNews.lang.cat.ajaxFailure
				});
			}
		});
	},

	/**
	 * creates the DOM for a new category select and appends it to the page
	 * @param level {Int} level of category selection
	 * @param options {Object} object with DomHelper style option elements
	 */
	createCategory: function(level, options) {
		var elId = mf.searchFormExhibitorNews.settings.idPrefix + level;
		// label, wenn suchbox rechts
		if(mf.rightSearchForm){
			Ext.DomHelper.append(Ext.get(mf.searchFormExhibitorNews.settings.containerId), {
				tag: 'p',
				cls: 'mfSelect mfCl',
				children: [{
					tag: 'label',
					'for': elId,
					html: mf.searchFormExhibitorNews.lang.cat.label
				}, {
					tag: 'select',
					id: elId,
					name: mf.searchFormExhibitorNews.settings.namePrefix + level,
					size: '1',
					children: options
				}]
			});
		} else {
			Ext.DomHelper.append(Ext.get(mf.searchFormExhibitorNews.settings.containerId), {
				tag: 'p',
				cls: 'mfSelect mfCl',
				children: [{
					tag: 'select',
					id: elId,
					name: mf.searchFormExhibitorNews.settings.namePrefix + level,
					size: '1',
					children: options
				}]
			});
		}

		var select = Ext.get(elId);
		select.highlight('ffff9c', {
			duration: 1
		});

		//mf.searchFormExhibitorNews.setCategoryListener(select);
	},

	/**
	 * remove loading indicator and error message
	 * @param none
	 */
	removeTempItems: function() {
		mf.searchFormExhibitorNews.categoryContainer.select('.mfLoadingIndicator').remove();
		mf.searchFormExhibitorNews.categoryContainer.select('.mfError').remove();
	}
};

/**
 * component: search for products
 * @description: product category browsing with toggle functionality
 */

// init component
Ext.onReady(function() {
	mf.searchFormProducts.init();
});


mf.searchFormProducts = {

	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			ajaxFailure: "Verbindungsfehler: Die Kategorien konnten nicht geladen werden!",
			loading: "Laden...",
			info: "Weitere Unterkategorien sind nicht vorhanden."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchFormProducts.comp = mf.components.getComp('mfContentMain', 'mfSearchFormProducts')) {
			mf.searchFormProducts.tree = Ext.get('mfSearchFormProductsTree');
			mf.searchFormProducts.setOverallListener();
			// inner tree toggle
			mf.searchFormProducts.setTreeListener(mf.searchFormProducts.tree);
		}
	},
	
	/**
	 * set event listener to trigger overall category change (open/close)
	 * @param none
	 */
	setOverallListener: function() {
		mf.searchFormProducts.comp.each(function(el){
			// overall toggle functions
			var toggleLinks = el.select('.mfToggle a');
			
			// close all categories
			toggleLinks.first().on('click', function() {
				mf.searchFormProducts.closeAllCategories();
			},this,{stopEvent: true});
		});
	},
	
	/**
	 * set the toggle listener on a single category
	 * @param ul {Ext.Element} list to set the toggle events for
	 */
	setTreeListener: function(ul) {
		ul.select('a').each(function(el) {
			if (el.up('ul') == ul) {
				mf.searchFormProducts.setCategoryToggle(el);
			}
		});
	},

	/**
	 * setup toggle links to reflect category state
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	setCategoryToggle: function(el) {
		// remove all formerly set listeners
		el.removeAllListeners();

		if (el.hasClass('mfCatClosed')) {
			el.on('click', function(e, t) {
				var link = Ext.get(t);
			
				if (link.up('li').child('ul')) {
					mf.searchFormProducts.openCategory(link);
				} else {
					mf.searchFormProducts.getCategory(link, link.dom.getAttribute('rel'));
				}
			},this,{stopEvent: true});
		} else if (el.hasClass('mfCatOpen')) {
			el.on('click', function(e, t) {
				mf.searchFormProducts.closeCategory(Ext.get(t));
			},this,{stopEvent: true});
		} else {
			el.on('click', function(e, t) {
				mf.searchFormProducts.createInfoMessage(Ext.get(t).up('li'));
			},this,{stopEvent: true});
		}

		// trigger product search
		el.child('span').on('click', function(e, t) {
			var target = Ext.get(t);
			var url;
			
			target.dom.nodeName == 'SPAN' ? url = target.up('a').dom.getAttribute('href') : url = target.dom.getAttribute('href');
			window.location.href = mf.searchFormProducts.settings.searchUrl + url.substring(url.indexOf('?'), url.length);
		},this,{stopEvent: true});
	},

	/**
	 * category dropdown settings: AJAX url, max. level etc.
	 */
	settings: {
		searchUrl: mfConfig.searchFormProducts ? mfConfig.searchFormProducts.searchUrl : null,
		categoryUrl: mfConfig.searchFormProducts ? mfConfig.searchFormProducts.categoryUrl : null,
		maxLevel: 4
	},

	/**
	 * get list items of this category
	 * @param el {Ext.Element} element which triggers the toggle
	 * @param requestUrl {String} url of AJAX request
	 */
	getCategory: function(el, requestUrl) {
		var items = [];
		var li = el.up('li');

		// add loading indicator
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormProducts.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
 			url: requestUrl ? mf.searchFormProducts.settings.categoryUrl + requestUrl : mf.searchFormProducts.settings.categoryUrl,
			success: function(response) {
				mf.searchFormProducts.removeTempItems(li);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						items.push({
							tag: 'li',
							children: {
								tag: 'a',
								cls: responseText[i].subcat ? 'mfCatClosed' : '',
								href: responseText[i].url,
								rel: responseText[i].qurl,
								children: {
									tag: 'span',
									html: responseText[i].text
								}
							}
						});
					}

					mf.searchFormProducts.createCategory(items, li);
				}
			},
			failure: function() {
				mf.searchFormProducts.removeTempItems(li);

				Ext.DomHelper.append(li, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormProducts.lang.cat.ajaxFailure
				});
			}
		});
	},

	/**
	 * creates a html list of category items
	 * @param items {Array} array of html list items
	 * @param li {Array} html list element to append items to
	 */
	createCategory: function(items, li) {
		Ext.DomHelper.append(li, {
			tag: 'ul',
			cls: 'mfClosed',
			children: items
		});

		mf.searchFormProducts.openCategory(li.child('a'));
	},

	/**
	 * remove loading indicator and error message
	 * @param li {Ext.Element} html list element
	 */
	removeTempItems: function(li) {
		li.select('.mfLoadingIndicator').remove();
		li.select('.mfError').remove();
		
		var infoMsg = li.select('.mfInfo').first();
		if (infoMsg) {
			infoMsg.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(infoMsg){
					infoMsg.remove();
				}
			});
		}
	},

	/**
	 * create info message for last level
	 * @param li {Ext.Element} html list element
	 */
	createInfoMessage: function(li) {
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfInfo',
			html: mf.searchFormProducts.lang.cat.info
		});
		
		window.setTimeout(function() {
			mf.searchFormProducts.removeTempItems(li);
		}, 1000);
	},

	/**
	 * opens a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	openCategory: function(el) {
		var ul = el.up('li').child('ul');
		
		if (ul) {
			ul.removeClass('mfClosed');
			ul.slideIn('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatClosed', 'mfCatOpen');
					mf.searchFormProducts.setCategoryToggle(toggleLink);
					mf.searchFormProducts.setTreeListener(ul);
				}
			});
		}
	},

	/**
	 * closes a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	closeCategory: function(el) {
		var ul = el.up('li').child('ul');

		if (ul) {
			ul.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					ul.addClass('mfClosed');

					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatOpen', 'mfCatClosed');
					mf.searchFormProducts.setCategoryToggle(toggleLink);
				}
			});
		}
	},

	/**
	 * close all categories in one attempt
	 * @param none
	 */
	closeAllCategories: function() {
		mf.searchFormProducts.tree.select('ul').each(function(el) {
			mf.searchFormProducts.removeTempItems(el.up('li'));
			el.addClass('mfClosed');
			el.up('li').child('a').replaceClass('mfCatOpen', 'mfCatClosed');
		});

		mf.searchFormProducts.tree.select('li').each(function(el) {
			mf.searchFormProducts.removeTempItems(el);
		});
			
		mf.searchFormProducts.setTreeListener(mf.searchFormProducts.tree);
	}
};

/**
 * component: search for scopes
 * @description: scope browsing with toggle functionality
 */

// init component
Ext.onReady(function() {
	mf.searchFormScopes.init();
});


mf.searchFormScopes = {

	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			ajaxFailure: "Verbindungsfehler: Die Kategorien konnten nicht geladen werden!",
			loading: "Laden...",
			info: "Weitere Unterkategorien sind nicht vorhanden."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchFormScopes.comp = mf.components.getComp('mfContentMain', 'mfSearchFormScopes')) {
			mf.searchFormScopes.tree = Ext.get('mfSearchFormScopesTree');
			mf.searchFormScopes.setOverallListener();
			// inner tree toggle
			mf.searchFormScopes.setTreeListener(mf.searchFormScopes.tree);
		}
	},
	
	/**
	 * set event listener to trigger overall scope change (open/close)
	 * @param none
	 */
	setOverallListener: function() {
		mf.searchFormScopes.comp.each(function(el){
			// overall toggle functions
			var toggleLinks = el.select('.mfToggle a');
			
			// close all categories
			toggleLinks.first().on('click', function() {
				mf.searchFormScopes.closeAllCategories();
			},this,{stopEvent: true});
		});
	},
	
	/**
	 * set the toggle listener on a single scope
	 * @param ul {Ext.Element} list to set the toggle events for
	 */
	setTreeListener: function(ul) {
		ul.select('a').each(function(el) {
			if (el.up('ul') == ul) {
				mf.searchFormScopes.setCategoryToggle(el);
			}
		});
	},

	/**
	 * setup toggle links to reflect scope state
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	setCategoryToggle: function(el) {
		// remove all formerly set listeners
		el.removeAllListeners();

		if (el.hasClass('mfCatClosed')) {
			el.on('click', function(e, t) {
				var link = Ext.get(t);
			
				if (link.up('li').child('ul')) {
					mf.searchFormScopes.openCategory(link);
				} else {
					mf.searchFormScopes.getCategory(link, link.dom.getAttribute('rel'));
				}
			},this,{stopEvent: true});
		} else if (el.hasClass('mfCatOpen')) {
			el.on('click', function(e, t) {
				mf.searchFormScopes.closeCategory(Ext.get(t));
			},this,{stopEvent: true});
		} else {
			el.on('click', function(e, t) {
				mf.searchFormScopes.createInfoMessage(Ext.get(t).up('li'));
			},this,{stopEvent: true});
		}

		// trigger product search
		el.child('span').on('click', function(e, t) {
			var target = Ext.get(t);
			var url;
			
			target.dom.nodeName == 'SPAN' ? url = target.up('a').dom.getAttribute('href') : url = target.dom.getAttribute('href');
			window.location.href = mf.searchFormScopes.settings.searchUrl + url.substring(url.indexOf('?'), url.length);
		},this,{stopEvent: true});
	},

	/**
	 * category dropdown settings: AJAX url, max. level etc.
	 */
	settings: {
		searchUrl: mfConfig.searchFormScopes ? mfConfig.searchFormScopes.searchUrl : null,
		scopeUrl: mfConfig.searchFormScopes ? mfConfig.searchFormScopes.scopeUrl : null,
		maxLevel: 4
	},

	/**
	 * get list items of this category
	 * @param el {Ext.Element} element which triggers the toggle
	 * @param requestUrl {String} url of AJAX request
	 */
	getCategory: function(el, requestUrl) {
		var items = [];
		var li = el.up('li');

		// add loading indicator
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormScopes.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
 			url: requestUrl ? mf.searchFormScopes.settings.scopeUrl + requestUrl : mf.searchFormScopes.settings.scopeUrl,
			success: function(response) {
				mf.searchFormScopes.removeTempItems(li);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						items.push({
							tag: 'li',
							children: {
								tag: 'a',
								cls: responseText[i].subcat ? 'mfCatClosed' : '',
								href: responseText[i].url,
								rel: responseText[i].qurl,
								children: {
									tag: 'span',
									html: responseText[i].text
								}
							}
						});
					}

					mf.searchFormScopes.createCategory(items, li);
				}
			},
			failure: function() {
				mf.searchFormScopes.removeTempItems(li);

				Ext.DomHelper.append(li, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormScopes.lang.cat.ajaxFailure
				});
			}
		});
	},

	/**
	 * creates a html list of category items
	 * @param items {Array} array of html list items
	 * @param li {Array} html list element to append items to
	 */
	createCategory: function(items, li) {
		Ext.DomHelper.append(li, {
			tag: 'ul',
			cls: 'mfClosed',
			children: items
		});

		mf.searchFormScopes.openCategory(li.child('a'));
	},

	/**
	 * remove loading indicator and error message
	 * @param li {Ext.Element} html list element
	 */
	removeTempItems: function(li) {
		li.select('.mfLoadingIndicator').remove();
		li.select('.mfError').remove();
		
		var infoMsg = li.select('.mfInfo').first();
		if (infoMsg) {
			infoMsg.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(infoMsg){
					infoMsg.remove();
				}
			});
		}
	},

	/**
	 * create info message for last level
	 * @param li {Ext.Element} html list element
	 */
	createInfoMessage: function(li) {
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfInfo',
			html: mf.searchFormScopes.lang.cat.info
		});
		
		window.setTimeout(function() {
			mf.searchFormScopes.removeTempItems(li);
		}, 1000);
	},

	/**
	 * opens a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	openCategory: function(el) {
		var ul = el.up('li').child('ul');
		
		if (ul) {
			ul.removeClass('mfClosed');
			ul.slideIn('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatClosed', 'mfCatOpen');
					mf.searchFormScopes.setCategoryToggle(toggleLink);
					mf.searchFormScopes.setTreeListener(ul);
				}
			});
		}
	},

	/**
	 * closes a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	closeCategory: function(el) {
		var ul = el.up('li').child('ul');

		if (ul) {
			ul.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					ul.addClass('mfClosed');

					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatOpen', 'mfCatClosed');
					mf.searchFormScopes.setCategoryToggle(toggleLink);
				}
			});
		}
	},

	/**
	 * close all categories in one attempt
	 * @param none
	 */
	closeAllCategories: function() {
		mf.searchFormScopes.tree.select('ul').each(function(el) {
			mf.searchFormScopes.removeTempItems(el.up('li'));
			el.addClass('mfClosed');
			el.up('li').child('a').replaceClass('mfCatOpen', 'mfCatClosed');
		});

		mf.searchFormScopes.tree.select('li').each(function(el) {
			mf.searchFormScopes.removeTempItems(el);
		});
			
		mf.searchFormScopes.setTreeListener(mf.searchFormScopes.tree);
	}
};

/**
 * component: search for exhibitor programs
 * @description: exhibitor program browsing with toggle functionality
 */

// init component
Ext.onReady(function() {
	mf.searchFormDirectories.init();
});


mf.searchFormDirectories = {

	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			ajaxFailure: "Connection error: exhibitor program options could not be retrieved!(x)",
			loading: "Laden...",
			info: "Weitere Unterkategorien sind nicht vorhanden."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchFormDirectories.comp = mf.components.getComp('mfContentMain', 'mfSearchFormDirectories')) {
			mf.searchFormDirectories.tree = Ext.get('mfSearchFormDirectoriesTree');
			mf.searchFormDirectories.setOverallListener();
			// inner tree toggle
			mf.searchFormDirectories.setTreeListener(mf.searchFormDirectories.tree);
		}
	},
	
	/**
	 * set event listener to trigger overall exhibitor program change (open/close)
	 * @param none
	 */
	setOverallListener: function() {
		mf.searchFormDirectories.comp.each(function(el){
			// overall toggle functions
			var toggleLinks = el.select('.mfToggle a');
			
			// close all categories
			toggleLinks.first().on('click', function() {
				mf.searchFormDirectories.closeAllCategories();
			},this,{stopEvent: true});
		});
	},
	
	/**
	 * set the toggle listener on a single exhibitor program
	 * @param ul {Ext.Element} list to set the toggle events for
	 */
	setTreeListener: function(ul) {
		ul.select('a').each(function(el) {
			if (el.up('ul') == ul) {
				mf.searchFormDirectories.setCategoryToggle(el);
			}
		});
	},

	/**
	 * setup toggle links to reflect exhibitor program state
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	setCategoryToggle: function(el) {
		// remove all formerly set listeners
		el.removeAllListeners();

		if (el.hasClass('mfCatClosed')) {
			el.on('click', function(e, t) {
				var link = Ext.get(t);
			
				if (link.up('li').child('ul')) {
					mf.searchFormDirectories.openCategory(link);
				} else {
					mf.searchFormDirectories.getCategory(link, link.dom.getAttribute('rel'));
				}
			},this,{stopEvent: true});
		} else if (el.hasClass('mfCatOpen')) {
			el.on('click', function(e, t) {
				mf.searchFormDirectories.closeCategory(Ext.get(t));
			},this,{stopEvent: true});
		} else {
			el.on('click', function(e, t) {
				mf.searchFormDirectories.createInfoMessage(Ext.get(t).up('li'));
			},this,{stopEvent: true});
		}

		// trigger product search
		el.child('span').on('click', function(e, t) {
			var target = Ext.get(t);
			var url;
			
			target.dom.nodeName == 'SPAN' ? url = target.up('a').dom.getAttribute('href') : url = target.dom.getAttribute('href');
			window.location.href = mf.searchFormDirectories.settings.searchUrl + url.substring(url.indexOf('?'), url.length);
		},this,{stopEvent: true});
	},

	/**
	 * category dropdown settings: AJAX url, max. level etc.
	 */
	settings: {
		searchUrl: mfConfig.searchFormDirectories ? mfConfig.searchFormDirectories.searchUrl : null,
		directoryUrl: mfConfig.searchFormDirectories ? mfConfig.searchFormDirectories.directoryUrl : null,
		maxLevel: 3
	},

	/**
	 * get list items of this category
	 * @param el {Ext.Element} element which triggers the toggle
	 * @param requestUrl {String} url of AJAX request
	 */
	getCategory: function(el, requestUrl) {
		var items = [];
		var li = el.up('li');

		// add loading indicator
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormDirectories.lang.cat.loading
		});

		Ext.Ajax.request({
 			disableCaching: false,
 			url: requestUrl ? mf.searchFormDirectories.settings.directoryUrl + requestUrl : mf.searchFormDirectories.settings.directoryUrl,
			success: function(response) {
				mf.searchFormDirectories.removeTempItems(li);

				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						items.push({
							tag: 'li',
							children: {
								tag: 'a',
								cls: responseText[i].subcat ? 'mfCatClosed' : '',
								href: responseText[i].url,
								rel: responseText[i].qurl,
								children: {
									tag: 'span',
									html: responseText[i].text
								}
							}
						});
					}

					mf.searchFormDirectories.createCategory(items, li);
				}
			},
			failure: function() {
				mf.searchFormDirectories.removeTempItems(li);

				Ext.DomHelper.append(li, {
					tag: 'p',
					cls: 'mfError',
					html: mf.searchFormDirectories.lang.cat.ajaxFailure
				});
			}
		});
	},

	/**
	 * creates a html list of category items
	 * @param items {Array} array of html list items
	 * @param li {Array} html list element to append items to
	 */
	createCategory: function(items, li) {
		Ext.DomHelper.append(li, {
			tag: 'ul',
			cls: 'mfClosed',
			children: items
		});

		mf.searchFormDirectories.openCategory(li.child('a'));
	},

	/**
	 * remove loading indicator and error message
	 * @param li {Ext.Element} html list element
	 */
	removeTempItems: function(li) {
		li.select('.mfLoadingIndicator').remove();
		li.select('.mfError').remove();
		
		var infoMsg = li.select('.mfInfo').first();
		if (infoMsg) {
			infoMsg.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(infoMsg){
					infoMsg.remove();
				}
			});
		}
	},

	/**
	 * create info message for last level
	 * @param li {Ext.Element} html list element
	 */
	createInfoMessage: function(li) {
		Ext.DomHelper.append(li, {
			tag: 'p',
			cls: 'mfInfo',
			html: mf.searchFormDirectories.lang.cat.info
		});
		
		window.setTimeout(function() {
			mf.searchFormDirectories.removeTempItems(li);
		}, 1000);
	},

	/**
	 * opens a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	openCategory: function(el) {
		var ul = el.up('li').child('ul');
		
		if (ul) {
			ul.removeClass('mfClosed');
			ul.slideIn('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatClosed', 'mfCatOpen');
					mf.searchFormDirectories.setCategoryToggle(toggleLink);
					mf.searchFormDirectories.setTreeListener(ul);
				}
			});
		}
	},

	/**
	 * closes a single category with a slide effect
	 * @param el {Ext.Element} element which triggers the toggle
	 */
	closeCategory: function(el) {
		var ul = el.up('li').child('ul');

		if (ul) {
			ul.slideOut('t',{
				easing: 'easeOut',
				duration: .5,
				callback: function(ul){
					ul.addClass('mfClosed');

					var toggleLink = ul.up('li').child('a');
					toggleLink.replaceClass('mfCatOpen', 'mfCatClosed');
					mf.searchFormDirectories.setCategoryToggle(toggleLink);
				}
			});
		}
	},

	/**
	 * close all categories in one attempt
	 * @param none
	 */
	closeAllCategories: function() {
		mf.searchFormDirectories.tree.select('ul').each(function(el) {
			mf.searchFormDirectories.removeTempItems(el.up('li'));
			el.addClass('mfClosed');
			el.up('li').child('a').replaceClass('mfCatOpen', 'mfCatClosed');
		});

		mf.searchFormDirectories.tree.select('li').each(function(el) {
			mf.searchFormDirectories.removeTempItems(el);
		});
			
	}
};

/**
 * component: search for fairs
 * @description: search form with AJAX featured location select
 */
// init component
Ext.onReady(function() {
	mf.searchFormFairs.init();
});
mf.searchFormFairs = {
	/**
	 * object to store localized strings
	 */
	lang: {
		cat: {
			defaultOption: "Alle",
			ajaxFailure: "Verbindungsfehler: Die Auswahlelemente konnten nicht geladen werden!",
			dateFailure: "Bitte prüfen Sie das Start- und Enddatum.",
			loading: "Laden..."
		}
	},
	/**
	 * object to store settings
	 */
	settings: {
		dateFromID: 'mfSFFDateFrom',
		dateToID: 'mfSFFDateTo',
		yearFromID: 'mfSFFYearFrom',
		yearToID: 'mfSFFYearTo',
		prefix: 'mfSFF',
		url: mfConfig.searchFormFairs ? mfConfig.searchFormFairs.continentsUrl : null
	},
	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		if (mf.searchFormFairs.comp = mf.components.getComp('mfContentMain', 'mfSearchFormFairs')) {
			mf.searchFormFairs.continents = mf.components.getComp('mfSFFFairContinent');
			mf.searchFormFairs.countries = mf.components.getComp('mfSFFFairCountry');
			mf.searchFormFairs.cities = mf.components.getComp('mfSFFFairCity');
			mf.searchFormFairs.infos = mf.components.getComp('mfSFFInfo');
			
			//set listener for continent and country select box
			mf.searchFormFairs.loadCountries(); 
			mf.searchFormFairs.loadCities(); 
			//date validator
			mf.searchFormFairs.checkDate();
		}
	},
	
	/**
	 * load countries on change
	 * @param none
	 */
	loadCountries: function() {
		if(mf.searchFormFairs.continents) {
			mf.searchFormFairs.continents.on('change', function(e, t) {
				
				// add loading indicator
				mf.searchFormFairs.createLoadingIndicator();
				
				Ext.get(t).select('option').each(function(el,col,i) {
					if (el.dom.selected) {
						//countries
						requestUrl = mfConfig.searchFormFairs.countryfolder + el.dom.value + '.html';							
						mf.searchFormFairs.countries.dom.innerHTML = "";
						mf.searchFormFairs.loadOptions(requestUrl, mf.searchFormFairs.countries);
						//cities
						if (el.dom.value == "all") {
							requestUrl = mfConfig.searchFormFairs.cityallfolder + el.dom.value + '.html';
						}
						else {
							requestUrl = mfConfig.searchFormFairs.citycontinentfolder + el.dom.value + '.html';
						}
						mf.searchFormFairs.loadOptions(requestUrl, mf.searchFormFairs.cities);
					}
				});
			});
		}
	},
	
	/**
	 * load cities on change
	 * @param {Object} 
	 */
	loadCities: function(select) {
		if(mf.searchFormFairs.countries) {
			mf.searchFormFairs.countries.on('change', function(e, t) {
				
				// add loading indicator
				mf.searchFormFairs.createLoadingIndicator();
				
				Ext.get(t).select('option').each(function(el,col,i) {
					if (el.dom.selected) {
						if (el.dom.value == "all") {
							requestUrl = mfConfig.searchFormFairs.cityallfolder + el.dom.value + '.html';
							mf.searchFormFairs.continents.select('option').each(function(el,col,i){
								if (el.dom.selected && el.dom.value != "all") requestUrl = mfConfig.searchFormFairs.citycontinentfolder + el.dom.value + '.html';
							});
						}
						else {
							requestUrl = mfConfig.searchFormFairs.citycountryfolder + el.dom.value + '.html';
						}
						mf.searchFormFairs.loadOptions(requestUrl, mf.searchFormFairs.cities);
					}
				});
			});
		}
	},
	
	/**
	 * load options from file via ajax
	 * @param string the url to load, the label and text 
	 */
	loadOptions: function(requestUrl,containerID) {
		var options = [{
			tag: 'option',
			value: 'all',
			html: mf.searchFormFairs.lang.cat.defaultOption
		}];
		options[0].selected = true;
		
		Ext.Ajax.request({
 			disableCaching: false,
			url: requestUrl ? mf.searchFormFairs.settings.url + requestUrl : mf.searchFormFairs.settings.url,
			success: function(response) {
				mf.searchFormFairs.removeTempItems();
				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);
					for (var i in responseText) {
						options.push({
							tag: 'option',
							value: i,
							html: responseText[i]
						});
					}
					containerID.dom.innerHTML = "";
					if (Ext.isIE) {
						// ie options bug
						var optionItem ="";
						for (var i=0; i < options.length; i++) {
                			optionItem = new Option('',options[i].value);
                			optionItem.appendChild(document.createTextNode(options[i].html));
                			containerID.appendChild(optionItem);
            			}
					}
					else {
						Ext.DomHelper.insertFirst(containerID, options);
					}
					//containerID.highlight('ffff9c');
				}
			},
			failure: function() {
				mf.searchFormFairs.removeTempItems();
				mf.searchFormFairs.createError(mf.searchFormFairs.lang.cat.ajaxFailure);
			}
		});
	},
	
	/**
	 * remove loading indicator and error message
	 * @param none
	 */
	removeTempItems: function() {
		mf.searchFormFairs.infos.select('.mfLoadingIndicator').remove();
		mf.searchFormFairs.infos.select('.mfError').remove();
	},
	
	/**
	 * checks the date
	 * @param none
	 */
	checkDate: function() {
		var form = mf.components.getComp('mfContentMain', 'mfSearchFormFairs form');
		var datefrom = Ext.get(mf.searchFormFairs.settings.dateFromID);
		var yearfrom = Ext.get(mf.searchFormFairs.settings.yearFromID);
		var dateto = Ext.get(mf.searchFormFairs.settings.dateToID);
		var yearto = Ext.get(mf.searchFormFairs.settings.yearToID);
		var today = new Date();
		// validate 
		form.on('submit',function(e){
			var error;
			//clear errors
			mf.searchFormFairs.removeTempItems();
			if((datefrom.dom.value == "def") && (yearfrom.dom.value == "def") && (dateto.dom.value == "def") && (yearto.dom.value == "def")) return true;
			// error check
			if (((datefrom.dom.value != "def") && (yearfrom.dom.value == "def")) || ((datefrom.dom.value == "def") && (yearfrom.dom.value != "def"))) error = true;
			if (((dateto.dom.value != "def") && (yearto.dom.value == "def")) || ((dateto.dom.value == "def") && (yearto.dom.value != "def"))) error = true;
			if(yearto.dom.value < yearfrom.dom.value) {
				if((datefrom.dom.value != "def") && (yearfrom.dom.value != "def")) error = true;
			}
			if ((parseInt(dateto.dom.value) < parseInt(datefrom.dom.value)) && (parseInt(yearto.dom.value) <= parseInt(yearfrom.dom.value))) {
				if((datefrom.dom.value != "def") && (yearfrom.dom.value != "def")) error = true;
			}
			if(parseInt(yearfrom.dom.value) < today.getFullYear()) error = true;
			if(parseInt(yearto.dom.value) < today.getFullYear()) error = true;
			//if((parseInt(datefrom.dom.value) < today.getMonth()) && parseInt(yearfrom.dom.value) <= today.getFullYear()) error = true;
			if((parseInt(dateto.dom.value) < today.getMonth()) && yearto.dom.value <= today.getFullYear()) error = true;
			if(error == true) {
				mf.searchFormFairs.createError(mf.searchFormFairs.lang.cat.dateFailure);
				e.preventDefault();
			}	
		});
	},
	
	/**
	 * create Error messages
	 * @param string error message
	 */
	createError: function(html) {
		Ext.DomHelper.append(mf.searchFormFairs.infos, {
			tag: 'p',
			cls: 'mfError',
			html: html
		});	
	},
	
	/**
	 * create Loading Indicator
	 */
	createLoadingIndicator: function() {
		Ext.DomHelper.append(mf.searchFormFairs.infos, {
			tag: 'p',
			cls: 'mfLoadingIndicator',
			html: mf.searchFormFairs.lang.cat.loading
		});
	}
};
/**
 * component: search page
 * @description: search box in main content
 */

// init component
Ext.onReady(function() {
	mf.mfSearchField.init();
});


mf.mfSearchField = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.mfSearchField.comp = mf.components.getComp('mfContentMain', 'mfSearchField')) {
			mf.mfSearchField.setSubmitListener();
		}
	},
	
	/**
	 * setup a submit listener, which gets the inputs the user has entered in the search form in the right content
	 * @param none
	 */
	setSubmitListener: function() {
		mf.mfSearchField.comp.each(function(el) {
		  el.select('form').on('submit', function(e, t) {
        if (mf.mfSearchField.advancedSearchComp = mf.components.getComp('mfContentRight', 'mfAdvancedSearch')) {
          var searchFieldForm = Ext.get(t);
          mf.mfSearchField.advancedSearchComp.each(function(e){
            e.select('form').each(function(item){
              // checkboxen
              item.select('p.mfCheckbox input').each(function(input){
                // nur einfÃ¼gen wenn noch nicht vorhanden
                // wenn checked == false und hidden input vorhanden -> entfernen                
                var found = false;
                searchFieldForm.select('input').each(function(iHidden) {
                  //if(iHidden.dom.name == input.dom.name && iHidden.dom.value == input.dom.value){
                  if(iHidden.dom.name == input.dom.name){
                    found = true;
                    if(input.dom.checked == false){
                      iHidden.remove();
                    } else {
                      iHidden.dom.value = true;	
                    }
                  }
                });
                if(found == false && input.dom.checked == true){
                	Ext.DomHelper.append(searchFieldForm, {
              		  tag: 'input',
              		  name: input.dom.name,
              		  type: 'hidden',
              		  value: input.dom.checked
                  });
                }
              });
              // selectboxen
              // wenn im rechten suchformular filter zurÃ¼ckgesetzt werden, sind selectboxen kategorie 2, 3 und 4 sowie anwendungsbereich 2, 3 und 4 nicht mehr im DOM -> hidden inputs lÃ¶schen
              item.select('p.mfSelect').each(function(sel){
                var selBox = sel.select('select').first();
                sel.select('option').each(function(option){
                  // wenn nicht selected und hidden input vorhanden -> entfernen
                  var found = false;                  
                  searchFieldForm.select('input').each(function(iHidden) {
                	  if(iHidden.dom.name == selBox.dom.name && iHidden.dom.value == option.dom.value){
                      found = true;
                      if(!option.dom.selected){
                        iHidden.remove();
                        if (iHidden.dom.name == 'sfK1') {
                          // get sfK2 sfK3 sfK4 and remove
                          for (var i = 2; i <5; i++) {
                        	var hiddenToRemove = searchFieldForm.select('input[name=sfK' + i + ']');
                          	if (hiddenToRemove) {
                          		hiddenToRemove.remove();
                          	} 
                          }                        	
                        }
                        if (iHidden.dom.name == 'sfS1') {
                          // get sfS2 sfS3 sfS4 and remove
                          for (var i = 2; i <5; i++) {
                      	    var hiddenToRemove = searchFieldForm.select('input[name=sfS' + i + ']');
                        	if (hiddenToRemove) {
                        		hiddenToRemove.remove();
                        	}
                          }                        	
                        }
                        if (iHidden.dom.name == 'sfD1') {
                          // get sfD2 sfD3 sfD4 and remove
                          for (var i = 2; i <5; i++) {
                    	    var hiddenToRemove = searchFieldForm.select('input[name=sfD' + i + ']');
                      	    if (hiddenToRemove) {
                      		  hiddenToRemove.remove();
                      	    }
                          }                        	
                        }
                      }                    
                    }
                  });                  
                  // nur einfÃ¼gen wenn noch nicht vorhanden
                  if(found == false && option.dom.selected){                    
                    Ext.DomHelper.append(Ext.get(t), {
                		  tag: 'input',
                		  name: selBox.dom.name,
                		  type: 'hidden',
                		  value: option.dom.value
                    });
                  }
                });
              });
              // text input
              item.select('p.mfInputText input').each(function(iText){
                // nur einfÃ¼gen wenn noch nicht vorhanden                
                var found = false;
                searchFieldForm.select('input').each(function(iHidden) {
                  if(iHidden.dom.name == iText.dom.name){
                    found = true;
                    iHidden.dom.value = iText.dom.value;                    
                  }
                });
                if(found == false){
                  Ext.DomHelper.append(searchFieldForm, {
              		  tag: 'input',
              		  name: iText.dom.name,
              		  type: 'hidden',
              		  value: iText.dom.value
                  });
                }
              });            
            });
          });
        }
			});
		});
	}
};

/**
 * component: search results counter
 * @description: get the number of results for the different search tabs
 */

// init component
Ext.onReady(function() {
	mf.searchResultsCounter.init();
});


mf.searchResultsCounter = {

	/**
	 * object to store localized strings
	 */
	lang: {
		results: {
			info: "Weitere Resultate wurden in den folgenden Kategorien gefunden:"
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		// result count for single tabs
		if (mfConfig.searchResultsCounter && mfConfig.searchResultsCounter.urls) {
			for (var i in mfConfig.searchResultsCounter.urls) {
				mf.searchResultsCounter.getResultsInfo(mfConfig.searchResultsCounter.urls[i]);
			}
		}
	},
	
	/**
	 * get the information about the tabindex,number of results etc.
	 * @param url {String} url of AJAX call
	 */
	getResultsInfo: function(url) {
		Ext.Ajax.request({
 			disableCaching: false,
			url: url,
			success: function(response) {
				if (response.responseText != null && response.responseText != '') {
					var responseText = Ext.util.JSON.decode(response.responseText);

					// update title
					mf.searchResultsCounter.updateTabTitle(responseText.index, responseText.results);

					// update body of search general component
					mf.searchResultsCounter.createMoreResultsHint(responseText);
					
					if (mf.contentTab && mf.contentTab.tabPanel) {
						mf.contentTab.tabPanel.autoScrollTabs();
					}
				}
			}
		});
	},

	/**
	 * create HTML in search general section, if no more than 5 results are displayed
	 * @param tabInfos {Object} object which contains tabIndex, searchResults and text
	 */
	createMoreResultsHint: function(tabInfos) {
		if (tabInfos.index != 0 && tabInfos.results > 0) {
			// get container
			var container = Ext.get('mfSearchResultsGeneral');

			if (container) {
				// create element for text and list one time
				if (container.select('.mfMoreResults').getCount() == 0) {
					Ext.DomHelper.append(container, {
						tag: 'div',
						cls: 'mfMoreResults',
						children: [{
							tag: 'p',
							html: mf.searchResultsCounter.lang.results.info
						}, {
							tag: 'ul',
							html: ''
						}]
					});
				}
	
				// append search results count
				container.select('.mfMoreResults ul').first().createChild({
					tag: 'li',
					html: tabInfos.text + ' <strong>' + tabInfos.results + ' ' + tabInfos.resultsText + '</strong>'
				});
			}
		}
	},

	/**
	 * update title of tab with number of search results
	 * @param tabIndex {Integer} index of tab
	 * @param searchResults {Integer} number of search results to display
	 */
	updateTabTitle: function(tabIndex, searchResults) {
		if (mf.contentTab && mf.contentTab.tabPanel) {
			for (var i=0; i<mf.contentTab.tabPanel.items.getCount(); i++) {
				// check if it is the correct tab
				if (i == tabIndex) {
					// get tab in tabpanel
					var tabItem = mf.contentTab.tabPanel.getItem(i);
					var tabEl = mf.contentTab.tabPanel.getTabEl(tabItem);
					// get dom element with the title
					var tabElSpans = tabEl.getElementsByTagName('span');
					var tabTitleEl;
					for (var j=0; j<tabElSpans.length; j++) {
						if (tabElSpans[j].className.indexOf('x-tab-strip-text') != -1) {
							tabTitleEl = tabElSpans[j];
						}
					}

					// update title
					tabTitleEl.innerHTML += ' (' + searchResults + ')';
				}
			}
		}
	}
}
/**
 * component: search results exhibitor
 * @description: creates a cookie with the search results URL
 */

// init component
Ext.onReady(function() {
	mf.searchResultsExhibitor.init();
});


mf.searchResultsExhibitor = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsExhibitor.comp = mf.components.getComp('mfSearchResultsExhibitor')) {
			mf.cookie.createCookie(mf.searchResultsExhibitor.settings.key, window.location.href, mf.searchResultsExhibitor.settings.exp);
		}
	},
	
	/**
	 * default settings for cookie
	 */
	settings: {
		key:'mf-search-url',
		exp: 1
	}
}
/**
 * component: MyAccount favourites link functions
 * @description: ...
 */

// init component
Ext.onReady(function() {
	mf.searchResultsExhibitorDetail.init();
});


mf.searchResultsExhibitorDetail = {

	/**
	 * object to store localized strings
	 */
	lang: {
		favorites: {
			link: "Zu Favoriten hinzufügen",
			status: "MyAccount-Favorit"
		}
	},
	
	init: function() {
		if (mf.searchResultsExhibitorDetail.comp = mf.components.getComp('mfExhibitorDetail')) {
			mf.searchResultsExhibitorDetail.initMyAccount();
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	initMyAccount: function() {
		if (mf.searchResultsExhibitorDetail.comp) {
			mf.searchResultsExhibitorDetail.getFavorites();
		}
	},

	/**
	 * add a listener to add an exhibitor to the favorite list
	 * @param none
	 */
	createFavoritesListener: function() {
		mf.searchResultsExhibitorDetail.comp.select('.mfFavorites a').on('click', function(e, t) {
			var activeFavorite = Ext.get(t).up('div');

			if (mf.myAccount.checkProtocol()) {
				mf.cookie.eraseCookie(mf.searchResultsExhibitorDetail.cookieSettings.name);
				mf.searchResultsExhibitorDetail.gatherBookmarks(activeFavorite);
			} else {
				// create cookie with exhibitor id
				mf.searchResultsExhibitorDetail.addStateCookie(activeFavorite.child('span.exhibitor').dom.innerHTML);
				// create autostart cookie
				mf.cookie.createCookie(mf.shadowbox.settings.autoStart.cookie, parent.mf.myAccount.replaceProtocol(parent.mf.myAccount.setLayerPath('login')) + mf.shadowbox.settings.autoStart.separator + 'mfMyAccountFormLogin');
				// switch protocol
				mf.myAccount.switchProtocol('https');
			}			
		},this,{stopEvent: true});
	},

	/**
	 * hide the shadowbox if open
	 * @param none
	 */
	hideShadowbox: function() {
		window.parent.Shadowbox.close();

		// get exhibitor id from cookie
		var cookieVal = mf.cookie.readCookie(mf.searchResultsExhibitorDetail.cookieSettings.name);
		if (cookieVal) {
			var cookieVals = cookieVal.split(mf.searchResultsExhibitorDetail.cookieSettings.separator);
			// remove cookie
			mf.cookie.eraseCookie(mf.searchResultsExhibitorDetail.cookieSettings.name);

			var activeFavorite;
			// get result DOM to the given exhibitor id
			mf.searchResultsExhibitorDetail.comp.select('span.exhibitor').each(function(fav) {
				if (fav.dom.innerHTML == cookieVals[0]) {
					activeFavorite = fav.up('div.mfExhibitorDetail');
				}
			});

			// add favorite
			if (activeFavorite) {
				mf.searchResultsExhibitorDetail.gatherBookmarks(activeFavorite);
			}
		}
	},
	
	/**
	 * show the processing indicator
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	showIndicator: function(activeFavorite) {
		var favLink = activeFavorite.select('.mfFavorites a').first();
		favLink.addClass('mfHd');
		
		favLink.up('p').createChild({
			tag: 'span',
			cls: 'mfProcessIndicator',
			html: parent.mf.myAccountMessages.addBookmarks.process.msg
		});
	},
	
	/**
	 * remove the processing indicator
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	removeIndicator: function(activeFavorite) {
		activeFavorite.select('.mfFavorites').each(function(el) {
			el.select('.mfProcessIndicator').remove();
			el.select('a').removeClass('mfHd');
		});
	},
	
	/**
	 * add "add to favorite" link
	 * @param container {Ext.Element} object to insert link into
	 */
	addLink: function(container) {
		Ext.DomHelper.overwrite(container, {
			tag: 'a',
			href: '#',
			html: mf.searchResultsExhibitorDetail.lang.favorites.link
		});
	},
	
	/**
	 * add all "add to favorite" links
	 * @param none
	 */
	addLinks: function() {
		var test = mf.searchResultsExhibitorDetail.comp.select('.mfFavorites');
		mf.searchResultsExhibitorDetail.comp.select('.mfFavorites').each(function(fav) {
			mf.searchResultsExhibitorDetail.addLink(fav);
		});
		//ie8 bug
		mf.searchResultsExhibitorDetail.comp.select('.mfFavorites').setStyle('background','#fff');
		mf.searchResultsExhibitorDetail.createFavoritesListener();
	},
	
	/**
	 * get the favorite list if the user is logged in
	 * @param loginStatus {Boolean} status of login
	 */
	getFavorites: function(loginStatus) {
		mf.searchResultsExhibitorDetail.addLinks();
	},

	/**
	 * gather bookmarks from DOM
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	gatherBookmarks: function(activeFavorite) {
		var bookmarks = new Array();
		
		//var exhibition = activeFavorite.child('.mfResultLink span.mfHd');
		var exhibition = activeFavorite.child('span.exhibition');
		var exhibitor = activeFavorite.child('span.exhibitor');
		if (exhibitor && exhibitor.dom.innerHTML != '' && exhibition && exhibition.dom.innerHTML != '') {
			console.log('### bookmarks.push: ' + exhibitor.dom.innerHTML + ':' + exhibition.dom.innerHTML);
			bookmarks.push(exhibitor.dom.innerHTML + ':' + exhibition.dom.innerHTML);
			//bookmarks.push(exhibition.dom.innerHTML);
		}

		if (bookmarks.length == 0) {
			mf.myAccount.showMessage('addBookmarks.error.headline', 'addBookmarks.error.msg1', true);
			activeFavorite.select('.mfFavorites a').remove();
		} else {
			mf.searchResultsExhibitorDetail.showIndicator(activeFavorite);
			mf.myAccount.getLoginStatus('mf.searchResultsExhibitorDetail.addFavorite', {
				activeFavorite: activeFavorite,
				bookmarks: bookmarks
			}); // user logged in ?
		}
	},

	/**
	 * add selected items to favorite list
	 * @param loginStatus {Boolean} status of login
	 * @param funcParams {Object} contains function parameters
	 */
	addFavorite: function(loginStatus, funcParams) {
		if (loginStatus) {
			// create store for ldap results
			var store = parent.mf.myAccount.prepareStore('addBookmarks', [
				{name: 'addedBookmarks'},
				{name: 'storedBookmarks'}
			]);

			store.load({
				params: {
					bookmarks: funcParams.bookmarks
				},
				callback: function() {
					try {
						var result = store.getAt(0);
						if (result) {
							var favContainer = funcParams.activeFavorite.select('.mfFavorites').first();
	
							if (result.data.operation == 'successful') {
								if (result.data.addedBookmarks == 0) {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.success.msg3
									});
								} else {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.success.msg1 + ' ' + mf.myAccountMessages.addBookmarks.success.msg2 + '<strong>' + result.data.storedBookmarks + '</strong>'
									});
								}
		
								favContainer.highlight('ffff9c', {
									duration: 3,
									callback: function() {
										Ext.DomHelper.overwrite(favContainer, {
											tag: 'span',
											html: mf.searchResultsExhibitorDetail.lang.favorites.status
										});
									}
								});
							} else {
								if (result.data.errorcode == '4') {
									mf.searchResultsExhibitorDetail.openLogin(funcParams.activeFavorite, 'm4');
								} else {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.error.msg2
									});
									
									window.setTimeout(function() {
										favContainer.select('span').remove();
									}, 3000);
								}
							}
						} else {
							mf.myAccount.showMessage('addBookmarks.error.headline', 'g1', true);
						}
						mf.searchResultsExhibitorDetail.removeIndicator(funcParams.activeFavorite);
					} catch(e) {}
				}
			}); 
		} else { // open login form
			mf.searchResultsExhibitorDetail.openLogin(funcParams.activeFavorite);
		}
	},

	/**
	 * settings for favorites cookie
	 */
	cookieSettings: {
		name: 'mf-favorites-state',
		separator: '|',
		duration: 0.01389 // approx. 20 min.
	},

	/**
	 * cookie to store information about the selected exhibitor
	 * @param exhibitorId {String} if of  exhibitor
	 * @param errorcode {String} errorcode to be displayed in login layer
	 */
	addStateCookie: function(exhibitorId, errorcode) {
		var cookieText = exhibitorId;
		if (errorcode) {
			cookieText += mf.searchResultsExhibitorDetail.cookieSettings.separator + errorcode;
		}
		mf.cookie.createCookie(mf.searchResultsExhibitorDetail.cookieSettings.name, cookieText, mf.searchResultsExhibitorDetail.cookieSettings.duration);
	},

	/**
	 * remove the processing indicator and open a login layer
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	openLogin: function(activeFavorite) {
		mf.searchResultsExhibitorDetail.removeIndicator(activeFavorite);
		mf.searchResultsExhibitorDetail.addStateCookie(activeFavorite.child('span.exhibitor').dom.innerHTML);

		var mfMergedOptions = mf.array.mergeObjects(parent.mf.shadowbox.options, parent.mf.shadowbox.getSpecificOptions('mfMyAccountFormLogin'));
		Shadowbox.open(mf.array.mergeObjects(mfMergedOptions, {
			content: parent.mf.myAccount.setLayerPath('login')
		}), mfMergedOptions);
	}
};
/**
 * component: search results fairs
 * @description: creates a cookie with the search results URL
 */

// init component
Ext.onReady(function() {
	mf.searchResultsFairs.init();
});

mf.searchResultsFairs = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsFairs.comp = mf.components.getComp('mfContentMain','mfContentTeaserEvent.mfEventSearchResult')) {
			var links = mf.components.getComp('mfContentMain','mfContentTeaserEventInfos p.mfText a');
			links.on('click',function() {
				mf.cookie.createCookie(mf.searchResultsFairs.settings.key, window.location.href, mf.searchResultsFairs.settings.exp);
			});
		}
	},
	
	/**
	 * default settings for cookie
	 */
	settings: {
		key:'mf-search-fairs-url',
		exp: 1
	}
}
/**
 * component: search results fairs
 * @description: creates a cookie with the search results URL
 */

// init component
Ext.onReady(function() {
	mf.searchResultsEvents.init();
});

mf.searchResultsEvents = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsEvents.comp = mf.components.getComp('mfSearchResultsEvents')) {
			var links = mf.searchResultsEvents.comp.select('h3.mfResultLink a');
			links.on('click',function() {
				mf.cookie.createCookie(mf.searchResultsEvents.settings.key, window.location.href, mf.searchResultsEvents.settings.exp);
			});
		}
	},
	
	/**
	 * default settings for cookie
	 */
	settings: {
		key:'mf-search-events-url',
		exp: 1
	}
}
/**
 * component: search results products
 * @description: adds functionality to load product details via XHR
 */

// init component
Ext.onReady(function() {
	mf.searchResultsProducts.init();
});


mf.searchResultsProducts = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsProducts.storedResults) {
			mf.searchResultsProducts.displayDOM();
		}

		if (mf.searchResultsProducts.comp = mf.components.getComp('mfSearchResultsProducts')) {
			if (mf.pageTitleExhibitor.comp) {
				if (mfConfig.searchResultsProducts && mfConfig.searchResultsProducts.url) {
					mf.searchResultsProducts.loadContent(mfConfig.searchResultsProducts.url);
					mfConfig.searchResultsProducts.url = null;
				} else {
					mf.searchResultsProducts.setXhrListener();
				}
			} else {
				mf.cookie.createCookie(mf.searchResultsExhibitor.settings.key, window.location.href, mf.searchResultsExhibitor.settings.exp);
			}
		}
	},

	/**
	 * adds an onclick listener to load the corresponding product details via XHR
	 * @param none
	 */
	setXhrListener: function() {
		mf.searchResultsProducts.comp.select('.mfResultLink a').on('click', function(e, t) {
			// load new content into search results container
			mf.searchResultsProducts.loadContent(Ext.get(t).dom.href);
		},this,{stopEvent: true});

		mf.searchResultsProducts.comp.select('.mfImage a').on('click', function(e, t) {
			var el = Ext.get(t);
			if (el.dom.tagName != 'A') {
				el = el.up('a');
			}
			// load new content into search results container
			mf.searchResultsProducts.loadContent(el.dom.href);
		},this,{stopEvent: true});
	},

	/**
	 * store old content and load new content into search results container
	 * @param url {String} url of AJAX call
	 */
	loadContent: function(url) {
		// store results container
		mf.searchResultsProducts.storedResults = mf.searchResultsProducts.comp.dom.innerHTML;

		mf.searchResultsProducts.comp.load({
			nocache: false,
			url: url,
			callback : mf.searchResultsProductsDetail.init
		});
	},

	/**
	 * property to store the current search results
	 */
	storedResults: null
	,

	/**
	 * display the stored search results
	 */
	displayDOM: function() {
		if (mf.searchResultsProducts.comp) {
			mf.searchResultsProducts.comp.dom.innerHTML = mf.searchResultsProducts.storedResults;
			mf.searchResultsProducts.storedResults = null;
		}
	}
}
/**
 * component: product details view
 * @description: registers initialize function for product search results on back link
 */

mf.searchResultsProductsDetail = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsProductsDetail.comp = mf.components.getComp('mfSearchResultsProductsDetail')) {
			mf.searchResultsProductsDetail.setListener();
			mf.shadowbox.init();
			mf.images.init(); //inits the pager for multible images after ajax call
		}
	},
	
	/**
	 * adds an onclick listener to load the stored search results again
	 * @param none
	 */
	setListener: function() {
		mf.searchResultsProductsDetail.comp.select('.mfLink a').on('click', mf.searchResultsProducts.init, this, {stopEvent: true});
	}
}
/**
 * component: search results exhibitor news
 * @description: creates a cookie with the search results URL
 */

// init component
Ext.onReady(function() {
	mf.searchResultsExhibitornews.init();
});

mf.searchResultsExhibitornews = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.searchResultsExhibitornews.comp = mf.components.getComp('mfContentMain','mfExhibitorNewsList')) {
			var links = mf.components.getComp('mfContentMain','mfExhibitorNewsList p a');
			links.on('click',function() {
				mf.cookie.createCookie(mf.searchResultsExhibitornews.settings.key, window.location.href, mf.searchResultsExhibitornews.settings.exp);
			});
		}
	},
	
	/**
	 * default settings for cookie
	 */
	settings: {
		key:'mf-search-exnews-url',
		exp: 1
	}
}
/**
 * component: social media share privacy
 * @description: 2 click embedding of social media button for more privacy
 */
// init component

Ext.onReady(function() {
	mf.share.init();
});

mf.share = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.share.comp = mf.components.getComp('mfContentMain', 'mfShare')) {
			mf.share.createTooltips();
			mf.share.setShareListener();
			
		}
	},
	
	/**
     * creates a tooltip
     * @param none
     * @return {Ext.CompositeElement} collection of HTML container, with the class "mfShare"
     */
    createTooltips: function() {
        mf.share.comp.each(function(el) {
			
            el.tooltips = new Object();
            el.select('ul[class=mfCl] li').each(function(shareEl,ths,index) {
                var tipEl = shareEl.select('p[class=tooltip]').first();
                if(tipEl) {
                    var tipBody = tipEl.dom.innerHTML;
                    var tipName = shareEl.dom.getAttribute('class');
                    
                    el.tooltips[index] = new Ext.ToolTip({
                        baseCls: 'tooltip',
                        target: shareEl,
                        dismissDelay: 0, //default 5000
                        hideDelay: 200, //default 200
                        showDelay: 100, //default 500
                        html: tipBody,
                        floating: true,
                        shadow: "frame",
                        shim: true,
                        shadowOffset: 5,
                        width: 325,
                        renderTo: el,
                        getTargetXY: function() {
                            return el.getAlignToXY(el, 'bl-tl',[31, 43-this.el.getHeight()]);
                        }
                    });
                 }
            });
            Ext.QuickTips.init();
            
        });
    },
    /**
     * set listener on links and create or remove iframe
     * @param none
     */
    setShareListener: function() {
        mf.share.comp.each(function(el) {
            el.select('ul[class=mfCl] li').each(function(shareEl,ths,index) {
                shareEl.on('click', function(e, t) {
                    var container = Ext.get(t).up('li');
                    var span = container.down('.switch');
                    var img = container.down('img');
                    
                    // iframe off, show on click
                    if(span && span.hasClass('off')) {
                        span.addClass('on').removeClass('off');
                        Ext.DomHelper.overwrite(span,'on');
                        var html = mf.share.getShareCode(Ext.get(t).up('li'));
                        var iframe = container.insertHtml('beforeEnd',html,true);
                        img.setStyle('display','none');

                        el.tooltips[index].disable();
                        el.tooltips[index].hide();
                        // disabling only doesnt work consistent
                        el.tooltips[index].showDelay = 100000;
                    }
                    // iframe on, delete on click
                    else if (span && span.hasClass('on')) {
                        span.addClass('off').removeClass('on');
                        Ext.DomHelper.overwrite(span,'off');
                        img.show();
                        container.select('iframe').remove();
                        el.tooltips[index].enable();
                        el.tooltips[index].showDelay = 100;
                    }
                },this,{stopEvent: true});
            });
        });
    },
    /**
     * get share code
     * @param {Object} el - current element
     * @return 
     */
    getShareCode: function(el) {
        var iframehtml = el.select('textarea').first();
        return (iframehtml)? iframehtml.getValue() : '';
    }

}

/**
 * component: tool box
 * @description: tool box in right content column (assistant, advanced search ..)
 */

// init component
Ext.onReady(function() {
	mf.rightToolbox.init();
});


mf.rightToolbox = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightToolbox.comp = mf.components.getComp('mfContentRight', 'mfRightToolBox')) {
			mf.rightToolbox.comp.boxWrap('mfBoxShadow');
			mf.rightToolbox.slideStart();
			mf.rightToolbox.addSlideEvent();
		}
	},
	
	/**
	 * slides boxes and hide at startup (for non js users)
	 * @param none
	 */
	slideStart: function() {
		mf.rightToolbox.comp.each(function(el){
			el.select('div.mfBox').each(function(item){
				// some boxes open on startup ?
				if(!item.hasClass('mfIsOpen')) {
					item.slideOut('t', {
						useDisplay: true,
						duration: 0.0001,
						remove: false
					});
				}
			});
		});
	},

	/**
	 * adds the sliding event to the link in the box header
	 * @param none
	 */
	addSlideEvent: function() {
		mf.rightToolbox.comp.each(function(el){
			el.select('h3 a').on('click', function(e, t){
				// toggle icon
				mf.rightToolbox.toggleLinkIcon(Ext.get(e.getTarget('a')));
				// slide effect
				var box = Ext.get(t).up('div.mfRightToolBox').select('div.mfBox').first();
				mf.rightToolbox.slide(box);
			});
		});
	},
	
	/**
	 * toggle the class of the link icon in the box header
	 * @param link {HTMLLinkElement} the link
	 */
	toggleLinkIcon: function(link) {
		link.toggleClass('mfUp');
	},
	
	/**
	 * animation to slide the box in or out
	 * @param box {Ext.Element} the box to slide
	 */
	slide: function(box) {
		if (box) {
			box.stopFx();
			//slide out
			if (box.hasClass('mfIsOpen')) {
				box.removeClass('mfIsOpen');
				box.slideOut('t',{
					useDisplay: true,
					easing: 'easeIn'
				});
			}
			//slide in
			else {
				box.slideIn('t',{
					callback: function() {
						box.repaint();
						box.addClass('mfIsOpen');
					},
					easing: 'easeIn'
				});
			}
		}
	},
	
	/**
	 * hide - for non-js user the boxes stays expanded
	 * @param none
	 */
	hide: function() {
		mf.rightToolbox.comp.each(function(el) {
			 el.select('div.mfBox').addClass('mfHd');
		});
	}
};

/**
 * component: right teaser
 * @description: adds shadows around the teaser box
 */

// init component
Ext.onReady(function() {
	mf.rightTeaser.init();
});


mf.rightTeaser = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightTeaser.comp = mf.components.getComp('mfContentRight', 'mfRightTeaser')) {
			mf.rightTeaser.comp.boxWrap('mfBoxShadow');
		}
	}
}
/**
 * component: right info
 * @description: adds shadows around the info box
 */

// init component
Ext.onReady(function() {
	mf.rightInfo.init();
});


mf.rightInfo = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightInfo.comp = mf.components.getComp('mfContentRight', 'mfRightInfo')) {
			mf.rightInfo.comp.boxWrap('mfBoxShadow');
		}
	}
}
/**
 * component: right teaser download
 * @description: adds shadows around the teaser box
 */

// init component
Ext.onReady(function() {
	mf.rightTeaserDownload.init();
});


mf.rightTeaserDownload = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightTeaserDownload.comp = mf.components.getComp('mfContentRight', 'mfRightTeaserDownload')) {
			mf.rightTeaserDownload.comp.boxWrap('mfBoxShadow');
			mf.rightTeaserDownload.createTooltips();
		}
	},
	
	/**
	 * creates the tooltips
	 * @param none
	 * @return {Ext.CompositeElement} collection of HTML container, with the class "mfRightTeaserDownload"
	 */
	createTooltips: function() {
		mf.rightTeaserDownload.comp.each(function(el) {
			var tipTarget = el.select('p a').first();
			var url = tipTarget.dom.getAttribute('rel');
			if (url && url.indexOf('#') == -1) {
				new Ext.ToolTip({
					target: tipTarget,
					width: 300,
					dismissDelay: 0, //default 5000
					hideDelay: 0, //default 200
					showDelay: 100, //default 500
					autoLoad: {
						url: url
					},
					trackMouse: true,
					shadow: "frame",
					shadowOffset: 5,
					floating: true
				});
			}
			Ext.QuickTips.init();
		});
	}
}
/**
 * component: assistant
 * @description: adds toogle functionality to FAQ links
 */

// init component
Ext.onReady(function() {
	mf.rightAssistant.init();
});


mf.rightAssistant = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightAssistant.comp = mf.components.getComp('mfContentRight', 'mfAssistant')) {
			mf.rightAssistant.comp.each(function(el) {
				el.select('.mfFAQ p:first-child a').on('click', function(e, t){
					Ext.get(t).up('div.mfFAQ').down('p.mfText').toggleClass('mfHd');
				}, this, {stopEvent: true});
			});
		}
	}
}
/**
 * component: advanced search
 * @description: filter box in right content column
 */

// init component
Ext.onReady(function() {
	mf.rightAdvancedSearch.init();
});


mf.rightAdvancedSearch = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightAdvancedSearch.comp = mf.components.getComp('mfContentRight', 'mfAdvancedSearch')) {
			mf.rightAdvancedSearch.checker();

			mf.rightAdvancedSearch.setFairListener();
			mf.rightAdvancedSearch.getCategories();
			mf.rightAdvancedSearch.setSubmitListener();
			mf.rightAdvancedSearch.setResetListener();
		}
	},
	
	/**
	 * check or uncheck all checkboxes in container
	 * @param none
	 */
	checker: function()  {
		mf.rightAdvancedSearch.comp.each(function(el) {
			el.select('p.mfChecker a').on('click', function(e, t){
				//check
				if(Ext.get(t).dom.className == "mfCheck") {
					Ext.get(t).up('div.mfAdvancedSearch').select('p.mfCheckbox input').each(function(el){
						el.dom.checked = true;
					});
				}
				//uncheck
				else {
					Ext.get(t).up('div.mfAdvancedSearch').select('p.mfCheckbox input').each(function(el){
						el.dom.checked = false;
					});
				}
			},this,{stopEvent: true});
		});
	},

	/**
	 * sets a listener on the fair selector to submit the form and optionally to remove form fields
	 * @param none
	 */
	setFairListener: function() {
		if (Ext.get('mfSFEFairs')) {
			Ext.get('mfSFEFairs').on('change', function(e, t) {
				var searchForm = Ext.get(t).up('form');

				// remove form fields for advanced search exhibitor
				if (searchForm.up('div.mfAdvancedSearch').hasClass('mfAdvancedSearchExhibitor')) {
					searchForm.select('h4').remove();
					searchForm.select('div').remove();

					searchForm.select('.mfSelect').each(function(el) {
						if (el.select('select').first().dom.id != 'mfSFEFairs') {
							el.remove();
						}
					});

					searchForm.select('.mfInputText').remove();
				}

				// trigger submit event
				var evt;
				if (document.createEvent) {
					evt = document.createEvent("Events"); 
					evt.initEvent('submit', true, true); 
					searchForm.dom.dispatchEvent(evt); 
				} else if (document.createEventObject) { 
					evt = document.createEventObject(); 
					searchForm.dom.fireEvent('onsubmit', evt); 
				} 
			});
		}
	},

	/**
	 * get all product categories
	 * @param none
	 */
	getCategories: function() {
		mf.rightAdvancedSearch.comp.each(function(el) {
			if (el.hasClass('mfAdvancedSearchExhibitor')) {
				mf.searchFormExhibitor.categoryContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdProductCategories);
				mf.searchFormExhibitor.scopeContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdScopes);
				mf.searchFormExhibitor.directoryContainer = Ext.get(mf.searchFormExhibitor.settings.containerIdDirectories);

				if (mf.searchFormExhibitor.categoryContainer) {
					mf.searchFormExhibitor.autoFillCategories();
				}
				if (mf.searchFormExhibitor.scopeContainer) {
					mf.searchFormExhibitor.autoFillScopes();
				}
				if (mf.searchFormExhibitor.directoryContainer) {
					mf.searchFormExhibitor.autoFillDirectories();
				}
			}
		});
	},
	
	/**
	 * reset inputs
	 * @param none
	 */
	resetInputs: function() {
		// reset text inputs and checkboxes
		mf.rightAdvancedSearch.comp.each(function(el) {
		  el.select('p.mfInputText input').each(function(iText){
		    iText.dom.value = '';
		  });
		  el.select('p.mfCheckbox input').each(function(iBox){
			  iBox.dom.checked = false;
		  });
		});
		// reset select box mfSFECountry & mfSFELocation
		if(Ext.get('mfSFECountry')){
      Ext.get('mfSFECountry').select('option').each(function(option){
		    // 'Alle'
        if(option.dom.value == ''){
		      option.dom.selected = true;
		    } else {
          option.dom.selected = false;
        }
		  });
		}
		if(Ext.get('mfSFELocation')){
      Ext.get('mfSFELocation').select('option').each(function(option){
		    // 'Alle'
        if(option.dom.value == ''){
		      option.dom.selected = true;
		    } else {
          option.dom.selected = false;
        }
		  });
		}
		// reset product categories
    mf.searchFormExhibitor.resetCategories();		
    mf.searchFormExhibitor.resetScopes();
    mf.searchFormExhibitor.resetDirectories();
	},

	/**
	 * setup a submit listener, which gets the text input, the user has entered in the search form in the main content
	 * @param none
	 */
	setSubmitListener: function() {
		mf.rightAdvancedSearch.comp.each(function(el) {
			el.select('form').on('submit', function(e, t) {
				if (Ext.get('mfSearchFieldInput')) {
					Ext.get(t).select('input').each(function(input) {
						if (input.dom.name == 'q') {
							input.dom.value = Ext.get('mfSearchFieldInput').dom.value;
						}
					});
				}
			});
		});
	},
	
	/**
	 * remove all category select fields and create the first one with the default values
	 * @param none
	 */
	setResetListener: function() {
		mf.rightAdvancedSearch.comp.each(function(el) {
		  if (el.hasClass('mfAdvancedSearchExhibitor')) {
		    //el.select('.mfSubmitBlock a').on('click', mf.searchFormExhibitor.resetCategories, this, {stopEvent: true});
		    el.select('.mfResetter a').on('click', mf.rightAdvancedSearch.resetInputs, this, {stopEvent: true});
		  }
		});
	}
};

/**
 * component: advanced search
 * @description: filter box in right content column
 */

// init component
Ext.onReady(function() {
	mf.rightExhibitorNewsSearch.init();
});


mf.rightExhibitorNewsSearch = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.rightExhibitorNewsSearch.comp = mf.components.getComp('mfContentRight', 'mfRightSearchFormExhibitorNews')) {

			mf.rightExhibitorNewsSearch.getCategories();
			//mf.rightExhibitorNewsSearch.setSubmitListener();
		}
	},

	/**
	 * get all product categories
	 * @param none
	 */
	getCategories: function() {
		mf.rightExhibitorNewsSearch.comp.each(function(el) {
			if (el.hasClass('mfRightSearchFormExhibitorNews')) {
				mf.searchFormExhibitorNews.categoryContainer = Ext.get(mf.searchFormExhibitorNews.settings.containerId);

				if (mf.searchFormExhibitorNews.categoryContainer) {
					mf.searchFormExhibitorNews.autoFillCategories();
				}
			}
		});
	}
};

/**
 * component: webcam
 * @description: reloads the webcam images in a certain time interval
 */

// init component
Ext.onReady(function() {
	mf.webcam.init();
});


mf.webcam = {

	/**
	 * initialize function
	 */
	init: function() {
		if(mf.webcam.comp = mf.webcam.getComp()) {
			mf.webcam.reload();
			if (Ext.getBody().hasClass('mfPageLayer')) {
				mf.webcam.comp.on('click', function() {
					mf.closeLink.closeShadowbox();
				});
				mf.webcam.resize();
			}
		}
	},
	
	/**
	 * selects the component
	 * @param none
	 * @return Ext.CompositeElement
	 */
	getComp: function() {
		return Ext.getBody().select('.mfWebcam img');
	},

	/**
	 * initialize function
	 */
	reload: function() {
		var now = null;
		mf.webcam.comp.each(function(el) {
			window.setInterval(function() {
				now = (new Date()).getTime();
				el.dom.src = el.dom.src.split('?')[0] + "?c=" + now;
			}, mf.webcam.getInterval());
		});
	},
	
	/**
	 * sets the interval for the webcam reload in milliseconds
	 * if the parameter could not be retrieved it uses a fallback
	 * @param none
	 */
	getInterval: function() {
		var mfWebcamInterval = parseInt('60000');
		return isNaN(mfWebcamInterval) ? 5000 : mfWebcamInterval;
	},

	/**
	 * resizes the shadowbox to iframe height
	 * @param none
	 */
	resize: function() {
		var imgSize = mf.webcam.comp.first().getSize();
		if (imgSize.width == 0 || imgSize.height == 0) {
			window.clearTimeout();
			window.setTimeout(mf.webcam.resize, 100);
		} else {
			var bodySize = Ext.getBody().getSize();
			parent.mf.shadowbox.resize(imgSize.width, bodySize.height);
		}
	}
}
/**
 * component: right teaser
 * @description: adds shadows around the download counter box
 */

// init component
Ext.onReady(function() {
	mf.rightDownloadCounter.init();
});


mf.rightDownloadCounter = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		var dom =  Ext.DomHelper;
		if (mf.rightDownloadCounter.comp = mf.components.getComp('mfContentRight', 'mfRightDownloadCount')) {		
			if (cookie = mf.cookie.readCookie('mfDownloads')) {
				var images = cookie.split('#').length - 1;
				dom.overwrite('mfRightDownloadCount','<b>' + images + '</b>');
			} 
			else {
				dom.overwrite('mfRightDownloadCount','<b>0</b>');
			}
		}
	}
}

/**
 * component: languageSwitcher
 * @description: modifies display of language selection
 */

// init component
Ext.onReady(function() {
	mf.languageSwitcher.init();
});

mf.languageSwitcher = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.languageSwitcher.comp = mf.components.getComp('mfLanguageSwitcher')) {
			mf.languageSwitcher.comp.down('ul.mfHNav').addClass('mfLanguageListDynamic');
			mf.languageSwitcher.createNavigation();
			mf.languageSwitcher.comp.down('a.mfGoDown').on('click', function() {
				mf.languageSwitcher.expand();
			},this,{stopEvent: true}); //open
			mf.languageSwitcher.comp.down('a.mfGoLeft').on('click', function() {
				mf.languageSwitcher.slide('left');
			},this,{stopEvent: true}); //navigate
			mf.languageSwitcher.comp.down('a.mfGoRight').on('click', function() {
				mf.languageSwitcher.slide('right');
			},this,{stopEvent: true}); //close
			mf.languageSwitcher.comp.select('li a').on('click', function() {
				mf.languageSwitcher.expand();
			},this,{stopEvent: true});
			mf.languageSwitcher.setMouseMoveListener();
		}
	},
	
	/**
	 * set mouse move event listener for list links
	 * @param none
	 */
	setMouseMoveListener: function() {
		mf.languageSwitcher.comp.select('li a').on({
			'mouseover': function(e, t) {
				var targetObj = Ext.get(t);
				var img = targetObj;
				if (targetObj.dom.tagName != 'IMG') {
					img = targetObj.select('img', true).first();
				}
				if (img.dom.src.indexOf('active') == -1) {
					img.dom.src = img.dom.src.replace(/(flag_[a-zA-Z]{2})/g, "$1_active");
				}
			},
			'mouseout': function(e, t) {
				var targetObj = Ext.get(t);
				var img = targetObj;
				if (targetObj.dom.tagName != 'IMG') {
					img = targetObj.select('img', true).first();
				} else {
					targetObj = targetObj.findParent('a', 2, true);
				}
				if (!targetObj.hasClass('mfActive') && img.dom.src.indexOf('active') != -1) {
					img.dom.src = img.dom.src.replace(/(flag_[a-zA-Z]{2})_active/g, "$1");
				}
			}
		});
	},
	
	/**
	 * Creates the link elements to open the language list and navigate through it
	 * @param none
	 */
	createNavigation: function() {
		Ext.DomHelper.insertFirst(mf.languageSwitcher.comp, {
			tag: 'a', cls: 'mfGoLeft', href: '#'
		});
		Ext.DomHelper.append(mf.languageSwitcher.comp, [
			{tag: 'a', cls: 'mfGoRight', href: '#'},
			{tag: 'a', cls: 'mfGoDown', href: '#'}
		]);
	},
	
	/**
	 * expand the switcher with an animation and change the css styles
	 * @param none
	 */
	expand: function() {
		var links = mf.languageSwitcher.comp.select('li a');
		links.removeAllListeners();
		links.on('click', mf.languageSwitcher.close);

		var count = mf.languageSwitcher.comp.select('li', true).getCount();

		// hide mfToolbarNav
		mf.languageSwitcher.hideToolbarNav();
		
		if (count <= 6) {
			var width = (Ext.isIE6 || Ext.isIE7) ? count * 52 + 17 : count * 52 + 9;
			mf.languageSwitcher.setListWidth(width, function() {
				var downLink = mf.languageSwitcher.comp.down('a.mfGoDown');
				downLink.removeAllListeners();
				downLink.on('click', mf.languageSwitcher.close);
			});
		} else {
			mf.languageSwitcher.setListWidth(325, function() {
				mf.languageSwitcher.comp.down('a.mfGoDown').setStyle('display', 'none');
				mf.languageSwitcher.comp.down('a.mfGoLeft').setStyle('display', 'block');
				mf.languageSwitcher.comp.down('a.mfGoRight').setStyle('display', 'block');
			});
		}
	},
	
	/**
	 * close the switcher
	 * @param none
	 */
	close: function() {
		mf.languageSwitcher.comp.down('a.mfGoLeft').setStyle('display', 'none');

		var links = mf.languageSwitcher.comp.select('li a');
		links.removeAllListeners();
		links.on('click', mf.languageSwitcher.expand);

		var downLink = mf.languageSwitcher.comp.down('a.mfGoDown');
		downLink.removeAllListeners();
		downLink.on('click', mf.languageSwitcher.expand);

		mf.languageSwitcher.setListWidth(59, function() {
			mf.languageSwitcher.comp.down('a.mfGoRight').setStyle('display', 'none');
			mf.languageSwitcher.comp.down('a.mfGoDown').setStyle('display', 'block');
			// show mfToolbarNav
			mf.languageSwitcher.showToolbarNav();
			
		});
	},
	
	/**
	 * sets the width of the list with the languages
	 * @param width {Int} the targeted width of the list
	 * @param func {Function} the function to execute as callback after the animation has finished
	 */
	setListWidth: function(width, func) {
		var ul = mf.languageSwitcher.comp.down('ul.mfHNav');
		var cookieValue =  parseInt(mf.cookie.readCookie('mf-font-size')) || 10;
		width = parseInt(width * cookieValue / 10);

		ul.setWidth(width, {
			animate: true,
			duration: (Ext.isIE6 || Ext.isIE7) ? 1.2 : .7,
			easing: 'easeOut',
			callback: function() {
				func();
				mf.languageSwitcher.setMouseMoveListener();
				//set px in em -> ie6 browser scale
				ul.setStyle('width',(width/cookieValue) + 'em');
			}
		});
	},
	
	/**
	 * slides the countrys left or right
	 * @param direction {String} left or right slide direction
	 */
	slide: function(direction) {
		var list = mf.languageSwitcher.comp.select('li', true);
		if (direction == 'left') {
			list.last().insertBefore(list.first().dom);
		} else {
			list.first().insertAfter(list.last().dom);
		}
	},
	
	/**
	 * show the toolbar navigation
	 * @param none
	 */
	showToolbarNav: function() {
		if (Ext.get('mfToolbarNav')) {
			Ext.get('mfToolbarNav').setStyle('display', 'block');
		}
	},

	/**
	 * hide the toolbar navigation
	 * @param none
	 */
	hideToolbarNav: function() {
		if (Ext.get('mfToolbarNav')) {
			Ext.get('mfToolbarNav').setStyle('display', 'none');
		}
	}
};


      
			/**
 * component: myaccount system messages
 * @description: international error, success and process messages
 */

mf.myAccountMessages = {
	
	/**
	 * get the text to a given message code
	 * @param code {String} errorcode
	 * @return {String} text
	 */
	getMessage: function(code) {
		var text = eval('this.' + code);

		if (typeof(text) == 'object') {
			text = eval('this.' + text.mapping);
		}

		return text;
	},

	/**
	 * error messages (LDAP)
	 */
	m1  : {mapping: 'g1'},
	m2  : {mapping: 'g1'},
	m3  : {mapping: 'g1'},
	m4  : "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
	m10 : {mapping: 'g1'},
	m11 : {mapping: 'g1'},
	m12 : {mapping: 'g1'},
	m13 : {mapping: 'g1'},
	m14 : {mapping: 'g1'},
	m20 : "Es ist ein Fehler in Ihren MyAccount-Daten aufgetreten. Bitte rufen Sie die Hotline an.",
	m21 : {mapping: 'g1'},
	m30 : "Ihr Account ist im Moment gesperrt. Bitte rufen Sie die Hotline an und lassen Ihren MyAccount wieder freischalten. Helpline: +49 69 7575 5000",
	m50 : "Ihre Angaben sind noch nicht vollständig. Bitte prüfen Sie, ob Sie alle Pflichtfelder ausgefüllt haben.",
	m51 : "Ihre Angaben enthalten noch Fehler. Bitte prüfen Sie, ob Sie alle Anforderungen an das Format der Daten beachtet haben.",
	m100: "Die E-Mail-Adresse ist bereits vergeben und kann deshalb nicht genutzt werden.",
	m200: "Sie sind bereits angemeldet.",
	m201: "Ihr MyAccount ist noch nicht freigeschaltet, bitte klicken Sie auf den Aktivierungslink in der E-Mail.",
	m202: "Die Kombination aus Benutzername und Passwort ist falsch.",
	m203: {mapping: 'g1'},
	m300: "Ihr Account ist bereits aktiviert.",
	m400: "Ihre alten und neuen Daten sind gleich. Änderungen sind deshalb nicht erforderlich.",
	m401: "Das alte Passwort ist falsch. Änderungen können nur mit dem gültigen alten Passwort durchgeführt werden.",

	/** 
	 * error messages (generic)
	 */
	g1: "<strong>Verbindungsfehler:</strong> Der MyAccount Service ist zurzeit leider nicht erreichbar! Ihre Aktion konnte nicht durchgeführt werden. Bitte versuchen Sie es zu einem späteren Zeitpunkt noch einmal. Vielen Dank!",

	/** 
	 * login
	 */
	login: {
		process: {
			msg1: "MyAccount wird geladen...",
			msg2: "Ihre Anmeldedaten werden geprüft. Bitte warten Sie..."
		},
		success: {
			msg: "Sie sind angemeldet."
		},
		error: {
			headline: "Anmeldung nicht erfolgreich"
		}
	},
	
	/** 
	 * logout
	 */
	logout: {
		process: {
			msg: "Ihre Abmeldung läuft. Bitte warten Sie..."
		},
		error: {
			headline: "Abmeldung nicht erfolgreich"
		}
	},
	
	/**
	 * register
	 */
	register: {
		success: {
			headline: "Registrierung erfolgreich",
			msg: "Ihre Registrierung war erfolgreich. Wir senden Ihnen umgehend eine E-Mail an Ihre hinterlegte E-Mail-Adresse. Aktivieren Sie bitte Ihr MyAccount-Konto durch den Aktivierungslink in der E-Mail."
		},
		error: {
			headline: "Registrierung nicht erfolgreich",
			msg: "Bitte beachten Sie, dass Sie unseren Datenschutzbestimmungen zustimmen müssen, um sich zu registrieren."
		}
	},

	/**
	 * delete account
	 */
	deleteAccount: {
		success: {
			headline: "Account gelöscht",
			msg: "Ihr Account wurde gelöscht. Wir bedanken uns für die Nutzung unseres MyAccount-Services."
		},
		error: {
			headline: "Account nicht gelöscht"
		}
	},

	/**
	 * activate account
	 */
	activate: {
		success: {
			headline: "Account aktiviert",
			msg: "Sie können sich ab sofort jederzeit auf www.messefrankfurt.com anmelden."
		},
		error: {
			headline: "Account nicht aktiviert"
		}
	},

	/**
	 * lost password
	 */
	lostPassword: {
		success: {
			headline: "Passwort verschickt",
			msg: "Ihr neues Passwort wurde Ihnen per E-Mail zugeschickt, wenn Sie sich bereits für den MyAccount-Service registriert haben. Bitte ändern Sie dieses Passwort nach Ihrer nächsten Anmeldung in MyAccount."
		},
		error: {
			headline: "Passwort nicht verschickt"
		}
	},
	
	/**
	 * profile data
	 */
	profileData: {
		success: {
			msg: "Ihre Änderungen wurden erfolgreich übernommen."
		},
		error: {
			headline1: "Profildaten nicht geladen",
			headline2: "Profildaten nicht geändert"
		}
	},
	
	/**
	 * user data
	 */
	userData: {
		success: {
			headline: "Benutzernamen ändern",
			msg1: "Ihre Änderungen wurden erfolgreich übernommen. Sie müssen Ihren MyAccount nun einmalig erneut aktivieren. Dazu ist Ihnen eine E-Mail mit einem Aktivierungslink zugeschickt worden.",
			msg2: "Ihre Änderungen wurden erfolgreich übernommen."
		},
		error: {
			headline1: "Benutzerdaten nicht geladen",
			headline2: "Benutzerdaten nicht geändert"
		}
	},
	
	/**
	 * add bookmarks
	 */
	addBookmarks: {
		process: {
			msg: "Aussteller wird hinzugefügt..."
		},
		success: {
			msg1: "Der Aussteller wurde zur Favoritenliste hinzugefügt.",
			msg2: "Gesamtanzahl: ",
			msg3: "Der Aussteller befindet sich bereits auf Ihrer Favoritenliste."
		},
		error: {
			headline: "Favoriten nicht hinzugefügt",
			msg1: "Dem Aussteller sind keine Messen zugeordnet. Er kann nicht in die Favoritenliste übernommen werden.",
			msg2: "Fehler beim Hinzufügen des Favoriten"
		}
	},

	/**
	 * get bookmarks
	 */
	getBookmarks: {
		error: {
			headline: "Favoriten nicht geladen"
		}
	},

	/**
	 * delete bookmarks
	 */
	deleteBookmarks: {
		success: {
			msg: "Die ausgewählten Favoriten wurden entfernt."
		},
		error: {
			headline: "Favoriten nicht entfernt",
			msg: "Bitte wählen Sie erst einen Aussteller aus Ihrer Liste aus."
		}
	},

	/**
	 * send bookmarks
	 */
	sendBookmarks: {
		success: {
			msg: "Die ausgewählten Favoriten wurden per E-Mail verschickt."
		},
		error: {
			headline: "Favoriten nicht gesendet",
			msg: "Bitte wählen Sie erst einen Aussteller aus Ihrer Liste aus."
		}
	},

	/**
	 * print bookmarks
	 */
	printBookmarks: {
		error: {
			msg: "Bitte wählen Sie erst einen Aussteller aus Ihrer Liste aus."
		}
	}
};
/**
 * component: myAccount
 * @description: provides generic functions for storing data, login/logout and message handling
 */

// init component
Ext.onReady(function() {
	mf.myAccount.init();
});


mf.myAccount = {
	
	/**
	 * object to store localized strings
	 */
	lang: {
		options: {
			first: "Bitte wählen..."
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		//mf.myAccount.simulateMyAccount = true; //simulate the myaccount backend for prototype development ?
		mf.myAccount.checkUserActivation();
	},

	/**
	 * checks if the URL contains an account activation code
	 * @param none
	 */
	checkUserActivation: function() {
		mf.myAccount.activationCode = mf.window.getParameterFromURL('activateUser');

		if (mf.myAccount.activationCode && mf.myAccount.activationCode != '') {
			mf.shadowbox.autoStart('mfMyAccountActivate', mf.myAccount.replaceProtocol(mf.myAccount.setLayerPath('activate')));
		}
	},

	/**
	 * check if protocol is https
	 * @param none
	 * @return {Boolean} state of protocol
	 */
	checkProtocol: function() {
		if (mf.myAccount.simulateMyAccount) {
			if (mf.cookie.readCookie('simulate_https')) return true;
		}
		return window.location.protocol == 'https:' ? true : false;
	},

	/**
	 * switch protocol
	 * @param protocolType {String} type of protocol (e.g. https)
	 */
	switchProtocol: function(protocolType) {
		if (mf.myAccount.simulateMyAccount) {
			(protocolType == 'https') ? mf.cookie.createCookie('simulate_https',true) : mf.cookie.eraseCookie('simulate_https');
			alert('set protocol to: ' + protocolType);
			window.location.reload();
		}
		else {
			window.location.href = protocolType == 'https' ? protocolType + window.location.href.substring(4) : protocolType + window.location.href.substring(5);
		}
	},

	/**
	 * check if protocol is http and replace it
	 * @param url {String} url to check
	 * @return {String} url
	 */
	replaceProtocol: function(url) {
		if (url.indexOf('http://') != -1) {
			url = 'https' + url.substring(4);
		}
		if (mf.myAccount.simulateMyAccount) {
			url = 'http' + url.substring(5);
			mf.cookie.createCookie('mf-simulate-https',true); //set flag
		}
		return url;
	},

	/**
	 * prepare data store
	 * @param urlParam {String} parameter to append to my account url
	 * @param newRecordStructure {Object} object which enhances the record with a specific structure
	 * @return {Ext.data.Store} object to store the response of the AJAX calls
	 */
	prepareStore: function(urlParam, newRecordStructure) {
		
		var recordStructure = [
		{
			name: 'operation'
		},

		{
			name: 'errorcode'
		},

		{
			name: 'errordetails'
		}
		];

		if (newRecordStructure) {
			for (var i=0; i<newRecordStructure.length; i++) {
				recordStructure.push(newRecordStructure[i]);
			}
		}
		
	  return new Ext.data.Store({
				proxy: new Ext.data.HttpProxy({
					autoAbort: true,
					disableCaching: false,
					//              timeout: 15000,
					url: mfConfig.myAccount.url + urlParam
				}),
				reader: new Ext.data.XmlReader({
					record: 'result'
				}, Ext.data.Record.create(recordStructure))
		});
		
	},

	/**
	 * get the property to the currently selected id
	 * @param collection {Object} array which contains objects
	 * @param selectedId {String} id to match against
	 * @param property {String} property to retrieve
	 * @return {String} content of matching node or null
	 */
	getPropertyFromRecord: function (collection, selectedId, property) {
		var prop = null;
		for (var i=0; i<collection.length; i++) {
			if (collection[i].id == selectedId) {
				prop = eval('collection[i].' + property);
				break;
			}
		}
		
		return prop;
	},

	/**
	 * check login against ldap
	 * @param none
	 */
	login: function(){
		
		if(mf.myAccount.simulateMyAccount){
			
			if(mf.myAccountFooter.loginName.dom.value == 'mme' || mf.myAccountFooter.loginPwd.dom.value == 'mme') {
				mf.myAccountFooter.showLoggedInStatus();
				mf.myAccount.setCookie('true', mf.myAccount.cookieSettings.login.duration);					
				mf.myAccountLayer.openLayer();
			}
			else {
				mf.myAccount.showMessage('login.error.headline', 'Melde dich an mit dem Benutzername: mme und dem Passwort: mme um einen validen Login zu simulieren', false);
				mf.myAccountFooter.showLoggedOutStatus();
			}
			return true;
		}
		
		mf.myAccountFooter.showIndicator('login.process.msg2');

		var store = mf.myAccount.prepareStore('loginUser');
		store.load({
			params: {
				username: mf.myAccountFooter.loginName.dom.value,
				password: mf.myAccountFooter.loginPwd.dom.value,
				frontendLanguage: mfConfig.pageLanguage.lang
			},
			callback: function() {
				try {
					var result = store.getAt(0); //get data
					// any data received?
					if(result) {
						// login successful?
						if(result.data.operation == 'successful' || result.data.errorcode == '200') {
							mf.myAccountFooter.showLoggedInStatus();
							mf.myAccount.setCookie('true', mf.myAccount.cookieSettings.login.duration);					
							mf.myAccountLayer.openLayer();
						} else {
							mf.myAccount.showMessage('login.error.headline', 'm'+result.data.errorcode, true);
							mf.myAccountFooter.showLoggedOutStatus();
						}
					} else {
						mf.myAccount.showMessage('login.error.headline', 'g1', true);
						mf.myAccountFooter.showLoggedOutStatus();
					}
				} catch(e) {}
			}
		});
	},
	
	/**
	 * check login status with client side cookie or ldap
	 * @param func {Function} function to be executed, when login status is defined
	 * @param funcParams {Object} object which contains parameters for the function
	 */
	getLoginStatus: function(func, funcParams){
		var loginStatus = 'undefined';
		var store;

		var getLogin = function() {
			var loginCookie = mf.myAccount.getCookie();
			if (loginCookie) {
				if (loginCookie == 'true') { // get login cookie
					loginStatus = true;
				} else {
					loginStatus = false;
				}
			} else { // check LDAP
				if (!store) {
					store = mf.myAccount.prepareStore('loginUser');
					store.load({
						params: {
							username: ''
						},
						callback: function() {
							try {
								var result = store.getAt(0);
								if (result) {
									// login already done?
									if (result.data.errorcode == '200') {
										mf.myAccount.setCookie('true', mf.myAccount.cookieSettings.login.duration);
										loginStatus = true;
									} else {
										mf.myAccount.setCookie('false', 0);
										loginStatus = false;
									}
								} else {
									mf.myAccount.setCookie('false', 0);
									loginStatus = false;
								}
							} catch(e) {}
						}
					});
				}
			}
		};

		var loginInterval = window.setInterval(function() {
			getLogin();
			if (loginStatus != 'undefined') {
				window.clearInterval(loginInterval);
				store = null;
				if (!mf.myAccount.checkProtocol() && loginStatus == true) {
					mf.myAccount.switchProtocol('https');
				} else {
					funcParams ? eval(func)(loginStatus, funcParams) : eval(func)(loginStatus);
				}
			}
		}, 1000);
	},

	/**
	 * logout the user
	 * @param none
	 */
	logout: function(){
		mf.myAccountFooter.showIndicator('logout.process.msg');

		if(mf.myAccount.simulateMyAccount){
			mf.myAccount.setCookie('false', 0);
			mf.cookie.eraseCookie(mf.myAccount.cookieSettings.loginswitch.name);
			mf.myAccount.switchProtocol('http');
		}
		
		var store = mf.myAccount.prepareStore('logoutUser');
		store.load({
			params: '',
			callback: function() {
				try {
					var result = store.getAt(0);
					if(result) {
						if (result.data.operation == 'successful'){
							mf.myAccount.setCookie('false', 0);
							mf.cookie.eraseCookie(mf.myAccount.cookieSettings.loginswitch.name);
							mf.myAccount.switchProtocol('http');
						} else {
							mf.myAccount.showMessage('logout.error.headline', 'm'+result.data.errorcode, true);
							mf.myAccountFooter.showLoggedInStatus();
						}
					} else {
						mf.myAccount.showMessage('logout.error.headline', 'g1', true);
						mf.myAccountFooter.showLoggedInStatus();
					}
				} catch(e) {}
			}
		});
	},
	
	/**
	 * settings for login and switch cookie
	 */
	cookieSettings: {
		login: {
			name: 'mf-login',
			duration: 0.01389 // approx. 20 min.
		},
		loginswitch: {
			name: 'mf-login-switch',
			duration: 0
		}
	},

	/**
	 * saves valid login state in a cookie
	 * @param state {Boolean} login state (true/false)
	 * @param duration {Int} duration of cookie in days
	 */
	setCookie: function(state, duration) {
		mf.cookie.createCookie(mf.myAccount.cookieSettings.login.name, state, duration);
	},
	
	/**
	 * delete the login cookie
	 * @param none 
	 */
	delCookie: function() {
		mf.cookie.eraseCookie(mf.myAccount.cookieSettings.login.name);
	},

	/**
	 * read the login cookie
	 * @param none
	 * @return {String} value of cookie
	 */
	getCookie: function() {
		return mf.cookie.readCookie(mf.myAccount.cookieSettings.login.name);
	},
	
	/**
	 * replace the placeholder in the layer path with the corresponding layer component
	 * @param comp {String} name of layer component
	 * @return completed path to layer component
	 */
	setLayerPath: function(comp) {
		return mfConfig.myAccount.layerPath.replace(/%1/, comp);
	},

	/**
	 * object to store message fragments for generated messages in shadowbox layer
	 */
	message: {
		getHeadline: function(){
			return this.headline;
		},
		setHeadline: function(code) {
			this.headline = {
				tag: 'h1',
				html: mf.myAccountMessages.getMessage(code)
			}
		},
		getMessage: function(){
			return this.message;
		},
		setMessage: function(msg, useCode) {
			if (useCode) {
				this.message = this.getErrorTag(msg);
			} else {
				this.message = msg;
			}
		},
		getErrorTag: function(code) {
			return {
				tag: 'p',
				cls: 'mfError',
				html: mf.myAccountMessages.getMessage(code)
			};
		},
		getSuccessTag: function(code) {
			return {
				tag: 'p',
				cls: 'mfSuccess',
				children: {
					tag: 'strong',
					html: mf.myAccountMessages.getMessage(code)
				}
			};
		}
	},

	/**
	 * show a message in a shadowbox layer
	 * @param headline {String} headline error code
	 * @param msg {String} message error code or HTML fragment
	 * @param useCode {Boolean} indicator if msg should be evaluated against mf.myAccountMessages
	 */
	showMessage: function(headline, msg, useCode) {
		mf.myAccount.message.setHeadline(headline);
		mf.myAccount.message.setMessage(msg, useCode);

		Shadowbox.open({
			content: mf.myAccount.setLayerPath('message'),
			height: '150',
			width: '426',
			player: 'iframe'
		}, mf.shadowbox.options);
	},

	/**
	 * inserts text into the page to change the headline
	 * @param container {Ext.Element} Element to insert text into
	 * @param code {String} errorcode
	 */
	setHeadline: function(container, code) {
		container.dom.innerHTML = mf.myAccountMessages.getMessage(code);
	},

	/**
	 * inserts an HTML fragment into the page to display error or success messages
	 * @param msgType {String} type of message: error(e), success(s)
	 * @param container {Ext.Element} Element to insert HTML into
	 * @param code {String} errorcode
	 */
	addMessage: function(msgType, container, code) {
		mf.myAccount.removeMessages(container);

		var tag = msgType == 'e' ? mf.myAccount.message.getErrorTag(code) : mf.myAccount.message.getSuccessTag(code);
		Ext.DomHelper.insertFirst(container, tag);
	},

	/**
	 * removes all HTML fragments which displays error or success messages
	 * @param container {Ext.Element} Element to search into
	 */
	removeMessages: function(container) {
		container.select('.mfError').remove();
		container.select('.mfSuccess').remove();
	},

	/**
	 * inserts an HTML fragment into the page to display a processing status
	 * @param container {Ext.Element} Element to insert HTML into
	 */
	addProcessIndicator: function(container) {
		mf.myAccount.removeProcessIndicator(container);

		Ext.DomHelper.insertFirst(container, {
			tag: 'div',
			cls: 'mfProcessIndicator'
		}, true).setOpacity(.8);
		
		if (Ext.isIE6) {
			container.select('.mfProcessIndicator').first().setStyle('height', container.getHeight());
		}
	},

	/**
	 * removes the process status element
	 * @param container {Ext.Element} Element to remove the HTML from
	 */
	removeProcessIndicator: function(container) {
		if (container.select('.mfProcessIndicator').getCount() > 0) {
			container.select('.mfProcessIndicator').remove();
		}
	},

	/**
	 * show select fields
	 * @param container {Ext.Element} Element to apply style to
	 */
	showSelects: function(container) {
		if (Ext.isIE6) {
			container.select('select').setStyle('visibility', 'visible');
		}
	},

	/**
	 * hide select fields
	 * @param container {Ext.Element} Element to apply style to
	 */
	hideSelects: function(container) {
		if (Ext.isIE6) {
			container.select('select').setStyle('visibility', 'hidden');
		}
	},

	/**
	 * closes the layer, when the connection to the LDAP interrupts
	 * @param none
	 */
	forceLayerClose: function() {
		mf.myAccountLayer.closeLayer(true);
		mf.myAccount.setCookie('false', 0);
		mf.myAccountFooter.showLoggedOutStatus();
	},

	/**
	 * add option elements to dom
	 * @param container {Ext.Element} container to put options into
	 * @param resultSet {Array} array with options content
	 * @param matchingValue {String} value to determine which option is selected
	 * @param newDefaultOption {Object} specialised default option
	 */
	addOptions: function(container, resultSet, matchingValue, newDefaultOption) {
		var options = [];
		var option;
		// create default option
		var defaultOption = {
			tag: 'option',
			value: '',
			html: mf.myAccount.lang.options.first
		};

		// add default option
		newDefaultOption ? options.push(mf.array.mergeObjects(defaultOption, newDefaultOption)) : options.push(defaultOption);
	
		// create options
		var selected = false;
		for (var i=0; i<resultSet.length; i++) {
			option = {
				tag: 'option',
				value: resultSet[i].id,
				html: resultSet[i].name
			};
			
			if (!selected && resultSet[i].id == matchingValue) {
				option.selected = true;
				selected = true;
			}

			options.push(option);
		}

		// select the first option , if none was selected before
		if (!selected) {
			options[0].selected = true;
		}

		// add options to dom
		if (Ext.isIE) {
			var containerInfos = {
				parent: container.up('p'),
				id: container.dom.id,
				name: container.dom.name,
				size: container.dom.size
			};
			container.remove();

			Ext.DomHelper.append(containerInfos.parent, {
				tag: 'select',
				id: containerInfos.id,
				name: containerInfos.name,
				size: containerInfos.size,
				children: options
			});
		} else {
			Ext.DomHelper.append(container, options);
		}
	}
};


/**
 * component: shadowbox
 * @description: Shadowbox myAccount addition
 */


mf.shadowbox = mf.array.mergeObjects(mf.shadowbox, {

	/**
	 * shadowbox config for specific links
	 */
	specificOptions: {
		mfMyAccountLostPwd: {
			height: 210,
			width: 428
		},
		mfMyAccountRegister: {
			height: 350,
			width: 428
		},
		mfMyAccountInfo: {
			height: 380,
			width: 428
		},
		mfMyAccountFormLogin: {
			height: 150,
			width: 428
		},
		mfMyAccountActivate: {
			height: 150,
			width: 428
		}
	},

	/**
	 * setup components related to myaccount on demand
	 * @param none
	 */
	setupMyAccountComponents: function() {
		if (mf.shadowbox.myaccountcomp = mf.components.getComp('mfMyAccountLogin')) {
			// setup shadowbox for myaccount - lost password
			mf.shadowbox.setupSelection('.mfMyAccountLostPwd', 'mfMyAccountLogin', mf.shadowbox.getSpecificOptions('mfMyAccountLostPwd'));
			
			// setup shadowbox for myaccount - register
			mf.shadowbox.setupSelection('.mfMyAccountRegister', 'mfMyAccountLogin', mf.shadowbox.getSpecificOptions('mfMyAccountRegister'));
			
			// setup shadowbox for myaccount - infos
			mf.shadowbox.setupSelection('.mfMyAccountInfo', 'mfMyAccountLogin', mf.shadowbox.getSpecificOptions('mfMyAccountInfo'));
		}
	}
});



/**
 * component: MyAccount right search functions (enhancement)
 * @description: ...
 */

// init component
Ext.onReady(function() {
	mf.searchResultsExhibitor.initMyAccount();
});


mf.searchResultsExhibitor = mf.array.mergeObjects(mf.searchResultsExhibitor, {

	/**
	 * object to store localized strings
	 */
	lang: {
		favorites: {
			link: "Zu Favoriten hinzufügen",
			status: "MyAccount-Favorit"
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	initMyAccount: function() {
		if (mf.searchResultsExhibitor.comp) {
//			mf.myAccount.getLoginStatus('mf.searchResultsExhibitor.getFavorites');
			mf.searchResultsExhibitor.getFavorites();
		}
	},

	/**
	 * add a listener to add an exhibitor to the favorite list
	 * @param none
	 */
	createFavoritesListener: function() {
		mf.searchResultsExhibitor.comp.select('.mfFavorites a').on('click', function(e, t) {
			var activeFavorite = Ext.get(t).up('div');

			if (mf.myAccount.checkProtocol()) {
				mf.cookie.eraseCookie(mf.searchResultsExhibitor.cookieSettings.name);
				mf.searchResultsExhibitor.gatherBookmarks(activeFavorite);
			} else {
				// create cookie with exhibitor id
				mf.searchResultsExhibitor.addStateCookie(activeFavorite.child('.mfResultLink a').dom.rel);
				// create autostart cookie
				mf.cookie.createCookie(mf.shadowbox.settings.autoStart.cookie, parent.mf.myAccount.replaceProtocol(parent.mf.myAccount.setLayerPath('login')) + mf.shadowbox.settings.autoStart.separator + 'mfMyAccountFormLogin');
				// switch protocol
				mf.myAccount.switchProtocol('https');
			}			
		},this,{stopEvent: true});
	},

	/**
	 * hide the shadowbox if open
	 * @param none
	 */
	hideShadowbox: function() {
		window.parent.Shadowbox.close();

		// get exhibitor id from cookie
		var cookieVal = mf.cookie.readCookie(mf.searchResultsExhibitor.cookieSettings.name);
		if (cookieVal) {
			var cookieVals = cookieVal.split(mf.searchResultsExhibitor.cookieSettings.separator);
			// remove cookie
			mf.cookie.eraseCookie(mf.searchResultsExhibitor.cookieSettings.name);

			var activeFavorite;
			// get result DOM to the given exhibitor id
			mf.searchResultsExhibitor.comp.select('.mfResultLink a').each(function(fav) {
				if (fav.dom.rel == cookieVals[0]) {
					activeFavorite = fav.up('div.mfResult');
				}
			});

			// add favorite
			if (activeFavorite) {
				mf.searchResultsExhibitor.gatherBookmarks(activeFavorite);
			}
		}
	},
	
	/**
	 * show the processing indicator
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	showIndicator: function(activeFavorite) {
		var favLink = activeFavorite.select('.mfFavorites a').first();
		favLink.addClass('mfHd');
		
		favLink.up('p').createChild({
			tag: 'span',
			cls: 'mfProcessIndicator',
			html: parent.mf.myAccountMessages.addBookmarks.process.msg
		});
	},
	
	/**
	 * remove the processing indicator
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	removeIndicator: function(activeFavorite) {
		activeFavorite.select('.mfFavorites').each(function(el) {
			el.select('.mfProcessIndicator').remove();
			el.select('a').removeClass('mfHd');
		});
	},
	
	/**
	 * add "add to favorite" link
	 * @param container {Ext.Element} object to insert link into
	 */
	addLink: function(container) {
		Ext.DomHelper.overwrite(container, {
			tag: 'a',
			href: '#',
			html: mf.searchResultsExhibitor.lang.favorites.link
		});
	},
	
	/**
	 * add all "add to favorite" links
	 * @param none
	 */
	addLinks: function() {
		mf.searchResultsExhibitor.comp.select('.mfFavorites').each(function(fav) {
			mf.searchResultsExhibitor.addLink(fav);
		});
		//ie8 bug
		mf.searchResultsExhibitor.comp.select('.mfFavorites').setStyle('background','#fff');
		mf.searchResultsExhibitor.createFavoritesListener();
	},
	
	/**
	 * get the favorite list if the user is logged in
	 * @param loginStatus {Boolean} status of login
	 */
	getFavorites: function(loginStatus) {
/*
		if (loginStatus) {
			// create store for ldap results
			var store = parent.mf.myAccount.prepareStore('getBookmarks', mf.myAccountFavorites.recordStructure);
			store.load({
				params: '',
				callback: function() {
					try {
						var result = store.getAt(0);
						if (result) {
							if(result.data.operation == 'successful') {
								mf.searchResultsExhibitor.comp.select('.mfFavorites').each(function(fav) {
									var exhibitorId = fav.up('div').child('.mfResultLink a').dom.rel;
									for (var i = 0; i < result.data.exhibitors.length; i++) {
										if (result.data.exhibitors[i].id == exhibitorId) {
											Ext.DomHelper.overwrite(fav, {
												tag: 'span',
												html: mf.searchResultsExhibitor.lang.favorites.status
											});
										} else {
											mf.searchResultsExhibitor.addLink(fav);
										}
									}
									mf.searchResultsExhibitor.createFavoritesListener();
								});
							} else {
								mf.searchResultsExhibitor.addLinks();
							}
						} else {
							mf.searchResultsExhibitor.addLinks();
						}
					} catch(e) {}
				}
			});
		} else {
*/
			mf.searchResultsExhibitor.addLinks();
//		}
	},

	/**
	 * gather bookmarks from DOM
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	gatherBookmarks: function(activeFavorite) {
		var bookmarks = new Array();

		var exhibitor = activeFavorite.child('.mfResultLink a');
		// try to get bookmarks from the list of exhibitions
		activeFavorite.select('ul li span.mfHd').each(function(span){
			if (span.dom.innerHTML != '') {
				bookmarks.push(exhibitor.dom.rel + ':' + span.dom.innerHTML);
			}
		});
		// if no bookmarks were created try to find a single exhibition (exhibition context)
		if (bookmarks.length == 0) {
			var exhibition = activeFavorite.child('.mfResultLink span.mfHd');
			if (exhibition && exhibition.dom.innerHTML != '') {
				bookmarks.push(exhibitor.dom.rel + ':' + exhibition.dom.innerHTML);
			}
		}

		if (bookmarks.length == 0) {
			mf.myAccount.showMessage('addBookmarks.error.headline', 'addBookmarks.error.msg1', true);
			activeFavorite.select('.mfFavorites a').remove();
		} else {
			mf.searchResultsExhibitor.showIndicator(activeFavorite);
			mf.myAccount.getLoginStatus('mf.searchResultsExhibitor.addFavorite', {
				activeFavorite: activeFavorite,
				bookmarks: bookmarks
			}); // user logged in ?
		}
	},

	/**
	 * add selected items to favorite list
	 * @param loginStatus {Boolean} status of login
	 * @param funcParams {Object} contains function parameters
	 */
	addFavorite: function(loginStatus, funcParams) {
		if (loginStatus) {
			// create store for ldap results
			var store = parent.mf.myAccount.prepareStore('addBookmarks', [
				{name: 'addedBookmarks'},
				{name: 'storedBookmarks'}
			]);

			store.load({
				params: {
					bookmarks: funcParams.bookmarks
				},
				callback: function() {
					try {
						var result = store.getAt(0);
						if (result) {
							var favContainer = funcParams.activeFavorite.select('.mfFavorites').first();
	
							if (result.data.operation == 'successful') {
								if (result.data.addedBookmarks == 0) {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.success.msg3
									});
								} else {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.success.msg1 + ' ' + mf.myAccountMessages.addBookmarks.success.msg2 + '<strong>' + result.data.storedBookmarks + '</strong>'
									});
								}
		
								favContainer.highlight('ffff9c', {
									duration: 3,
									callback: function() {
										Ext.DomHelper.overwrite(favContainer, {
											tag: 'span',
											html: mf.searchResultsExhibitor.lang.favorites.status
										});
									}
								});
							} else {
								if (result.data.errorcode == '4') {
									mf.searchResultsExhibitor.openLogin(funcParams.activeFavorite, 'm4');
								} else {
									Ext.DomHelper.overwrite(favContainer, {
										tag: 'span',
										html: mf.myAccountMessages.addBookmarks.error.msg2
									});
									
									window.setTimeout(function() {
										favContainer.select('span').remove();
									}, 3000);
								}
							}
						} else {
							mf.myAccount.showMessage('addBookmarks.error.headline', 'g1', true);
						}
						mf.searchResultsExhibitor.removeIndicator(funcParams.activeFavorite);
					} catch(e) {}
				}
			}); 
		} else { // open login form
			mf.searchResultsExhibitor.openLogin(funcParams.activeFavorite);
		}
	},

	/**
	 * settings for favorites cookie
	 */
	cookieSettings: {
		name: 'mf-favorites-state',
		separator: '|',
		duration: 0.01389 // approx. 20 min.
	},

	/**
	 * cookie to store information about the selected exhibitor
	 * @param exhibitorId {String} if of  exhibitor
	 * @param errorcode {String} errorcode to be displayed in login layer
	 */
	addStateCookie: function(exhibitorId, errorcode) {
		var cookieText = exhibitorId;
		if (errorcode) {
			cookieText += mf.searchResultsExhibitor.cookieSettings.separator + errorcode;
		}
		mf.cookie.createCookie(mf.searchResultsExhibitor.cookieSettings.name, cookieText, mf.searchResultsExhibitor.cookieSettings.duration);
	},

	/**
	 * remove the processing indicator and open a login layer
	 * @param activeFavorite {Ext.Element} html element, which contains one set of exhibitor information
	 */
	openLogin: function(activeFavorite) {
		mf.searchResultsExhibitor.removeIndicator(activeFavorite);
		mf.searchResultsExhibitor.addStateCookie(activeFavorite.child('.mfResultLink a').dom.rel);

		var mfMergedOptions = mf.array.mergeObjects(parent.mf.shadowbox.options, parent.mf.shadowbox.getSpecificOptions('mfMyAccountFormLogin'));
		Shadowbox.open(mf.array.mergeObjects(mfMergedOptions, {
			content: parent.mf.myAccount.setLayerPath('login')
		}), mfMergedOptions);
	}
});
/**
 * component: myaccount favorites
 * @description: shared  functions and settings for favorites components
 */


mf.myAccountFavorites = {

	/**
	 * record structure for Ext.data.Record
	 */
	recordStructure: [
		{name: 'exhibitions', mapping: function(node) {
			var ids = Ext.DomQuery.select('exhibitions > exhibition > id', node);
			var names = Ext.DomQuery.select('exhibitions > exhibition > name', node);
			var result = [];
			for (var i = 0; i < ids.length; i++) {
				result.push({
					id: ids[i].childNodes.length > 0 ? ids[i].firstChild.nodeValue : '',
					name: names[i].childNodes.length > 0 ? names[i].firstChild.nodeValue : ''
				});
			}
			return result;
		}},
		{name: 'exhibitors', mapping: function(node) {
			var ids = Ext.DomQuery.select('exhibitors > exhibitor > id', node);
			var names = Ext.DomQuery.select('exhibitors > exhibitor > name', node);
			var logos = Ext.DomQuery.select('exhibitors > exhibitor > logo', node);
			var exhibitions = Ext.DomQuery.select('exhibitors > exhibitor > exhibition', node);
			var stands = Ext.DomQuery.select('exhibitors > exhibitor > stands', node);
			var result = [];
			for (var i = 0; i < ids.length; i++) {
				// get stands per exhibition
				var exhibitionStands = [];
				for (var j = 0; j < stands[i].childNodes.length; j++) {
					if (stands[i].childNodes[j].tagName == 'stand') {
						exhibitionStands.push({
							name: stands[i].childNodes[j].childNodes.length > 0 ? stands[i].childNodes[j].firstChild.nodeValue : ''
						});
					}
				}
				result.push({
					id: ids[i].childNodes.length > 0 ? ids[i].firstChild.nodeValue : '',
					name: names[i].childNodes.length > 0 ? names[i].firstChild.nodeValue : '',
					logo: logos[i].childNodes.length > 0 ? logos[i].firstChild.nodeValue : '',
					exhibition: exhibitions[i].childNodes.length > 0 ? exhibitions[i].firstChild.nodeValue : '',
					stands: exhibitionStands
				});
			}
			return result;
		}},
		{name: 'halls', mapping: function(node) {			
			var names = Ext.DomQuery.select('halls > hall > name', node);
			var halls = Ext.DomQuery.select('halls > hall', node);
			var exhibitors = Ext.DomQuery.select('halls > hall > exhibitor', node);
			var stands = Ext.DomQuery.select('halls > hall > exhibitor > stands', node);
			
			var result = [];
			for (var i = 0; i < halls.length; i++) {
				// get exhibitors per hall
				var hallExhibitors = [];
				var exhibitorNode = halls[i].getElementsByTagName('exhibitor');
				for (var j = 0; j < exhibitorNode.length; j++) {					
					// get stands per exhibition
					var exhibitionStands = [];
					var standsNode = exhibitorNode[j].getElementsByTagName('stands')[0];					
					for (var k = 0; k < standsNode.childNodes.length; k++) {
						if (standsNode.childNodes[k].tagName == 'stand') {
							exhibitionStands.push({
								name: standsNode.childNodes[k].childNodes.length > 0 ? standsNode.childNodes[k].firstChild.nodeValue : ''
							});
						}
					}
					
					hallExhibitors.push({
					    id: exhibitorNode[j].getElementsByTagName('id').length > 0 && exhibitorNode[j].getElementsByTagName('id')[0].childNodes.length > 0 ? exhibitorNode[j].getElementsByTagName('id')[0].firstChild.nodeValue : '',
						name: exhibitorNode[j].getElementsByTagName('name').length > 0 && exhibitorNode[j].getElementsByTagName('name')[0].childNodes.length > 0 ? exhibitorNode[j].getElementsByTagName('name')[0].firstChild.nodeValue : '',
						logo:  exhibitorNode[j].getElementsByTagName('logo').length > 0 && exhibitorNode[j].getElementsByTagName('logo')[0].childNodes.length > 0 ? exhibitorNode[j].getElementsByTagName('logo')[0].firstChild.nodeValue : '',
						exhibition: exhibitorNode[j].getElementsByTagName('exhibition').length > 0 && exhibitorNode[j].getElementsByTagName('exhibition')[0].childNodes.length > 0 ? exhibitorNode[j].getElementsByTagName('exhibition')[0].firstChild.nodeValue : '',
						stands: exhibitionStands
					});
				}
				
				result.push({
					name: names[i].childNodes.length > 0 ? names[i].firstChild.nodeValue : '',
					exhibitors: hallExhibitors
				});
			}
			return result;
		}}
	],

	/**
	 * get all selected checkboxes of exhibitors
	 * @param none
	 * @return {Ext.Element} object which contains all selected input fields
	 */
	getSelectedFavorites: function() {
	var inputs = mf.myAccountFavoritesView.form.select('input[type=checkbox]');
		var removables = [];
		
		inputs.each(function(el) {
			if (!el.dom.checked) {
				removables.push(el.dom.id);
			}
		});	
		
		inputs.removeElement(removables);

		return inputs;
	},

	/**
	 * get a list of all selected exhibitors
	 * @param inputs {Ext.Element} object which contains all selected input fields
	 * @return {Array} array with objects which contain exhibitor id and exhibition id
	 */
	getSelectedBookmarks: function(inputs) {
		var bookmarks = new Array();

		inputs.each(function(el) {
			// get hall
			var resultGroup = el.up('div.mfResultGroup');				
			var hallName = resultGroup.child('p').dom.innerHTML;
			
			// get value and exhibition id and build favorite id
			bookmarks.push(el.dom.value + ':' + parent.mf.myAccount.getPropertyFromRecord(mf.myAccountFavoritesView.exhibitors, el.dom.value, 'exhibition') + ':' + hallName);
		});
		
		return bookmarks;
	},

	/**
	 * remove all whitespaces in front and at the end of a given string
	 * @param text {String} string to be trimmed
	 * @return {String} trimmed string
	 */
	trimWhitespace: function(text) {
		while (text.substring(0,1) == ' ') {
			text = text.substring(1, text.length);
		}
		while (text.substring(text.length-1, text.length) == ' ') {
			text = text.substring(0, text.length-1);
		}
		
		return text;
	}
};


/**
 * component: myAccount
 * @description: checks login state, modifies display of login fields and navigation
 */

// init component
Ext.onReady(function() {
	mf.myAccountFooter.init();
});


mf.myAccountFooter = {
	
	/**
	 * object to store localized strings
	 */
	lang: {
		form: {
			username: "Benutzername",
			password: "Passwort",
			submit: "Anmelden",
			close: "Schließen"
		},
		navLoggedOut: {
			login: "Login",
			close: "Schließen",
			remember: "Passwort vergessen?",
			register: "Registrieren",
			info: "Was ist MyAccount?"
		},
		navLoggedIn: {
			logout: "Abmelden",
			show: "Einblenden",
			hide: "Ausblenden"
		}
	},

	/**
	 * initialize function
	 * @param none
	 */
	init: function() {
		if (mf.myAccountFooter.comp = mf.components.getComp('mfMyAccountLogin')) {
			mf.myAccountFooter.showIndicator('login.process.msg1');
			mf.myAccount.getLoginStatus('mf.myAccountFooter.toggleFooter');
		}
	},

	/**
	 * toggle the footer status depending on the login status
	 * @param loginStatus {Boolean} status of login
	 */
	toggleFooter: function(loginStatus) {
		if (loginStatus) {
			mf.myAccountFooter.showLoggedInStatus();
		} else {
			mf.myAccountFooter.showLoggedOutStatus();
		}
	},

	/**
	 * display myaccount footer with logged in status
	 */
	showLoggedInStatus: function() {
		mf.myAccountFooter.hideFooterParts();

		var ul = mf.myAccountFooter.comp.createChild({
			tag: 'ul',
			cls: 'mfHNav mfLoggedIn',
			children: [{
				tag: 'li',
				children: {
					tag: 'strong',
					html: mf.myAccountMessages.login.success.msg
				}
			}, {
				tag: 'li',
				children: {
					tag: 'a',
					href: '#',
					html: mf.myAccountFooter.lang.navLoggedIn.logout
				}
			}, {
				tag: 'li',
				children: {
					tag: 'a',
					href: '#',
					html: mf.myAccountFooter.lang.navLoggedIn.show
				}
			}]
		});

		mf.myAccountFooter.setLoggedInListener(ul);
		mf.myAccountFooter.comp.setWidth(490,true);
		mf.myAccountFooter.comp.select('#mfToolbarNav').setWidth(0).removeClass('mfHd').setWidth(375,true);
	},

	/**
	 * set listener for links, when the user is logged in
	 * @param ul {Ext.Element} unordered html list
	 */
	setLoggedInListener: function(ul) {
		// logout
		ul.select('li a').first().on('click',function(){
			mf.myAccountLayer.closeLayer(true);
			mf.myAccount.logout();
		},this,{
			stopEvent: true
		});

		// show/hide layer
		ul.select('li a').last().on('click',function(){
			mf.myAccountLayer.openLayer();
		},this,{
			stopEvent: true
		});

		// myAccount logo
		mf.myAccountFooter.comp.select('h2 a'). removeAllListeners();
	},

	/**
	 * display myaccount footer with logged out status
	 */
	showLoggedOutStatus: function() {
		mf.myAccountFooter.hideFooterParts();

	
		if (mf.cookie.readCookie(mf.myAccount.cookieSettings.loginswitch.name)) {
			mf.myAccountFooter.comp.select('#mfToolbarNav').addClass('mfHd');
			mf.cookie.eraseCookie(mf.myAccount.cookieSettings.loginswitch.name);
			// create login form
			mf.myAccountFooter.comp.createChild({
				tag: 'form',
				action: '',
				children: [{
					tag: 'input',
					id: 'mfMyAccountLoginName',
					type: 'text',
					cls: 'mfText',
					value: mf.myAccountFooter.lang.form.username
				}, {
					tag: 'input',
					id: 'mfMyAccountLoginPwdText',
					type: 'text',
					cls: 'mfText',
					value: mf.myAccountFooter.lang.form.password
				}, {
					tag: 'input',
					id: 'mfMyAccountLoginPwd',
					type: 'password',
					cls: 'mfText mfHd',
					value: ''
				}, {
					tag: 'input',
					id: 'mfMyAccountLoginSubmit',
					type: 'submit',
					title: mf.myAccountFooter.lang.form.submit,
					value: ''
				},{
					tag: 'a',
					href: mf.myAccount.setLayerPath('lostpwd'),
					cls: 'mfMyAccountLostPwd',
					html: mf.myAccountFooter.lang.navLoggedOut.remember
				}, {
					tag: 'a',
					href: '#',
					cls: 'mfMyAccountCloseLink',
					html: mf.myAccountFooter.lang.form.close
				}]
			});
			mf.myAccountFooter.comp.select('form input.mfText').setWidth(200,true);
			mf.myAccountFooter.comp.select('#mfMyAccountLogin').setStyle('width','85.5em');
			mf.myAccountFooter.loginName = Ext.get('mfMyAccountLoginName');
			mf.myAccountFooter.loginPwdText = Ext.get('mfMyAccountLoginPwdText');
			mf.myAccountFooter.loginPwd = Ext.get('mfMyAccountLoginPwd');
			mf.myAccountFooter.loginSubmit = Ext.get('mfMyAccountLoginSubmit');
			mf.myAccountFooter.close = mf.myAccountFooter.comp.select('.mfMyAccountCloseLink');
			mf.myAccountFooter.lostPwd = mf.myAccountFooter.comp.select('.mfMyAccountLostPwd');
			mf.myAccountFooter.setLoggedOutListener();//form listeners
		}
	  
		else {
			mf.myAccountFooter.comp.select('#mfToolbarNav').removeClass('mfHd');
			// login navigation (logged out state)
			mf.myAccountFooter.comp.createChild({
				tag: 'ul',
				cls: 'mfHNav',
				children: [{
					tag: 'li',
					children: {
						tag: 'a',
						href: '#',
						cls: 'mfMyAccountLogin',
						html: mf.myAccountFooter.lang.navLoggedOut.login
					}
				},
				{
					tag: 'li',
					children: {
						tag: 'a',
						href: mf.myAccount.setLayerPath('lostpwd'),
						cls: 'mfMyAccountLostPwd',
						html: mf.myAccountFooter.lang.navLoggedOut.remember
					}
				}, {
					tag: 'li',
					children: {
						tag: 'a',
						href: mf.myAccount.setLayerPath('register'),
						cls: 'mfMyAccountRegister',
						html: mf.myAccountFooter.lang.navLoggedOut.register
					}
				}, {
					tag: 'li',
					children: {
						tag: 'a',
						href: mf.myAccount.setLayerPath('info'),
						cls: 'mfMyAccountInfo',
						html: mf.myAccountFooter.lang.navLoggedOut.info
					}
				}]
			});
			mf.myAccountFooter.setLoggedOutLinkListener();
			mf.shadowbox.setupMyAccountComponents();
			//mf.myAccountFooter.comp.select('#mfMyAccountLogin').setWidth(490);
			
		}     
	},

	/**
         * set click listener to login link
         */
	setLoggedOutLinkListener: function(){
		
		//mf.shadowbox.setupMyAccountComponents();
		
		mf.myAccountFooter.comp.select('ul li a').on('click',function(e,t){
			var current = Ext.get(t);
			e.preventDefault();
			//login link
			if (current.hasClass('mfMyAccountLogin')) {
				mf.cookie.createCookie(mf.myAccount.cookieSettings.loginswitch.name, true);
				if (mf.myAccount.checkProtocol()) {
					//mf.cookie.eraseCookie(mf.myAccount.cookieSettings.loginswitch.name);
					mf.myAccountFooter.showLoggedOutStatus();
				}
				else {
					mf.myAccount.switchProtocol('https');
				}
			}
			else { //other links 
				var className = current.dom.className;
				var href = current.dom.href;
				
				if (mf.myAccount.checkProtocol()) {
					mf.shadowbox.setupSelection('.'+className, 'mfMyAccountLogin', mf.shadowbox.getSpecificOptions(className));
				}
				else {
					if (href != '') {
						mf.cookie.createCookie(mf.shadowbox.settings.autoStart.cookie, mf.myAccount.replaceProtocol(href) + mf.shadowbox.settings.autoStart.separator + className);
					}
					mf.myAccount.switchProtocol('https');
				}
			}
		});

	},

	/**
	 * set listener for form handling, when the user is logged out
	 * @param none
	 */
	setLoggedOutListener: function() {
		//close link
		mf.myAccountFooter.close.on('click',function(){
			mf.cookie.eraseCookie(mf.myAccount.cookieSettings.loginswitch.name);
			mf.myAccount.switchProtocol('http');
		});
		//forgot pwd link
		var className = mf.myAccountFooter.lostPwd.first().dom.className;
		mf.shadowbox.setupSelection('.'+className, 'mfMyAccountLogin', mf.shadowbox.getSpecificOptions(className));
		// username
		mf.myAccountFooter.loginName.on({
			'blur': {
				fn: function() {
					mf.myAccountFooter.checkLoginNameValue();
					mf.myAccountFooter.formHasFocus = false;
					mf.myAccountFooter.setCloseFormTimer();
				}
			},
			'focus': {
				fn: function() {
					mf.myAccountFooter.checkLoginNameValue();
					mf.myAccountFooter.formHasFocus = true;
					mf.myAccountFooter.clearCloseFormTimer();
					mf.myAccountFooter.focusForm();
				}
			},
			'click': {
				fn: function() {
					//mf.myAccountFooter.checkLoginNameValue();
				},
				stopEvent: true
			}
		});

		// password (text style)
		mf.myAccountFooter.loginPwdText.on({
			'focus': {
				fn: function() {
					mf.myAccountFooter.showPasswordField();
				}
			},
			'click': {
				fn: function() {
				// do nothing else than to stop the event
				},
				stopEvent: true
			}
		});

		// password
		mf.myAccountFooter.loginPwd.on({
			'blur': {
				fn: function() {
					mf.myAccountFooter.checkLoginPwdValue();
					mf.myAccountFooter.formHasFocus = false;
					//mf.myAccountFooter.setCloseFormTimer();
				}
			},
			'focus': {
				fn: function() {
					mf.myAccountFooter.formHasFocus = true;
					//mf.myAccountFooter.clearCloseFormTimer();
				}
			},
			'click': {
				fn: function() {
				// do nothing else than to stop the event
				},
				stopEvent: true
			}
		});

		// submit
		mf.myAccountFooter.loginSubmit.on('click', function() {
			mf.myAccountFooter.comp.setStyle('width','49em');
			mf.myAccount.login();
		},this,{
			stopEvent: true
		});
	},

	/**
	 * hide form, list and indicator
	 * @param none
	 */
	hideFooterParts: function() {
		// hide loading indicator
		mf.myAccountFooter.comp.select('.myAccountIndicator').remove();
		// hide overlay
		mf.myAccountFooter.hideLoginOverlay();
		// hide form and navigation
		mf.myAccountFooter.clearCloseFormTimer();
		mf.myAccountFooter.comp.select('form').remove();
		mf.myAccountFooter.comp.select('ul').remove();
	},

	/**
	 * show an indicator message
	 * @param code {String} message code to display in footer
	 */
	showIndicator: function(code) {
		mf.myAccountFooter.hideFooterParts();

		mf.myAccountFooter.comp.createChild({
			tag: 'p',
			cls: 'myAccountIndicator',
			html: mf.myAccountMessages.getMessage(code)
		});
	},

	/**
	 * create an overlay for the navigation
	 * @param none
	 */
	showLoginOverlay: function() {
		mf.myAccountFooter.comp.createChild({
			tag: 'div',
			cls: 'mfMyAccountLoginOverlay'
		}).setOpacity('.7');
	},

	/**
	 * remove the overlay for the navigation
	 * @param none
	 */
	hideLoginOverlay: function() {
		mf.myAccountFooter.comp.select('.mfMyAccountLoginOverlay').remove();
	},

	/**
	 * get the number of overlay instances for the navigation
	 * @param none
	 * @return {Integer} number of overlay instances (should be only 1)
	 */
	getLoginOverlayCount: function() {
		return mf.myAccountFooter.comp.select('.mfMyAccountLoginOverlay').getCount();
	},

	/**
	 * close the form after a certian period of time
	 * @param none
	 */
	setCloseFormTimer: function() {
		mf.myAccountFooter.clearCloseFormTimer();

		mf.myAccountFooter.formTimer = window.setTimeout(function() {
			if (mf.myAccountFooter.formHasFocus) {
				mf.myAccountFooter.clearCloseFormTimer();
			} else {
				mf.myAccountFooter.blurForm();
			}
		}, 5000);
	},

	/**
	 * close the form after a certian period of time
	 * @param none
	 */
	clearCloseFormTimer: function() {
		if (mf.myAccountFooter.formTimer) {
			window.clearTimeout(mf.myAccountFooter.formTimer);
		}
	},

	/**
	 * hide links and show password field
	 * @param none
	 */
	focusForm: function() {
		// animate form fields
		var anim = mf.myAccountFooter.animation;
		
		if (mf.myAccountFooter.loginName.getWidth() < anim.loginName.widthExpanded) {
			// hide navigation overlay if it is there
			mf.myAccountFooter.hideLoginOverlay();
			// add navigation overlay
			mf.myAccountFooter.showLoginOverlay();
			
			// which field should be visible?
			var loginField = mf.myAccountFooter.loginPwd.dom.value == '' ? mf.myAccountFooter.loginPwdText : mf.myAccountFooter.loginPwd;
			
			// make password field and link visible
			loginField.removeClass('mfHd');
			mf.myAccountFooter.comp.select('form a').removeClass('mfHd');
			
			mf.myAccountFooter.loginName.setWidth(anim.loginName.widthExpanded - anim.widthExpandedOffset, {
				animate: anim.animate,
				duration: anim.duration
			});
			
			loginField.setWidth(anim.loginPwd.widthExpanded - anim.widthExpandedOffset, {
				animate: anim.animate,
				duration: anim.duration
			});
			
			// add listener to footer component
			Ext.get('mfFooter').on('click', function(e) {
				mf.myAccountFooter.blurForm();
			}, this, {
				stopEvent: true
			});
		}
	},

	/**
	 * show links and hide password field
	 * @param none
	 */
	blurForm: function() {
		var anim = mf.myAccountFooter.animation;

		if (mf.myAccountFooter.getLoginOverlayCount() > 0) {
			window.clearTimeout(mf.myAccountFooter.formTimer);

			// hide password field and link
			mf.myAccountFooter.loginPwdText.addClass('mfHd');
			mf.myAccountFooter.loginPwd.addClass('mfHd');
			mf.myAccountFooter.comp.select('form a').addClass('mfHd');

			// animate form field
			mf.myAccountFooter.loginName.setWidth(anim.loginName.widthCollapsed, {
				animate: anim.animate,
				duration: anim.duration,
				callback: function(){		
					// hide overlay
					mf.myAccountFooter.hideLoginOverlay();
				} 
			});

			// remove listener from footer component
			Ext.get('mfFooter').removeAllListeners();
		}
	},
	
	/**
	 * check if value of username is the default value
	 * @param none
	 */
	checkLoginNameValue: function() {
		var value = mf.myAccountFooter.loginName.dom.value;
		
		if (value == mf.myAccountFooter.lang.form.username) {
			mf.myAccountFooter.loginName.dom.value = '';
		} else if (value == '') {
			mf.myAccountFooter.loginName.dom.value = mf.myAccountFooter.lang.form.username;
		}
	},
	
	/**
	 * check if value of password is the default value
	 * @param none
	 */
	checkLoginPwdValue: function() {
		if (mf.myAccountFooter.loginPwd.dom.value == '') {
			mf.myAccountFooter.hidePasswordField();
		}
	},
	
	/**
	 * show the "real" password field and hide the text variant
	 * @param none
	 */
	showPasswordField: function() {
		// get width of 'real' password field
		var width = mf.myAccountFooter.loginPwdText.getWidth() - mf.myAccountFooter.animation.widthExpandedOffset;
		// set width of 'text' password field
		mf.myAccountFooter.loginPwd.setWidth(width);
		// swap fields and focus real password field
		mf.myAccountFooter.loginPwdText.addClass('mfHd');
		mf.myAccountFooter.loginPwd.removeClass('mfHd');
		mf.myAccountFooter.loginPwd.focus();
	},

	/**
	 * hide the "real" password field and show the text variant
	 * @param none
	 */
	hidePasswordField: function() {
		// get width of 'real' password field
		var width = mf.myAccountFooter.loginPwd.getWidth() - mf.myAccountFooter.animation.widthExpandedOffset;
		// set width of 'text' password field
		mf.myAccountFooter.loginPwdText.setWidth(width);
		// swap fields
		mf.myAccountFooter.loginPwd.addClass('mfHd');
		mf.myAccountFooter.loginPwdText.removeClass('mfHd');
	},

	/**
	 * settings for the animation of the form fields
	 * @param none
	 */
	animation: {
		animate: true,
		duration: .5,
		widthExpandedOffset: Ext.isIE ? 4 : 0,
		loginName: {
			widthCollapsed: 88,
			widthExpanded: 154
		},
		loginPwd: {
			widthCollapsed: 88,
			widthExpanded: 114
		}
	},
	
	/**
	 * toogles the link to show/hide the myaccount layer
	 * @param closed {Boolean} true:false
	 */
	toggleLayer: function(closed) {
		var link = mf.myAccountFooter.comp.select('ul.mfLoggedIn li');
		
		if (link.getCount() != 0) {
			link = link.last().child('a');	
			link.removeAllListeners();
			if(closed) {
				link.dom.innerHTML = mf.myAccountFooter.lang.navLoggedIn.show;
				link.on('click', function(){
					mf.myAccountLayer.openLayer();
				},this,{
					stopEvent: true
				});
			} else {
				link.dom.innerHTML = mf.myAccountFooter.lang.navLoggedIn.hide;
				link.on('click', function(){
					mf.myAccountLayer.closeLayer();
				},this,{
					stopEvent: true
				});
			}
		}
	}
};
/**
 * component: my acount layer
 * @description: mask the page without footer / slide in a Layer from footer / load iframe
 */

// init component
Ext.onReady(function() {
	mf.myAccountLayer.init();
});


mf.myAccountLayer = {

	/**
	 * initialize function
	 * @param none
	 */
	init: function(){
		mf.myAccountLayer.isHomepage = Ext.getBody().hasClass('mfPageHome');

		mf.myAccountLayer.helper = {
			wrapper: Ext.get('mfWrapper'),
			footer: Ext.get('mfFooter')
		}
	},
	
	/**
	 * settings for the layer
	 */
	settings: {
		borderWidth: 2,
		maxHeight: 600
	},

	/**
	 * create a mask for the page
	 * @param none
	 */
	createMask: function() {
		// remove old mask
		var oldMask = Ext.get('mfMyAccountMask');
		if (oldMask) {
			oldMask.remove();
		}

		// create new mask
		mf.myAccountLayer.mask = mf.myAccountLayer.helper.wrapper.createChild({
			tag: 'div',
			id: 'mfMyAccountMask'
		});

		// get current dimensions
		var dimensions = mf.myAccountLayer.getMaskDimensions();

		// set dimensions
		mf.myAccountLayer.setMaskDimensions(dimensions);

		// set opacity
		mf.myAccountLayer.mask.setOpacity(0).setOpacity(.7,{duration:1});
		
		// add click listener
		mf.myAccountLayer.mask.on('click', function() {
			mf.myAccountLayer.closeLayer();
		}, this, {stopEvent: true});
		
		// change footer style
		mf.myAccountLayer.helper.footer.setStyle('z-index', '1005');
	},
	
	/**
	 * calculate dimensions of the myAccount mask
	 * @param none
	 * @return {Obj} array which contains dimensions of the mask
	 */
	getMaskDimensions: function() {
		var body = Ext.getBody();
		var offset = Ext.isIE6 ? 2 : 0;

		return {
			height: mf.myAccountLayer.isHomepage ? Ext.get('mfWrapperHomeOuter').getHeight() + 'px' : '100%',
			left: -parseInt(mf.myAccountLayer.helper.wrapper.getOffsetsTo(body)[0]) + offset,
			top: mf.myAccountLayer.isHomepage ? -parseInt(mf.myAccountLayer.helper.wrapper.getOffsetsTo(body)[1]) + offset : 0,
			width: body.getWidth()
		};
	},

	/**
	 * set dimensions of the myAccount mask
	 * @param dimensions {Obj} array which contains dimensions of the mask
	 */
	setMaskDimensions: function(dimensions) {
		mf.myAccountLayer.mask.setStyle({
			'height': dimensions.height,
			'left': dimensions.left + 'px',
			'top': dimensions.top + 'px',
			'width': dimensions.width + 'px'
		});
	},

	/**
	 * delete the mask
	 * @param: none
	 */
	deleteMask: function(){
		var mask = Ext.get('mfMyAccountMask');
		if (mask) {
			mask.setOpacity(0, {
				duration: .25,
				callback: mask.remove
			});
		}
	},
	
	/**
	 * creates a layer for myAccount components
	 * @param none
	 */
	createLayer: function(){
		// create wrapper for layer
		mf.myAccountLayer.layerWrapper = mf.myAccountLayer.helper.footer.createChild({
			tag: 'div',
			id: 'mfMyAccountLayerWrapper'
		});

		// get and set current wrapper dimensions
		var wrapperDimensions = mf.myAccountLayer.getLayerWrapperDimensions();
		mf.myAccountLayer.setLayerWrapperDimensions(wrapperDimensions);

		// create layer
		mf.myAccountLayer.layer = mf.myAccountLayer.layerWrapper.createChild({
			tag: 'div',
			id: 'mfMyAccountLayer'
		});

		// get and set current layer dimensions
		var dimensions = mf.myAccountLayer.getLayerDimensions();
		mf.myAccountLayer.setLayerDimensions(dimensions);

		// create iframe with my account
		mf.myAccountLayer.iframe = mf.myAccountLayer.loadIframe();

		// open the layer
		mf.myAccountLayer.openLayer();
	},
	
	/**
	 * calculate dimensions of the myAccount layer wrapper in respect to layer settings
	 * @param none
	 * @return {Obj} array which contains dimensions of the layer
	 */
	getLayerWrapperDimensions: function() {
		var bodyHeight = Ext.getBody().getHeight();
		var headerHeight = Ext.get('mfHeader').getHeight();
		var footerHeight = mf.myAccountLayer.helper.footer.getHeight();

		// height
		var height = mf.myAccountLayer.isHomepage ? Ext.get('mfContentWrapper').getHeight() : bodyHeight - footerHeight - headerHeight;

		if (height >= mf.myAccountLayer.settings.maxHeight) {
			height = mf.myAccountLayer.settings.maxHeight;
		}

		return {
			height: height,
			top: bodyHeight - footerHeight - height
		};
	},

	/**
	 * set dimensions of the myAccount layer wrapper
	 * @param dimensions {Obj} array which contains dimensions of the mask
	 */
	setLayerWrapperDimensions: function(dimensions) {
		mf.myAccountLayer.layerWrapper.setStyle({
			'height': dimensions.height + 'px',
			'top': '-' + dimensions.height + 'px'
		});
	},

	/**
	 * calculate the height, width, top and left position of the myAccount layer in respect to layer settings
	 * @param none
	 * @return {Obj} array which contains dimensions of the layer
	 */
	getLayerDimensions: function() {
		var box = Ext.get('mfMyAccountLayerWrapper').getBox();

		return {
			height: box.height,
			top: box.y,
			width: box.width
		};
	},

	/**
	 * calculate the height, width, top and left position of the myAccount layer in respect to layer settings
	 * @param dimensions {Obj} array which contains dimensions of the mask
	 */
	setLayerDimensions: function(dimensions) {
		mf.myAccountLayer.layer.shift({
			y: dimensions.height + dimensions.top,
			width: dimensions.width,
			duration: .25,
			easing: 'easeOut'
		});
	},

	/**
	 * delete all the layers
	 * @param none
	 */
	deleteLayer: function(){
		mf.myAccountLayer.layer.remove();
		mf.myAccountLayer.layer = null;
		mf.myAccountLayer.layerWrapper.remove();
		mf.myAccountLayer.layerWrapper = null;
	},

	/**
	 * open the layer with the iframe
	 * @return none
	 */
	openLayer: function() {
	    // configure actual language on myAccount server
        Ext.Ajax.request({
            disableCaching: true,
            url: '/myaccount/v1/setFrontendLanguage?frontendLanguage=' + currentLanguage,
            success: function() {},
            failure: function() {}
        });

		mf.myAccountLayer.createMask();

		if (mf.myAccountLayer.layer) {
			// stop effects
			mf.myAccountLayer.layer.stopFx();
			// set resize handler
			mf.myAccountLayer.setResizeHandler();
			// set current dimensions
			mf.myAccountLayer.layerWrapper.setStyle('display', 'block');
			var dimensions = mf.myAccountLayer.getLayerDimensions();
			// set indicator
			mf.myAccountLayer.createLoadingIndicator();

			// shift in layer
			mf.myAccountLayer.layer.shift({
				y: dimensions.top,
				duration: 2,
				easing: 'easeOut',
				callback: function() {
					mf.myAccountLayer.iframe.setStyle('display', 'block');
					mf.myAccountLayer.loadingIndicator.remove();
					// adjust footer events
					mf.myAccountFooter.toggleLayer(false);
				}
			});
		} else {
			mf.myAccountLayer.createLayer();
		}
	},
	
	/**
	 * close the layer and delete mask
	 * @return removeLayer {Boolean} switch if layer should be removed from the DOM
	 */
	closeLayer: function(removeLayer) {
		if (mf.myAccountLayer.layer) {
			// stop effects
			mf.myAccountLayer.layer.stopFx();
			// get current dimensions
			var dimensions = mf.myAccountLayer.getLayerDimensions();
			// set indicator and hide frame
			mf.myAccountLayer.createLoadingIndicator();
			mf.myAccountLayer.iframe.setStyle('display', 'none');

			// shift out layer
			mf.myAccountLayer.layer.shift({
				y: dimensions.height + dimensions.top,
				duration: 1,
				easing: 'easeIn',
				callback: function() {
					// adjust footer events
					mf.myAccountFooter.toggleLayer(true);
					mf.myAccountLayer.loadingIndicator.remove();
					// remove resize handler
					mf.myAccountLayer.removeResizeHandler();
					mf.myAccountLayer.layerWrapper.setStyle('display', 'none');
					mf.myAccountLayer.deleteMask();
					if (removeLayer) {
						mf.myAccountLayer.deleteLayer();
					}
				}
			});
		} else {
			mf.myAccountLayer.deleteMask();
		}
	},
	
	/**
	 * set new resize handler and append former resize handlers (if any)
	 * @param none
	 */
	setResizeHandler: function(){
		window.onresize = function() {
			if (Ext.get('mfMyAccountMask')) {
				mf.myAccountLayer.setMaskDimensions(mf.myAccountLayer.getMaskDimensions());
			}
			if (Ext.get('mfMyAccountLayerWrapper')) {
				mf.myAccountLayer.setLayerWrapperDimensions(mf.myAccountLayer.getLayerWrapperDimensions());
			}
		};
	},

	/**
	 * set new resize handler and append former resize handlers (if any)
	 * @param none
	 */
	removeResizeHandler: function(){
		window.onresize = null;
	},

	/**
	 * creates a temporary overlay for the layer contents
	 * @param none
	 */
	createLoadingIndicator: function(){
		// create loading indicator
		mf.myAccountLayer.loadingIndicator = mf.myAccountLayer.layer.createChild({
			tag: 'div',
			id: 'mfMyAccountLoading'
		}).setOpacity(.5);
	},

	/**
	 * generate the iframe
	 * @param none
	 * @return {Ext.Element} Iframe-Element
	 */
	loadIframe: function() {
		return Ext.get('mfMyAccountLayer').createChild({
			tag: 'iframe',
			id: 'mfMyAccountIframe',
			frameborder: '0',
			src: mfConfig.myAccount.myAccountPath
		});
	}
};


			
