/**
 * AUDI JavaScript library: Modal Layer
 * 
 * @projectDescription	Layer class providing functionalities for modal layers 
 * @namespace			layer
 *
 * @author 				$Author: mkrause $
 * @version				$Revision: 179 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 * 
 * @file:				audi_ngw.layer.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi_ngw.layer.js $
 */
 
/* create namespace */
audi_ngw.namespace(audi_ngw,'layer.modal');

/**
 * 
 * API
 * 
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'layer.modal.api');


/**
 * External interface for audi_ngw.api.openModal. Acts as a proxy to audi_ngw.layer.modal.show().
 * "Ã–ffnet die angegebene Seite in einem modalen Layer. Als Parameter kÃ¶nnen Callbacks fÃ¼r open/close angegeben werden."
 * @method audi_ngw.api.openModal 
 * @see audi_ngw.api.openModal 
 * @see audi_ngw.layer.modal.show
 * @param {String} URL 
 * @param {Object} Parameters: {Function} Callback .onOpen, {Function} Callback .onClose
 * @return {Void}
 */

audi_ngw.layer.modal.api.show = function (sURL,oParam) {
	// cache scope
	var scope = audi_ngw.layer.modal;
	// get layer element 
	var _$element = scope._$elLayer;
	// construct modal layer related options 
	oParam = oParam || {};
	if (typeof sURL == 'object') {
			scope._oLayerOptions = {
			sPosition : 'center' ,
			hasOutsideClick : false,
			hasHideDelayed : false,
			sRel: 'layerModal',
			sContentType: 'confirm_dialog',
			sContent: sURL,
			sWidth:  null || oParam.sWidth,
			sHeight: null || oParam.sHeight
		};
	} else {
		scope._oLayerOptions = {
			sPosition : 'center' ,
			hasOutsideClick : false,
			hasHideDelayed : false,
			sRel: 'layerModal',
			sContentType: 'ajax-layer',
			sContent: audi_ngw.url.addAjaxFragment(sURL),
			sWidth:  null || oParam.sWidth,
			sHeight: null || oParam.sHeight
		};
	}	
	
	// open
	audi_ngw.layer.modal._doShow(_$element,null,scope._oLayerOptions);
	audi_ngw.layer.modal.apiOnClose = ( typeof oParam.onClose == 'function') ? oParam.onClose  :  function (){};
};

/**
 * Ã–ffnet den Login-Layer. Als Parameter kÃ¶nnen Callbacks fÃ¼r open/close angegeben werden.
 * @method audi_ngw.api.openLogin 
 * @param {String} URL 
 * @param {Object} Parameters: {Function} Callback .onOpen, {Function} Callback .onClose
 * @return {Void}
 */
audi_ngw.layer.modal.api.login = function (sUrl,oParam) {
// cache scope
	var scope = audi_ngw.layer.modal;
	// get layer element 
	var _$element = scope._$elLayer;
	// construct modal layer related options 
	oParam = oParam || {};
	scope._oLayerOptions = {
		sPosition : 'center' ,
		hasOutsideClick : false,
		hasHideDelayed : false,
		sRel: 'layerModal',
		sContentType: 'ajax-layer',
		sContent: audi_ngw.url.addAjaxFragment(sUrl) || audi_ngw.config.sLoginUrl,
		sWidth:  null || oParam.sWidth,
		sHeight: null || oParam.sHeight
	};

	// open
	audi_ngw.layer.modal._doShow(_$element,null,scope._oLayerOptions);
	audi_ngw.layer.modal.apiOnClose = ( typeof oParam.onClose == 'function') ? oParam.onClose  :  function (){};
};

/**
 * Adds Overlay divs to dom
 * Adds wrappers needed for positioning
 * Adds Close Button
 * Calls centerPosition and adds event Listener on window resize
 * @method _setUp
 * @return {Void}
 * @private
 */
audi_ngw.layer.modal._setUp = function(){

	/* adding overlay */
	
	if (jQuery('#audi_modal_container')) {
		jQuery("<div></div>").attr('id','audi_modal_container').appendTo('body');
	}
	jQuery(this._options.sIdModalContainer).before(this._options.sHTMLModalOverlay);
	

	
	/* adding super wrapper and wrapper */
	jQuery(this._options.sIdModalContainer).wrap(this._options.sHTMLModalSuperWrapper).wrap(this._options.sHTMLModalWrapper);
 
	this._$elLayer = jQuery(this._options.sIdModalContainer);

	// fix firefox 
	if (jQuery.browser.mozilla && parseFloat(jQuery.browser.version) < 1.9) {
		jQuery('#audi_modal_super_wrapper').css('position','fixed');
	}

	// cache elements
	this._$elLayerWrapper = jQuery('#audi_modal_super_wrapper').hide();
	this._$elModal = jQuery('#audi_modal_overlay').hide();
};

audi_ngw.layer.modal._addClose = function (sId) {
	var scope = audi_ngw.layer.modal;
	var _sSelector = "#";
	_sSelector += sId || audi_ngw.url.getContentId();
	_sSelector += " #audi_modal_header";
	

	jQuery(_sSelector).append(scope._options.sHTMLModalCloseButton);
};
 
/**
 * centers advice layer
 * @method _doCenterPosition
 * @constructor
 * @param {Object} scope 
 * @param optional {String} animation 
 * @return {Void}
 */
/**
 * Sets layer position depending on supplied position type such as "center", "element"
 * @param {HTMLElement} $element / layer
 * @param {Object} _oPos
 * @return {Void}
 * @private
 */
audi_ngw.layer.modal.setPosition = function($element, _oPos, sPosition){
	var scope = audi_ngw.layer.modal;
	sPosition = sPosition || scope._oLayerOptions.sPosition;

	if ( !_oPos || _oPos.sTop == '0px' ) { return;}
 	
	// special treatment for the fullscreen layer
	if( 0 < jQuery('#audi_modal_container .layer_fullscreen').size() ) { 
		var height = jQuery(window).height();
		var width = jQuery(window).width();
		if ( jQuery.browser.msie === true && parseFloat(jQuery.browser.version) < 6.5 ) { 
			width = width - 2;
			height = height - 6;
		}

		jQuery('#audi_modal_container').css({height: height, width: width, left: 0, top: 0});
		height = height - jQuery('#audi_modal_container #audi_modal_header').outerHeight() - 6;
		
		jQuery('#audi_modal_container #audi_modal_body').css({height: height, width: width});
		return;
	}

	switch (sPosition) {
		// center layer according to content wrapper
		case 'centerStatic':
			$element.css({
				top: _oPos.sTop,
				left: _oPos.sLeft
			});
		break;

		// center layer according to content wrapper
		case 'center':
			$element.stop().animate({
				top: _oPos.sTop,
				left: _oPos.sLeft,
				easing: 'linear'
			}, 150);
		break;

		// center layer according to content wrapper
		case 'centerOnResize':
			$element.stop().animate({
				top: _oPos.sTop,
				left: _oPos.sLeft,
				easing: 'linear'
			}, 150);
		if (jQuery.browser.msie) {
			$('#audi_modal_wrapper').width($element.outerWidth() + 'px');
			$('#audi_modal_wrapper').height($element.outerHeight() + 'px');
		}
		break;
	
	}
 
};


/**
 * Calculates layer positionin relation to supplied element
 * @param {EventElement} $eventElement
 * @return {Object}
 */
audi_ngw.layer.modal._calculatePosition = function($element, sPosition, $eventElement){

	var _top, _right, _bottom, _left;
	var scope = audi_ngw.layer.modal;
	$element = scope._$elLayer;

	switch (sPosition) {

		case 'centerStatic':
		case 'center':
			// get viewport height, use native ie stuff or jQuery dimensios plugin 
			var _viewportHeight = (jQuery.browser.msie === true && jQuery.browser.version < 7) ? document.documentElement.clientHeight : jQuery('body').innerHeight();

			if (_viewportHeight < $element.height()) {
				_top = scope._options.iMinPaddingTop;
			}
			else {
				_top = ((( _viewportHeight / 2) - ($element.height() / 2)) > scope._options.iMinPaddingTop) ? ((_viewportHeight / 2) - ($element.height() / 2)) : scope._options.iMinPaddingTop;
				_top = parseInt(_top, 10);
 
			}
			if (!$element.height()) {
				_top = 0;
			}
			_left = Math.floor(((jQuery('body').outerWidth() / 2) - ($element.outerWidth() / 2)));
		break;
			
	}
	// add units
	_left += 'px';
	_top += 'px';
	_bottom += 'px';
 

	return {
		iHeight: (!$element.outerHeight()&& scope._oLayerOptions && scope._oLayerOptions.sHeight) ? parseInt(scope._oLayerOptions.sHeight, 10) : $element.outerHeight(),
		iWidth: (!$element.outerWidth()&& scope._oLayerOptions && scope._oLayerOptions.sWidth) ? parseInt(scope._oLayerOptions.sWidth, 10) : $element.outerWidth(),
//		iHeight:  $element.outerHeight(),
//		iWidth:  $element.outerWidth(),
		sLeft: _left,
		sTop: _top,
		sBottom: _bottom
	};
};


/**
 * Set layer position / dimensions after succesfully loaded content via xhr
 * @param {HTMLElement} $element / layer
 * @param {Object} _oPos
 * @return {Boolean}
 * @private
 */
audi_ngw.layer.modal._doXhrReallocation = function ($element,_oPos) {
	
	var scope = audi_ngw.layer.modal;
	
	// check if layer ain't visible (e.g. outside click closed element during xhr)
	if (audi_ngw.dom.getUnique($element.attr('id')) !== true) {
		// reset using hide
		scope._doHide($element);
		return false;
	}
 
	// skip reposition if fixed with is requested
	if (scope._oLayerOptions.sWidth || scope._oLayerOptions.sHeight) {
		// callback, pass element

		audi_ngw.layer.modal.setPosition($element,_oPos);
		audi_ngw.layer.modal._doXhrReallocationComplete($element);
		return false;
	} 
	
	if( 'center' == scope._oLayerOptions.sPosition ) {
/*	
	switch (scope._oLayerOptions.sPosition) {
		// center layer according to content wrapper
		case 'center':
*/
			// on content reload, animate height, nothing else
			if (scope._oLayerOptions.sSelectorContainer) {
				$element.animate({
					height: _oPos.iHeight + 'px'
				}, 'fast', '', audi_ngw.layer.modal._doXhrReallocationComplete);

			}
			else {

				if( 0 === jQuery('#audi_modal_container .layer_fullscreen').size() ) {
				
					if( 'undefinedpx' !== _oPos.sLeft ) {
						$element.css('left', _oPos.sLeft);
					}
					if( 'undefinedpx' !== _oPos.sTop ) {
						$element.css('top', _oPos.sTop);
					}
					$element.css('width', _oPos.iWidth + 'px');
				
				} else {
					jQuery('#audi_modal_container').css({
						'width': '100%',
						'height': '100%',
						'left': '0px',
						'top': '0px'
					});
				}
				audi_ngw.layer.modal._doXhrReallocationComplete($element);

			}
/*
		break;
*/			
		 
	}
	
	return true;
};


/**
 * OnComplete callback for repaint after xhr, set content further options
 * @return {Void}
 * @private
 */

audi_ngw.layer.modal._doXhrReallocationComplete = function(){
	var scope = audi_ngw.layer.modal;	
	// get extended element, either supplied or passed as callback argument (this)
	var $element = arguments[0] || jQuery(this);
	// delay content to get a smoother transition
	window.setTimeout( 
		function () {

			// check if layer ain't visible (e.g. outside click closed element during xhr)
			if (audi_ngw.dom.getUnique($element.attr('id')) !== true) {
				// reset everyting using _doHide
				audi_ngw.layer.modal._doHide($element);
				return;
			}
 
			// force height
			if (scope._oLayerOptions.sHeight) { 
					$element.height(scope._oLayerOptions.sHeight); 
			} 
			// or remove height due to flexibility
			else {
				$element.css('height','');
			}

//			audi_ngw.layer.modal._$elLayerClone = null;
			if (scope._oLayerOptions.sSelectorContainer) {
				// set loading, hide current content while keeping layer 
				if (scope._oLayerOptions.sSelectorContainer == "#audi_modal_body") {
					jQuery("#audi_modal_body_tmp").remove();
					jQuery("#audi_modal_header_tmp").remove();
					jQuery("#audi_modal_body").css('overflow', 'auto');
					jQuery("#audi_modal_container").css({'overflow': 'auto'});
				}
				// set loading state on provided element
				else {
					jQuery(scope._oLayerOptions.sSelectorContainer).audi_unsetLoading();
				}
			}
			else {
				scope._$elLayerWrapper.audi_unsetLoading();
			}
//			audi_ngw.layer.prepareContentAfterXHR();
			// set close event
			if (jQuery('#modal_close')) {
				// changed from click to click.layerModalClose due to request from BAD, 20081210
//OLD				jQuery('#modal_close').unbind('click.layerModalClose').bind('click.layerModalClose',audi_ngw.layer.modal.hide);
			}
			scope.setPosition(scope._$elLayer, scope._calculatePosition(scope._$elLayer, scope._oLayerOptions.sPosition), 'centerStatic');
			
			if (jQuery.browser.msie === true) { 
				// prevent jumping loader
				$('#audi_modal_wrapper').css('overflow', '');
				// prevent scrollbars flashing
				$('#audi_modal_super_wrapper').css('overflow','');
				if (parseFloat(jQuery.browser.version) < 6.5) {
					$(window).resize();
					
					// DANG-2172 force repainting for the tab-navigation (not shown in ie6 before)
					jQuery('#audi_modal_container .audi_tab_navigation').addClass('audi_someTmpClass').removeClass('audi_someTmpClass');

				}
			}
			
		},300);
};


/**
 * wrapper for _doShow
 * @method show
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal._doCenterPosition = function(){
	var scope = audi_ngw.layer.modal;
	scope.setPosition(scope._$elLayer, scope._calculatePosition(scope._$elLayer, scope._oLayerOptions.sPosition), 'centerOnResize');
};


/**
 * wrapper for _doHide (delays for 500 miliseconds)
 * @method hide
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal.delayedHide = function(){
	window.setTimeout(audi_ngw.layer.modal._doHide, 300);
	return false;
};

/**
 * wrapper for _doHide
 * @method hide
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal.hide = function(){
	
	/* DANG-3282 */
	if( 1 === jQuery('#audi_modal_container .audi_modal_reload').length ) {
		var url = window.location.href.split('#');
		window.location.href = url[0];
		return;
	}
	
	
	/* DANG-1712 */
	if( 'object' == typeof(audi_ngw.navigation.history) && 1 < audi_ngw.navigation.history.length && 1 == jQuery('#audi_modal_header').parents('.detailview_image, .func_sendfriend').size() ) {
		audi_ngw.navigation.history.pop();
		var pos = audi_ngw.navigation.history.length-1;
		var tmp = audi_ngw.navigation.history[pos];
		audi_ngw.navigation.historyLoad(tmp);
		return false;

	/* DAU-1241 */
	} else if( 'object' == typeof(audi_ngw.navigation.history) && 1 === audi_ngw.navigation.history.length ) {
		audi_ngw.navigation.history = '';
	}
	
	
	
	

	audi_ngw.layer.modal._doHide();
	return false;
};


audi_ngw.layer.modal.isVisible = function(){
	
	// find out if a modal layer is shown
	var display = jQuery('#audi_modal_super_wrapper').css('display');
	
	// if display == block => modal layer is shown
	if( 'block' === display ) {
		return true;
	}
	
	// means, the modal layer is not shown
	return false;
	
	
}

/**
 * hides modal window
 * @method _doHide
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal._doHide = function(){
	// set scope
	var scope = audi_ngw.layer.modal;
	// clear timer 
	scope._oTimers.hideDelayed = audi_ngw.clearTimer(scope._oTimers.hideDelayed);
	// delete reference
	delete scope._oTimers.hideDelayed;
	// remove global listener (hasOutsideClick)
	jQuery(window).unbind('resize.modal', audi_ngw.layer.modal._doCenterPosition);	
	scope._$elLayerWrapper.audi_unsetLoading();
	// set element properties

	// remove element before resetting
	scope._$elLayer.hide();	
		
	// remove all objects/embed nodes by using an apropriate function 
	// due to related ie bugs on empty() and remove(), whose source is .removeChild on flash-movies
	if (jQuery.browser.msie) {
		scope._$elLayer
			.find('object, embed')
			.each(function(){
				audi_ngw.flash.remove(this);
			});			
	}
	// continue
	scope._$elLayer
		.empty()
		.audi_unsetUnique()
		.attr('className','')
		// reset all css properties to guarantee constant experience
		.css({
			height: '',
			width: '',
			top: '',
			right: '',
			bottom: '',
			left: '',
			opacity: 1
		});

	// reset clone
	if(scope._$elLayerClone) {
		scope._$elLayerClone
			.empty()
			.remove();
		scope._$elLayerClone = null;
	}
	
	// clear options
	this._oLayerOptions = {};
	
	//audi_ngw.flash.overlayShow();
	scope._$elLayerWrapper
		.hide();
	scope._$elModal
		.hide();
	// remove marker class on div#audi_container_main to enable printing "layer-only"
	jQuery('body').removeClass('hasModal');
	audi_ngw.layer.simple.hide();
 	
	// remove selector element used on contentShow
	if (scope._oLayerOptions.sSelectorContainer) {jQuery(scope._oLayerOptions.sSelectorContainer).audi_unsetUnique(); }
	
	// remove iframe
	audi_ngw.layer.unsetIE6Fix();
	
	// reset scrollbars
	// ie6 complete disable, even if modal window is smaller than the browser window 
 	jQuery("body","html").css({height: '', width: ''});
	// all others, scrollbar appears when browser window is smaller than modal layer
	jQuery("html").css("overflow",'');
	
	jQuery('#audi_content_wrapper .audi_flash_replace').each(function(){
		var parent = jQuery(this);
		parent.css('height', '');
		// check whether element is already a object and show
		if (parent.attr('tagName').toLowerCase() == 'object') {
			parent.show();
		} else {
			parent.find('object').show();
		}
	});
	
	if (jQuery.isFunction(audi_ngw.layer.modal.apiOnClose)) {audi_ngw.layer.modal.apiOnClose(); }
	

	
	return false;
};

/**
 * Loads modal element from history, bridge to audi_ngw.layer.modal.show
 * @param {String} sURL
 * @return {void}
 */
//audi_ngw.layer.modal.showHistory = function ($eventElement, sURL) {
audi_ngw.layer.modal.showHistory = function (sURL) {
 
	// cache scope
	var scope = audi_ngw.layer.modal;
	// get layer element 
	var _$element = scope._$elLayer;
 
	// construct history related options 
	scope._oLayerOptions = {
		sPosition : 'center',
		hasOutsideClick : false,
		hasHideDelayed : false,
		sContentType: 'ajax-layer',
		sRel: 'layerModal',
		sContent: audi_ngw.url.addAjaxFragment(sURL),
		sWidth:  null,
		sHeight: null
	};
	// open
	$eventElement = null;
	audi_ngw.layer.modal._doShow(_$element,$eventElement,scope._oLayerOptions);
};

/**
 * Loads content into modal element. Useful when we're just updating a visible modal layer. 
 * Skips "scope._$elLayer" storage because we need this one to be the whole content wrapper for position calculation.
 * @param {EventElement} event
 * @param {String} Container to update. Default: #audi_modal_body
 */
//audi_ngw.layer.modal.showContent = function (event,sSelectorContainer) {
audi_ngw.layer.modal.showContent = function (event,sSelectorContainer) {
	// @TODO: set URL from arguments to sURL
	// kill event
	if (arguments[0].preventDefault) {
		event.preventDefault();
	}
	
	if (jQuery('#audi_modal_overlay').css('display') !== 'block') {
		audi_ngw.layer.modal.showHistory(arguments[0]);
		return false;
	}
	
	// set scope
	var scope = audi_ngw.layer.modal;	
	// get element reference 
	var _$element = scope._$elLayer;
	var oOptions = oOptions || {};
	// extract event element  or set to passed element
//	var _$eventElement = jQuery(event.target) || jQuery(event);
	// get options from event element
//	scope._oLayerOptions = audi_ngw.layer.getOptions(_$eventElement,'modal');
	// construct history related options 
	scope._oLayerOptions = {
		sPosition : 'center',
		hasOutsideClick : false,
		hasHideDelayed : false,
		sContentType: 'ajax-layer',
		sRel: 'layerModalContent',
		sContent: audi_ngw.url.addAjaxFragment(sURL),
		sWidth:  null,
		sHeight: null
	};
	// open
	$eventElement = null;
	scope._oLayerOptions.sSelectorContainer = sSelectorContainer || '#audi_modal_body';
	// show
	scope._doShow(_$element,_$eventElement,scope._oLayerOptions);
};
/**
 * wrapper for _doShow
 * @method show
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal.show = function(event){
	// show modal layer immediately due to slow browser
	if (jQuery.browser.msie === true) {
		document.getElementById('audi_modal_overlay').style.display = "block";
	}
	event.preventDefault();
	// set scope
	var scope = audi_ngw.layer.modal;	
	// get element reference 
	var _$element = scope._$elLayer;
	var oOptions = oOptions || {};
	// extract event element  or set to passed element
	var _$eventElement = jQuery(event.target) || jQuery(event);
	// get options from event element
	scope._oLayerOptions = audi_ngw.layer.getOptions(_$eventElement,'modal');

	// show
	
	scope._doShow(_$element, _$eventElement, scope._oLayerOptions);
};
/**
 * shows modal window
 * calls initialize
 * @method _doShow
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal._doShow = function($element, $eventElement, oOptions){

	// cache scope
	var scope = audi_ngw.layer.modal;
	if (scope._$elLayerClone) {
		return;
	}
	var _oPos = {};
	// check for running / open element
	//	if (audi_ngw.dom.getUnique($element.attr('id')) === true) { return; }

	// reset classnames
	scope._$elLayer.attr('class','');
	scope._$elLayer.attr('class','');
	
	// add iframe covering the whole body
	audi_ngw.layer.setIE6Fix('body', {});
	
	// add consistend behaviour in every browser due to removing scrollbars
	window.scroll(0, 0);
	
	// disable scrollbars
	// ie6 complete disable, even if modal window is smaller than the browser window 
	jQuery("body", "html").css({
		height: "100%",
		width: "100%"
	});
	// all others, scrollbar appears when browser window is smaller than modal layer

	jQuery("html").css("overflow", "hidden");
	
	// hide all flashmovies in the content-area (producing massive cpu)
	jQuery('#audi_content_wrapper .audi_flash_replace').each(function(){
		var parent = jQuery(this);
		parent.css('height', parent.height());
		// check whether element is already object and hide
		if (parent.attr('tagName').toLowerCase() == 'object') {
			parent.hide();
		} else {
			parent.find('object').hide();
		}
	});

	
	jQuery("#audi_modal_super_wrapper").css({
		overflow: ""
	});
	jQuery("#audi_modal_wrapper").css({
		overflow: ""
	});
	
	if (jQuery.browser.msie === true) { 
		jQuery("#audi_modal_wrapper")
			.css({
				left: "0",
				top: "0",
				height: "1%"
			}); 
			
		// removed in audi_ngw.layer.modal._doXhrReallocationComplete 
		// prevent jumping loader
		$('#audi_modal_wrapper').css('overflow', 'hidden');
		// prevent scrollbars flashing
		$('#audi_modal_super_wrapper').css('overflow', 'hidden');
	}
	

	// set loading on wrapper 
	if (oOptions.sSelectorContainer) {
		// prepare element
		$element = jQuery(oOptions.sSelectorContainer);
		if (oOptions.sSelectorContainer == "#audi_modal_body") {
			jQuery("#audi_modal_body").css('overflow','hidden');
			jQuery("#audi_modal_body").append('<div id="audi_modal_body_tmp" class="preload"></div>');
			jQuery("#audi_modal_body_tmp").css({'overflow':'hidden',' height' : jQuery("#audi_modal_body").outerHeight()+'px'} );
			if (jQuery("#audi_modal_header").size()) {
				jQuery("#audi_modal_header").append('<div id="audi_modal_header_tmp"></div>');
				jQuery("#audi_modal_header").css('overflow','hidden');
				jQuery("#audi_modal_header_tmp").css({'overflow':'hidden','height' : jQuery("#audi_modal_header").outerHeight()+'px'} );
			}
		}else {
			jQuery(oOptions.sSelectorContainer).audi_setLoading();
		}

	}
	else {
		scope._$elLayerWrapper.audi_setLoading();
	}
	// show elements
	scope._$elModal.show();
	// set marker class on div#audi_container_main to enable printing "layer-only"
	jQuery('body').addClass('hasModal');
	scope._$elLayerWrapper.show();
		
	// prepare element
	$element.audi_setUnique();

	// set fixed if requested
	if (oOptions.sWidth) { 
		$element.width(oOptions.sWidth); 
		scope._$elLayerClone.width(oOptions.sWidth); 
	}
	if (oOptions.sHeight) { 
		$element.height(oOptions.sHeight); 
		scope._$elLayerClone.height(oOptions.sHeight); 
	}

	// set content using class or default method
	if (typeof scope._doSetContent == 'function') {
		_oPos = scope.setContent($element,'modal',oOptions);
	} else {
		_oPos = audi_ngw.layer._doSetContent($element,$eventElement,'modal',oOptions);
	}


	if( 0 < jQuery('#audi_modal_container .layer_fullscreen').size() ) {
		// use default or scope method to calculate position
		if (typeof scope._calculatePosition == 'function') {
			_oPos = scope._calculatePosition($element,oOptions.sPosition,$eventElement);
		} else {
			_oPos = audi_ngw.layer._calculatePosition($element,oOptions.sPosition,$eventElement);
		}
	}
 
	// set properties if we're not loading content
	if (!oOptions.sSelectorContainer) {
		audi_ngw.layer.modal.setPosition($element, _oPos, 'centerStatic');
		
		// Add resize event listener
		jQuery(window).bind('resize.modal', audi_ngw.layer.modal._doCenterPosition);
		
		// bind custom "events"
//		// show elements
//		scope._$elModal.show();
//		scope._$elLayerWrapper.show();
		//audi_ngw.flash.overlayHide();
		$element.show();
		
		audi_ngw.layer.modal._doCenterPosition();
	}
	setTimeout(function() {
		jQuery(window).trigger('resize');
	}, 1000);
};


audi_ngw.layer.modal.loadAjaxContentAdvice = function(sUrl, _$element) {
// kill event
	if (arguments[0].preventDefault) {
		event.preventDefault();
	}
	
	if (jQuery('#audi_modal_overlay').css('display') !== 'block') {
		audi_ngw.layer.modal.showHistory(sUrl);
		return false;
	}
	
	if( !_$element || 1 !== _$element.size() ) {
		// handle "active state on navigation"
		sUrl=sUrl.replace(/http:\/\/localhost\/combined\//,'');
		var _sSelector = '#audi_advice_leftcol_container a[href$="'+sUrl+'"]';
		_$element = jQuery(_sSelector).eq(0);
	}
	
	_$element
		.parents()
		.siblings()
		.removeClass('active');
	_$element
		.parent()
		.addClass('active');
		
	var _sFragment = "advice_fragment";
	jQuery('#audi_advice_rightcol_container')
	.height(jQuery('#audi_advice_rightcol_container').height()+'px')
	.empty()
	.audi_setLoading();
	jQuery.get( audi_ngw.url.addAjaxFragment( sUrl,_sFragment),
		function(data)  {
				jQuery('#audi_advice_rightcol_container')
				.replaceWith(data)
				.audi_unsetLoading()
				.height('');
				
				var _sId = "#audi_advice_rightcol_container";
				audi_ngw.event.trigger('ajaxSnippetReady',[{'sId': _sId}]);
		}
	);
};


/**
 * Custom Event: wil be fired as soon as we filled the ajax-content into the modal layer, just before "xhrReallocate"
 * @param {Object} event
 * @param {Object} xhr
 */
audi_ngw.layer.modal.onAjaxModalContentReady = function(event,xhr){
	// check if this xhr-response contains valid content
	if (!audi_ngw.url.hasXHRContent(xhr,event.timeStamp)) {return false;}
	//audi_ngw.log("-> "+audi_ngw.event.ajaxModalContentReadyCount+" EVENT - ajaxModalContentReady:audi_ngw.layer.modal.onAjaxModalContentReady" ,arguments);
	// execute funtions on new content
 	audi_ngw.layer.modal._addClose();
	// trigger event 
	audi_ngw.event.trigger('ajaxModalContentPrepared');
};
/**
 * Custom Event: wil be fired as soon as we injected the xhr-snippet 
 * @param {Object} event
 * @param {Object} data {sId: new HTML parent Id}
 */
audi_ngw.layer.modal.onAjaxSnippetReady = function(event,data){
 
	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.layer.modal.onAjaxSnippetReady ",arguments);
	// execute funtions on new content if there's a modal layer
	if (jQuery('#audi_modal_overlay').css('display') !== 'none') {
		audi_ngw.layer.modal._doCenterPosition();
		audi_ngw.layer.modal._addClose(data.sId.slice(1));
	}
	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared');
 };


/**
 * Initialize advice layer
 * @method initialize
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.modal.initialize = function(options){
	this.__className =  'audi_ngw.layer.modal';
	this.__classVersion= '1.2';
	
	this._options = {};
	this._options.iMinPaddingTop = 20;
	this._options.sIdToClone = 'audi_modal_container';
	this._options.sIdModalContainer =  '#audi_modal_container';
	this._options.sIdModalHeader =  '#audi_modal_header';
	this._options.sIdModalHeaderH1 =  '#audi_modal_header h1';
	this._options.sIdModalBody = '#audi_modal_body';
	this._options.sIdModalTabNavigation = '#audi_tab_navigation';
	this._options.sIdModalWrapper = '#audi_modal_wrapper';
	this._options.sHTMLModalSuperWrapper = '<div id="audi_modal_super_wrapper"></div>';
	this._options.sHTMLModalWrapper = '<div id="audi_modal_wrapper"></div>';
//	this._options.sHTMLModalRoundEdgesTop =  '<div id="audi_modal_round_head"><div id="audi_modal_top_right"></div><div class="audi_modal_bg_bar"></div><div id="audi_modal_top_left"></div></div>';
//	this._options.sHTMLModalRoundEdgesBottom = '<div id="audi_modal_round_bottom"><div id="audi_modal_bottom_right"></div><div class="audi_modal_bg_bar"></div><div id="audi_modal_bottom_left"></div></div>';
	this._options.sHTMLModalCloseButton = '<a href="#" id="modal_close"><span>'+audi_ngw.dictionary.CLOSE+'</span><img src="'+audi_ngw.docroot+'img/advice/icon_close_modal_layer.gif" alt="'+audi_ngw.dictionary.CLOSE+'" /></a>';
	this._options.sHTMLModalOverlay =  '<div id="audi_modal_overlay"></div>';
	
	this.oDefaults = {
		hasOutsideClick: false,
		hasHideDelayed: false,
		iHideDelayedMs: 0,
		iFadeOutMS: 0,
		sContentType: 'ajax-layer',
		sPosition: 'center',
		sContent: 'DEFAULT TEXT'

	};
	this._oTimers = {};

	this._$elLayer = null;
	this._$elLayerWrapper = null;
	this._$elModal = null;
	this._$elLayerClone = null;
	
	this._setUp();
	

	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady.layerModal',audi_ngw.layer.modal.onAjaxModalContentReady);
	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.layer.modal.onAjaxSnippetReady);
};
	


