
/*global $,log,app,style,svc,ml,confmodell,modeldisplayCtrl,layoutManager */
/*global showroom,getContentHeight,getWindowHeight,getBordersSum,getMarginsSum,getPaddingsSum */

function LayoutManager(params) {
	this.init(params);
}

$.extend(LayoutManager.prototype, {
	init : function(params) {
		this.state = '';
		this.oldState = '';

		this.pageContentDecrement = 0;

		// bind window.resize event
		var that = this;
		$(window).resize(function() {
			that.doLayout();
		});
	},

	setState : function(state) {
		if(state !== this.state){
			//log("LayoutManager", "new state " + state);
			this.oldState = this.state;
			this.state = state;
		}
	},

	resetState : function() {
		//log("LayoutManager", "reset state " + this.oldState);
		this.state = this.oldState;
	},

	doLayout : function() {
		// log("LayoutManager", "doLayout " + this.state);
		if(style.isPorsche) {
			this.doLayoutPorsche();
		} else if(app.isShowroom) {
			showroom.doLayoutShowroom(this.state);
		} else {			
			switch (this.state) {
			case 'ausvgl':
				this.doLayoutAusvgl();
				break;
			case 'merkliste':
				this.doLayoutMerkliste();
				break;
			case 'serie':
				this.doLayoutSerie();
				break;
			case 'modellbild':
				this.doLayoutModellbild();
				break;
			case 'trichter':
			case 'trichterliste':
			case 'farben':
			case 'raeder':
			case 'maus':
			case 'angebot':
			default:
				this.doLayoutCC();
				break;
			}
		}
	},

	getWindowHeight : function() {
		return (self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight);
	},

	calculateHeights : function(element, scalingElements, depth) {
		var fixedHeight = 0;

		for ( var i = 0; i < element.childNodes.length; i += 1) {
			var node = element.childNodes[i];

			if (node.nodeType === 1) {
				if ((node.className.indexOf('page-') >= 0) && (node.className.indexOf('page-content') < 0)) {
					fixedHeight += node.offsetHeight;
				} else if (node.className.indexOf('page-content') >= 0) {
					scalingElements[scalingElements.length] = node;
				}else if (depth < 3) {
					fixedHeight += this.calculateHeights(node, scalingElements, depth + 1);
				}
			}
		}
		return fixedHeight;
	},

	doLayoutCC : function() {
		var windowHeight = this.getWindowHeight();
		var scalingElements = [];

		windowHeight -= this.calculateHeights(document.documentElement, scalingElements, 0);

		for ( var i = 0; i < scalingElements.length; i += 1) {
			var height = windowHeight / (scalingElements.length - i);

			if (height >= 0) {
				scalingElements[i].style.height = (height - this.pageContentDecrement) + 'px';

//				if (scalingElements[i].id && eval("typeof " + scalingElements[i].id + 'Resized == "function"')) {
//					var resizeFunction = eval(scalingElements[i].id + 'Resized');
//					resizeFunction(height - this.pageContentDecrement);
//				}
			}

			windowHeight -= height;
		}
		this.updateInfoSize();
	},

	doLayoutMerkliste : function() {
		var headerHeight = getContentHeight( {
			"innerHeights" : [ '#header', '.small_navigation' ],
			"marginSums" : [ '#header', '.small_navigation' ],
			"paddingSums" : [ '.small_navigation' ]
		});

		var auvTopHeight = getContentHeight( {
			"innerHeights" : [ '#ausvgl_top' ],
			"marginSums" : [ '#ausvgl_top' ]
		});

		// Anpassung wegen fehlerhafter Hoehenberechnungen
		var markenOffset = 0;
		var navHeight = $('.small_navigation').css('height');
		markenOffset = Number(navHeight.substr(0, navHeight.indexOf("px")));
		if (isNaN(markenOffset)) {
			markenOffset = 0;
		}

		$("#modell_serie_text").css('height', (getWindowHeight() - (headerHeight + markenOffset)) + 'px');
		$("#ausvgl_main").css('height', (getWindowHeight() - (headerHeight + markenOffset + auvTopHeight)) + 'px');

		if (style.isSkoda) // border-right fehlt sonst wenn
		// Table-Inhalt sehr kurz (kuerzer als
		// Bildschirm hoch)
		{
			$("#merkliste_spacer").height(0);
			$("#merkliste_spacer").show();

			var mklMainHeight = $('#modell_serie_text').innerHeight();
			var mklUserdetailsHeight = $('#mkl_userdetails').outerHeight(true);
			var mklOverviewHeight = $('#mkl_overview').outerHeight();
			var mklActionlinksHeight = $('#mkl_actionlinks').outerHeight();

			var mklSpacerHeight = mklMainHeight - (mklUserdetailsHeight + mklOverviewHeight);

			if (mklSpacerHeight < 0){
				mklSpacerHeight = 15;
			}

			$("#merkliste_spacer").height(mklSpacerHeight);
		}
	},

	doLayoutSerie : function() {
		var contentHeight = getContentHeight( {
			"innerHeights" : [ '#modell_serie' ],
			"marginSums" : [ '#modell_serie' ]
		});
		var headerHeight = getContentHeight( {
			"innerHeights" : [ '#header', '.small_navigation' ],
			"marginSums" : [ '#header', '.small_navigation' ],
			"paddingSums" : [ '.small_navigation' ]
		});

		// Anpassung wegen fehlerhafter Hoehenberechnungen
		var markenOffset = 0;
		var navHeight = $('.small_navigation').css('height');
		var footerHeight = $('#modell_serie_footer').css('height');
		markenOffset = Number(navHeight.substr(0, navHeight.indexOf("px")));
		if (isNaN(markenOffset)){
			markenOffset = 0;
		}
		var cssFooterHeight = Number(footerHeight.substr(0, footerHeight.indexOf("px")));
		markenOffset += isNaN(cssFooterHeight) ? 0 : cssFooterHeight;

		if (!style.isGA){
			$(".class_main_size").height(contentHeight);
		}
		$("#modell_serie_text").css('height', (getWindowHeight() - (headerHeight + markenOffset)) + 'px');
	},

	doLayoutAusvgl : function() {
		var headerHeight = getContentHeight( {
			"innerHeights" : [ '#header', '.small_navigation' ],
			"marginSums" : [ '#header', '.small_navigation' ],
			"paddingSums" : [ '.small_navigation' ]
		});

		var auvTopHeight = getContentHeight( {
			"innerHeights" : [ '#ausvgl_top' ],
			"marginSums" : [ '#ausvgl_top' ]
		});

		// Anpassung wegen fehlerhafter Hoehenberechnungen
		var markenOffset = 0;
		var navHeight = $('.small_navigation').css('height');
		markenOffset = Number(navHeight.substr(0, navHeight.indexOf("px")));
		if (isNaN(markenOffset)) {
			markenOffset = 0;
		}

		$("#modell_serie_text").css('height', (getWindowHeight() - (headerHeight + markenOffset)) + 'px');
		$("#ausvgl_main").css('height', (getWindowHeight() - (headerHeight + markenOffset + auvTopHeight)) + 'px');

		if (style.isSkoda) // border-right fehlt sonst wenn
		// Table-Inhalt sehr kurz (kuerzer als
		// Bildschirm hoch)
		{
			$("#ausvgl_spacer").show();

			var auvMainHeight = getContentHeight( {
				"innerHeights" : [ '#ausvgl_main' ],
				"marginSums" : [ '#ausvgl_main' ]
			});
			var auvRightHeight = getContentHeight( {
				"innerHeights" : [ '#ausvgl_right' ],
				"marginSums" : [ '#ausvgl_right' ]
			});

			if (auvRightHeight < auvMainHeight) {
				$("#ausvgl_spacer").css('height', (auvMainHeight - auvRightHeight) + 'px');
			} else {
				if ($.browser.msie) // wiedermal anderes rendering ...
				{
					$("#ausvgl_spacer").css('height', '15px');
				} else {
					$("#ausvgl_spacer").css('height', '10px');
				}
			}
		}
	},
	
	doLayoutModellbild: function() {			
		if (style.isSkoda) {
    		var headerHeight = getContentHeight({
    			"innerHeights": ['#header'],
    			"marginSums":   ['#header']
    		});
    		var upperNavHeight = getContentHeight({
    			"innerHeights": ['.small_navigation'],
    			"marginSums":   ['.small_navigation']
    		});
    		headerHeight -= getBordersSum('.small_navigation') + 2;

    		var footerHeightPx =  $('#navigation').css('height');
    		var footerHeight = Number(footerHeightPx.substr(0, footerHeightPx.indexOf("px")));
    		if (isNaN(footerHeight)){
    			footerHeight = 0;
    		}

    		$('#modell_picture').css('height', (getWindowHeight() - (headerHeight + footerHeight + upperNavHeight)) + 'px');     	
        }
		
		$('#modelImageBig1, #modelImageBig2').imageview('centerize');
	},
	
	doLayoutPorsche : function() {
		var windowHeight = this.getWindowHeight();
		var fixedHeight = $("#header").outerHeight() + $("#info_header").outerHeight() + $("#menu").outerHeight();
		$("#rundherum").css("height", (windowHeight - fixedHeight) + "px");
	},
	
	updateInfoSize : function() {
		if (style.isGA || style.isPorsche || app.isShowroom){
			return;
		}

		switch (this.state) {
		case 'trichter':
			this.updateInfoSizeTrichter();
			break;
		case 'trichterliste':
			this.updateInfoSizeTrichterListe();
			break;
		case 'farben':
			this.updateInfoSizeFarben();
			break;
		case 'raeder':
			this.updateInfoSizeRaeder();
			break;
		case 'maus':
			this.updateInfoSizeMaus();
			break;
		case 'angebot':
			this.updateInfoSizeAngebot();
			break;
		}
	},

	updateInfoSizeTrichter : function() {
		var $div_size = $("#rundherum").innerHeight();
		var contentHeight = getContentHeight( {
			"innerHeights" : [ '#content_info', '#modell_list', '.modell_bild' ],
			"marginSums" : [ '#content_info', '#modell_list', '.modell_bild' ]
		});

		$(".sidebar").css('height', '');
		var sidebarHeight = $(".sidebar").innerHeight() + getMarginsSum(".sidebar");
		if (sidebarHeight > contentHeight){
			contentHeight = sidebarHeight;
		}
		if (contentHeight > $div_size){
			$div_size = contentHeight;
		}else if (style.isSkoda){
			$div_size -= 2;
		}
		var height = (($div_size - getMarginsSum(".sidebar")) - getBordersSum("#content_main"));

		if (style.isSkoda) // hoehe des main-contents setzen, damit die
		// borders bei skoda passen
		{
			$(".sidebar").css('height', height + 'px');
			$("#content_main").css('height', height + 'px');
		} else if (style.isSeat) {
			$(".sidebar").css('height', (height) + 'px');
		}
	},

	updateInfoSizeTrichterListe : function() {
		var $div_size = $("#rundherum").innerHeight();
		var contentHeight;
		
		if (style.isAudi) {
			contentHeight = getContentHeight( {
				"innerHeights" : [ '#modell_list' ],
				"marginSums" : [ '#modell_list' ]
			});
			var infoHeight = getContentHeight( {
				"innerHeights" : [ '#content_info' ],
				"marginSums" : [ '#content_info' ]
			});
			if ((contentHeight + infoHeight) > $div_size){
				$div_size = contentHeight;
			} else {
				$div_size -= infoHeight;
			}
			$("#content_main").css('height', $div_size + 'px');
			return;
		}

		contentHeight = getContentHeight( {
			"innerHeights" : [ '#content_info', '#modell_list', '.modell_bild' ],
			"marginSums" : [ '#content_info', '#modell_list', '.modell_bild' ]
		});

		$(".sidebar").css('height', '');
		var sidebarHeight = $(".sidebar").innerHeight() + getMarginsSum(".sidebar");

		if (sidebarHeight > contentHeight){
			contentHeight = sidebarHeight;
		}
		if (contentHeight > $div_size){
			$div_size = contentHeight;
		} else if (style.isSkoda) {
			$div_size -= 2;
		}
		var height = (($div_size - getMarginsSum(".sidebar")) - getBordersSum("#content_main"));

		if (style.isSkoda) {
			// hoehe des main-contents setzen, damit die
			// borders bei skoda passen
			$(".sidebar").css('height', height + 'px');
			$("#content_main").css('height', height + 'px');
		} else if (style.isSeat) {
			$(".sidebar").css('height', height + 'px');
		}
	},

	updateInfoSizeFarben : function() {
		if (style.isSkoda) {
			$("#modell_farben").css('height', '');
			$("#line_polster").css('height', '');
		}
		$("#sidebar").each(function(idx, el) {
			el.style.height = '';
		});
		$(".class_main_size").css('height', '');
		var sidebarHeight = $("#sidebar").innerHeight() + getMarginsSum("#sidebar");
		var $div_size = $("#rundherum").innerHeight();
		var contentHeight = getContentHeight( {
			"innerHeights" : [ '#modell_farben' ],
			"marginSums" : [ '#modell_farben', '.class_main_size' ]
		});

		if (sidebarHeight > contentHeight){
			contentHeight = sidebarHeight;
		}
		if (contentHeight > $div_size){
			$div_size = contentHeight;
		}
		$div_size -= getMarginsSum(".class_main_size");

		$(".class_main_size").css('height', $div_size + 'px');

		if (style.isSkoda) {
			$("#modell_farben").css('height', $div_size + 'px');
			$("#line_polster").css('height', ($div_size - 38) + 'px');
		}
	},

	updateInfoSizeRaeder : function() {

		$(".sidebar").each(function(idx, el) {
			el.style.height = '';
		});
		$(".class_main_size").css('height', '');
		var sidebarHeight = $("#sidebar").innerHeight() + getMarginsSum("#sidebar");
		var $div_size = $("#rundherum").innerHeight();
		var contentHeight = getContentHeight( {
			"innerHeights" : [ '#modell_raeder' ],
			"marginSums" : [ '#modell_raeder', '.class_main_size' ]
		});

		if (style.isSkoda){
			contentHeight += getPaddingsSum('#modell_raeder_header');
		}
		if (sidebarHeight > contentHeight){
			contentHeight = sidebarHeight;
		}
		if (contentHeight > $div_size){
			$div_size = contentHeight;
		}
		$div_size -= getMarginsSum(".class_main_size");
		$(".class_main_size").css('height', $div_size + 'px');
	},

	updateInfoSizeMaus : function() {
		var mausLinksPositionStatic = $('#maus_links_position').css('position') === 'static';
		
		$(".sidebar").each(function(idx, el) {
			el.style.height = '';
		});
		$(".class_main_size").css('height', '');
		
		var sidebarHeight;		
		if (style.isSeat) {
			sidebarHeight = $("#modell_table").innerHeight() + getMarginsSum("#modell_table") + 25;
		} else {
			if (mausLinksPositionStatic) {
				sidebarHeight = $("#sidebar").innerHeight() + getMarginsSum("#sidebar");
			} else {
				sidebarHeight = $("#sidebar").innerHeight() + 
				                getMarginsSum("#sidebar") + 
				                getPaddingsSum("#sidebar");
			}
		}
		var $div_size = $("#rundherum").innerHeight();
		var contentHeight;
		if (mausLinksPositionStatic) {
			contentHeight = getContentHeight( {
				"innerHeights" : [ '#modell_maus_akt', '#modell_maus', '#maus_links' ],
				"marginSums" : [ '#modell_maus_akt', '#modell_maus', '#maus_links', '.class_main_size' ]
			});
		} else {
			contentHeight = getContentHeight( {
				"innerHeights" : [ '#modell_maus_akt', '#modell_maus' ],
				"marginSums" : [ '#modell_maus_akt', '#modell_maus', '#content_main' ],
				"paddingSums" : [ '#content_main' ]
			});
		}

		if (sidebarHeight > contentHeight){
			contentHeight = sidebarHeight;
		}

		if (contentHeight > $div_size){
			$div_size = contentHeight;
		}

		if (mausLinksPositionStatic) {
			$(".class_main_size").css('height', ($div_size - getMarginsSum(".class_main_size")) + 'px');
		} else {
			$("#content_main").css('height',
					($div_size - getMarginsSum("#content_main") - getPaddingsSum("#content_main")) + 'px');
			$("#modell_details").css('height',
					($div_size - getPaddingsSum("#modell_details") - getMarginsSum("#modell_details")) + 'px');
		}
	},

	updateInfoSizeAngebot : function() {
		if (!style.isSkoda && !style.isAudi){
			return;
		}

		$(".class_main_size_angebot").css('height', '');

		var $div_size = $("#rundherum").innerHeight();

		var contentLeftHeight = getContentHeight( {
			"innerHeights" : [ '#angebot_left' ],
			"marginSums" : [ '#angebot_left' ]
		});

		var contentRightHeight = getContentHeight( {
			"innerHeights" : [ '#angebot_right' ],
			"marginSums" : [ '#angebot_right' ]
		});

		var contentHeight = contentLeftHeight > contentRightHeight ? contentLeftHeight : contentRightHeight;

		if (contentHeight > $div_size){
			$div_size = contentHeight;
		}

		if (style.isAudi){
			$div_size -= 5;
		}

		$(".class_main_size_angebot").css('height', $div_size + 'px');
	}
});