/***********
* Overlays *
***********/
/*
 * Param relAttribute: The content of the rel-attribute from where to extract dimensions
 * 
 * Returns an array where the first element is the width and the second is the height 
 */
function getOverlayDimensions(relAttribute)
{
	// width & height des overlays aus dem rel-attribut auslesen
	// dieses sollte z.b. diese syntax haben: rel="#overlay 600x400"
	if(relAttribute)
		var dimensions = relAttribute.match(/(\d*) {0,1}x {0,1}(\d*)/);
	
	if( dimensions == null || dimensions.length == 0 )
		return new Array(500,400); // default dimensions for overlay dialog
	
	// determine max width and height and reduce overlay dimensions if necessary
	var maxWidth = $(window).width() - 40; // reduce window width by left and right margin
	if( dimensions[1] > maxWidth )
		dimensions[1] = maxWidth;
	
	var maxHeight = $(window).height() - 150 - 20; // reduce window height by top and bottom margin
	if( dimensions[2] > maxHeight )
		dimensions[2] = maxHeight;
	
	return dimensions.slice(1);
}

/*
 * Param screenUrl: url des screens der geöffnet werden soll
 * Param width: Breite der Overlay-Dialogbox
 * Param height: Höhe der Overlay-Dialogbox
 */
function openOverlay(screenUrl, width, height, additionalRequestData)
{
	if( typeof(screenUrl) != 'string' )
		return false;
	
	showOverlayLoader();
	
	// screen für overlay anpassen
	screenUrl = makeOverlayScreen(screenUrl, true);
	
	var urlParts = screenUrl.split('?');
	urlParts[1] = addOverlayRequestParams(urlParts[1], width, height);
	
	if( typeof(additionalRequestData) != 'undefined' && additionalRequestData != false )
		urlParts[1] = urlParts[1].concat( '&' + additionalRequestData );
	
	$.ajax({
	   type: "POST",
	   url: DSTORE_BASE_URL + '/index.php',
	   data: urlParts[1],
	   dataType: 'json',
	   success: function(response)
	   {
			// If response is json and RedirectURL is set
			if( typeof(response.redirectURL) != 'undefined' ) {
				redirect(response);
				return true;
			}

			closeOverlayLoader();
			$('#AjaxContainer').html(unescape(response.MAIN));
			
			modalDialog = $('#AjaxContainer').modal({
				position: [150],
				overlayCss: {
			    backgroundColor: '#000',
			    cursor: 'wait'
			  },
			  containerCss: {
				width: width + 'px',
			    height: height + 'px',
			    backgroundColor: '#ffffff',
			    border: '1px solid #3a3a3a'
			  },
			  onShow: function(dialog) {
				  // click-event für links die ein neues overlay öffnen sollen
				  $("#AjaxContainer a[rel^='#overlay']").click(function() {
					  modalDialog.close();
					  
					  var dimensions = getOverlayDimensions($(this).attr('rel'));
					  openOverlay($(this).attr('href'), dimensions[0], dimensions[1], modalDialog);
					  return false;
				  });
				  
				  // submit-event für formulare innerhalb des overlays und
				  // deren submit-response im overlay dargestellt werden soll
				  $("#AjaxContainer form[rel^='#overlay-formsubmit']").submit(function(e) {
					  e.preventDefault();
					  submitOverlayForm($(this), $.modal, null);
				  });
				  
				  // Runde Fehler- und Successboxen
				  var settings = { tl: { radius: 8 }, tr: { radius: 8 }, bl: { radius: 8 }, br: { radius: 8 }, antiAlias: true}
				  curvyCorners(settings, ".style_msg_error, .style_msg_success");
				  
				  // custom scroll bars, falls content im overlay scrollbar
				  window.setTimeout("makeCustomScrollbars();", 100);
				  }
			});
	   },
	   error: function(response)
	   {
		   closeOverlayLoader();
	   }
	});
}

/*
 * Param form: jQuery object of the form to submit
 */
function submitOverlayForm(form, dialog, additonalURLParams, dimensions)
{
	var formClone = form.clone();
	
	if(additonalURLParams == undefined)
		additonalURLParams = '';
	selectElem = form.find('select');
	for(i = 0; i < selectElem.length; i++){
		selectedOption = $(selectElem[i]).find('option:selected');
		if(selectedOption.length == 1)
			additonalURLParams += '&'+$(selectElem[i]).attr('name')
				+'='+$(selectedOption).attr('value');
	}
	textAreaElem  = form.find('textarea');
	for(i = 0; i < textAreaElem.length; i++){
		additonalURLParams += '&'+$(textAreaElem[i]).attr('name')
				+'='+$(textAreaElem).attr('value');
	}
	
	var screenElement = formClone.children("[name^='screen']")
	if( screenElement.length == 0 )
		return false;
	
	showOverlayLoader();
	
	// screen für overlay anpassen
	var overlayScreen = makeOverlayScreen($(screenElement).attr('value'), false);
	$(screenElement).attr('value', overlayScreen);
	
	var formData = formClone.serialize();
	if(dimensions == undefined)
		var dimensions = getOverlayDimensions(formClone.attr('rel'));
	
	formData = addOverlayRequestParams(formData, dimensions[0], dimensions[1]);
	formData += '&'+additonalURLParams;
	
	$.ajax({
		   type: "POST",
		   url: formClone.attr('action'),
		   data: formData,
		   dataType: 'json',
		   success: function(response)
		   {
			   if(dialog){
				  dialog.close();
			   }
			   
				// If response is json and RedirectURL is set
				if( typeof(response.redirectURL) != 'undefined' ) {
					redirect(response);
					return true;
				}
				
				closeOverlayLoader();
				$('#AjaxContainer').html(unescape(response.MAIN));
				
				modalDialog = $('#AjaxContainer').modal({
					position: [150],
					overlayCss: {
				    backgroundColor: '#000',
				    cursor: 'wait'
				  },
				  containerCss: {
					width: dimensions[0] + 'px',
				    height: dimensions[1] + 'px',
				    backgroundColor: '#ffffff',
				    border: '1px solid #3a3a3a'
				  },
				  onShow: function(dialog) {
					  // click-event für links die ein neues overlay öffnen sollen
					  $("#AjaxContainer a[rel^='#overlay']").click(function() {
						  modalDialog.close();
						  
						  var dimensions = getOverlayDimensions($(this).attr('rel'));
						  openOverlay($(this).attr('href'), dimensions[0], dimensions[1]);
						  return false;
					  });
					  
					  // submit-event für formulare des overlays und
					  // deren submit-response im overlay dargestellt werden soll
					  $("#AjaxContainer form[rel^='#overlay-formsubmit']").submit(function(e) {
						  e.preventDefault();
						  submitOverlayForm($(this), $.modal, null);
					  });
					  
				  	  // Runde Fehler- und Successboxen
					  var settings = { tl: { radius: 8 }, tr: { radius: 8 }, bl: { radius: 8 }, br: { radius: 8 }, antiAlias: true}
					  curvyCorners(settings, ".style_msg_error, .style_msg_success");
				  	  
					  // custom scroll bars, falls content im overlay scrollbar
					  window.setTimeout("makeCustomScrollbars();", 100);
				  }
				});
		   },
		   error: function(response)
		   {
			   closeOverlayLoader();
		   }
	});
}


/*
 * Param screen: screen name or url with screen get-parameter
 * Param isUrl: if screen is an url set to true, otherwise to false
 * 
 * Returns the modified screen name
 */
function makeOverlayScreen(screen, isUrl)
{	 
	// wenn es sich um eine Url handelt, screen parameter extrahieren
	if( isUrl == true ) {
		var screenUrl = screen;
		matches = screenUrl.match(/screen=([^&#]*)/);
		if(matches)
		{
			screen = matches[1];
		}
		else
		{
			//Screen liegt als SmartURL vor, das können wir nicht gebrauchen, 
			//wir holen den Screen und die URL in nicht "SmartURL"-Form
		 	$.ajax({
		 		type: "POST",
  			url: "http://www.pfarrbrief.de/customGates/scripts/jsonDecodeSmartURL.php",
  			data: ({SmartURL: screen}),
  			dataType: "json",
  			async: false,
  			success: function(response) {
  				screen = response.screen;
  				screenUrl = response.screenURL;
				}
 			});	
		}
	}
	
	// screen in einzelteile trennen
	var screenTokens = screen.split('.');
	
	// screen um overlay erweitern
	// z.B: aus dstore.account.login wird dstore.account.overlay.login
	var len = screenTokens.length;
	if( screenTokens[len-2] != 'overlay' ) {
		screenTokens[len] = screenTokens[len-1];
		screenTokens[len-1] = 'overlay';
	}
	
	// einzelteile des screen wieder zusammensetzen
	var screen = screenTokens.join('.');
	
	if( isUrl == true ) {
		var oldScreen = screenUrl.match(/screen=(.*?)(&|$)/)[1];
		screenUrl = screenUrl.replace(oldScreen, screen);
		return screenUrl;
	}
	return screen;
}

/*
 * Param requestParams: string of request parameters
 * Param width: width of the overlay
 * Param height: height of the overlay
 * 
 * Returns the modified request parameters string
 */
function addOverlayRequestParams(requestParams, width, height)
{
	// width + height für content bereich des overlays errechnen
	var overlayContentWidth = width; // abziehen von 10px abstand zum rechten rand 
	var overlayContentHeight = height - 60; // abziehen des headers
	
	// overlay parameter an request-url anhängen
	requestParams = requestParams +
					'&overlayRequest=true' +
					'&overlayWidth=' + overlayContentWidth.toString() +
					'&overlayHeight=' + overlayContentHeight.toString();
	
	return requestParams;
}

function showOverlayLoader()
{
	// Mehrfache OverlayLoader verhindern
	if( $('.simplemodal-overlay-loader').length >= 1 )
		return true;
	
	$('body').append(
				'<div class="simplemodal-overlay-loader">' +
					'<div class="OverlayLoader">' +
						'<img src="http://www.pfarrbrief.de/customGates/resources/binaries/universal/backgrounds/ajax-loader.gif" border="0" alt="">' +
					'</div>' +
				'</div>');
	
	// Fix für IE6, der nicht mit 100% und position:fixed zurecht kommt
	if( !isPositionFixedSupported() )
	{
		$('.simplemodal-overlay-loader').css('position','absolute');
		$('.simplemodal-overlay-loader').css('width', $('body').outerWidth() + 'px');
		$('.simplemodal-overlay-loader').css('height', $('body').outerHeight() + 'px');
		
		$('.OverlayLoader').css('position','absolute');
		$('.OverlayLoader').css('left', ($(window).width() / 2).toFixed(0) + 'px');
		$('.OverlayLoader').css('top', ($(window).height() / 2).toFixed(0) + 'px');
	}
}

function closeOverlayLoader()
{
	if( $('.simplemodal-overlay-loader').length == 0 )
		return true;
		
	$('.simplemodal-overlay-loader').remove();
}

/*
* Workaround for buggy behaviour when calling jScrollPane in onShow callback of modalDialog
* The height of the content is not calculated correctly, so the user is not able to scroll
* down the whole content. Maybe the onShow callback is triggered too early
* (before dom is ready) or something...
* For most browsers waiting 1ms leads to the correct height calculation of the content div.
* But we better call the setTimeout with 100ms for some buffer ;)
* Side-effect is that the user could see the tiny ajax-loading gif ;) 
*/ 
function makeCustomScrollbars()
{
	$($('#AjaxContainer .OverlayContent')[0]).jScrollPane({
		  showArrows: true,
		  scrollbarWidth: 19,
		  arrowSize: 20
	  });
}

function redirect(options)
{
	// einfacher redirect
	if( typeof(options.redirectToOverlay) == 'undefined' || ( options.redirectToOverlay != true && options.redirectToOverlay != 'true') ) {
		options.redirectURL = unescape(options.redirectURL);
		if( options.redirectURL.substr(0, 1) != '/' )
			options.redirectURL = '/' + options.redirectURL;
		
		window.location.href = DSTORE_BASE_URL + options.redirectURL;
		return true;
	}
	
	var additionalRequestData = false;
	if( typeof(options.requestData) != 'undefined' && options.requestData != '' )
		additionalRequestData = unescape(options.requestData);
	
	// redirect zu einem anderen overlay
	var dimensions = getOverlayDimensions(unescape(options.overlayDimensions));
	openOverlay(unescape(options.redirectURL), dimensions[0] , dimensions[1], additionalRequestData);
}
