
// helper for save logging:
	function log(o) {
	if (typeof console == "object"){
		if (typeof console.log == "function") {
			top.console.log(o);
		}
	}
}




var oNavControl = {

	/**
	 * @var oMainNavItems
	 */
	oMainNavItems: {
		'home': 		0
		,'projects':	1
		,'aboutus':		2
		,'takeaction':	3
		,'tracks':		4
	}

	/**
	 * @var oMenu assotiative array of menu strucure
	 */
	,oMenu: {}

	/**
	 *
	 */
	,sMainNav: null

	/**
	 * @var oActivePage, itemem of oMenu that stores the entry of the currently active page
	 * JSON sructure:
	 * {
	 *    sName:		'Title'
	 *   ,sType:		'startseite oder textstrecke, etc.'
	 *   ,sUrl:		    'http://...'
	 *   ,sParams:	    'GET-Parameter'
	 *   ,bActive: 	    true for the current page, else false
	 *   ,oElement:		Annker-Opject in Dom
	 *   ,oParent:		oParent (reference to parent Item in oMenu)
	 *   ,oChildren:	array of child elements in oMenu, null if none
	 *   ,iMyNumber:	unique id
	 * };
	 */
	,oActivePage: null

	/**
	 * @var sBaseUrl
	 */
     ,sBaseUrl: null

	/**
	 * @var sBaseStart
	 */
     ,sBaseStart: null

	/**
	 * @var sBaseParams
	 */
     ,sBaseParams: null

	/**
	 * @var bSsl
	 */
     ,bSsl: false

	/**
	 * @var bCamerActive
	 */
	,bCameraActive: false

	/**
	 * @var bLoading
	 */
	,bLoading: false

	/**
	 * @var sCurrentUrl
	 */
	,sCurrentUrl: null

	/**
	 * @var oLastPage
	 */
	,oLastPage: null

	/**
	 * @var bFillWizzard
	 */
	,bFillWizzard: true




	/**
	 * initializes the m4m navigation
	 */
	,init: function() {
//return;

		// get main structure
		this.getMainMenuStructure();
log(oNavControl.oMenu);

		// init base varibales
		this.setBaseValues();

		if (oNavControl.aAllParams.bSsl == 1) {
			oNavControl.showSslChange();
		}
		
		oMfmStorage.getTranslationMap(oNavControl.init3);
	}
	
	
	
	/**
	 * initializes the m4m navigation any more
	 */
	, init3: function() {

		// set page type
		oNavControl.setPageType();

		// render top navigation
		oNavControl.renderOrgNavigation();

		// render left & right navigation
		oNavControl.initSidewaysNav();
		oNavControl.setupMouseHandling();
		oNavControl.renderBullets();

		// hide content and navigation if first page isn't the start page
		$('#content').hide();
		$('#nav-static').hide();
		$('#bullets').hide();

		// inti background
		oBgControl.init();

		// get donations
		var oCurrentPortal = oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal];
		var oLanguage = oCurrentPortal.aLanguages[oMfmStorage.oLanguage.iActiveLanguage];
		$.post(
			oNavControl.sBaseUrl + '?eID=json&action=totoyaRequest&sClass=cDonations&sFunction=ajaxGetDonations'
			,{
				sPortal:		oMfmStorage.oLanguage.sActivePortal
				, sLanguage:	oLanguage.sSymbol
			}
			,function(o) {
				oMfmStorage.oDonations = o.mData;
				if (oMfmStorage.oLanguage.sActivePortal == 'org') {
					oMfmStorage.sTargetPortal = o.mData.sDefaultPortal.toLowerCase();
				}
				$('#donation_slider_select')
					.val(oMfmStorage.oDonations.sDefaultPortal.toLowerCase())
					.change();
				oNavControl.init2();
			}
			,'json'
		);

		// TODO: show this to the admin :)
		// check if user is logged in
		$.ajax({
			url:		oNavControl.sBaseUrl + "?eID=json&action=totoyaRequest&sClass=cUserLogin&sFunction=ajaxIsLoggedIn"
			, type:		'get'
			, dataType:	'json'
			, success:	function(o) {
				var bIsLoggedIn = false;
				if (!o.bError && o.mData) {
					bIsLoggedIn = true;
				}
				oSiteControl.renderPersonalContent(bIsLoggedIn);
			}
			, error:	function() {
				oSiteControl.renderPersonalContent(false);
			}
		});
	}




	/**
	 * initializes the m4m navigation - part 2
	 */
	,init2: function() {
		// init history manager
		$.history.init(oNavControl.handleNextPage, {'unescape': '/'});
		this.bLoading = false;

		// inith bandwidth control
		this.initBandwithControl();
	}




	,handleNextPage: function(sUrl) {
		if (typeof sUrl != 'string' || $.trim(sUrl).length == 0) {
			sUrl = (
				$.history.last() != null ?
				$.history.last() :
				oNavControl.sBaseStart + oNavControl.sBaseParams
			);
		}
		if (sUrl.split('/')[0] == 'scheckbuch') {
			sUrl = 'mainmenu/spendenscheckbuch/spendenscheckbuch/';
		}
		oNavControl.setActivePage(sUrl);
		oNavControl.changeContent(sUrl);
	}




	/**
	 * Sets base values.
	 */
	,setBaseValues: function() {
		var sUrl = window.location.href;
/*
		if (sUrl.toUpperCase().indexOf('%3F') != -1) {
			sUrl = unescape(sUrl);
		}
*/
		var rHttp = /^(http[s]?:\/\/[^#\/\?]*)\/([^#\?]*)(#([^\?]*))?(\?(.*))?$/;
		var bUrlTest = rHttp.test(sUrl);
		if (bUrlTest) {
			var aUrl = rHttp.exec(sUrl);
			sUrl = aUrl[1] + '/';
			if (typeof aUrl[3] == 'string') {
				sUrl += aUrl[3];
			}
			if (typeof aUrl[5] == 'string') {
				sUrl += aUrl[5];
			}
		}
		this.sBaseUrl = sUrl.split('#')[0].split('?')[0];
		this.bSsl = this.sBaseUrl.substr(0, 5).toLowerCase() == 'https';
 		this.sBaseParams =
			(
				typeof sUrl.split('#')[0].split('?')[1] == 'string' ?
				decodeURIComponent('?' + sUrl.split('#')[0].split('?')[1]) :
				''
			);

		// set base start
		var oBaseStart = oNavControl.oMenu.oChildren[0];
		while (oBaseStart.sType == 'shortcut' && oBaseStart.oChildren.length > 0) {
			oBaseStart = oBaseStart.oChildren[0];
		}
		this.sBaseStart = oBaseStart.sUrl;
		if (
			bUrlTest
			&& (typeof aUrl[3] == 'undefined' || $.trim(aUrl[3]).length == 0)
			&& typeof aUrl[2] == 'string'
			&& aUrl[2].length > 0
		) {
			this.sBaseStart = aUrl[2];
		}

		// set active portal
		var rHttp2 = /^http[s]?:\/\/(.*)\/$/;
		if (rHttp2.test(this.sBaseUrl)) {
			var aDomain = rHttp2.exec(this.sBaseUrl);
			oMfmStorage.oLanguage.sActivePortal = oMfmStorage.oPortals.oBaseUrl2Portal[aDomain[1]];
		} else {
			oMfmStorage.oLanguage.sActivePortal = 'de';
		}
		oMfmStorage.sTargetPortal = oMfmStorage.oLanguage.sActivePortal;

		// set active language
		var sLanguage = $.trim(this.sBaseStart.substr(0, 3));
		var aLanguages = oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal].aLanguages;
		for (var iLanguage in oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal].aLanguages) {
			if (sLanguage == aLanguages[iLanguage].sRealUrlPrefix) {
				oMfmStorage.oLanguage.iActiveLanguage = iLanguage;
				break;
			}
		}

		// get all params
		var sBaseParams = '';
		var aBaseUrl = sUrl.split('#');
		if (typeof aBaseUrl[1] != 'undefined') {
			var aBaseParams = aBaseUrl[1].split('?');
			if (typeof aBaseParams[1] != 'undefined') {
				sBaseParams = decodeURIComponent('?' + aBaseParams[1]);
				sBaseParams = (sBaseParams.substr(0, 1) == '?' ? sBaseParams.substr(1) : sBaseParams);
			}
		}
		oNavControl.aAllParams = {};
		var aParams = sBaseParams.split('&');
		for (var i in aParams) {
			var aValues = aParams[i].split('=');
			oNavControl.aAllParams[aValues[0]] = aValues[1];
		}
	}

	,showDataChange: function() {
		$('body').prepend(
			'<div id="loader-overlay3"><div id="loader-overlay-box3">'
			+oMfmStorage._('sending')+'<br />' + oMfmStorage._('wait') + '<br /><br />'
			+'<img id="ajaxloader3" src="/fileadmin/templates/css/images/ajax_loader.gif" alt="' + oMfmStorage._('wait') + '" title="' + oMfmStorage._('wait') + '" />'
			+'</div></div>'
		);
		$('#loader-overlay3').css('display', 'block');
	}


	,hideDataChange: function() {
		$('#loader-overlay3').remove();
	}


	,showSslChange: function() {
		$('body').prepend(
			'<div id="loader-overlay2"><div id="loader-overlay-box2">'
			+ oMfmStorage._('changeSecuretyCall') + '<br /><br />'
			+'<img id="ajaxloader2" src="/fileadmin/templates/css/images/ajax_loader.gif" alt="' + oMfmStorage._('wait') + '" title="' + oMfmStorage._('wait') + '" />'
			+'</div></div>'
		);
		$('#loader-overlay2').css('display', 'block');
	}


	,hideSslChange: function() {
		$('#loader-overlay2').remove();
	}


	,loadSsl: function(sPage, oParams) {

		oNavControl.showSslChange();

		var sAddParams = '';
		for (var sParam in oParams) {
			switch(sPage) {
				case 'wizard':
					if ($.inArray(sParam, ['sAmount', 'sWerbeCode', 'sProjectName', 'sTargetPortal']) != -1) {
						sAddParams += '&' + sParam + '=' + encodeURI(oParams[sParam]);
					}
					break;
			}
		}

		var sParams = '';
		if (typeof oNavControl.sCurrentUrl == 'string') {
			var aUrl = oNavControl.sCurrentUrl.split('?');
			if (aUrl.length > 1) {
				var aGetParams = aUrl[1].split('&');
				for (var i in aGetParams) {
					var aParams = aGetParams[i].split('=');
					if (aParams.length > 1) {
						switch(sPage) {
							case 'wizard':
								if($.inArray(aParams[0], ['sAmount', 'sWerbeCode', 'sProjectName', 'sTargetPortal']) != -1) {
									continue;
								}
								break;
						}
						sParams += '&' + aParams[0] + '=' + aParams[1];
					}
				}
			}
		}

		var sPortal = oMfmStorage.oLanguage.sActivePortal;
		var iLanguage = oMfmStorage.oLanguage.iActiveLanguage;
		var sLangPrefix = oMfmStorage.oLanguage[sPortal].aLanguages[iLanguage].sRealUrlPrefix;
		var sUrl =
			'https'
			+ this.sBaseUrl.substr(4) + sLangPrefix
			+ '#' + oNavControl.oActivePage.sUrl
			+ '?bSsl=1&sPage=' + sPage + sAddParams + sParams;
		window.location.href = sUrl;
	}



	,unloadSsl: function() {
		if (typeof oNavControl.sCurrentUrl == 'string') {
			var sPortal = oMfmStorage.oLanguage.sActivePortal;
			var iLanguage = oMfmStorage.oLanguage.iActiveLanguage;
			var sLangPrefix = oMfmStorage.oLanguage[sPortal].aLanguages[iLanguage].sRealUrlPrefix;
			var aUrl = oNavControl.sCurrentUrl.split('?');
			var sUrl = aUrl[0];
			sUrl = oNavControl.sBaseUrl + sLangPrefix + '#' + sUrl;
			var aIgnore = [ 'bSsl', 'sPage', 'sParam', 'sAmount', 'sWerbeCode', 'sProjectName', 'sTargetPortal' ];
			if (aUrl.length > 1) {
				var aGetParams = aUrl[1].split('&');
				if (aGetParams.length > 0) {
					sUrl += '?';
					for (var i in aGetParams) {
						var aParams = aGetParams[i].split('=');
						if (aParams.length > 1 && $.inArray(aParams[0], aIgnore) == -1) {
							sUrl += '&' + aParams[0] + '=' + aParams[1];
						}
					}
				}
			}
		} else {
			sUrl = oNavControl.oMenu.oChildren[0].sUrl;
		}
		if (sUrl.substr(0, 5) == 'https') {
			sUrl = 'http' + sUrl.substr(5);
		}
		window.location.href = sUrl;
	}



	/**
	 * Sets the donations
	 */
	,setDonations: function(sCategory) {
		if (!oNavControl.bFillWizzard) {
			return;
		}
		
		var oCategories = (
			oMfmStorage.oLanguage.sActivePortal == 'org' ?
			oMfmStorage.oDonations[$('#donation_slider_select').val().toUpperCase()] :
			oMfmStorage.oDonations 
		);

		var oDonation = (
			oCategories != null && typeof oCategories[sCategory] != 'undefined' ?
			oCategories[sCategory] :
			oMfmStorage.oDefaultDonation
		);

		oDonationControl.fill(
			oDonation.sProjectName
			, oDonation.sPromotion
			, oDonation.iDefaultAmount
			, oDonation.sTeaser
			, oDonation.sAmount1
			, oDonation.sText1
			, oDonation.sAmount2
			, oDonation.sText2
			, oDonation.sAmount3
			, oDonation.sText3
			, oDonation.sCategory
		);
	}




	/**
	 * Reads the full menu structure.
	 */
	,getMainMenuStructure: function() {
		// helper function for recursion
		function getMenuStructure(oDomParent, oParent) {
			var oItems = [];
			var i = 0;
			oDomParent.find('> ul > li').each(function() {
				var oMe 		= $(this);
				var myAnker = oMe.find('a');
				// store data in array
				var oItem = {
					sName:		myAnker.html()
					,sType:		myAnker.attr('target')
					,sUrl:		myAnker.attr('href')
					,sParams:	''
					,bActive: 	myAnker.hasClass('l1-act')
									|| myAnker.hasClass('l2-act')
									|| myAnker.hasClass('l3-act')
									|| myAnker.hasClass('l4-act')
									|| myAnker.hasClass('l5-act')
					,oElement:	oMe
					,oParent:	oParent
					,oChildren:	null
					,iMyNumber:	i
				};
				if (oItem.bActive) {
					if (oNavControl.oActivePage != null) {
						oNavControl.oActivePage.bActive = false;
					}
					oNavControl.oActivePage = oItem;
				}
				oItem.oChildren = getMenuStructure(oMe, oItem);
				oItems.push(oItem);
				i++;
			});

			return oItems;
		}

		// init with starting point
		oNavControl.oMenu.oChildren = getMenuStructure($('#navigation'), oNavControl.oMenu);

		// TODO: delete typo3 navi element ('#navigation')
    }




	/**
	 * Sets the page type as body class.
	 */
	,setPageType: function() {
		$('body').attr('id', oNavControl.oActivePage.sType);
	}




	/**
	 * Finds and activates the previews page in the page tree on the same level.
	 */
	,getPrevPage: function() {
		if (oNavControl.oActivePage.sType == 'projektseite') {
			var aProjectIds = oNavControl.oActivePage.aProjectIds;
			var sProjectId = null;
			for (var i in aProjectIds) {
				if (oNavControl.oActivePage.oCurrent.iId == aProjectIds[i]) {
					var iNextIndex = ((parseInt(i) + 1) % aProjectIds.length);
					sProjectId = aProjectIds[iNextIndex];
					break;
				}
			}
			if (sProjectId == null) {
				return oMfmStorage.oLanguageMapping.parsePath('mainmenu/projekte/');
			}
			var sLink = 'mainmenu/projekte/projekt/'
				+ '?cat=' + oNavControl.oActivePage.sCategory
				+ '&project=' + sProjectId;
			return oMfmStorage.oLanguageMapping.parsePath(sLink);
		} else if (oNavControl.oActivePage.oParent.oChildren.length-1 == oNavControl.oActivePage.iMyNumber) {
			if (oNavControl.oActivePage.iMyNumber == 0) {
				// first page == last page, so no nav-right possible
				return false;
			}
			else {
				oNavControl.oActivePage.bActive = false;
				oNavControl.oActivePage = oNavControl.oActivePage.oParent.oChildren[0];
				oNavControl.oActivePage.bActive = true;
				return oNavControl.oActivePage.sUrl+oNavControl.oActivePage.sParams;
			}
		}
		else {
			oNavControl.oActivePage.bActive = false;
			oNavControl.oActivePage = oNavControl.oActivePage.oParent.oChildren[oNavControl.oActivePage.iMyNumber + 1];
			oNavControl.oActivePage.bActive = true;
			return oNavControl.oActivePage.sUrl+oNavControl.oActivePage.sParams;
		}
	}




	/**
	* Finds and activates the next page in the page tree on the same level.
	*/
	,getNextPage: function() {
		if (oNavControl.oActivePage.sType == 'projektseite') {
			var aProjectIds = oNavControl.oActivePage.aProjectIds;
			var sProjectId = null;
			for (var i in aProjectIds) {
				if (oNavControl.oActivePage.oCurrent.iId == aProjectIds[i]) {
					var iLastIndex = ((aProjectIds.length + parseInt(i) - 1) % aProjectIds.length);
					sProjectId = aProjectIds[iLastIndex];
					break;
				}
			}
			if (sProjectId == null) {
				return oMfmStorage.oLanguageMapping.parsePath('mainmenu/projekte/');
			}
			var sLink = 'mainmenu/projekte/projekt/'
				+ '?cat=' + oNavControl.oActivePage.sCategory
				+ '&project=' + sProjectId;
			return oMfmStorage.oLanguageMapping.parsePath(sLink);
		} else if (0 == oNavControl.oActivePage.iMyNumber) {
			if (oNavControl.oActivePage.oParent.oChildren.length-1 == 0) {
				// first page == last page, so no nav-right possible
				return false;
			}
			else {
				oNavControl.oActivePage.bActive = false;
				oNavControl.oActivePage = oNavControl.oActivePage.oParent.oChildren[oNavControl.oActivePage.oParent.oChildren.length-1];
				oNavControl.oActivePage.bActive = true;
				return oNavControl.oActivePage.sUrl+oNavControl.oActivePage.sParams;
			}
		}
		else {
			oNavControl.oActivePage.bActive = false;
			oNavControl.oActivePage = oNavControl.oActivePage.oParent.oChildren[oNavControl.oActivePage.iMyNumber - 1];
			oNavControl.oActivePage.bActive = true;
			return oNavControl.oActivePage.sUrl+oNavControl.oActivePage.sParams;
		}
	}




	/**
	 * Searches for the new page in the page tree and sets that page active.
	 */
	,setActivePage: function(sUrl) {
		// function used to search in tree recursive
		function searchInTree(oMenuTree, sUrl) {
			if (typeof oMenuTree != 'object') {
				return false;
			}
			for (var i in oMenuTree) {
				var oActualItem = oMenuTree[i];
				// check if a child item is the searched one
				var oChildItem = searchInTree(oActualItem.oChildren, sUrl);
				if (oChildItem != false) {
					return oChildItem;
				}
				// check if this item is the searched one
				if (typeof oActualItem.sUrl != 'undefined' && oActualItem.sUrl.toLowerCase() == sUrl.toLowerCase()) {
					return oActualItem;
				}
			}
			// nothing found, so return false
			return false;
		}

		// search url in tree
		var aUrl = sUrl.split('?');
		var sSearchUrl = aUrl[0];

		if (sSearchUrl.substr(sSearchUrl.length - 1) != '/') {
			sSearchUrl += '/';
		}

		var oNewActiveItem = searchInTree(this.oMenu.oChildren, sSearchUrl);
		if (!oNewActiveItem) {
			return false;
		}

		// change active status
		while (oNewActiveItem.sType == "shortcut") {
			// shortcut handle
			if (typeof oNewActiveItem.oChildren[0] == "undefined") {
				return false;
			}
			var iIndex = 0;
			// special handle for project (go to random project page)
			// @feature remove "&& aUrl[0] != 'mainmenu/start/'" to get a random start page
			if (
				(
					oNavControl.oActivePage.sNavCat == 'projects'
					&& oNavControl.oActivePage.sType == 'auswahlseite'
					&& aUrl[0] != 'mainmenu/start/'
				) ||
				(
					oNavControl.oActivePage.sType == 'startseite'
					&& aUrl[0] != 'mainmenu/start/'
				)
			) {
					var iIndex = Math.floor(Math.random() * oNewActiveItem.oChildren.length);
			}
			oNewActiveItem = oNewActiveItem.oChildren[iIndex];
		}
		oNewActiveItem.sParams = (aUrl.length > 1 ? '?' + aUrl[1] : '');
		this.oActivePage.bActive	= false;
		this.oActivePage			= oNewActiveItem;
		this.oActivePage.bActive	= true;

		this.updateMainNav(oNewActiveItem);

		return oNewActiveItem;
    }




    /**
     * Updates the main navigation.
     */
	,updateMainNav: function(oActivePage) {
		// get main navigation point
		this.sMainNav = (oActivePage.sType == 'bilderstrecke' ? 'home' : oNavControl.getNavCat(oActivePage));

		if (typeof this.sMainNav == 'string') {
		    // reset nav
		    $('#orgnavi_items li a')
		        .blur();
		    $('#orgnavi_items li')
				.removeClass('orgcurrent')
				.removeClass('orgactive')
				.addClass('orginactive');

			// set current nav
			$('#orgnavi_items_'+this.sMainNav+'_li')
				.removeClass('orginactive')
				.addClass('orgcurrent');

			// special nav handling
			$('#orgnavi_items_home').css('background-position', (this.sMainNav == 'home' ? '-100px' : '0px')+' -995px');
		}
	}




	/**
	 * Replaces the url of every intern link to use oNavControl navTo instead of changing page directly.
	 */
	,replaceAllLinks: function() {
		var oCurrentPortal = oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal];
		var oCurrentLanguage = oCurrentPortal.aLanguages[oMfmStorage.oLanguage.iActiveLanguage];
		$('a').each(function(iIndex, oElement) {
			// check anker target
			if ($.inArray($(oElement).attr('target'), oMfmStorage.oPageTypes) != -1) {
				$(oElement).removeAttr('target');
			}
			
			if (!$(this).parent().hasClass('no-url-replace') && !$(this).hasClass('no-url-replace') && !($(this).closest('.no-url-replace-all').length > 0)) {
				var sUrl = $(this).attr('href');
				if (typeof sUrl == 'string') {
					if (sUrl.substr(0, oNavControl.sBaseUrl.length) == oNavControl.sBaseUrl) {
						sUrl = sUrl.substr(oNavControl.sBaseUrl.length);
					}
					if (sUrl.substr(0,1) == '/') {
						sUrl = sUrl.substr(1);
					}
					if (
						sUrl
						&& sUrl.length > 0
						&& sUrl.substr(0, 7) != 'mailto:'
						&& sUrl.substr(0, 4) != 'http'
						&& sUrl.substr(0, 22) != "javascript:oNavControl"
						&& sUrl.substr(sUrl.length - 3).toLowerCase() != "pdf"
					) {
						if (oCurrentLanguage.sRealUrlPrefix != '') {
							// check missing language prefix in url
							if (sUrl.substr(0, 3) != oCurrentLanguage.sRealUrlPrefix) {
								sUrl = oCurrentLanguage.sRealUrlPrefix + sUrl;
							}
						}
						$(this).attr('href', "javascript:oNavControl.navTo('" + sUrl + "')");
					}
				}
			}
		});
	}
	
	
	
	
	/**
	 * Navigates to new page using this.navTo()
	 * but parses the url with oMfmStorage.oLanguageMapping.parsePath() before navigating
	 *
	 * @param sUrl		string	target url
	 */
	,mappedNavTo: function (sUrl) {
		
		this.navTo(oMfmStorage.oLanguageMapping.parsePath(sUrl));
		
	}
	
	
	
	
	/**
	 * Navigates to new page - uses transistions if internal link.
	 *
	 * @param sUrl		string	target url
	 */
	,navTo: function(sUrl) {
		// remove body height 
		//(because a lightbox might have set it, but it shall not be kept if you nav to another site)
		$('body').css({'height': 'auto'});
		
		var bHistory = true;
		if (
			typeof sUrl == 'string'
			&& sUrl.substr(0, oNavControl.sBaseUrl.length) == oNavControl.sBaseUrl
		) {
			sUrl = sUrl.substr(oNavControl.sBaseUrl.length);
		}
//log('nav to "'+sUrl+'"');
		// get url
		oNavControl.oLastPage = oNavControl.oActivePage;
		if (sUrl == 'right') {
			if ((sUrl = oNavControl.getPrevPage()) === false) {
				return;
			}
			bHistory = ( oNavControl.oActivePage.sType != 'bilderstrecke');
		} else if (sUrl == 'left') {
			if ((sUrl = oNavControl.getNextPage()) === false) {
				return;
			}
			bHistory = ( oNavControl.oActivePage.sType != 'bilderstrecke');
		} else {
			var oNewPage = oNavControl.setActivePage(sUrl);
			if (!oNewPage) {
				oNavControl.bLoading = false;
				window.location.href = sUrl;
				return;
			}
			sUrl = oNewPage.sUrl + oNewPage.sParams;
		}
		if (sUrl === false) {
			oNavControl.bLoading = false;
			window.location.href = sUrl;
			return;
		}
		if (bHistory) {
			$.history.load(sUrl);
		} else {
			oNavControl.handleNextPage(sUrl);
		}
	}




	/**
	 * Changes the content.
	 */
	,changeContent: function(sUrl) {
	    // check if currently loading...
		if (oNavControl.bLoading) {
		    return;
		}
		oNavControl.bLoading = true;

		$('body').prepend('<div id="loader-overlay"><img id="ajaxloader" src="/fileadmin/templates/css/images/ajax_loader.gif" alt="ajax loader" title="ajax loader" /></div>');
		$('#footer').css('top', $('#footer').position().top +'px');
		window.setTimeout(function(){
				$('#loader-overlay').css('display', 'block');
			}
			,1000);
		$('#dotorgnavi').removeClass('hide');

		oNavControl.sCurrentUrl = sUrl;

		// special project handler
		if (oNavControl.oActivePage.sType == 'projektseite') {
			// get url parameters
			var aParams = oNavControl.getParameters(sUrl);

			// get category project ids
			$.get(
				oNavControl.sBaseUrl + '?eID=json'
				, {
					action:			'totoyaRequest'
					,sClass:		'cProjects'
					,sFunction:		'ajaxGetProjectList'
					,sCategory:		aParams.sCategory
					,sPortal:		oMfmStorage.oLanguage.sActivePortal
				}
				, function(oProjectList) {
					// if project list is empty, show 404 page
					if (typeof oProjectList.mData != 'object' || oProjectList.mData.length == 0) {
						window.location.href = '/404/';
						return;
					}

					// init projects data object
					var oProjectsData = {
						sCategory:		aParams.sCategory
						, aProjectIds: 	oProjectList.mData
					};

/*
					// if no project id is given, set one randomly
					if (aParams.iProjectId == null) {
						var iRandom = parseInt(Math.random() * oProjectList.mData.length);
						aParams.iProjectId = oProjectList.mData[iRandom];
					}
*/
					// if no project id is given, set first one
					if (aParams.iProjectId == null) {
						aParams.iProjectId = oProjectList.mData[0];
					}

					// set language
					var oPortal = oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal];
					var oLanguage = oPortal.aLanguages[oMfmStorage.oLanguage.iActiveLanguage];

					// get project data
					$.get(
						oNavControl.sBaseUrl + '?eID=json'
						, {
							action:			'totoyaRequest'
							,sClass:		'cProjects'
							,sFunction:		'ajaxGetProject'
							,iProjectId:	aParams.iProjectId
							,sLanguage:		oLanguage.sSymbol
							,sPortal:		oMfmStorage.oLanguage.sActivePortal
						}
						, function(oProject) {
							// if no project data is given, show 404 page
							if (
								typeof oProject.mData != 'object'
								|| (
									oProject.mData.sTitle.length == 0
									&& oProject.mData.sText.length == 0
									&& oProject.mData.sTrack === null
								)
							) {
								window.location.href = '/404/';
								return;
							}

							// add current project data to projects data object
							oProject.mData.iId = aParams.iProjectId;
							oProjectsData.oCurrent = oProject.mData;
							oMfmStorage.oProjectsData = oProjectsData;

							// call special page loader
							oNavControl.projectPageLoader(sUrl.split('?')[0], oProjectsData);
						}
						,'json'
					);
					return;
				}
				, 'json'
			);
			return;
		} else {
			// call default page loader
			if (
				oNavControl.oActivePage.oParent.oParent.sName == 'Strecken'
				&& $.inArray(oNavControl.oActivePage.sType, ['bilderstrecke', 'textstrecke', 'videostrecke', 'kartenstrecke']) != -1
			) {
				$.get(
					oNavControl.sBaseUrl + '?eID=json'
					, {
						action:			'totoyaRequest'
						, sClass:		'cProjects'
						, sFunction:	'ajaxGetTrackProject'
						, sUrl:			sUrl
						, sPortal:		oMfmStorage.oLanguage.sActivePortal
						, sLanguage:	oMfmStorage.oLanguage[oMfmStorage.oLanguage.sActivePortal].aLanguages[oMfmStorage.oLanguage.iActiveLanguage].sSymbol
					}
					, function(o) {
						// if no track found, show 404 page
						if (o.mData === null) {
							window.location.href = '/404/';
						}
						
						// set track data
						oMfmStorage.oProjectsData = {
							sCategory:	o.mData.sCategory
							, sCatName: o.mData.sCatName
							, oCurrent:	o.mData
						};
						oNavControl.defaultPageLoader(sUrl);
					}
					, 'json'
				);
			} else {
				oMfmStorage.oProjectsData = null;
				oNavControl.defaultPageLoader(sUrl);
			}
		}
	}




	/**
	 * Parses a text.
	 *
	 * @param	sText	string		text to parse
	 */
	,parseText: function(sText) {
		if (typeof sText == 'string') {
			// change color templates
			var sParsedText = sText
				.replace(/_#/g, '<span class="texthighlight">')
				.replace(/#_/g, '</span>')
				.replace(/_i#/g, '<span class="texthighlight_italic">')
				.replace(/#i_/g, '</span>');
		} else {
			sParsedText = "";
		}
		return sParsedText;
	}




	/**
	 * Default page loader.
	 */
	,defaultPageLoader: function(sUrl) {
		// create complete path
		sUrl = oNavControl.sBaseUrl + sUrl;

		// get new page content

		$.ajax({
			url		: sUrl
			,data	: ''
			,success: function(e) {
				var oNewPage = $(e);
				var sBackground = oNewPage.filter('#background').find('img').attr('src');
				if (typeof sBackground == 'undefined') {
					sBackground = oNewPage.find('#background').find('img').attr('src');
				}
				var oBgPosition = oNewPage.filter('#bg_image_position');
				if (oBgPosition.length == 0) {
					var sBgPosition = oNewPage.find('#bg_image_position').text();
				} else {
					var sBgPosition = oBgPosition.text();
				}
				var oContent = oNewPage.filter('#center').find('#content');
				oContent.html(oNavControl.parseText(oContent.html()));
				var oTarget = $('#content-wrapper');
				oTarget.fadeOut('fast',function() {
					oBgControl.swap(sBackground, sBgPosition, function() {
						oTarget.html(oContent);
						document.title = oNewPage.filter('title').text();
						oTarget.fadeIn('fast');
						oNavControl.setPageType();
						oNavControl.renderBullets();
						oNavControl.setDonations(
							oMfmStorage.oProjectsData == null || typeof oMfmStorage.oProjectsData.sCategory == 'undefined' ?
							'other' :
							oMfmStorage.oProjectsData.sCategory
						);
						oSiteControl.init();
						oNavControl.replaceAllLinks();
						oNavControl.bLoading = false;
						// set last mousemoove to zero, so that the 5 seconds
						// until autonav switches again start now
						oNavControl.iLastMove = 0;
						oNavControl.checkAutoStart();
						$(window).resize();
					});
				});
			}
			,error:	function(){
//				oNavControl.defaultPageLoader('');
				window.location.href = '/404/';
			}
		});
	}




	/**
	 * Project page loader.
	 */
	,projectPageLoader: function(sUrl, oProjectsData) {
		// create complete path
		sUrl = oNavControl.sBaseUrl + sUrl;

		// get new page content
		$.ajax({
			url		: sUrl
			,data	: ''
			,success: function(e) {
				var oNewPage = $(e);
				oNavControl.oActivePage.sName = oProjectsData.oCurrent.sTitle;
				oNavControl.oActivePage.aProjectIds = oProjectsData.aProjectIds;
				oNavControl.oActivePage.oCurrent = oProjectsData.oCurrent;
				oNavControl.oActivePage.sCategory = oProjectsData.sCategory;
				var sBackground = oProjectsData.oCurrent.sBackground;
				var sBgPosition = oProjectsData.oCurrent.sBgPosition;
				var oContent = oNewPage.filter('#center').find('#content');
				oContent.html(oNavControl.parseText(oContent.html()));
				var oTarget = $('#content-wrapper');
				oTarget.fadeOut('fast', function() {
					oBgControl.swap(sBackground, sBgPosition, function() {
						oTarget.html(oContent);
						$('#inner_content .csc-header h1').html(oNavControl.parseText(oProjectsData.oCurrent.sText));
						$('#content_right .csc-header h1').each(function() {
							var sNr = $(this).html().substr(3);
							$(this).parent().parent().find('.bodytext').html(oNavControl.parseText(oProjectsData.oCurrent['sBox'+sNr]));
							var sLink = oProjectsData.oCurrent['sLink'+sNr];
							if (sLink != null && sLink.length > 0) {
								$(this).html('<a href="'+sLink+'">' + $(this).html() + '</a>');
							}
						});
						document.title = document.title = 'Menschen für Menschen - ' + oNavControl.oActivePage.sName;
						oTarget.fadeIn('fast');
						oNavControl.setPageType();
						oNavControl.renderBullets();
						oNavControl.setDonations(
							typeof oNavControl.oActivePage.sCategory == 'undefined' ?
							'other' :
							oNavControl.oActivePage.sCategory
						);
						oSiteControl.init();
						oNavControl.replaceAllLinks();
						oNavControl.bLoading = false;
						// set last mousemoove to zero, so that the 5 seconds
						// until autonav switches again start now
						oNavControl.iLastMove = 0;
						oNavControl.checkAutoStart();
						$(window).resize();
					});
				});
			}
			,error:	function(){
//				oNavControl.defaultPageLoader('');
				window.location.href = '/404/';
			}
		});
	}




	,checkAutoStart: function() {
		// handle ssl flag
		if (oNavControl.aAllParams.bSsl == '1' && oNavControl.aAllParams.sPage.length > 0) {
			switch (oNavControl.aAllParams.sPage) {
				case 'activities':
				case 'chequebook':
					break;

				case 'wizard':
					oNavControl.aAllParams.bSsl = 0;
					oDonationControl.sWerbeCode = oNavControl.aAllParams.sWerbeCode;
					oDonationControl.sProjectName = oNavControl.aAllParams.sProjectName;
					oDonationControl.showDonationWizard(parseInt(oNavControl.aAllParams.sAmount), oNavControl.aAllParams.sTargetPortal);
					oNavControl.bFillWizzard = false;
					break;

				case 'login':
					oNavControl.aAllParams.bSsl = 0;
					oNavControl.hideSslChange();
					oSiteControl.showLoginBox();
					break;
			}
		}
	}




	,getParameters: function(sUrl) {
		// get category and project parameter
		var oResult = {
			sCategory: null
			,iProjectId: null
		};
		var aUrl = sUrl.split('?');
		if (aUrl.length > 1) {
			var aParams = aUrl[1].toLowerCase().split('&');
			for (var i in aParams) {
				var aParam = aParams[i].split('=');
				if (aParam.length > 1) {
					if (aParam[0] == 'cat') {
						oResult.sCategory = aParam[1];
					} else if (aParam[0] == 'project') {
						oResult.iProjectId = aParam[1];
					}
				}
			}
		}
		return oResult;
	}




	/**
	 * Sets up the mouse interactions.
	 */
	 // TODO: prevent scrolling!
	 // scrolling allows the arrows to swap over the content.
	,iLastMove: 0
	,iArrowNavTopBorder : 110 // y-axis top boundary to keep the mainmenu clean
	,iArrowNavBottomBorder : 909 // y-axis bottom boundary to keep the content clean
	,setupMouseBoundaries: function() {
		var oContentOffset = $('#content').offset();
		oNavControl.iArrowNavBottomBorder = oContentOffset.top - 32;
	}
	,centerArrowNav: function(iPosition) {
		oNavControl.setupMouseBoundaries();
		var iYCenter = (oNavControl.iArrowNavBottomBorder / 2) + 30;
		//var iYCenter = (typeof iPosition == 'number'? iPosition : 210);
		$('#nav-to-left')
			.stop()
			.clearQueue()
			.animate({top: iYCenter}, 500, 'swing')
			.css('opacity', 0.6);
		$('#nav-to-right')
			.stop()
			.clearQueue()
			.animate({top: iYCenter}, 300, 'swing')
			.css('opacity', 0.6);

	}
	,setupMouseHandling: function() {

		// keep mouse position
		var iX = 0;
		var iY = 0;
		oNavControl.iLastMove = 0;
		function mouseMoveHelper(e) {
			iX = e.clientX;
			iY = e.clientY;
			oNavControl.iLastMove	= 0;
		}

		// keep centered document offset
		var iOffsetX = 0;
		var iOffsetY = 0;
		function windowResizeHelper() {
			iOffsetX = $('#nav-center').offset().left;
			iOffsetY = 0;
		}

		 // control mouse interactions
		 var iRealX	= 0;
		 var iRealY	= 0;
		 var bLeftInteractive	= false;
		 var bRightInteractive	= false;
		 var iLastX = 0;
		 var iLastY = 0;
		 function mouseInteractionHelper() {

			// automate page switching every 15 seconds
			oNavControl.iLastMove ++;
			if(oNavControl.iLastMove > 150 && !oNavControl.bLoading) {
				oNavControl.iLastMove = 0;
				// put page types here that should automaticly nav to right
				if(
					(
						oNavControl.oActivePage.sType == 'startseite'
						|| oNavControl.oActivePage.sType == 'orgstartseite'
					) 
					&& !oMfmStorage.bDebug
					&& oMfmStorage.bSwitching
				) {
					oNavControl.navTo('right');
				}

			}

			// set offset
			var iOffsetX = $('#nav-center').offset().left;
			//log('off: ' + iOffsetX);

			// inits
			if (iLastX == iX && iLastY == iY) {
				return;
			}
			iLastX = iX;
			iLastY = iY;
			iRealX = iX - iOffsetX;
			iRealY = iY - iOffsetY + $(document).scrollTop();

			// check y-axis boundaries
			oNavControl.setupMouseBoundaries();
			if (iRealY < oNavControl.iArrowNavTopBorder) {
				iRealY = oNavControl.iArrowNavTopBorder;
			}
			if (iRealY > oNavControl.iArrowNavBottomBorder) {
				iRealY = oNavControl.iArrowNavBottomBorder;
			}
//log('iX: ' + iX);
//log('iOffsetX: ' + iOffsetX);
//log('iRealX: ' + iRealX);
			// left navi
			if (
				iRealX >= 0
				&& iRealX < 50
				&& (iY + $(document).scrollTop()) >= (oNavControl.iArrowNavTopBorder - 20)
				&& (iY + $(document).scrollTop()) <= (oNavControl.iArrowNavBottomBorder + 30)
			) {
				if (bLeftInteractive != true) {
					bLeftInteractive = true;
					$('#nav-to-left')
						.css('opacity', 1);
						//.addClass('active');
				}
				$('#nav-to-left')
					.stop()
					.clearQueue()
					.animate({top: parseInt(iRealY-20)}, 90, 'swing');
			}
			else if (bLeftInteractive == true) {
				var iYCenter = (oNavControl.iArrowNavBottomBorder / 2) + 30;
				//var iYCenter = 210;
				bLeftInteractive = false;
				$('#nav-to-left')
					.stop()
					.clearQueue()
					.animate({top: iYCenter}, 500, 'swing')
					.css('opacity', 0.6);
					//.removeClass('active');
			}

			// right navi
			if (
				iRealX >= 900
				&& iRealX < 950
				&& (iY + $(document).scrollTop()) >= (oNavControl.iArrowNavTopBorder - 20)
				&& (iY + $(document).scrollTop()) <= (oNavControl.iArrowNavBottomBorder + 30)
			) {
				if(bRightInteractive != true) {
					bRightInteractive = true;
					$('#nav-to-right')
					.css('opacity', 1);
					//.addClass('active');
				}
				$('#nav-to-right')
					.stop()
					.clearQueue()
					.animate({top: parseInt(iRealY-20)}, 90, 'swing');
			}
			else if (bRightInteractive == true) {
				var iYCenter = (oNavControl.iArrowNavBottomBorder / 2) + 30;
				//var iYCenter = 210;
				bRightInteractive = false;
				$('#nav-to-right')
					.stop()
					.clearQueue()
					.animate({top: iYCenter}, 300, 'swing')
					//.removeClass('active')
					.css('opacity', 0.6);
			}
		}

		$('body').bind('mousemove', mouseMoveHelper);
		$(window).bind('resize', windowResizeHelper);
		windowResizeHelper();
		window.setInterval(mouseInteractionHelper, 100);
		// setup click events
		$('#nav-to-left')
			.css('opacity', 0.6)
			.click(function() {
				oNavControl.navTo('left');
			});
		$('#nav-to-right')
			.css('opacity', 0.6)
			.click(function() {
				oNavControl.navTo('right');
			});
	}




	/**
	 * Sets up the dom-elements and events for siteways navigation.
	 */
	,initSidewaysNav: function() {
		$('body').prepend(
			'<div id="nav-static">'
				+'<div id="nav-center">'
				+'<div id="nav-to-left"></div>'
				+'<div id="nav-to-right"></div>'
				+'</div>'
				+'</div>'
		);
	}




	/**
	 * Render the bullets.
	 */
	,renderBullets: function() {
		$('#bullets').empty();
		if (oNavControl.oActivePage.sType == 'projektseite') {
			for (var i in oNavControl.oActivePage.aProjectIds) {
				var iProjectId = oNavControl.oActivePage.aProjectIds[i];
				var iCurrent = oNavControl.oActivePage.oCurrent.iId;
				var sCat = oNavControl.oActivePage.sCategory;
				var oNewBullet = $('<div />')
					.addClass(iProjectId == iCurrent ? 'active_bullet' : 'inactive_bullet')
					.css({'cursor': (iProjectId == iCurrent ? 'normal' : 'pointer')})
					.bind('click', { sCat: sCat, iProjectId: iProjectId }, function(e) {
						var data = e.data;
						oNavControl.mappedNavTo('mainmenu/projekte/projekt/?cat='+data.sCat+'&project='+data.iProjectId);
					})
					.appendTo('#bullets');
			}
		} else {
			if (typeof oNavControl.oActivePage.oParent.oChildren == 'object') {
				$.each(oNavControl.oActivePage.oParent.oChildren, function(i, oPage) {
					var oNewBullet = $('<div />')
						.addClass((oPage.bActive ? 'active_bullet' : 'inactive_bullet'))
						.css({'cursor': (oPage.bActive ? 'normal' : 'pointer')})
						.click(function() {
							oNavControl.navTo(oPage.sUrl+oPage.sParams);
						})
						.appendTo('#bullets');
				});
			}
		}
		$('#bullets')
			.css({'left': ((960 - $('#bullets').width()) / 2)})
			.show();
	}




	/**
	 * Binds the url to the flag elements (.org)
	 */
/*
	,bindFlagLinks: function() {
		if ($('.flags').length > 0) {
			$('.flags').bind('click', function() {
				var aBaseUrl = oNavControl.sBaseUrl.split('://');
				var sCountry = $(this).attr('id').split('_')[1];
				window.location.href = aBaseUrl[0] + '://' + sCountry + aBaseUrl[1];
			});
		}
	}
*/




	/**
	 * Renders the top navigation.
	 */
	,renderOrgNavigation: function() {
		var sHtml = '<ul id="orgnavi_items">';
		$.each(oNavControl.oMenu.oChildren[0].oChildren, function(i, oPage) {
		    var sNavCat = oNavControl.getNavCat(oPage);
		    switch (oPage.sName) {

		    	case 'Home':
		    	case 'Start':
		    		sHtml += '<li class="orgcurrent" id="orgnavi_items_home_li"><div id="orgnavi_items_home"></div></li>';
		    		break;

		    	case 'Meine Hilfe':
		    		sHtml += '<li class="orginactive loggedin_dependent" id="orgnavi_items_community_li">' + oPage.sName + '</li>';
		    		break;

		    	case 'Shop':
		    		sHtml += '<li class="orginactive" id="orgnavi_items_shop_li"><a class="orginactive" href="' + oMfmStorage.oShop[oMfmStorage.oLanguage.sActivePortal] + '" target="shop">Shop</a></li>';
		    		break;

		    	default:
		    		sHtml += '<li class="orginactive" id="orgnavi_items_' + sNavCat + '_li">' + oPage.sName + '</li>';
		    		break;
		    }
		});

		sHtml += '<li class="orginactive" id="orgnavi_items_camera_li"><div id="orgnavi_items_camera"></div></li></ul>';
		$('#dotorgnavi').html(sHtml);

		// bind click handler
		$.each(oNavControl.oMenu.oChildren[0].oChildren, function(i, oPage) {
		    var sNavCat = oNavControl.getNavCat(oPage);
		    $('#orgnavi_items_'+sNavCat+'_li').bind('click', { sPage: oPage.sName }, function(o) {
				if (o.data.sPage != 'Shop') {
					oNavControl.navTo(oPage.sUrl + oPage.sParams);
				}
			});
		});
		$('#orgnavi_items_community_li').click(function() {
			oNavControl.navTo('community/meine-uebersicht');
		});

		// hover
		$('#dotorgnavi ul li').hover(function() {
				if (!$(this).hasClass('orgcurrent')) {
					$(this).removeClass('orginactive').addClass('orgactive');
					$(this).find('a').removeClass('orginactive').addClass('orgactive');
				}
			},
			function() {
				if (!$(this).hasClass('orgcurrent')) {
					$(this).removeClass('orgactive').addClass('orginactive');
					$(this).find('a').removeClass('orgactive').addClass('orginactive');
				}
			}
		);
		$('#orgnavi_items_camera_li').hover(function() {
				$('#orgnavi_items_camera').css('background-position', '-100px -1100px');
			},
			function() {
				$('#orgnavi_items_camera').css('background-position', '0px -1100px');
			}
		);
		$('#orgnavi_items_home_li').hover(function() {
		        if (!$(this).hasClass('orgcurrent')) {
                    $('#orgnavi_items_home').css('background-position', '-100px -995px');
				}

			},
			function() {
		        if (!$(this).hasClass('orgcurrent')) {
					$('#orgnavi_items_home').css('background-position', '0px -995px');
				}
			}
		);

		// camera handler
		$('#orgnavi_items_camera_li').click(this.cameraHandler);

	}




	/**
	 * Returns the navigation category.
	 */
	,getNavCat: function(oItem) {
		// return cached result
	    if (typeof oItem.sNavCat != 'undefined') {
			return oItem.sNavCat;
		}

		var oMainParent = oItem;
		while (
			typeof oMainParent.oParent != 'undefined'
			&& typeof oMainParent.oParent.oParent != 'undefined'
			&& typeof oMainParent.oParent.oParent.oParent != 'undefined'
		) {
			oMainParent = oMainParent.oParent;
		}

	    var sNavCat = 'unknown';
		for (var sCurrentNavCat in oNavControl.oMainNavItems) {
		    if (oMainParent.iMyNumber === oNavControl.oMainNavItems[sCurrentNavCat]) {
		        sNavCat = sCurrentNavCat;
		        break;
			}
		}
		oItem.sNavCat = sNavCat;

	    return sNavCat;
	}




	/**
	 * Camera handler
	 * BH: move to sitecontrol?
	 */
	,cameraHandler: function() {

		this.bCameraActive = !this.bCameraActive;

		if (this.bCameraActive) {

			this.bHelpActive = $('#orgnavi_items_community_li').css('display');

			$('#content-wrapper').hide();
			$('#nav-static').hide();
			$('#footer').hide();
			$('#orgnavi_items li').hide();
			$('#orgnavi_items_camera_li').show();

		} else {

			$('#content-wrapper').show();
			$('#nav-static').show();
			$('#footer').show();
			$('#orgnavi_items li').show();

			$('#orgnavi_items_community_li').css('display', this.bHelpActive);

		}
	}




	/**
	 * initializes Bandwidth control
	 * This loads files with known file size from
	 * the remote server and calcuates bandwidth
	 * from that
	 */
	,fBandwidth:	null // kB/s
	,initBandwithControl:	function() {
// TODO: TEMPORARY DEACTIVATED !!
return;
		// local vars
		var aResults = [];
		var aAllResults = []; //only for debugging
		var aFiles = {
				small: {
					sUrl:	'/fileadmin/bandwidth/small.gz'
					,iSize:	1029
				}
				,medium: {
					sUrl:	'/fileadmin/bandwidth/medium.gz'
					,iSize:	10424
				}
				,large: {
					sUrl:	'/fileadmin/bandwidth/large.gz'
					,iSize:	103632
				}
		};

		// function to execute one check
		//  - is called more than once
		//  - timeouts are handeld by infinite recursion (maybe we should change this?)
		function executeCheck(sFilename, iFilesize, iNextStage) {
			var iStart = Date.now();
			$.ajax({

				url:		sFilename + '?rnd='+Math.random()

				,timeout:	5000

				,type:		'GET'

				,success:	function(data, textStatus) {
								iDuration = Math.max(Date.now() - iStart - 10, 1); // 10ms for usual overhead
								fSpeed = iFilesize / iDuration;
								controlBandwidthChecks(iNextStage, fSpeed)
							}

				,error:		function() {
								executeCheck(sFilename, iFilesize);
							}
			});
		}


		// function to control checks
		//  - interrupts for each ajax-operation
		//  - is recalled after each ajax operation with an higer stage param
		function controlBandwidthChecks(iStage, fLastResult) {

			//log('BW stage: ' + iStage +' / Result: ' + fLastResult);
			//log(aResults);
			if(fLastResult != null && fLastResult > 0) {
				aResults.push(fLastResult);
				aAllResults.push(fLastResult);
			}
			switch(iStage) {


				// small
				case 0:
					// first check is a small file
					executeCheck(aFiles['small'].sUrl, aFiles['small'].iSize, 1);
				break;

				case 1:
					// then retest with a small file
					executeCheck(aFiles['small'].sUrl, aFiles['small'].iSize, 2);
				break;

				case 2:
					// compare them
					fTemp = aResults[0]/aResults[1];
					if(0.8 < fTemp && fTemp < 1.2) { // difference below 20%
						// goto next stage
						controlBandwidthChecks(3);
					}
					else {
						// retest until they can be compared
						// remove older test result
						aResults.shift();
						// retest
						executeCheck(aFiles['small'].sUrl, aFiles['small'].iSize, 2);
					}
				break;



				// medium
				case 3:
					// first check is a small file
					executeCheck(aFiles['medium'].sUrl, aFiles['medium'].iSize, 4);
				break;

				case 4:
					// then retest with a small file
					executeCheck(aFiles['medium'].sUrl, aFiles['medium'].iSize, 5);
				break;

				case 5:
					// compare them
					fTemp = aResults[2]/aResults[3];
					if(0.8 < fTemp && fTemp < 1.2) { // difference below 20%
						// goto next stage
						controlBandwidthChecks(6);
					}
					else {
						// retest until they can be compared
						// remove older test result
						aResults = [
							 aResults[0]
							,aResults[1]
							,aResults[3]
						];
						// retest
						executeCheck(aFiles['medium'].sUrl, aFiles['medium'].iSize, 5);
					}
				break;



				// large
				case 6:
					// first check is a small file
					executeCheck(aFiles['large'].sUrl, aFiles['large'].iSize, 7);
				break;

				case 7:
					// then retest with a small file
					executeCheck(aFiles['large'].sUrl, aFiles['large'].iSize, 8);
				break;

				case 8:
					// compare them
					fTemp = aResults[4]/aResults[5];
					if(0.8 < fTemp && fTemp < 1.2) { // difference below 20%
						// goto next stage
						controlBandwidthChecks(9);
					}
					else {
						// retest until they can be compared
						// remove older test result
						aResults = [
							 aResults[0]
							,aResults[1]
							,aResults[2]
							,aResults[3]
							,aResults[5]
						];
						// retest
						executeCheck(aFiles['large'].sUrl, aFiles['large'].iSize, 8);
					}
				break;

				// result
				case 9:
					// calculate average
					// and "return"
					var fSum = 0;
					for(i in aResults) {
						fSum += aResults[i];
					}
					var fAverage = fSum / aResults.length;
					oNavControl.fBandwidth = Math.floor(fAverage);
					//log('BW result:' + fAverage);
				break;
			}
		}

		// init checks
		controlBandwidthChecks(0);
	}




	/**
	 *
	 */
	,getBandwidwth:	function() {
	}




	/**
	 *
	 */
	,getImageQuality:	function() {
	}

}




// init on doc ready
$(document).ready(function() {
	oNavControl.init();
});
document.write(''
	+'<style type="text/css">'
		+'.noscript {'
			+'display:none;'
		+'}'
	+'</style>'
);



