﻿/*
*  fktResize.js
*  Commonly used script functions for window resizes
*  (c) 1998-2007 VSX VOGEL SOFTWARE GmbH.
*/

// Nach Bug 1799
// Abstand zum Rang
var cLeftDistance       = 0;
var cRightDistance      = 0;
var cLeftRightDelemiter = 2;
var cTopDistance        = 85;

// allgemeine Groessenanordnungen der globalen großen Divs
function GetGlobalLeftL( aResizeInfo)
// abstand links bis zum ersten DIV
{
   return cLeftDistance;
} 

function GetGlobalPartW( aResizeInfo)
{
  return ( (aResizeInfo.clientW - cLeftRightDelemiter) / 2);
}
  
function GetGlobalLeftW( aResizeInfo)
// Breite des linken DIVS
{
   return GetGlobalPartW( aResizeInfo);
}

function GetGlobalRightL( aResizeInfo)
// Breite des rechten DIVS
{
   return GetGlobalLeftL( aResizeInfo ) + GetGlobalLeftW( aResizeInfo) /* + cLeftRightDelemiter */ ;  
} 
  
function GetGlobalRightW( aResizeInfo)
{
   // Platz fuer Scrollbar lassen, ueberdeckt sonst;
   // var iScrollbarW = ScrollbarVisible("bodycontent") ? SCROLLBAR_WIDTH - 1 : 2;
   var iScrollbarW = 0;
   
   if( ShowBodyContentScrollbar() && ScrollbarVisible("bodycontent") ) 
     iScrollbarW = SCROLLBAR_WIDTH;

   return GetGlobalPartW(aResizeInfo) - cRightDistance - iScrollbarW;
}

function GetGlobalTop( aResizeInfo)
{
   return cTopDistance;
} 

function GetGlobalTopW( aResizeInfo)
{
   return GetGlobalLeftW(aResizeInfo) + cLeftRightDelemiter + GetGlobalRightW(aResizeInfo);
} 
  
function ResizeGlobalDiv_Left( sDivId, aResizeInfo )
{
  if( (null == aResizeInfo) || ("undefined" == typeof aResizeInfo) )
    aResizeInfo = new ResizeInfo();
 
  ASSERT( "" != sDivId);

  SetElmTop(   sDivId, GetGlobalTop(aResizeInfo) );
  SetElmLeft(  sDivId, GetGlobalLeftL(aResizeInfo) );
  SetElmWidth( sDivId, GetGlobalLeftW(aResizeInfo) );
}

function ResizeGlobalDiv_Right( sDivId, aResizeInfo )
{
  if( (null == aResizeInfo) || ("undefined" == typeof aResizeInfo) )
    aResizeInfo = new ResizeInfo();
 
  ASSERT( "" != sDivId);
  
  SetElmTop(   sDivId, GetGlobalTop(aResizeInfo) );
  SetElmLeft(  sDivId, GetGlobalRightL(aResizeInfo) );
  SetElmWidth( sDivId, GetGlobalRightW(aResizeInfo) );
}

function ResizeGlobalDiv_Top( sDivId, aResizeInfo )
{
  SetElmLeft(  sDivId, GetGlobalLeftL(aResizeInfo) );
  SetElmWidth( sDivId, GetGlobalTopW(aResizeInfo) );
  SetElmTop(   sDivId, GetGlobalTop(aResizeInfo) );
}

function ResizeGlobalDiv_BodyContent( aResizeInfo )
{
  if( (null == aResizeInfo) || ("undefined" == typeof aResizeInfo) )
    aResizeInfo = new ResizeInfo();
    
  // Hoehe Content
  SetElmHeight( "bodycontent", aResizeInfo.clientH);
}

function ResizeGlobalDiv_Next( sDivId, aResizeInfo )
{
  SetElmLeft(  sDivId, GetGlobalLeftL(aResizeInfo) );
  SetElmWidth( sDivId, GetGlobalTopW(aResizeInfo) );
}



//--- globaler OnResize-Handler ---

var g_resizehandler = new GlobalResizeHandler();

function GlobalResizeHandler()
{
  //--- private ---
  var self = this;
  var handlerL = new Array();
  
  //--- public ---
  
  this.Invoke = function()
  // Alle Handler aufrufen
  {
    for( var i = 0; i < handlerL.length; ++i)
    {
      var fn = handlerL[i];
      fn();
    }
  }  

  this.IsRegistered = function( fnHandler)
  // Testen, ob Handler registriert ist
  {
    for( var i = 0; i < handlerL.length; ++i)
      if( fnHandler == handlerL[i])
        return true;
    return false;    
  }

  this.Add = function( fnHandler)
  // Handler registrieren
  {
    ASSERT( "function" == typeof(fnHandler));
    if( ! this.IsRegistered( fnHandler))  // nicht mehrfach registrieren
      AddToArray( handlerL, fnHandler);
  } 
  
  this.ResizeGlobalLeft         = ResizeGlobalDiv_Left;
  this.ResizeGlobalRight        = ResizeGlobalDiv_Right;
  this.ResizeGlobalTop          = ResizeGlobalDiv_Top;    
  this.ResizeGlobalBodyContent  = ResizeGlobalDiv_BodyContent;   
  this.ResizeGlobalNext         = ResizeGlobalDiv_Next;     
  
  
  this.GlobalLeftL              = GetGlobalLeftL;
  this.GlobalLeftW              = GetGlobalLeftW;
  this.GlobalRightL             = GetGlobalRightL;
  this.GlobalRightW             = GetGlobalRightW;
  this.GlobalTop                = GetGlobalTop;  
  this.GlobalTopW               = GetGlobalTopW;    
  
  
}

function OnGlobalResize()
{
  g_resizehandler.Invoke();
}

// globalen Handler per default installieren, kann mittels onresize= beim Element ueberschrieben werden
window.onresize = OnGlobalResize;




//--- allgemeine Layout-Tools fuer fmtSection-"Boxmodell" -------------------------------------------------------


// im IE QuirksMode muss die Border mit berechnet werden, 
// den Wert dann in der entsprechenden Seite(!) geeignet initialisieren = oben + unten
var FMTSECTION_BORDER = 0;  


function ResizeFmtSection( aDivID, aX,aY, aW,aH)
// Anpassung der Abmessungen eines fmtSection-Containers einschliesslich enthaltener Boxmodell-Elemente (CONT,RIGHT) etc.
// Fuer Werte, welche nicht angepasst werden sollen, stattdessen false angeben
{
  var fmtSection = findScriptElement( aDivID);
  if( null == fmtSection)
    return;

  // was ist variabel?
  var bSetX = ("number" == typeof aX);
  var bSetY = ("number" == typeof aY);
  var bSetW = ("number" == typeof aW);
  var bSetH = ("number" == typeof aH);

  // benoetigte DIVs suchen  
  var divL = GetChildsByTagName( fmtSection, "div");
  var i, div, sTest;
  var divHead = null, divCont = null, divLeft = null, divRight = null;  // FIX: lokale Variablen, keine globalen, wegen moeglicher Reentranz
  for( i = 0;  i < divL.length;  ++i)
  {
    div = divL[i];
    sTest = " "+div.className+" ";
    if(      sTest.indexOf(" cont ") >= 0)
      divCont = div;
    else if( sTest.indexOf(" head ") >= 0)
      divHead = div;
    else if( sTest.indexOf(" right ") >= 0)
      divRight = div;
    else if( sTest.indexOf(" left ") >= 0)
      divLeft = div;
  }
  
  
  // fmtSection.cont: variabel ist nur die Hoehe 
  if( (null != divCont) && bSetH)
  {
    // Unterscheidung mit/ohne Header erforderlich
    var nHeight = aH - FMTSECTION_BORDER;
    if( null != divHead)
      nHeight -= divHead.offsetHeight;
    
    // Minimalwert fuer Content-Hoehe beachten. Ausnahme: der aktuelle Wert liegt bereits darunter 
    nHeight = Math.max( nHeight, Math.min( 10, divCont.offsetHeight)); 
    divCont.style.height = String(nHeight) + "px";
      
    // aH basierend auf neuer Ist-Hoehe zurueckrechnen
    aH = nHeight + FMTSECTION_BORDER;
    if( null != divHead)
      aH += divHead.offsetHeight;
  }
  
  
  // fmtSection.cont.right: variabel ist die Breite, das DIV ist optional
  // Wenn right existiert muss immer auch ein left existieren, sonst illegaler Zustand
  if( bSetW && (null != divRight) && (null != divLeft))
  {
    var nWidth = aW - divLeft.offsetWidth;

    // Minimalwert fuer Content-Breite beachten. Ausnahme: der aktuelle Wert liegt bereits darunter 
    nWidth = Math.max( nWidth, Math.min( 10, divRight.offsetWidth)); 
    divRight.style.width = String(nWidth) + "px";
      
    // aW basierend auf neuer Ist-Breite zurueckrechnen
    aW = nWidth + divLeft.offsetWidth;
  }


  // fmtSection zuletzt, wegen Minimalwerten
  var css = fmtSection.style;
  if( bSetX)  css.left   = String(aX) + "px";
  if( bSetY)  css.top    = String(aY) + "px";
  if( bSetW)  css.width  = String(aW) + "px";
  if( bSetH)  css.height = String(aH) + "px";
}

//--- ResizeInfo ---

function ResizeInfo_Recalc( aClientW, aClientH)
// Neuberechnung, basierend auf den UEBERGEBENEN Werte fuer aktuelle Clientabmessungen
{
  // verfuegbarer Clientbereich abzgl. Header und ggf. Footer
  this.clientW = Math.max( 10, aClientW);
  this.clientH = Math.max( 10, aClientH);

  // Faktor zu den Original-Design-Abmessungen 
  this.multW   = this.clientW / this.origW;
  this.multH   = this.clientH / this.origH;
}


function ResizeInfo( aOrigW, aOrigH, aHeaderH, aFooterH)
// Liefert Clientabmessungen und Umrechnungsfaktoren
// Fuer Sonderzwecke wie IFRAMES koennen abweichende Original-Design-Abmessungen 
// angegeben werden, default ist 1275 x 830
{
  // Methoden
  this.Recalc = ResizeInfo_Recalc;

  // Originalabmessungen merken
  this.origH   = ("number" == typeof aOrigH)  ?  aOrigH  :  830;
  this.origW   = ("number" == typeof aOrigW)  ?  aOrigW  :  1275;
  
  // Header und Footer beruecksichtigen = layoutspezifisch!
  this.headerH = ("number" == typeof aHeaderH)  ?  aHeaderH  :  85;
  this.footerH = ("number" == typeof aFooterH)  ?  aFooterH  :  20;
  
  // aktuell verfuegbarer Clientbereich, abzgl. Header und ggf. Footer
  var nW = GetClientWidth();
  var nH = GetClientHeight() - (this.headerH + this.footerH);   
  
  // Werte setzen und berechnen lassen
  this.Recalc( nW, nH);
}

// EOF

