<?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>';
?>