/*----------------------------------------------------------------------*/
/*  Informationen zur Darstellung des Inhaltes verwalten                */
/*  und Zentrierung des Bildschirminhaltes                              */
/*  Copyright by Antritter-Informatik, Juli 2002 - September 2005       */
/*----------------------------------------------------------------------*/

/*
** Bemerkungen zur "Darstellung des Inhaltes", Begriffsdefinitionen:
** Der Browser stellt eine ((Zeichenfläche)) zur Verfügung, in dem alle
** die Seite konstituierenden Elemente dargestellt werden können.
** Innerhalb dieser Zeichenfläche wird nun ein ((Vordergrund)) gezeichnet,
** innerhalb dem alle wesentlichen Inhalte der ((Seite)) dargestellt werden;
** um den möglicherweise freien Platz "Zeichenfläche ./. Vordergrund" optisch
** ansprechend aufzufüllen, liegt unter dem Vordergrund ein ((Untergrund)),
** der aber lediglich "optisch ansprechend" sein soll, selbst aber keine
** wesentlichen Informationen zeigen sollte.
** Die ((Seite)) ist demnach das in der ((Zeichenfläche)) sichtbare
** Gesamtresultat, im allgemeinen also der ((Vordergrund)) mit einem sichtbaren
** Rand aus dem ((Untergrund))
*/



//-------
// Daten:
//-------
var Seitendarstellung_GroesseDesVordergrundsFixiert = 1;
var Seitendarstellung_BreiteVordergrund             = 760;
var Seitendarstellung_HoeheVordergrund              = 400;

var Seitendarstellung_PositionDesVordergrundsFixiert = 1;
var Seitendarstellung_anteilUntergrundLinks          = 50;
var Seitendarstellung_anteilUntergrundRechts         = 50;
var Seitendarstellung_anteilUntergrundOben           = 50;
var Seitendarstellung_anteilUntergrundUnten          = 50;

var Seitendarstellung_KoordinatentransformationBegonnen  = 0;
var Seitendarstellung_KoordinatentransformationVollendet = 0;
var Seitendarstellung_nameDerKoordinatentransformationsebene = "";

var Seitendarstellung_listeDerZuBenachrichtigendenFunktionen = new Array();



//--------------------------------------------------------------------------
// function Seitendarstellung_MaximaleHorizontaleGroesseDerZeichenflaeche():
// function Seitendarstellung_MaximaleVertikaleGroesseDerZeichenflaeche():
//--------------------------------------------------------------------------

function Seitendarstellung_MaximaleHorizontaleGroesseDerZeichenflaeche()
   {
   // Die maximale Größe der Zeichenfläche wird normalerweise im
   // Vollbildmodus erreicht. Im Falle von Bildschirmkacheln könnte
   // ein Browserfenster jedoch über mehrere Kacheln reichen, deshalb
   // verwende, falls größer, lieber die momentane Größe der Zeichenfläche:

   return Browser_getWindowInnerWidth();
//   return Math.max( Browser_getWindowInnerWidth(), Browser_getScreenWidth() );
   }

function Seitendarstellung_MaximaleVertikaleGroesseDerZeichenflaeche()
   {
   // Die maximale Größe der Zeichenfläche wird normalerweise im
   // Vollbildmodus erreicht. Im Falle von Bildschirmkacheln könnte
   // ein Browserfenster jedoch über mehrere Kacheln reichen, deshalb
   // verwende, falls größer, lieber die momentane Größe der Zeichenfläche:

   return Browser_getWindowInnerHeight();
//   return Math.max( Browser_getWindowInnerHeight(), Browser_getScreenHeight() );
   }



//----------------------------------------------------------------
// function Seitendarstellung_FixierungDerGroesseDesVordergrunds:
// function Seitendarstellung_FixierungDerPositionDesVordergrunds:
//----------------------------------------------------------------

function Seitendarstellung_FixierungDerGroesseDesVordergrunds( wasZuTun )
   {
   switch( wasZuTun )
      {
      case "aufheben":
         {
         Seitendarstellung_GroesseDesVordergrundsFixiert = 0;
         break;
         }

      case "setzen":
         {
         Seitendarstellung_GroesseDesVordergrundsFixiert = 1;
         break;
         }

      default:
         {
         // Fehler: falsche Angabe "wasZuTun"...
         return;
         }
      }

   Seitendarstellung_neuArrangierenFallsErforderlich();
   }

function Seitendarstellung_FixierungDerPositionDesVordergrunds( wasZuTun )
   {
   switch( wasZuTun )
      {
      case "aufheben":
         {
         Seitendarstellung_PositionDesVordergrundsFixiert = 0;
         break;
         }

      case "setzen":
         {
         Seitendarstellung_PositionDesVordergrundsFixiert = 1;
         break;
         }

      default:
         {
         // Fehler: falsche Angabe "wasZuTun"...
         return;
         }
      }

   Seitendarstellung_neuArrangierenFallsErforderlich();
   }



//---------------------------------------------------------
// function Seitendarstellung_definiereGroesseVordergrund:
// function Seitendarstellung_liesBreiteVordergrund:
// function Seitendarstellung_liesHoeheVordergrund:
// function Seitendarstellung_definierePositionVordergrund:
//---------------------------------------------------------

function Seitendarstellung_definiereGroesseVordergrund( breite, hoehe )
   {
   if( Seitendarstellung_GroesseDesVordergrundsFixiert &&
       (  Seitendarstellung_KoordinatentransformationBegonnen
       || Seitendarstellung_KoordinatentransformationVollendet )
     )
      {
      // Fehler: wenn die Größe des Vordergrundes fixiert sein soll, darf die Größe nur
      // solange geändert werden, wie die Koordinatentransformation noch nicht begonnen
      // hat (bis dahin handelt es sich um ein legitimes Überschreiben der voreingestellten Werte!)
      return;
      }

   Seitendarstellung_BreiteVordergrund = breite;
   Seitendarstellung_HoeheVordergrund  = hoehe;


   Seitendarstellung_neuArrangierenFallsErforderlich();
   }


function Seitendarstellung_liesBreiteVordergrund()
   {
   return Seitendarstellung_BreiteVordergrund;
   }


function Seitendarstellung_liesHoeheVordergrund()
   {
   return Seitendarstellung_HoeheVordergrund;
   }


function Seitendarstellung_definierePositionVordergrund(
   spezifikationDerHorizontalenPosition, spezifikationDerVertikalenPosition
)
   {
   // mögliche Spezifikationsarten:
   // -----------------------------
   // für die horizontale Position: (40:60) / links / mitte / rechts
   // für die vertikale Position:   (40:60) / oben / mitte / unten

   if( Seitendarstellung_PositionDesVordergrundsFixiert &&
       (  Seitendarstellung_KoordinatentransformationBegonnen
       || Seitendarstellung_KoordinatentransformationVollendet )
     )
      {
      // Fehler: wenn die Position des Vordergrundes fixiert sein soll, darf die Größe nur
      // solange geändert werden, wie die Koordinatentransformation noch nicht begonnen
      // hat (bis dahin handelt es sich um ein legitimes Überschreiben der voreingestellten Werte!)
      return;
      }

   // wandle textuelle Spezifikationen um in Anteilsspezifikationen "(x:y)":
   if( spezifikationDerHorizontalenPosition == "links")  spezifikationDerHorizontalenPosition = "(0:100)";
   if( spezifikationDerHorizontalenPosition == "mitte")  spezifikationDerHorizontalenPosition = "(50:50)";
   if( spezifikationDerHorizontalenPosition == "rechts") spezifikationDerHorizontalenPosition = "(100:0)";

   if( spezifikationDerVertikalenPosition == "oben")  spezifikationDerVertikalenPosition = "(0:100)";
   if( spezifikationDerVertikalenPosition == "mitte") spezifikationDerVertikalenPosition = "(50:50)";
   if( spezifikationDerVertikalenPosition == "unten") spezifikationDerVertikalenPosition = "(100:0)";


   // analysiere textuelle Anteilsspezifikationen zu Zahlenwerten:
   var analyseDerHorizontalenPosition = spezifikationDerHorizontalenPosition.match( /\((\d+)\:(\d+)\)/ );
   var anteilUntergrundLinks  = analyseDerHorizontalenPosition[1];
   var anteilUntergrundRechts = analyseDerHorizontalenPosition[2];

   var analyseDerVertikalenPosition = spezifikationDerVertikalenPosition.match( /\((\d+)\:(\d+)\)/ );
   var anteilUntergrundOben  = analyseDerVertikalenPosition[1];
   var anteilUntergrundUnten = analyseDerVertikalenPosition[2];


   // rechne die Anteilsspezifikationen um in prozentuale Angaben:
   var bezugssummeHorizontal = parseInt(anteilUntergrundLinks) + parseInt(anteilUntergrundRechts);
   var bezugssummeVertikal   = parseInt(anteilUntergrundOben) + parseInt(anteilUntergrundUnten);

   Seitendarstellung_anteilUntergrundLinks  = Math.floor( 100 * anteilUntergrundLinks  / bezugssummeHorizontal + 0.5 );
   Seitendarstellung_anteilUntergrundRechts = 100 - Seitendarstellung_anteilUntergrundLinks;

   Seitendarstellung_anteilUntergrundOben  = Math.floor( 100 * anteilUntergrundOben  / bezugssummeVertikal + 0.5 );
   Seitendarstellung_anteilUntergrundUnten = 100 - Seitendarstellung_anteilUntergrundOben;


   Seitendarstellung_neuArrangierenFallsErforderlich();
   }



//-----------------------------------------------------------
// function Seitendarstellung_MaximalesAusmassDesUntergrunds:
//-----------------------------------------------------------

function Seitendarstellung_MaximalesAusmassDesUntergrunds( inWelcherRichtung )
   {
   var breiteSichtbarerUntergrund = 0;
   var hoeheSichtbarerUntergrund  = 0;

   if( Seitendarstellung_GroesseDesVordergrundsFixiert )
      {
      // Ist die Größe des Vordergrundes fixiert, so ist der
      // sichtbare Anteil des Untergrundes (d.h.: der Anteil des Untergrunds
      // UM DEN VORDERGRUND HERUM) die Differenz aus Zeichenfläche
      // und Vordergrund, jedoch mindestens so groß wie der Vordergrund
      // selbst - letzteres ist dann wichtig, wenn der Vordergrund größer
      // sein sollte als die Zeichenfläche: dann ist um den Vordergrund
      // herum kein Untergrund sichtbar, weil man gar nicht außerhalb
      // des Vordergrunds scrollen kann; der Vordergrund muss aber
      // trotzdem komplett mit Untergrund unterlegt sein, weil ja
      // Teile des Untergrundes in den Vordergrund durchscheinen können.

      breiteSichtbarerUntergrund =   Seitendarstellung_MaximaleHorizontaleGroesseDerZeichenflaeche()
                                   - Seitendarstellung_BreiteVordergrund;

      hoeheSichtbarerUntergrund  =   Seitendarstellung_MaximaleVertikaleGroesseDerZeichenflaeche()
                                   - Seitendarstellung_HoeheVordergrund;

      if( breiteSichtbarerUntergrund < 0 )
         {
         breiteSichtbarerUntergrund = 0
         }

      if( hoeheSichtbarerUntergrund < 0 )
         {
         hoeheSichtbarerUntergrund = 0
         }
      }
   else
      {
      // Ist die Größe des Vordergrundes dagegen nicht fixiert, so könnte
      // der Vordergrund theoretisch bis hin zur Größe "0" verkleinert
      // werden. In diesem Fall wäre der Untergrund am wenigsten
      // überdeckt, d.h. es wäre die maximale Ausdehnung desselben
      // erreicht:

      breiteSichtbarerUntergrund = Seitendarstellung_MaximaleHorizontaleGroesseDerZeichenflaeche();
      hoeheSichtbarerUntergrund  = Seitendarstellung_MaximaleVertikaleGroesseDerZeichenflaeche();
      }


   var oberhalbVordergrund  = 0;
   var unterhalbVordergrund = 0;
   var linksVonVordergrund  = 0;
   var rechtsVonVordergrund = 0;

   if( Seitendarstellung_PositionDesVordergrundsFixiert )
      {
      // Ist die Position des Vordergrundes fixiert, so ist der sichtbare
      // Untergrund gemäß der festgelegten Anteile aufzuteilen.

      oberhalbVordergrund  = Math.ceil( hoeheSichtbarerUntergrund  * Seitendarstellung_anteilUntergrundOben   / 100 );
      unterhalbVordergrund = Math.ceil( hoeheSichtbarerUntergrund  * Seitendarstellung_anteilUntergrundUnten  / 100 );
      linksVonVordergrund  = Math.ceil( breiteSichtbarerUntergrund * Seitendarstellung_anteilUntergrundLinks  / 100 );
      rechtsVonVordergrund = Math.ceil( breiteSichtbarerUntergrund * Seitendarstellung_anteilUntergrundRechts / 100 );
      }
   else
      {
      // Ist die Position des Vordergrundes dagegen nicht fixiert, so kann
      // der Vordergrund bis zu allen Rändern geschoben werden - an
      // den gegenüberliegenden Rändern sind somit 100% des sichtbaren
      // Untergrundes anzunehmen.

      oberhalbVordergrund  = hoeheSichtbarerUntergrund;
      unterhalbVordergrund = hoeheSichtbarerUntergrund;
      linksVonVordergrund  = breiteSichtbarerUntergrund;
      rechtsVonVordergrund = breiteSichtbarerUntergrund;
      }


   // nun sind alle Maße berechnet; gib dasjenige zurück, für das angefragt wurde:
   switch( inWelcherRichtung )
      {
      case "oberhalbVordergrund":
         {
         return oberhalbVordergrund;
         break;
         }

      case "unterhalbVordergrund":
         {
         return unterhalbVordergrund;
         break;
         }

      case "linksVonVordergrund":
         {
         return linksVonVordergrund;
         break;
         }

      case "rechtsVonVordergrund":
         {
         return rechtsVonVordergrund;
         break;
         }

      default:
         {
         // Fehler: ungültige Spezifikation von 'inWelcherRichtung'
         break;
         }
      }
   }



//--------------------------------------------------------
// function Seitendarstellung_PositionVordergrundAbsolutX:
// function Seitendarstellung_PositionVordergrundAbsolutY:
//--------------------------------------------------------

function Seitendarstellung_PositionVordergrundAbsolutX()
   {
   var x = Math.floor( (Browser_getWindowInnerWidth() - Seitendarstellung_BreiteVordergrund) * Seitendarstellung_anteilUntergrundLinks / 100 );
   if(x<0) x=0;
   return x;
   }


function Seitendarstellung_PositionVordergrundAbsolutY()
   {
   var y = Math.floor( (Browser_getWindowInnerHeight() - Seitendarstellung_HoeheVordergrund) * Seitendarstellung_anteilUntergrundOben / 100 );
   if(y<0) y=0;
   return y;
   }



//-------------------------------------------------------------
// function Seitendarstellung_beginneKoordinatentransformation:
// function Seitendarstellung_beendeKoordinatentransformation:
//-------------------------------------------------------------

function Seitendarstellung_beginneKoordinatentransformation( nameDerKoordinatentransformationsebene )
   {
   var PositionVordergrundAbsolutX = Seitendarstellung_PositionVordergrundAbsolutX();
   var PositionVordergrundAbsolutY = Seitendarstellung_PositionVordergrundAbsolutY();

   Seitendarstellung_nameDerKoordinatentransformationsebene = nameDerKoordinatentransformationsebene;

   Browser_moveToRelative( Seitendarstellung_nameDerKoordinatentransformationsebene,
                           PositionVordergrundAbsolutX,
                           PositionVordergrundAbsolutY
                         );

   Seitendarstellung_KoordinatentransformationBegonnen = 1;   

   // ab dem Beginn der Koordinatentransformation ist die Größe des Browserfensters
   // und somit der Offset zum Hintergrund bekannt.. informiere von dieser Information
   // abhängige Module (z.B. "area") (indirekt über "neuArrangieren"...):
   Seitendarstellung_neuArrangierenFallsErforderlich()
   }


function Seitendarstellung_beendeKoordinatentransformation()
   {
   Seitendarstellung_KoordinatentransformationVollendet = 1;
   }



//---------------------------------------------------------------
// function Seitendarstellung_triggerungBeiWechselDerDarstellung:
//---------------------------------------------------------------

function Seitendarstellung_triggerungBeiWechselDerDarstellung( funktionsreferenz )
   {
   Seitendarstellung_listeDerZuBenachrichtigendenFunktionen.push( funktionsreferenz );
   }



//------------------------------------------------------------
// function Seitendarstellung_neuArrangierenFallsErforderlich:
//------------------------------------------------------------

function Seitendarstellung_neuArrangierenFallsErforderlich()
   {
   // falls die Koordinatentransformationsebene bereit steht, wurde diese Funktion
   // wegen einer dynamischen Aktualisierung (also wegen einer nachträglichen Änderung)
   // der Anzeigeparameter aufgerufen... setze die neuen Parameter dann also um:

   if( Seitendarstellung_KoordinatentransformationBegonnen && Seitendarstellung_KoordinatentransformationVollendet )
      {
      Browser_moveToRelative(
         "TransKoordDiv",
         Seitendarstellung_PositionVordergrundAbsolutX(),
         Seitendarstellung_PositionVordergrundAbsolutY()
         );
      }


   // benachrichtige alle interessierten Funktionen, dass sich etwas
   // bezüglich der Darstellung der Seite geändert hat:

   var i;
   for( i=0 ; i<Seitendarstellung_listeDerZuBenachrichtigendenFunktionen.length ; i++ )
      {
      eval( Seitendarstellung_listeDerZuBenachrichtigendenFunktionen[i]() );
      }
   }

Browser_registerResizeEventHandler( Seitendarstellung_neuArrangierenFallsErforderlich );



//---------------------------------------------
// function Seitendarstellung_erzeugeNeueEbene:
//---------------------------------------------

function Seitendarstellung_erzeugeNeueEbene(
   nameDerEbene,
   breite, hoehe,
   positionX, positionY,
   visibility,
   codeInhalt,
   parameter
   )
   {
   Browser_erzeugeNeueEbene(
      nameDerEbene,
      ( (Seitendarstellung_nameDerKoordinatentransformationsebene != "")?
         Seitendarstellung_nameDerKoordinatentransformationsebene
          :
         0
      ),
      breite, hoehe,
      positionX, positionY,
      visibility,
      codeInhalt,
      parameter
      );
   }



/*----------------------------------------------------------------------*/
/*- end of file                                                        -*/
/*----------------------------------------------------------------------*/


