<?php
/* Vorlagenseite für Standard-Artikel. Diese Seite erzeugt anhand diverser Variablen und Text- bzw. Grafikabschnitte eine standardisierte Darstellung. Diese Seite ist eine reine php-Seite und wird durch eine reine PHP-Variablen-Seite aufgerufen. */
Zusätzliche Variablen ermitteln /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ###### Lade die aktuelle Datei in eine Variable
$pageContent = file_get_contents(phpConvertPageToFilesystemPath(htmlspecialchars($_GET["id"])));
// ********************
// Variablen bestimmen
// ********************
//###### URL zur Anzeige von Bildern über http/https
$dokuwikiMediaUrl = 'https://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/lib/exe/fetch.php?media=';
// ###### Rechte Sidbar
$sidebarRight = phpConvertPageToFilesystemPath($pageVarArray['variables']['default']['sidebarRight']);
// ###### Daten zum Erstellungszeitpunkt
$pageVarArray['variables']['default']['authorCreationDate'] = date("d.m.Y",strtotime($pageVarArray['variables']['default']['authorCreationDate']));
$pageVarArray['variables']['default']['authorCreationTimeStamp'] = strtotime("{$pageVarArray['variables']['default']['authorCreationDate']} {$pageVarArray['variables']['default']['authorCreationTime']}");
//###### Falls ein oder mehrere Bilder verwendet werden, muss der DIV benannt werden
$imageCounter = 0;
//Führende und endende Leerzeichen und Zeilenumbrüche entfernen
$pageVarArray['variables']['default']['pageEyeCatcher'] = trim($pageVarArray['variables']['default']['pageEyeCatcher']);
// ********************
// Fehlermeldung, falls keine CSS-Datei vorhanden ist
// ********************
if ( (empty($pageVarArray['variables']['default']['styleSchema'])) || (!(file_exists(phpConvertPageToFilesystemPath($pageVarArray['variables']['default']['styleSchema']))))) {
echo '<html>
<div style="width: 100%; height: 100px; padding-top:25px; text-align: center; border: 2px solid black; font-weight: bold; font-size: 2vw;">
Es existiert keine Style-Sheet-Datei
</div>
</html>';
exit();
}
CSS-Datei inkludieren /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include(phpConvertPageToFilesystemPath('includes:css:css_transform_page')); include(phpConvertPageToFilesystemPath($pageVarArray['variables']['default']['styleSchema'])); Funktionen
//##################################################################################
//###### Funktion: Durchsuche angegebenen Pfad nach Bildern (nicht rekursiv)
//##################################################################################
function func_getAllImagesFromDir($dir, $filter, $excludeArray) {
//CONDITION: Falls kein oder ein falscher Exclude-Filter gesetzt wurde, setze Asterisk als Filter
if ( (empty($excludeArray)) || (!(isset($excludeArray))) || (!is_array($excludeArray)) ) {
$excludeArray = NULL;
}
if (!(is_null($excludeArray))) {
$excludeRegExString = ( (count($excludeArray) > 1) ? '(' . implode('|',$excludeArray) . ')' : $excludeArray[0] );
}
//###### Wenn Uebergabewert In DokuWiki-Pfad-Syntax, dann konvertiere zu File-System-Pfad-Syntax
if ((strpos($dir,':'))) {
//###### String enthält :
$tree = glob(rtrim(phpConvertNamespaceToFilesystemPath($dir), '/') . '/' . $filter);
} elseif (strpos($dir,'/') !== false ) {
//###### String enthält /
$tree = glob(rtrim($dir, '/') . '/' . $filter);
} else {
//###### String enthält weder : noch /
$tree = glob(rtrim(phpConvertNamespaceToFilesystemPath($dir), '/') . '/' . $filter);
}
if (is_array($tree)) {
foreach ($tree as $file) {
if (is_file($file)) {
//###### Falls Datei verarbeitet werden soll, inkludieren und in ganzheitliches Array fuellen
if ( (strpos($file, '.jpg')) || (strpos($file, '.png')) || (strpos($file, '.svg')) ) {
//###### UpperCase zu LowerCase umbenennen
$filePathSplitArray = explode('/', $file);
$fileName = end($filePathSplitArray);
if (preg_match("/[A-Z]/", $fileName)) {
$fileNameLower = strtolower($fileName);
array_pop($filePathSplitArray);
$filePath = implode('/', $filePathSplitArray);
echo $filePath . '-' . $fileNameLower. '<><><><> //// ';
copy("$filePath/$fileName","$filePath/$fileNameLower");
unlink("$filePath/$fileName");
}
if (!(preg_match($excludeRegExString, $file) === 1)) {
$includedImages[] = str_replace('media:', '', phpCreateDokuWikiConformName(substr(str_replace(realpath(dirname(__FILE__) . '/../../..'), '', $file),1)));
}
}
}
}
}
//###### globales Array uebergeben
return $includedImages;
}
//##################################################################################
//###### Funktion 1v2: Erstelle das Repo einer Gallerie
//###### Funktion 2v2: Erstelle das zum Repo zugehörige Ribbon
//##################################################################################
function func_buildGalleryRepo($givenGallerySectionData) {
//CONDITION: Falls kein oder ein falscher Include-Filter gesetzt wurde, setze Asterisk als Filter
if ( (empty($givenGallerySectionData['sectionContIncl'])) || (!(isset($givenGallerySectionData['sectionContIncl']))) || (!is_array($givenGallerySectionData['sectionContIncl'])) ) {
$givenGallerySectionData['sectionContIncl'] = ['*'];
}
$currentGalleryImageArray = array();
foreach ($givenGallerySectionData['sectionContent'] as $currentImageSource) {
$currentImageSourceDir = str_replace('/data/pages/', '/data/media/', phpConvertNamespaceToFilesystemPath($currentImageSource[0]));
$currentImageSourceFile = str_replace('/data/pages/', '/data/media/', phpConvertPageToFilesystemPath($currentImageSource[0]));
// CONDITION: Handelt es bei der aktuellen Bildquelle um ein Bild oder einen Ordner
if (file_exists($currentImageSourceDir)) {
foreach($givenGallerySectionData['sectionContIncl'] as $curentImageFilter) {
$foundImages = func_getAllImagesFromDir($currentImageSourceDir, $curentImageFilter, $givenGallerySectionData['sectionContExcl']);
if (!(is_null($foundImages))) {
$currentGalleryImageArray = array_merge($currentGalleryImageArray, $foundImages);
}
}
} elseif (file_exists($currentImageSourceFile)) {
$currentGalleryImageArray[] = str_replace('media:', '', $currentImageSourceFile);
}
}
array_unique($currentGalleryImageArray);
sort($currentGalleryImageArray);
return $currentGalleryImageArray;
}
function func_buildGalleryRibbon($dokuwikiMediaUrl, $keyCurrentParagraph, $keyCurrentSection, $currentGalleryImageArray) {
//###### Gallerie-Ribbon-String mit allen Bildern erstellen
$imageRibbonString = '';
echo '<script language="javaScript">var jsGalleryImageArray_' . $keyCurrentParagraph . '_' . $keyCurrentSection . ' = [\'' . implode('\', \'', $currentGalleryImageArray) . '\'];</script>';
foreach ($currentGalleryImageArray as $currentImageKey => $imageCurrent) {
$imageRibbonString .= '<img id="slideshow" onclick="rotateimages(\'previewImage-' . $keyCurrentParagraph . '-' . $keyCurrentSection . '\', jsGalleryImageArray_' . $keyCurrentParagraph . '_' . $keyCurrentSection . ', \'' . $currentImageKey . '\'); return false;" onmouseover="rotateimages(\'previewImage-' . $keyCurrentParagraph . '-' . $keyCurrentSection . '\', jsGalleryImageArray_' . $keyCurrentParagraph . '_' . $keyCurrentSection . ', \'' . $currentImageKey . '\'); return false;" src="' . $dokuwikiMediaUrl . $imageCurrent . '" />';
}
return $imageRibbonString;
}
// ********************
// Funktion zum Anzeigen von Bildern
// ********************
function func_showImage( $dokuwikiMediaUrl, $imagePath, $imageType, $keyCurrentParagraph, $keyCurrentSection) {
return '<div class="ct-image-' . $imageType . '" onclick="fullscreen(\'previewImage-' . $keyCurrentParagraph . '-' . $keyCurrentSection . '\')"><img id="previewImage-' . $keyCurrentParagraph . '-' . $keyCurrentSection . '" src="' . $dokuwikiMediaUrl . $imagePath . '"></div>';
}
// ********************
// JavaScript-Funktionen für Slideshow und FullScreen/Lightbox
// ********************
//###### Lightbox-Funktionen-String erstellen (JavaScript)
$jsLightboxFunctions = '
<script language="javascript">
function rotateimages(givenImageDiv, givenImageArray, givenImageKey){
imgFromGivenDiv = document.getElementById(givenImageDiv)
imgFromGivenDiv.src = "' . $dokuwikiMediaUrl . '" + givenImageArray[givenImageKey];
imgFromGivenDiv.array = givenImageArray.slice(0);
imgFromGivenDiv.arrayKey = givenImageKey;
}
function fullscreen(givenImageDivId) {
ctFullscreen = document.getElementById("fullscreenContainer");
ctFullscreenImage = document.getElementById("fullscreenImage");
ctFullscreen.style.display = "flex";
ctFullscreenOverlayInfo = document.getElementById("fullscreenInfo");
ctFullscreenOverlayInfoDesc = document.getElementById("fullscreenDescription");
ctFullscreenOverlayInfoNav = document.getElementById("fullscreenNav");
ctFullscreenOverlayInfoPrev = document.getElementById("fullscreenPrev");
ctFullscreenOverlayInfoCount = document.getElementById("fullscreenCount");
ctFullscreenOverlayInfoNext = document.getElementById("fullscreenNext");
imgFromGivenDiv = document.getElementById(givenImageDivId);
if (typeof imgFromGivenDiv.array == "undefined") {
ctFullscreenOverlayInfoNav.style.display = "none";
} else {
ctFullscreenImage.array = imgFromGivenDiv.array;
ctFullscreenImage.arrayKey = imgFromGivenDiv.arrayKey;
ctFullscreenOverlayInfoNav.style.display = "flex";
ctFullscreenOverlayInfoCount.innerHTML = (parseInt(imgFromGivenDiv.arrayKey) + 1) + "/" + imgFromGivenDiv.array.length;
if ((parseInt(imgFromGivenDiv.arrayKey) + 1) == imgFromGivenDiv.array.length) {
ctFullscreenOverlayInfoNext.style.visibility = "hidden";
} else {
ctFullscreenOverlayInfoNext.style.visibility = "visible";
}
if (parseInt(imgFromGivenDiv.arrayKey) == 0) {
ctFullscreenOverlayInfoPrev.style.visibility = "hidden";
} else {
ctFullscreenOverlayInfoPrev.style.visibility = "visible";
}
}
ctfullscreenContainer = document.getElementById("fullscreenImage");
ctfullscreenContainer.src = imgFromGivenDiv.src;
}
function fullscreenClose() {
ctFullscreen = document.getElementById("fullscreenContainer");
ctFullscreen.style.display = "none";
}
function fullscreenPrev() {
ctFullscreen = document.getElementById("fullscreenImage");
arrayFromFullscreen = ctFullscreen.array;
arrayKeyFromFullscreen = parseInt(ctFullscreen.arrayKey) - 1;
ctFullscreen.src = "' . $dokuwikiMediaUrl . '" + arrayFromFullscreen[arrayKeyFromFullscreen];
ctFullscreen.arrayKey = arrayKeyFromFullscreen;
fullscreen("fullscreenImage");
}
function fullscreenNext() {
ctFullscreen = document.getElementById("fullscreenImage");
arrayFromFullscreen = ctFullscreen.array;
arrayKeyFromFullscreen = parseInt(ctFullscreen.arrayKey) + 1;
ctFullscreen.src = "' . $dokuwikiMediaUrl . '" + arrayFromFullscreen[arrayKeyFromFullscreen];
ctFullscreen.arrayKey = arrayKeyFromFullscreen;
fullscreen("fullscreenImage");
}
</script>
';
Medienverzeichnis prüfen und ggfs. anlegen (vereinfacht das Hochladen von Bildern über den MediaManager) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ###### Alle Bilder am angegebenen Pfad finden (hier Blog-Mediendateien)
//###### zugehoeriges Medien-Verzeichnis ermitteln
$filePathOfPageImages = str_replace('/pages/media/', '/media/', phpConvertNamespaceToFilesystemPath('media:' . $_GET["id"]));
//###### das übergeordnete (Parent)-Verzeichnis des Medien-Verzeichnises ermitteln
$filePathOfPageImagesSplit = explode(':', $_GET["id"]);
end($filePathOfPageImagesSplit);
array_pop($filePathOfPageImagesSplit);
$wikiPathOfParentPageImages = implode(':', $filePathOfPageImagesSplit);
$filePathOfParentPageImages = str_replace('/pages/media/', '/media/', phpConvertNamespaceToFilesystemPath('media:' . $wikiPathOfParentPageImages));
//###### Erstelle den Pfad, falls er nicht existiert
$filePathOfPageImagesSplit=explode('/', ltrim($filePathOfPageImages, '/'));
$pathOfPageImagesBreadcrumb = '';
foreach($filePathOfPageImagesSplit as $currentPathOfPageImagesSubfolder) {
$pathOfPageImagesBreadcrumb .= '/' . $currentPathOfPageImagesSubfolder;
if (!file_exists($pathOfPageImagesBreadcrumb)) {
mkdir($pathOfPageImagesBreadcrumb);
}
}
Generiere die eigentliche Seite /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ###### HTML-Tag öffnen
//################################################################################## echo '<html>';
//###### JavaScript-Funktionen einbinden, falls gesetzt
//##################################################################################
if (isset($jsLightboxFunctions)) { echo $jsLightboxFunctions; }
//###### Fullscreen-Image-Container erzeugen
//##################################################################################
echo '
<div id="fullscreenContainer" class="ctr-fullscreen-overlay-outer-frame">
<div class="ctr-fullscreen-overlay-inner-frame">
<div class="ctr-fullscreen-overlay-img">
<div onclick="fullscreenClose()" class="img-fullscreen-overlay">' . ( (!empty($pageVarArray['variables']['default']['pageImageCover'])) ? '<img id="fullscreenImage" src="' . $dokuwikiMediaUrl . $pageVarArray['variables']['default']['pageImageCover'] . '">' : '' ) . '</div>
</div>
<div id="fullscreenInfo" class="ctr-fullscreen-overlay-info">
<div id="fullscreenDescription" class="ctr-fullscreen-overlay-description">
<div class="ct-paragraph">
<div class="ct-paragraph-section-title">
Hallo, dies ist ein Test.
</div>
<div class="ct-paragraph-section-content">
Hallo, dies ist ein Test.
</div>
</div>
</div>
<div id="fullscreenNav" class="ctr-fullscreen-overlay-nav">
<div id="fullscreenPrev" onclick="fullscreenPrev()" class="elem-fullscreen-overlay-nav-btn">◀</div>
<div id="fullscreenCount" class="elem-fullscreen-overlay-nav-count">x/x</div>
<div id="fullscreenNext" onclick="fullscreenNext()" class="elem-fullscreen-overlay-nav-btn">▶</div>
</div>
</div>
</div>
</div>
';
//###### Parent-Inhalts-Container //################################################################################## //###### BEGIN: parent-container: umspannender Inhalts-Container echo "
";
//###### BEGIN: parent-container-linke-spalte: umspannender Inhalts-Container
echo "
<div class='" . ( ((isset($pageVarArray['variables']['default']['sidebarRight'])) && (file_exists(phpConvertPageToFilesystemPath($pageVarArray['variables']['default']['sidebarRight'])))) ? 'ct-parent-column-left' : 'ct-parent-column-full' ) . "'>";
//CONDITION: Falls ein Top-Banner der Seite angezeigt werden soll
if ( ($pageVarArray['variables']['default']['pageImageBannerDisplay']) && (!empty($pageVarArray['variables']['default']['pageImageBanner'])) ) {
echo "
<div class='ct-paragraph' style='border: none; background: none; border-radius: 0;'>
<div class='ct-paragraph-section-content-image-banner' style='background: none;'>" . func_showImage($dokuwikiMediaUrl, $pageVarArray['variables']['default']['pageImageBanner'], 'stretch-top', '0', '0') . "</div>
</div>
";
}
//Informationen zu Datum, Webpage und Autor
echo "
<div style='margin-bottom: var(--global-font-size);'>Beitrag" . ( (!empty($pageVarArray['variables']['default']['authorCreationDate'])) ? " vom {$pageVarArray['variables']['default']['authorCreationDate']}" : "" ) . " auf {$_SERVER['SERVER_NAME']}" . ( (!empty($pageVarArray['variables']['default']['authorCreationUser'])) ? " von </html>[[user:{$pageVarArray['variables']['default']['authorCreationUser']}]]<html>" : "" ) . "</div>
";
//CONDITION: Falls der Titel der Seite angezeigt werden soll
if ($pageVarArray['variables']['default']['pageTitleDisplay']) {
echo "
<div class='ct-paragraph'>
<div class='ct-page-title-top'>" . str_replace('\\\\', '<br />', $pageVarArray['variables']['default']['pageTitleRow1']) . "</div>" . ( (!empty($pageVarArray['variables']['default']['pageTitleRow2'])) ? "<div class='ct-page-title-bottom'>{$pageVarArray['variables']['default']['pageTitleRow2']}</div>" : "" ) . "
</div>
";
}
//CONDITION: Falls der Eyecatcher der Seite angezeigt werden soll
if ( ($pageVarArray['variables']['default']['pageEyeCatcherDisplay']) && (!empty($pageVarArray['variables']['default']['pageEyeCatcher'])) ) {
echo "
<div class='ct-paragraph'" . ( ($pageVarArray['variables']['default']['pageEyeCatcherStyled']) ? "" : " style='border: none; border-radius: none; background: none;'" ). ">
<div class='ct-paragraph-eyecatcher'" . ( ($pageVarArray['variables']['default']['pageEyeCatcherStyled']) ? "" : " style='background: none;'" ). ">{$pageVarArray['variables']['default']['pageEyeCatcher']}</div>
</div>
";
}
//LOOP: Finde alle Content-Bereiche
foreach($pageVarArray['paragraphs'] as $keyCurrentParagraph=>$currentParagraph) {
unset($currentInlineSection);
if ($currentParagraph['paragraphDisplay']) {
echo "
<div class='ct-paragraph'" . ( ($currentParagraph['paragraphStyled']) ? "" : " style='border: none; border-radius: 0; background: none;'" ). ">";
echo ( (($currentParagraph['paragraphTitleDisplay']) && (!empty($currentParagraph['paragraphTitle']))) ? "<div class='ct-paragraph-title'>" . trim($currentParagraph['paragraphTitle']) . "</div>" : "" );
foreach($currentParagraph['paragraphSections'] as $keyCurrentSection=>$currentParagraphSection) {
//CONDITION: Handelt es sich beim aktuellen Abschnitt um einen Abschnitt mit einem "Nachbarn"?
if ((isset($currentInlineSection['left'])) || ($currentParagraphSection['sectionAlignment'][0] == 'inline') || ($currentParagraphSection['sectionAlignment'][0] == 'column')) {
if (isset($currentInlineSection['left'])) {
if (($currentParagraphSection['sectionAlignment'][0] != 'inline') && ($currentParagraphSection['sectionAlignment'][0] != 'column')) {
echo '<html>
<div style="width: 100%; height: 100px; padding-top:25px; text-align: center; border: 2px solid black; font-weight: bold; font-size: 2vw;">
FEHLER: Es wurde nur einer von zwei Inline- oder Spalten-Bereichen angegeben
</div>
</html>';
exit();
}
$currentInlineSection['right'] = $currentParagraphSection;
$currentInlineSection['right']['sectionAlignment'][0] = 'inline-right';
//CONDITION: Falls zwei Nachbar-Bereiche korrekt angegeben wurden, stelle diese dar; Sollte einer von beiden als Spalte angegeben sein, deaktiviere den Fließtext
if (($currentInlineSection['left']['sectionAlignment'][0] == 'column') || ($currentInlineSection['right']['sectionAlignment'][0] == 'column')) {
$inlineSuffix = '-column';
} else {
$inlineSuffix = '';
}
echo "
<div class='ct-paragraph-section-flow'>
<div class='ct-paragraph-section-flow-outer{$inlineSuffix}'><div class='ct-paragraph-section-flow-inner{$inlineSuffix}'>" . ( ($currentInlineSection['right']['sectionType'][0] == 'image') ? func_showImage($dokuwikiMediaUrl, $currentInlineSection['right']['sectionContent'], $currentInlineSection['right']['sectionAlignment'][0], $keyCurrentParagraph, $keyCurrentSection) : trim($currentInlineSection['right']['sectionContent']) ) . "</div>" . ( ($currentInlineSection['left']['sectionType'][0] == 'image') ? func_showImage($dokuwikiMediaUrl, $currentInlineSection['left']['sectionContent'], $currentInlineSection['left']['sectionAlignment'][0], $keyCurrentParagraph, $keyCurrentSection) : trim($currentInlineSection['left']['sectionContent']) ) . "</div>
</div>
";
} else {
$currentInlineSection['left'] = $currentParagraphSection;
$currentInlineSection['left']['sectionAlignment'][0] = 'inline-left';
continue;
}
unset($currentInlineSection);
//CONDITION: Handelt es sich beim angegebenen Abschnitt um eine Gallerie
} elseif ($currentParagraphSection['sectionType'][0] == 'gallery') {
$currentGalleryImageArray = func_buildGalleryRepo($currentParagraphSection);
$imageRibbonString = func_buildGalleryRibbon($dokuwikiMediaUrl, $keyCurrentParagraph, $keyCurrentSection, $currentGalleryImageArray);
echo func_showImage($dokuwikiMediaUrl, $currentGalleryImageArray[0], $currentParagraphSection['sectionType'][0], $keyCurrentParagraph, $keyCurrentSection) . '
<script language="javascript">
rotateimages(\'previewImage-' . $keyCurrentParagraph . '-' . $keyCurrentSection . '\', jsGalleryImageArray_' . $keyCurrentParagraph . '_' . $keyCurrentSection . ', 0);
</script>
<div class="ct-image-gallery-ribbon">
<div class="ct-image-gallery-ribbon-content">' . $imageRibbonString . '</div>
</div>
';
} else {
echo ( (($currentParagraphSection['sectionTitleDisplay']) && (!empty($currentParagraphSection['sectionTitle']))) ? "<div class='ct-paragraph-section-title'>" . trim($currentParagraphSection['sectionTitle']) . "</div>" : "" );
echo "
<div class='ct-paragraph-section-content'" . ( ($currentParagraph['paragraphStyled']) ? "" : " style='background: none;'" ). ">" . ( ($currentParagraphSection['sectionType'][0] == 'image') ? func_showImage($dokuwikiMediaUrl, $currentParagraphSection['sectionContent'], $currentParagraphSection['sectionAlignment'][0], $keyCurrentParagraph, $keyCurrentSection) : trim($currentParagraphSection['sectionContent']) ) . "</div>
";
}
}
echo "
</div>
";
}
}
//###### CLOSE: parent-container-linke-spalte: umspannender Inhalts-Container
echo " </div>";
// CONDITION: Falls eine Seitenleiste eingeblendet werden soll, füge diese Hinzu
if ((isset($pageVarArray['variables']['default']['sidebarRight'])) && (file_exists(phpConvertPageToFilesystemPath($pageVarArray['variables']['default']['sidebarRight'])))) {
//###### BEGIN: parent-container-rechte-spalte: umspannender Inhalts-Container
echo "<div class='ct-parent-column-right'>";
include($sidebarRight);
//###### CLOSE: parent-container-rechte-spalte
echo " </div>";
};
//###### CLOSE: parent-container: umspannender Inhalts-Container
echo "</div>";
//###### JavaScript - tatsächliche Größe der ParentBox bestimmen und festlegen
//##################################################################################
echo '
<script language="javascript">
var biggestHeight = 0;
// Loop through elements children to find & set the biggest height
$(".parentbox*").each(function(){
// If this elements height is bigger than the biggestHeight
if ($(this).height() > biggestHeight ) {
// Set the biggestHeight to this Height
biggestHeight = $(this).height();
}
});
// Set the container height
$(".parentbox").height(biggestHeight);
</script>
';
//###### HTML-Tag schließen
//##################################################################################
echo '</html>';
?>