/**
 * loadTemplate()
 *
 * @param  booean $bIsPHP
 * @return mixed          BlockenTemplate | void
 */
function loadTemplate($bIsPHP = true)
{
    global $aryPear;
    global $aryParam;
    global $sLoadFilename;
    global $bIsAuth;
    global $iCacheExpire;
    global $sContentType;
    if (!isset($bIsAuth)) {
        $bIsAuth = false;
    }
    if (!isset($iCacheExpire)) {
        $iCacheExpire = 0;
    } else {
        if (0 > $iCacheExpire) {
            $iCacheExpire = BLOCKEN_CACHE_EXPIRE;
        }
    }
    if (!isset($sContentType)) {
        $sContentType = 'html';
    }
    if ('' != $sLoadFilename) {
        $bIsPHP = false;
    }
    $objBlocken =& new BlockenController();
    if (!$bIsPHP) {
        if ('' == $sLoadFilename) {
            $sLoadFilename = $_SERVER['SCRIPT_FILENAME'];
            if (BLOCKEN_MOBILE_USE) {
                if ($aryPear['mobile']->isDoCoMo()) {
                    $sLoadFilename = BLOCKEN_MOBI_D_TEMPLATE . '/' . basename($_SERVER['SCRIPT_FILENAME']);
                } else {
                    if ($aryPear['mobile']->isEZweb()) {
                        $sLoadFilename = BLOCKEN_MOBI_E_TEMPLATE . '/' . basename($_SERVER['SCRIPT_FILENAME']);
                    } else {
                        if ($aryPear['mobile']->isSoftBank()) {
                            $sLoadFilename = BLOCKEN_MOBI_S_TEMPLATE . '/' . basename($_SERVER['SCRIPT_FILENAME']);
                        } else {
                            $sLoadFilename = BLOCKEN_MOBI_P_TEMPLATE . '/' . basename($_SERVER['SCRIPT_FILENAME']);
                        }
                    }
                }
                if (!is_readable($sLoadFilename)) {
                    $sLoadFilename = $_SERVER['SCRIPT_FILENAME'];
                }
            }
            $sBuff = file_get_contents($sLoadFilename);
            if (BLOCKEN_MOBILE_USE) {
                $objBlocken->setIsHankaku(true);
                $objBlocken->parseMobile($sBuff);
                $bIsAuth = $objBlocken->getIsAuth();
            }
        } else {
            $sBuff = file_get_contents($sLoadFilename);
            if (BLOCKEN_MOBILE_USE && BLOCKEN_MOBI_P_REDIRECT != $sLoadFilename) {
                $objBlocken->setIsHankaku(true);
            }
        }
    }
    if (BLOCKEN_MOBILE_USE && $bIsAuth) {
        if (!isset($aryParam['uid'])) {
            if (!$aryPear['mobile']->isNonMobile()) {
                if ($aryPear['mobile']->isDoCoMo()) {
                    if (BLOCKEN_MOBI_OFFCIAL) {
                        $sLoadFilename = BLOCKEN_MOBI_D_UIDERR;
                    } else {
                        if ('GUID' == BLOCKEN_MOBI_D_AUTHUID) {
                            $sLoadFilename = BLOCKEN_MOBI_D_GUIDERR;
                        } else {
                            $sLoadFilename = BLOCKEN_MOBI_D_UTN;
                            $aryParamTmp = $aryParam;
                            $aryParamTmp['_utn'] = '1';
                            unset($aryParamTmp[$aryPear['session']->name()]);
                            $sQuery = BlockenCommon::makeURL($aryParamTmp);
                            $sRtnUrl = $_SERVER['SCRIPT_NAME'] . ('' == $sQuery ? '' : '?' . $sQuery);
                            $objBlocken->setRepStr('/%RTN_PATH%/i', $sRtnUrl);
                        }
                    }
                } else {
                    if ($aryPear['mobile']->isEZweb()) {
                        $sLoadFilename = BLOCKEN_MOBI_E_SUBNOERR;
                    } else {
                        if ($aryPear['mobile']->isSoftBank()) {
                            $sLoadFilename = BLOCKEN_MOBI_S_UIDERR;
                        }
                    }
                }
                $sBuff = file_get_contents($sLoadFilename);
                $objBlocken->setIsHankaku(true);
                $bIsPHP = false;
            }
        } else {
            if (BLOCKEN_MOBI_OFFCIAL && 0 != BLOCKEN_MOBI_E_AUTHTIME && $aryPear['mobile']->isEZweb()) {
                BlockenCommon::authCheck($aryPear, $aryParam);
            }
            if (!funcIsMember($aryParam['uid'], $aryPear)) {
                $sLoadFilename = BLOCKEN_MOBI_REGIST;
                $sBuff = file_get_contents($sLoadFilename);
                $objBlocken->setIsHankaku(true);
                $bIsPHP = false;
                $sQuery = BlockenCommon::makeURL($aryParam);
                $sRtnUrl = urlencode(BLOCKEN_HTTP_URL . $_SERVER['SCRIPT_NAME'] . ('' == $sQuery ? '' : '?' . $sQuery));
                $objBlocken->setAddParam('_rtn', $sRtnUrl);
            }
        }
    }
    if (!$bIsPHP) {
        if (preg_match('/\\.(?:xhtml|xhtm)$/', $sLoadFilename)) {
            $sContentType = 'xhtml';
        } else {
            if (preg_match('/\\.xml$/', $sLoadFilename)) {
                $sContentType = 'xml';
            } else {
                if (preg_match('/\\.hdml$/', $sLoadFilename)) {
                    $sContentType = 'hdml';
                }
            }
        }
        $objBlocken->setHtml($sBuff);
        $objBlocken->setPear($aryPear);
        $objBlocken->setParam($aryParam);
        $objBlocken->parse();
        while ($objBlocken->hasNextBlock()) {
            $sType = $objBlocken->getBlockType();
            switch ($sType) {
                case 'dynamic':
                    $objBlocken->execScript();
                    break;
                case 'static':
                default:
                    $objBlocken->readHtml();
                    break;
            }
        }
    } else {
        $sTemplateFile = str_replace('.php', '.html', basename($_SERVER['SCRIPT_FILENAME']));
        $sTemplateDir = BLOCKEN_TEMPLATE_NAME;
        $sCacheDir = BLOCKEN_CACHE_NAME;
        if (BLOCKEN_MOBILE_USE) {
            if ($aryPear['mobile']->isDoCoMo()) {
                if (file_exists(BLOCKEN_MOBI_D_TEMPLATE . '/' . $sTemplateFile)) {
                    $sTemplateDir = BLOCKEN_MOBI_D_TEMPLATE;
                    $sCacheDir = BLOCKEN_MOBI_D_CACHE;
                }
            } else {
                if ($aryPear['mobile']->isEZweb()) {
                    if (file_exists(BLOCKEN_MOBI_E_TEMPLATE . '/' . $sTemplateFile)) {
                        $sTemplateDir = BLOCKEN_MOBI_E_TEMPLATE;
                        $sCacheDir = BLOCKEN_MOBI_E_CACHE;
                    }
                } else {
                    if ($aryPear['mobile']->isSoftBank()) {
                        if (file_exists(BLOCKEN_MOBI_S_TEMPLATE . '/' . $sTemplateFile)) {
                            $sTemplateDir = BLOCKEN_MOBI_S_TEMPLATE;
                            $sCacheDir = BLOCKEN_MOBI_S_CACHE;
                        }
                    } else {
                        if (file_exists(BLOCKEN_MOBI_P_TEMPLATE . '/' . $sTemplateFile)) {
                            $sTemplateDir = BLOCKEN_MOBI_P_TEMPLATE;
                            $sCacheDir = BLOCKEN_MOBI_P_CACHE;
                        }
                    }
                }
            }
        }
        $objBlocken =& new BlockenTemplate($sTemplateDir, $sCacheDir, unserialize(BLOCKEN_CACHE_PAGE));
        if (BLOCKEN_MOBILE_USE) {
            $objBlocken->setIsHankaku(true);
        }
        $objBlocken->setHtmlCacheExpire($iCacheExpire);
        $aryParamCache = $aryParam;
        unset($aryParamCache['uid']);
        unset($aryParamCache['sid']);
        unset($aryParamCache['emoji']);
        unset($aryParamCache['guid']);
        unset($aryParamCache['_utn']);
        unset($aryParamCache['_reg']);
        unset($aryParamCache[$aryPear['session']->name()]);
        $argArgCache['template'] = str_replace(array('/', '.php'), array('__', ''), $_SERVER['SCRIPT_NAME']);
        $argArgCache['template_dir'] = $sTemplateDir;
        $objBlocken->setCacheParam($aryParamCache, $argArgCache);
        $objBlocken->setParam($aryParam);
        $objBlocken->loadTemplateFile($sTemplateFile);
    }
    $objBlocken->setRepStr('/<\\?php.*\\?>/', '');
    $objBlocken->setRepStr('/%HTTP_URL%/i', BLOCKEN_HTTP_URL);
    $objBlocken->setRepStr('/%HTTPS_URL%/i', BLOCKEN_HTTPS_URL);
    $objBlocken->setRepStr('/%PHP_SELF%/i', $_SERVER['PHP_SELF']);
    $objBlocken->setRepStr('/%ROOT_PATH%/i', BLOCKEN_ROOT_PATH);
    $objBlocken->setRepStr('/%IMG_PATH%/i', BLOCKEN_IMG_PATH);
    $objBlocken->setRepStr('/%CSS_PATH%/i', BLOCKEN_CSS_PATH);
    $objBlocken->setRepStr('/%JS_PATH%/i', BLOCKEN_JS_PATH);
    if (BLOCKEN_MOBILE_USE && BLOCKEN_MOBI_P_REDIRECT != $sLoadFilename) {
        if (BLOCKEN_MOBI_AUTOHEADER) {
            $sHead = file_get_contents(BLOCKEN_MOBI_AUTOHEADER);
            $objBlocken->setRepStr('/<body(.*)>/i', "<body\\1>\n{$sHead}");
        }
        if (BLOCKEN_MOBI_AUTOFOOTER) {
            $sFoot = file_get_contents(BLOCKEN_MOBI_AUTOFOOTER);
            $objBlocken->setRepStr('/<\\/body>/i', "{$sFoot}\n</body>");
        }
        if (!$aryPear['mobile']->isNonMobile()) {
            if (BLOCKEN_MOBI_OFFCIAL) {
                if ($aryPear['mobile']->isDoCoMo()) {
                    $objBlocken->setAddParam('uid', BLOCKEN_MOBI_D_UID);
                    $objBlocken->setRepStr('/(.*):(.*)[\\?&]uid=' . BLOCKEN_MOBI_D_UID . '/i', '\\1:\\2');
                } else {
                    if ($aryPear['mobile']->isSoftBank()) {
                        $objBlocken->setAddParam('uid', BLOCKEN_MOBI_S_UID);
                        $objBlocken->setAddParam('sid', BLOCKEN_MOBI_S_SID);
                        $objBlocken->setRepStr('/(.*):(.*)[\\?&]uid=' . BLOCKEN_MOBI_S_UID . '&sid=' . BLOCKEN_MOBI_S_SID . '/i', '\\1:\\2');
                    }
                }
            } else {
                if ($aryPear['mobile']->isDoCoMo()) {
                    if ('GUID' == BLOCKEN_MOBI_D_AUTHUID) {
                        $objBlocken->setAddParam('guid', BLOCKEN_MOBI_D_GUID);
                        $objBlocken->setRepStr('/(.*):(.*)[\\?&]guid=' . BLOCKEN_MOBI_D_GUID . '/i', '\\1:\\2');
                    } else {
                        if (isset($aryParam['uid'])) {
                            $objBlocken->setAddParam($aryPear['session']->name(), $aryPear['session']->id());
                            $objBlocken->setRepStr('/(.*):(.*)[\\?&]' . $aryPear['session']->name() . '=' . $aryPear['session']->id() . '/i', '\\1:\\2');
                        }
                    }
                }
            }
            if (BLOCKEN_MOBI_E_BOOKMARK && $aryPear['mobile']->isEZweb()) {
                $objBlocken->setRepStr('/<head>/i', "<head>\n<meta name=\"vnd.up.bookmark\" wml:forua=\"true\" content=\"" . BLOCKEN_MOBI_E_BOOKMARK . "\" />");
            }
            if ($aryPear['mobile']->isSoftBank() && $aryPear['mobile']->isTypeC()) {
                $objBlocken->setRepStr('/<form(.*)method=[\\"\']post[\\"\'](.*)>/i', '<form\\1method="get"\\2>');
            }
            $objBlocken->setRepStr('/<meta(.*)charset=UTF-8/i', '<meta\\1charset=Shift_JIS');
            if ('xhtml' != $sContentType) {
                $objBlocken->setRepStr('/<(.*) \\/>/', '<\\1>');
                $objBlocken->setRepStr('/<(.*)\\/>/', '<\\1>');
            } else {
                $objBlocken->setRepStr('/<\\?xml(.*)encoding="UTF-8"/i', '<?xml\\1encoding="Shift_JIS"');
            }
        } else {
            if (isset($aryParam['uid']) && BLOCKEN_MOBI_P_DEBUGUID != $aryParam['uid']) {
                $objBlocken->setAddParam('uid', $aryParam['uid']);
                $objBlocken->setRepStr('/(.*):(.*)[\\?&]uid=' . $aryParam['uid'] . '/i', '\\1:\\2');
            }
        }
    }
    $objBlocken->setRepStr(BlockenMobile::unicode2sjis());
    $objBlocken->setRepStr($aryPear['mobile']->convertEmoji());
    switch ($sContentType) {
        case 'xhtml':
            if (BLOCKEN_MOBILE_USE && !$aryPear['mobile']->isNonMobile()) {
                ob_start('_bcomOutputHandler');
                header('Content-type: application/xhtml+xml; charset=Shift_JIS');
            } else {
                header('Content-type: application/xhtml+xml; charset=UTF-8');
            }
            break;
        case 'xml':
            header('Content-type: text/xml; charset=UTF-8');
            $objBlocken->setIsDebug(false);
            break;
        case 'hdml':
            header('Content-type: text/x-hdml; charset=Shift_JIS');
            $objBlocken->setIsDebug(false);
            break;
    }
    if (BLOCKEN_MOBILE_USE && $aryPear['mobile']->isEZweb()) {
        header('Expires: Sat, 01 Jan 2000 00:00:00 GMT');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
        header('Cache-Control: no-cache, must-revalidate');
        header('Pragma: no-cache');
    }
    if (!$bIsPHP) {
        echo $objBlocken->getHtml();
        exit;
    }
    if (!$objBlocken->isExpired()) {
        $objBlocken->showCache();
        exit;
    }
    return $objBlocken;
}