/* Greybox 11com7 edition
 * Required: http://jquery.com/
 * Written by: Patric Pesch
 * License: LGPL (read more in LGPL.txt)
 * Version: 1.0 (25.11.2007)
 * History:
 * 	1.0
 * 	 - GB_hide() nach außen gelegt -> $.Gb_hide(sCallBack)
 * 	 - zusätzlich kann nun $.Gb_hide(sCallBack) eine CallBackfunktion übergeben werden
 *
 */

(function($) {

  $.GB_show = function(url, toParams)
  {
  	// Defaultwerte und ggf. eigene Werte übernehmen
  	//var $this = $(this);
    var goParams = $.extend({}, $.GB_show.defaults, toParams);
    //var oParams = ($.metadata) ? $.extend({}, goParams, $this.metadata()) : goParams;
    var oParams = goParams;

    var iScrollTop;

  	GB_show_intern = function()
    {
    	iScrollTop = $(window).scrollTop();

    	// Start-Callback abfeuern
	    if(oParams.callOnStart && typeof(oParams.callOnStart) == 'function') {
	      oParams.callOnStart.apply();
	    }

	    if (!oParams.f2ndBox && oParams.fOverflowHidden)
	     GB_BodyOverflow('start');

      // erstmal alle Objects und Flashs entfernen
			$('embed, object').hide();
			//$('embed, object').css('display', 'none');

	    $(document.body)
	      .append(
	        "<div id='"+oParams.sBoxPreFix+"GB_overlay' class='GB_overlay'></div>" +
	        "<div id='"+oParams.sBoxPreFix+"GB_window' class='GB_window'><div id='"+oParams.sBoxPreFix+"GB_caption' class='GB_caption'><img src='" + oParams.close_img + "' alt='Close window'/>" +
	        "</div></div>");
	    $("#"+oParams.sBoxPreFix+"GB_caption img").unbind('click').click($.GB_hide);
	    if(oParams.overlay_clickable) {
	      $("#"+oParams.sBoxPreFix+"GB_overlay").unbind('click').click($.GB_hide);
	    }

	    GB_overlay_size();


	    // ppp - prüfen ob ein Bild geladden werden soll
	    /*
	    Das geht sicher auch eleganter!
	    var baseURL;
		   if(url.indexOf("?")!==-1){ //ff there is a query string involved
				baseURL = url.substr(0, url.indexOf("?"));
		   }else{
		   		baseURL = url;
		   }

	    var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
		  var urlType = baseURL.toLowerCase().match(url);

		  if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp')
			{
			  oParams.fImage = true;
			  oParams.fAjax = false;
			  oParams.fIframe = false;
			}
			*/


			if (oParams.fIframe && !oParams.fImage && !oParams.fAjax )
			{
				$("#"+oParams.sBoxPreFix+"GB_window")
	       .append("<iframe id='"+oParams.sBoxPreFix+"GB_frame' src='"+url+"'></iframe>");
			}
			else if (oParams.fImage && !oParams.fIframe && !oParams.fAjax)
			{
			  // TODO - IMage muss resized werden, eingebunden usw.
	      $("#"+oParams.sBoxPreFix+"GB_window")
	       .append("<iframe id='"+oParams.sBoxPreFix+"GB_frame' src='"+url+"'></iframe>");
			}
			else // Ajax load
			{

				var queryString = url.replace(/^[^\?]+\??/,'');
	      $("#"+oParams.sBoxPreFix+"GB_window")
	       .append("<div id='"+oParams.sBoxPreFix+"GB_frame' class='GB_frame'></div>");

	       $('#'+oParams.sBoxPreFix+'GB_frame').load(url);
	       /* weg per get
	       $.get(baseURL, GB_parseParams(queryString), function(data) {
	         $('#'+oParams.sBoxPreFix+'GB_frame').html(data);
				 });

				 */

			}



	    $("#"+oParams.sBoxPreFix+"GB_caption").append(oParams.caption);

      GB_position();

      $('#'+oParams.sBoxPreFix+'GB_overlay').css("opacity", oParams.sBackOpacity).fadeIn(400, function() {

        // Fix für MSIE - Das FILTER Element wieder entfernen - ansonsten bleibt
        // der Hintergrund schwarz
        //if ($.browser.msie) document.all.oParams.sBoxPreFix+GB_overlay.style.removeAttribute("filter", false);
        //GB_position();/* ggf hier noch was tun?! */

        if(oParams.animation) {
          $("#"+oParams.sBoxPreFix+"GB_window").slideDown("slow", function() {
          	if (!oParams.fFireAnimationAtOnce)
          		$("#"+oParams.sBoxPreFix+"GB_frame").show();
          });
          if (oParams.fFireAnimationAtOnce)
          	$("#"+oParams.sBoxPreFix+"GB_frame").show();
        }

         else {
          $("#"+oParams.sBoxPreFix+"GB_window").show('slow');
        }

        // Callback nachdem greyBox ausgeführt wurde
        if(oParams.callOnShow && typeof(oParams.callOnShow) == 'function') {
          oParams.callOnShow.apply();
        }

      });

    }


			GB_overlay_size = function() {

			  var sCssParams = {};


			  sCssParams['width'] = $(document).width();
			  sCssParams['height'] = $(document).height();
			  // PATCH für MSIE < 7 - MSIE setzt die document.height bei overflow:hidden
			  // auf den echten Content - das führt dazu, dass die Window-height größer
			  // als die Document-height sein kann
			  if ($.browser.msie && $.browser.version < 7)  if ($(window).height() > sCssParams['height']) sCssParams['height'] = $(window).height();

			  if (!oParams.f2ndBox)
			  	sCssParams['display'] = 'none';
			  else
			  	// wenn im 2ndBox Modus, soll das Overlay auf der obersten Ebene transparent bleiben
					sCssParams['background'] = 'transparent';

				if (oParams.iZindex > 0)
			    sCssParams['z-index'] = oParams.iZindex;
			  $("#"+oParams.sBoxPreFix+"GB_overlay").css(sCssParams);

			}

			/**
			* Setzt die Größe und die Position der Box.
			*
			* @access private
			* @since  2007-11-17
			* @author ppp
			* @return void
			*/
			GB_position = function() {
			  var sCssParams = {};
			  var iWindowHeight = $(window).height();
			  var iWindowWidth = $(window).width();

			  var iBoxHeight;
			  var iBoxWidth;
			  var iBoxPositionTop;
			  var iBoxPositionLeft;

			  // wenn Autosize gesetzt ist, wird die Größe und Position der Box
			  // über die Fenster-Breite und Höhe bestimmt
			  if (oParams.fAutoSize)
			  {
			  	if (oParams.dAspectRatio == 0)
			  	{
			  		iBoxWidth = iWindowWidth - 2 * oParams.iAutoSizeMargin;
						iBoxHeight = iWindowHeight - 2 * oParams.iAutoSizeMargin;
						iBoxPositionLeft = oParams.iAutoSizeMargin;
						iBoxPositionTop = oParams.iAutoSizeMargin;
			  	}
			  	else
			  	{
			  		if (iWindowHeight > iWindowWidth)
			  		{
			  			iBoxWidth = iWindowWidth - oParams.iAutoSizeMargin - oParams.iAutoSizeMargin;
			  			iBoxHeight = iBoxWidth / oParams.dAspectRatio;

			  			if (iBoxHeight > iWindowHeight)
			  			{
			  				iBoxHeight = iWindowHeight - oParams.iOuterBorder- oParams.iAutoSizeMargin;
			  				iBoxWidth = iBoxHeight * oParams.dAspectRatio;
			  			}
			  		}
			  		else
			  		{
			  			iBoxHeight = iWindowHeight - oParams.iOuterBorder- oParams.iAutoSizeMargin;
			  			iBoxWidth = iBoxHeight * oParams.dAspectRatio;

			  			if (iBoxWidth > iWindowWidth)
			  			{
			  				iBoxWidth = iWindowWidth - oParams.iAutoSizeMargin - oParams.iAutoSizeMargin;
			  				iBoxHeight = iBoxWidth / oParams.dAspectRatio;
			  			}
			  		}
			  		// Nun noch das ganze zentrieren
			  		iBoxPositionLeft = (iWindowWidth - (iBoxWidth + oParams.iOuterBorder))/2;
			  		iBoxPositionTop = (iWindowHeight - (iBoxHeight + oParams.iOuterBorder))/2 + $(window).scrollTop();
			  	}


			  }
			  else // ansonsten wird die übergebene breite und Höhe gesetzt, wenn sie in das Fenster passt
			  {
			  	// ###################################
			  	// Breite
			  	// ###################################
			  	iBoxWidth = oParams.width;
			  	// Falls die Breite größer als die Fensterbreite ist, wird sie verkleinert,
			  	// damit die Box korrekt ausgegeben wird.
			  	if (!oParams.fBoxBiggerThanWindow && iBoxWidth > iWindowWidth)
			  		iBoxWidth = iWindowWidth - 20;

			  	// Box horizontal zentrieren
			  	iBoxPositionLeft = (iWindowWidth - (iBoxWidth + oParams.iOuterBorder))/2;

			  	// ###################################
			  	// Höhe
			  	// ###################################
			  	//erstmal prüfen ob die übergebene Höhe größer als die Höhe des Fensters ist
			  	// die 40 sind ein geschätzter Wert - damit sieht es ganz gut aus - kann ggf.
			  	// geändert werden
				  if (!oParams.fBoxBiggerThanWindow && oParams.height + 40 > iWindowHeight)
				  {
				    // wenn ja, dann wird die Höhe auf die Windows-Höhe -40px verkleinert
				    // die übergebene Höhe spielt ab hier keine Rolle mehr
				    iBoxHeight = iWindowHeight - 40;
				  }
				  else
				   iBoxHeight = oParams.height; // ansonsten wird die Höhe einfach übernommmen


				  // Wenn die Top-Position anhand der Scroll-Position ermittelt werden soll
				  if (oParams.fReCalcTopPosition)
				  {
				    // ggf. $(window).scrollTop() + oParams.iTopPosition um den Wert aus den
				    // Einstellungen auch einzubeziehen
				    iBoxPositionTop = $(window).scrollTop();
				    // Position ein bisschen nach unten rücken - sieht besser aus, wenn die box
				    // nicht ganz oben dranklept

				    // Falls die TopPosition kleiner als 20px ist, wird sie manuel auf 20px gesetzt
				    // hier kann man überlegen, ob sie dann auf oParams.iTopPosition gesetzt wird.
				    // hier gehts nur rein, wenn der Browser durch das overflow:hidden den scrolltop
				    // auf 0 geändert hat - z.B. FF
				    if (iBoxPositionTop < 20)
				    {
				      if (iBoxHeight + 20 < iWindowHeight)
					    	iBoxPositionTop = iBoxPositionTop + 20;
				    }

				  }
				  else
				    iBoxPositionTop = oParams.iTopPosition;

			  }
				// Css-Parameter setzen
			  sCssParams['height'] = iBoxHeight;
			  sCssParams['width'] = iBoxWidth;
			  sCssParams['top'] = iBoxPositionTop;
			  sCssParams['left'] = iBoxPositionLeft;

			  if (oParams.animation)
			  	sCssParams['display'] = 'none'; // bei Animation display:none setzen, damit die Animation sichtbar wird

			  if (oParams.iZindex > 0)
			     sCssParams['z-index'] = oParams.iZindex + 10; // +10 um sicher über dem Overlay zu sein

			  $("#"+oParams.sBoxPreFix+"GB_window").css(sCssParams);

			  // Breite und Höhe des Divs/Iframes innerhalb der Box setzen
			  sCssParams = {};
			  sCssParams['height'] = iBoxHeight - oParams.iCaptionHeight;
			  // Der Iframe brauch auch noch die Breite
			  if (oParams.fIframe)
			  	sCssParams['width'] = iBoxWidth;

			  if (oParams.animation)
			  	sCssParams['display'] = 'none'; // bei Animation display:none setzen, damit die Animation sichtbar wird

			  $("#"+oParams.sBoxPreFix+"GB_frame").css(sCssParams);

			}


			$.GB_hide = function(sCallBack) {
			  if(oParams.callOnCloseStart && typeof(oParams.callOnCloseStart) == 'function') {
			    oParams.callOnCloseStart.apply();
			  }
				$("#"+oParams.sBoxPreFix+"GB_window,#"+oParams.sBoxPreFix+"GB_overlay").remove();
			  if (!oParams.f2ndBox)
			  {
			  	//$('embed, object').css('visibility', 'visible');
			  	//$('embed, object').css('display', 'block');
			  	$('embed, object').show();
			  }

			  if (!oParams.f2ndBox && oParams.fOverflowHidden)
	       GB_BodyOverflow('stop');

	      // nun noch den scrolltop setzen
	      if (iScrollTop > 0)
	      	$(window).scrollTop(iScrollTop);

			  if(oParams.callOnClose && typeof(oParams.callOnClose) == 'function') {
			    oParams.callOnClose.apply();
			  }

			  if(sCallBack && typeof(sCallBack) == 'function') {
			    sCallBack.apply();
			  }
			}

			GB_parseParams = function ( query ) {
			 var Params = {};
			 if ( ! query ) {return Params;}// return empty object
			 var Pairs = query.split(/[;&]/);
			 for ( var i = 0; i < Pairs.length; i++ ) {
			    var KeyVal = Pairs[i].split('=');
			    if ( ! KeyVal || KeyVal.length != 2 ) {continue;}
			    var key = unescape( KeyVal[0] );
			    var val = unescape( KeyVal[1] );
			    val = val.replace(/\+/g, ' ');
			    Params[key] = val;

			 }
			 return Params;
		 }

		 /* Function setzt auf HTML oder body einen overflow (falls param overflow: true) -
		    zusätzlich wird ein padding-right gesetzt, um den Scrollbalken auszugleichen */
		 GB_BodyOverflow = function (param)
		 {
        if ($.browser.msie)
          var oObj = $('html');
        else
          var oObj = $('body');

        if (param == 'start')
        {
          var sOverflowMode = 'hidden';
          var sPadding = oParams.overflowScrollbarPadding + 'px';
        }
        else
        {
          var sOverflowMode = 'auto';
          var sPadding = '';
        }

        oObj.css({overflow: sOverflowMode, 'padding-right': sPadding});
        // hier würde ich gerne für MSIE das padding wieder komplett aus html entfernen,
        // aber ich hab keine Ahnung wie ich an das html-tag komme
        //if ($.browser.msie) document.html.style.removeAttribute("padding-right", false);

		 }

		return GB_show_intern();


  }


  // Default-Werte exportieren, damit diese überschrieben werden können

  $.GB_show.defaults =
  {
    close_img: "close.gif", /* Pfad zum close-Bild */
    sCloseText: '', /* Text zum schließen der Box - wenn Text gestetzt ist, wird das Bild nicht benutzt */
    height: "400",
    width: "400",
    sBackOpacity: 0.6,
    animation: false,
    overlay_clickable: true,
    fOverflowHidden: true, /* wenn true, wird overflow:hidden auf den body gesetzt, damit man kein doppelscrollen hat */
    overflowScrollbarPadding: 18, /* bei overflow:hidden verschwindet die scrollbar - um das auszugleichen kann ein Padding gesetzt werden */
    callOnStart: "null", /* Callback, der als erstes gleich nach dem Start aufgerufen wird*/
    callOnShow: "null",  /* Callback, der nach dem Anzeigen gefeuert wird*/
    callOnCloseStart: "null", /* Callback, beim schließen gefeuert wird*/
    callOnClose: "null", /* Callback, beim schließen gefeuert wird*/
    caption: "",				 /* Caption text*/
    fIframe: true,			/* iframe Modus */
    fAjax: false,				/* Ajax-Fenster */
    fImage: false,
    iImageMaxWidth: "800", /* Maximale Bild-Größe - derzeit noch nicht eingebaut */
    iImageMaxHeight: "600", /* Maximale Bild-Höhe - derzeit noch nicht eingebaut */
    iCaptionHeight: "20", /* Höhe des Caption-Divs in px */
    fReCalcTopPosition : true,	/* automatische Positionsberechnung - arbeitet mit Scrolltop, um Fenster an die richtige Stelle zu setzen */
    iTopPosition : "20",		/* Fixer Wert für die top-Position */
    f2ndBox: false,			/* Flag, für Boxen die innerhalb einer Box aufgerufen wird - in diesem Modus ist das Overlay tranzparent und der body wird nicht nocheinmal auf overflow:hidden gesetzt*/
    fFireAnimationAtOnce: true,			/* Wenn true, wird die Animation der des Frame-Elements gleichzeitig mit der Animation (fadeIn) des Box-Windows gefeuert - hat den Effekt, dass der Inhalt schon beim einfaden der Box sichtbar ist. Wenn das Flag false ist, dann wird erst die Anmation der Box durchgeführt und dann die Animation des Fensters */
    sBoxPreFix: "",		/* eindeutiger Prefix - Muss gesetzt werden, wenn man im 2ndBox-Mous ist, damit alle Elemente eindeutige IDs bekommen */
		iZindex: 0,			/* manueller z-Index-Modus */
		fAutoSize : false, /* in diesem Modus wird die Größe der Box automatisch über die Fenstergröße ermittelt */
		iAutoSizeMargin: 30, /* damit das Fenster nicht ganz Bildschirmfüllend wird, kann noch eine äüßere Margin gesetzt werden */
		dAspectRatio: 0, /* Seitenverhältnis - wenn größer Null wird die Höhe über dieses Verhältnis zur Breite gesetzt: Bsp: 1.33 -> 4:3 Funktioniert nur im Automodus! */
		fBoxBiggerThanWindow: false, /* wenn true, kann die Breite größer als die Fenster-breite sein - nicht empfohlen! */
		iOuterBorder: 8 /* Summe der äußeren Border (links und rechts) - wird zum perfekten zentrieren gebraucht, ansonsten ist auf kleinen Monitoren die Box zu weit rechts */
  };


})(jQuery);

