<?php
/**
 * This file is part of
 * pragmaMx - Web Content Management System.
 * Copyright by pragmaMx Developer Team - http://www.pragmamx.org
 *
 * pragmaMx is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * $Revision: 1.8.2.4 $
 * $Author: tora60 $
 * $Date: 2008/12/26 17:49:48 $
 */

defined('mxMainFileLoaded') or die('access denied');

/**
 * Definition der jeweiligen Platzhalter und deren Ersetzungen
 */
function theme_define_placeholders()
{
    global $themesetting;
    $title = theme_colorize_all($themesetting['headtitle']['title'], true);
    $part[] = array("{PAGE_TITLE}", $title);
    $part[] = array("{PAGE_SLOGAN}", $themesetting['headtitle']['slogan']);
    $part[] = array("{NAVBAR}", theme_get_navbars());
    $part[] = array("{LAYOUT_CLASS}", theme_get_layout_class());
    $part[] = array("{HEAD_IMAGE}", theme_get_headimage());
    $part[] = array("{FOOTMESSAGE}", theme_show_footmsg());
    $part[] = array("{DEBUGSERVICE}", theme_get_servicetext('debugservice'));
    $part[] = array("{SITESERVICE}", theme_get_servicetext('siteservice'));
    $part[] = array("{CURRENTYEAR}", date('Y'));

    $part[] = array("{BANNER1}",   mx_themebanner(1)         ); #HeaderBanner
    $part[] = array("{BANNER2}",   mx_themebanner(2)         ); #FooterBanner

    return $part;
}

/**
 * Definition der einzelnen Blockbereiche
 */
function theme_define_blocks()
{
    global $themesetting;
    static $var;
    if (isset($var)) return $var;
    // linke Bloecke
    $name = 'block_left';
    $var[$name]['container'] = 'blocks_left_loop';
    $var[$name]['function'] = 'themesidebox';
    $var[$name]['position'] = 'l';
    // provisorische Moeglichkeit, die linken Bloecke bei bestimmten Modulen zu entfernen
    if (isset($themesetting['noleft_modules']) && in_array(MX_MODULE, $themesetting['noleft_modules']) && MX_MODULE != 'admin') {
        unset($var[$name]);
    }
    // obere Center-Bloecke
    $name = 'block_center_top';
    $var[$name]['container'] = 'blocks_center_top_loop';
    $var[$name]['function'] = 'thememiddlebox';
    $var[$name]['position'] = 'c';
    // untere Center-Bloecke
    $name = 'block_center_down';
    $var[$name]['container'] = 'blocks_center_down_loop';
    $var[$name]['function'] = 'thememiddlebox';
    $var[$name]['position'] = 'd';
    // rechte Bloecke
    $name = 'block_right';
    $var[$name]['container'] = 'blocks_right_loop';
    $var[$name]['function'] = 'themesidebox';
    $var[$name]['position'] = 'r';
    return $var;
}



/**
 * Banner anzeigen
 */
function mx_themebanner($pos)
{
    if ($GLOBALS['banners']) {
        if (!function_exists('viewbanner')) {
            @include_once('includes/mx_bannerfunctions.php');
        }
        if (function_exists('viewbanner')) {
            $pos = intval($pos);
            if (empty($pos)) $pos = 1;
            return viewbanner($pos);
        }
    }
    return '&nbsp;';
}




/**
 * Definition des Contentbereiches inkl. der open/close-Table Funktionen
 */
function theme_define_content()
{
    static $var;
    if (isset($var)) return $var;
    // die Funktion OpenTable()
    $var['opentabs']['OpenTable']['templatevar'] = 'opentable';
    $var['opentabs']['OpenTable']['innerreplace'] = '{OPENCLOSE_TABLE}'; // hier kann irgendwas stehen, es muss aber mit dem entsprechenden Text innerhalb der template-Datei uebereinstimmen...
    // die Funktion OpenTable2()
    $var['opentabs']['OpenTable2']['templatevar'] = 'opentable2';
    $var['opentabs']['OpenTable2']['innerreplace'] = '{OPENCLOSE_TABLE_2}';
    // die Funktion OpenTableAl()
    $var['opentabs']['OpenTableAl']['templatevar'] = 'opentableal';
    $var['opentabs']['OpenTableAl']['innerreplace'] = '{OPENCLOSE_TABLE_AL}';
    // die Funktion themeindex() / News Modul
    $var['themeindex'] = 'themeindex';
    // die Funktion themearticle() / News Modul
    $var['themearticle'] = 'themearticle';
    // der Name (output_container) darf nicht veraendert werden !!
    $var['output_container'] = 'script_output';
    // der Name (index_on_container) darf nicht veraendert werden !!
    $var['index_on_container'] = 'blocks_right_container';
    $var['index_on_block_container'] = 'blocks_right_loop';
    // der Name (more_header) darf nicht veraendert werden !!
    $var['add_header'] = 'more_header';

    return $var;
}

/**
 * ersetzen von eigenen Theme-Elementen, kann veraendert und ergaenzt werden
 * diese Teile werden gleich zu Beginn des scriptes, beim einlesen des templates, ersetzt
 * Vorsicht, wenn das Theme gecached werden soll!!!
 * Dann duerfen hier keine dynamischen Elemente eingesetzt werden.
 */
function theme_replace_start($template)
{
    /**
     * bestimmte Texte, vor allem Image-Pfade, die ersetzt werden sollen, definieren (suche/ersetze)
     */
    $part[] = array('"style/', '"' . MX_THEME_DIR . '/style/'); // die Stylesheets
    $part[] = array('"images/', '"' . MX_THEME_DIR . '/images/'); // normale images im theme
    $part[] = array('url(images/', 'url(' . MX_THEME_DIR . '/images/');
    // $part[] = array('"js/', '"' . MX_THEME_DIR . '/js/');
    // Suchformular entfernen, wenn Suche abgeschaltet ist
    if (!mxModuleAllowed('Search')) {
        theme_extract_part($template, 'searchform', '<br />');
    }
    // Siteservicebereich entfernen, wenn Siteservice abgeschaltet oder leer ist
    if (!theme_get_servicetext('siteservice')) {
        theme_extract_optional_part($template, 'siteservice', '');
    }
    // Debugbereich entfernen, wenn Debugmodus abgeschaltet oder leer ist
    if (!theme_get_servicetext('debugservice')) {
        theme_extract_optional_part($template, 'debugservice', '');
    }
    // das Kopfmenue durch die tatsaechlichen Daten ersetzen
    theme_extract_optional_part($template, 'headmenue', '{NAVBAR}');
    return theme_replace_parts($template, $part);
}

/**
 * ersetzen von eigenen Theme-Elementen, kann veraendert und ergaenzt werden
 * diese Teile werden vor der Ausgabe des headers im Headbereich ersetzt
 */
function theme_replace_header($newheader)
{
    return $newheader;
    // alles ersetzen und Rückgabe...
    // return theme_replace_parts($newheader, $part);
}

function theme_get_layout_class()
{
    global $themesetting;

    /* Die verschiedenen Layouts der Spalten definieren */
    if (isset($themesetting['noleft_modules']) && in_array(MX_MODULE, $themesetting['noleft_modules'])) {
        // provisorische Moeglichkeit, die linken Bloecke bei bestimmten Modulen zu entfernen
        // einspaltiges Layout
        return 'hide-both';
    } else if (!$GLOBALS['index']) {
        // zweispaltiges Layout
        return 'hide-rightbar';
    } else {
        // dreispaltiges Layout > Standard
        return 'hide-none';
    }
}

/**
 * ersetzen in jedem einzelnen Block
 */
function theme_replace_blocks($template, $block)
{
    global $themesetting;
    // $themesetting['blocknav']['style'] = 'sidemenu';
    // $themesetting['blocknav']['current'] = 'current';
    switch ($block['position']) {
        case 'l':
        case 'r':
            if (strpos($block['blockfile'], 'block-Modules') === 0) {
                if (preg_match('#<table[^>]+>(.+)</table>#sU', $template, $table)) {
                    if  (preg_match_all('#<tr(?:[^>]*)>\s*<td[^>]*>[^<]*<img[^>]*/([a-z])arrow\.gif[^>]*>[^<]*(<a[^>]*>.+</a>)[^<]*</td></tr>#', $table[1], $rows)) {
                        $new = array();
                        foreach ($rows[2] as $key => $link) {
                            $class = ($rows[1][$key] == 'o') ? ' class="' . $themesetting['blocknav']['current'] . '"' : '';
                            $new[$key] = '<li' . $class . '>' . $link . '</li>';
                        }
                        if ($new) {
                            $part[] = array($table[0], '<ul class="' . $themesetting['blocknav']['style'] . '">' . implode("\n", $new) . '</ul>');
                        }
                    }
                }
            }
            break;
        case 'c':
        case 'd':
            break;
    }

    /* Teil fuer alle Bloecke */
    if (empty($block['title']) || $block['title'] == 'NOTITLE') {
        $part[] = array('__BLOCK_ID__' , '__BLOCK_ID__ block-hide-caption');
    }
    $part[] = array('__BLOCK_ID__' , 'block-' . $block['position'] . '-' . $block['order']);

    /* alle Bilder aus dem Onlineblock holen */
    $part['preg'][] = array('#<img\s+([^>]+)images/maaxon/([^>]+)\.gif([^>]+)\s*/*>#i', '');
    /* die komischen nuke-listen verschoenern */
    theme_change_middot($part);

    if (isset($part)) {
        return theme_replace_parts($template, $part);
    }
    return $template;
}

/**
 * ersetzen von eigenen Theme-Elementen, kann veraendert und ergaenzt werden
 * diese Teile werden am Ende des scriptes, in der Funktion themefooter() ersetzt
 */
function theme_replace_end($template)
{
    global $themesetting;

    /* provisorische Moeglichkeit, die linken Bloecke bei bestimmten Modulen zu entfernen */
    if (isset($themesetting['noleft_modules']) && in_array(MX_MODULE, $themesetting['noleft_modules'])) {
        theme_extract_part($template, 'blocks_left_container');
    }

    /* die haesslichen Rahmen um Checkboxen und Radio-Feldern entfernen, ueber style-sheet Klasse */
    $template = theme_fix_formtags($template);

    /* leere Tabellen Tags entfernen, wenn kein Inhalt von Modul angezeigt wird (blank_home) */
    $part['preg'][] = array('#<table[^>]*>\s*<tbody>\s*<tr>\s*<td>\s*</td>\s*</tr>\s*</tbody>\s*</table>\s*<br\s*/?>#si', '');

    if (MX_MODULE == 'admin') {
        /* in Graficadmin, mehr Icons nebeneinander ;) */
        $part[] = array('<div style="float:left; width:16%; height:6.5em; text-align: center;">', '<div style="float:left; width:11%; height:6.5em; text-align: center;">');

        /* Floatfehler korrigieren */
        $part['preg'][] = array('#(<br /> ' . _ADMINLOGOUT . '</a></div>)\s*</div>#sU', '$1<div style="clear:both;"></div></div>');
    }

    $template = theme_replace_parts($template, $part);
    return $template;
}

/**
 * Die Navigationsbuttons in der Artikelliste des Newsmoduls
 */
function getThemeIndexButtons($story)
{
    global $theme_template;
    static $img, $isnewsadmin;
    if (!isset($isnewsadmin)) {
        $isnewsadmin = mxGetAdminPref('radminarticle');
    }
    if (empty($img)) {
        // die images werden in einen statischen Variable gehalten um die Bildgroessen nicht bei jedem Artikel zu ermitteln
        // xx als alttext wird weiter unten dynamisch ersetzt
        $img[1] = mxCreateImage(MX_THEME_DIR . "/images/buttons/informant.gif", "xx", 0);
        $img[2] = mxCreateImage(MX_THEME_DIR . "/images/buttons/print.gif", _BMXPRINTER, 0);
        $img[3] = mxCreateImage(MX_THEME_DIR . "/images/buttons/friend.gif", _BMXFRIEND, 0);
        $img[4] = mxCreateImage(MX_THEME_DIR . "/images/buttons/counter.gif", "xx", 0);
        $img[6] = mxCreateImage(MX_THEME_DIR . "/images/buttons/bytesmore.gif", "xx", 0);
        if ($GLOBALS['articlecomm']) $img[5] = mxCreateImage(MX_THEME_DIR . "/images/buttons/comments.gif", "xx", 0);
        // mxdebugfuncvars($story['allmorelink']); // zum ansehen der morelink-Parameter einkommentieren
        // mxdebugfuncvars($story);                // zum ansehen der story-Parameter der ersten story einkommentieren
    }
    // mxdebugfuncvars($story);                  // zum ansehen der story-Parameter aller stories einkommentieren
    $bmore = ($story['allmorelink']['bodycount']) ? _READMORE . " (" . $story['allmorelink']['bodycount'] . ' ' . _BYTESMORE . ")" : _READMORE;
    $adminlink = ($isnewsadmin) ? " href='admin.php?op=EditStory&amp;sid=" . $story['sid'] . "' " : "";
    $link[] = $story['allmorelink']['storylink'] . str_replace("xx", $bmore, $img[6]) . "</a>";
    if ($story['informant'] != $GLOBALS['anonymous'] && (MX_IS_USER || MX_IS_ADMIN)) {
        $link[] = $story['allmorelink']['informantlink'] . str_replace("xx", _USERINFO . ": " . $story['informant'], $img[1]) . "</a>";
    }
    $link[] = $story['allmorelink']['printerlink'] . $img[2] . "</a>";
    if (mxModuleAllowed('Recommend_Us')) {
        $link[] = $story['allmorelink']['friendlink'] . $img[3] . "</a>";
    }
    if (empty($story['acomm']) && $GLOBALS['articlecomm']) { // Achtung!!! acomm: 0 = Ja , 1 = Nein
        $link[] = $story['allmorelink']['commentslink'] . str_replace("xx", _COMMENTS . " (" . $story['comments'] . ")", $img[5]) . "</a>";
    }
    $link[] = "<a title='" . $story['allmorelink']['counter'] . ", " . $story['allmorelink']['score'] . "' " . $adminlink . ">" . str_replace("xx", $story['counter'] . ' ' . _READS, $img[4]) . "</a>";
    return $link;
}

/* die Navigationsbuttons im header, Quelle in settings.php */
function theme_get_navbars()
{
    global $themesetting;

    $data = theme_head_data();
    return $data['navbar'];
}

function theme_head_data()
{
    global $themesetting;
    static $out;
    if (isset($out)) {
        return $out;
    }
    foreach ($themesetting['headnav'] as $title => $menue) {
        if (empty($current) && in_array(1, $menue['case'])) {
            $current = ' id="navcurrent"';
            $out['current'] = $menue;
        } else {
            $current = '';
        }
        $slogan = (empty($menue['slogan'])) ? '' : ' title="' . $menue['slogan'] . '"';
        $navbar[] = '<li' . $current . '><a href="' . $menue['link'] . '"' . $slogan . '><span>' . $title . '</span></a></li>';
    }
    $out['navbar'] = implode("\n", $navbar);
    return $out;
}

function theme_get_slogan()
{
    global $themesetting;
    $data = theme_head_data();
    if (isset($data['current']['slogan'])) {
        return $data['current']['slogan'];
    } else {
        /* wenn nix gefunden, dann Standard zurueck.. */
        return $themesetting['defaultslogan'];
    }
}

function theme_get_headimage()
{
    global $themesetting;
    $data = theme_head_data();
    if (isset($data['current']['logo'])) {
        return MX_THEME_DIR . '/images/logos/' . $data['current']['logo'];
    } else {
        /* wenn nix gefunden, dann Standard zurueck.. */
        return MX_THEME_DIR . '/images/logos/' . $themesetting['defaultheaderimage'];
    }
}

/* einen beliebigen Text bunt einfaerben */
function theme_colorize_title($title)
{
    $check = explode(' ', str_replace('  ', ' ', $title));
    if (isset($check[4])) {
        $check[2] = '<span class="color-change-2">' . $check[2] . '</span>';
        $max_i = count($check);
        for ($i = 4; $i < $max_i; $i++) {
            $check[$i] = '<span class="color-change-3">' . $check[$i] . '</span>';
        }
    } else if (isset($check[2])) {
        $check[2] = '<span class="color-change-2">' . $check[2] . '</span>';
    } else if (isset($check[1])) {
        $check[1] = '<span class="color-change-2">' . $check[1] . '</span>';
    }
    return implode(' ', $check);
}

/* einen beliebigen Text bunt einfaerben */
function theme_colorize_all($title, $trim = false)
{
    $check = explode(' ', str_replace('  ', ' ', $title));
    $max_i = count($check);
    $y = 0;
    $class = array(' class="color-change-1"',
        ' class="color-change-2"',
        ' class="color-change-3"',
        );
    $max_y = count($class);

    for ($i = 0; $i < $max_i; $i++) {
        $check[$i] = '<span' . $class[$y] . '>' . $check[$i] . '</span>';
        $y++;
        if ($y == $max_y) {
            $y = 0;
        }
    }
    if ($trim) {
        return implode('', $check);
    } else {
        return implode(' ', $check);
    }
}

/**
 * in $newheader ist der gesamte angepasste header enthalten
 */
function theme_header($newheader, &$siteservice, &$debugservice)
{
    global $theme_template, $themesetting;
    /* das Theme verwendet eigene Servicebereiche, deswegen hier die beiden Variablen killen */
    $siteservice = null;
    $debugservice = null;
    /* den body-Tag hinter head-Ende setzen >> nicht veraendern !! */
    $newheader .= "\n</head>\n\n" . $theme_template['body_tag'] . "\n\n";
    /* bei Bedarf den XHTML-Dokumenttyp ueberpruefen und Fehlermeldung ausgeben */
    if (MX_IS_ADMIN && !theme_check_xhtmldoctype()) {
        $newheader .= '<div class="warning"><h2 class="align-center">' . _FALSEDOCTYPE . '</h2></div>';
    }
    // ersetzen von eigenen Theme-Elementen, kann veraendert und ergaenzt werden
    // diese Teile werden vor der Ausgabe des headers im Headbereich ersetzt
    $newheader = theme_replace_header($newheader);

    return $newheader;
}

/**
 * parsen der Seiten-Bloecke
 */
function themesidebox($title, $content, $block = array(), $noecho = 0)
{
    global $theme_template;
    if (empty($block)) {
        $block['position'] = "l";
    }
    $out = ($block['position'] == "r") ? $theme_template['block_right'] : $theme_template['block_left'];
    $out = str_replace('{BLOCK_CONTENT}' , $content , $out);
    $out = str_replace('{BLOCK_TITLE}' , $title , $out);
    if ($noecho) {
        return $out;
    } else {
        echo $out;
    }
}

/**
 * parsen der Center-Bloecke
 */
function thememiddlebox($title, $content, $block = array(), $noecho = 0)
{
    global $theme_template;
    if (empty($block)) {
        $block['position'] = "c";
    }
    $out = ($block['position'] == "d") ? $theme_template['block_center_down'] : $theme_template['block_center_top'];
    $out = str_replace('{BLOCK_CONTENT}' , $content , $out);
    $out = str_replace('{BLOCK_TITLE}' , theme_colorize_title($title) , $out);
    if ($noecho) {
        return $out;
    } else {
        echo $out;
    }
}

/**
 * News Modul Artikelliste (index.php)
 * $x bedeutet: nicht verwendet, nur zur nuke-Modulkompatibilitaet
 */
function themeindex($x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $story = array())
{
    global $theme_template;
    pmxHeader::add('<link rel="stylesheet" media="all" type="text/css" href="themes/' . basename(dirname(__FILE__)) . '/style/news.css" />');
    // nur eine Spalte zulassen :-)
    $GLOBALS['storyhome_cols'] = 1;
    $cattitle = (empty($story['cattitle'])) ? '' : ' <span style="font-weight: normal; font-size: 80%;" class="color-change-2">(' . $story['allmorelink']['categorie'] . ')</span>';
    $authorinfo = (empty($story['informant']) || $story['informant'] == $GLOBALS['anonymous']) ? theme_adminname($story) : " " . $story['allmorelink']['informantlink'] . $story['informant'] . "</a>";
    $story['topicimage'] = mxCreateImage($GLOBALS['tipath'] . $story['topicimage'], $story['topictext'], 0, 'align="left" class="post-topicimage"');
    $story['title'] = theme_colorize_title(strip_tags($story['title'])) . $cattitle;
    $story['content'] = $story['hometext'];
    if (!$story['acomm'] && $GLOBALS['articlecomm']) { // Achtung!!! acomm: 0 = Ja , 1 = Nein
        $story['comments'] = '<a href="modules.php?name=News&amp;file=article&amp;sid=' . $story['sid'] . '#comments" class="comments">' . _COMMENTS . ' (' . $story['comments'] . ')</a>';
    } else {
        $story['comments'] = '';
    }
    if (empty($story['allmorelink']['bodycount'])) {
        $story['readmore'] = '';
    } else {
        $title = ($story['allmorelink']['bodycount']) ? ' title="' . $story['allmorelink']['bodycount'] . ' ' . _BYTESMORE . '"' : '';
        $story['readmore'] = '<a href="modules.php?name=News&amp;file=article&amp;sid=' . $story['sid'] . '" class="readmore"' . $title . '>' . _HREADMORE . '</a>';
    }
    // $story['datetime'] = '<span class="date">' . formatTimestamp($story['time'], _SHORTDATESTRING) . '</span>';
    $story['datetime'] = '<span class="date">' . formatTimestamp($story['time'], _DATESTRING2) . '</span>';
    // die oben definierten Variablen in dem passenden templateteil ersetzen
    $artvars = theme_define_content();
    echo theme_replace_vars($theme_template[$artvars['themeindex']], $story);
    return;
}

/**
 * News Modul Artikelansicht (article.php)
 * $x bedeutet: nicht verwendet, nur zur nuke-Modulkompatibilitaet
 */
function themearticle($x, $x, $x, $x, $x, $x, $x, $x, $x, $story = array())
{
    global $theme_template;
    pmxHeader::add('<link rel="stylesheet" media="all" type="text/css" href="themes/' . basename(dirname(__FILE__)) . '/style/news.css" />');
    $authorinfo = (empty($story['informant']) || $story['informant'] == $GLOBALS['anonymous']) ? theme_adminname($story) : " " . $story['allmorelink']['informantlink'] . $story['informant'] . "</a>";
    $story['infoline'] = ($GLOBALS['storyhome_cols'] == 1) ? _NEWSSUBMITED . " " . $authorinfo . " " . $story['allmorelink']['datetime'] : $story['datetime'];
    $story['topicimage'] = mxCreateImage($GLOBALS['tipath'] . $story['topicimage'], $story['topictext'], 0, 'align="left" class="post-topicimage"');
    $story['title'] = theme_colorize_title(strip_tags($story['title']));
    $story['content'] = $story['hometext'] . "<br />\n" . $story['bodytext'];
    $story['notes'] = (empty($story['notes'])) ? '' : '<br />' . $story['notes'];
    // die oben definierten Variablen in dem passenden templateteil ersetzen
    echo theme_replace_vars($theme_template['themearticle'], $story);
    return;
}

?>