<?php

//  Author: Trabis
//  URL: http://www.xuups.com
//  E-Mail: lusopoemas@gmail.com
//  Plugin version: 1.1
//  Release date: 06-04-2009
//  Usage : just place <{block id=1}> inside any template or theme, replace '1' with the id of the block you want to show
//
//  Other options:
//  display = 'title' -> shows just title
//  display = 'none' -> renders the block but does not display it
//  options = 'enter|block|options' -> overwrites block default options
//  groups = 'enter|allowed|groups' -> overwrites block default group view permissions
//  cache = 3600 -> overwrite cache time(in seconds)
//
//  Examples:
//  <{block id=1 display="title"}>   displays just the block title
//  <{block id=1}>                   displays just the block content
//  <{block id=7 display="none"}>    does not display nothing but executes the block, this can go for online block or to trigger some cron block
//  <{block id=600 groups="0|1" cache=20}>  display block just for this 2 groups and sets a cache of 20 seconds
//  <{block id=600 options="100|100|s_poweredby.gif|0"}> displays block with diferent options

/**
 * @param $params
 * @param $smarty
 *
 * @return mixed
 */
function smarty_function_block($params, &$smarty)
{
    if (!isset($params['id'])) {
        return null;
    }

    $display_title = (isset($params['display']) && $params['display'] === 'title');
    $display_none  = (isset($params['display']) && $params['display'] === 'none');
    $options       = isset($params['options']) ? $params['options'] : false;
    $groups        = isset($params['groups']) ? explode('|', $params['groups']) : false;
    $cache         = isset($params['cache']) ? (int)$params['cache'] : false;

    $block_id = (int)$params['id'];

    static $block_objs;
    if (!isset($block_objs[$block_id])) {
        include_once XOOPS_ROOT_PATH . '/class/xoopsblock.php';

        $blockObj = new XoopsBlock($block_id);

        if (!is_object($blockObj)) {
            return null;
        }

        $block_objs[$block_id] = $blockObj;
    } else {
        $blockObj = $block_objs[$block_id];
    }

    $user_groups = $GLOBALS['xoopsUser'] ? $GLOBALS['xoopsUser']->getGroups() : array(XOOPS_GROUP_ANONYMOUS);

    static $allowed_blocks;
    if (count($allowed_blocks) == 0) {
        $allowed_blocks = XoopsBlock::getAllBlocksByGroup($user_groups, false);
    }

    if ($groups) {
        if (!array_intersect($user_groups, $groups)) {
            return null;
        }
    } else {
        if (!in_array($block_id, $allowed_blocks)) {
            return null;
        }
    }

    if ($options) {
        $blockObj->setVar('options', $options);
    }

    if ($cache) {
        $blockObj->setVar('bcachetime', $cache);
    }

    if ($display_title) {
        return $blockObj->getVar('title');
    }

    $xoopsLogger = XoopsLogger::getInstance();
    $template    =& $GLOBALS['xoopsTpl'];

    $bcachetime = (int)$blockObj->getVar('bcachetime');
    if (empty($bcachetime)) {
        $template->caching = 0;
    } else {
        $template->caching        = 2;
        $template->cache_lifetime = $bcachetime;
    }

    $template->setCompileId($blockObj->getVar('dirname', 'n'));
    $tplName = ($tplName = $blockObj->getVar('template')) ? "db:{$tplName}" : 'db:system_block_dummy.tpl';
    $cacheid = 'blk_' . $block_id;

    if (!$bcachetime || !$template->is_cached($tplName, $cacheid)) {
        $xoopsLogger->addBlock($blockObj->getVar('name'));
        if (!($bresult = $blockObj->buildBlock())) {
            return null;
        }
        if (!$display_none) {
            $template->assign('block', $bresult);
            $template->display($tplName, $cacheid);
        }
    } else {
        $xoopsLogger->addBlock($blockObj->getVar('name'), true, $bcachetime);
        if (!$display_none) {
            $template->display($tplName, $cacheid);
        }
    }
    $template->setCompileId($blockObj->getVar('dirname', 'n'));

    return null;
}
