OSDN Git Service

携帯関係のウィジェット、テンプレートを削除。
[magic3/magic3.git] / include / manager / pageManager.php
index 977a2a2..badfd99 100644 (file)
@@ -10,7 +10,7 @@
  *
  * @package    Magic3 Framework
  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
- * @copyright  Copyright 2006-2017 Magic3 Project.
+ * @copyright  Copyright 2006-2018 Magic3 Project.
  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
  * @version    SVN: $Id$
  * @link       http://www.magic3.org
@@ -26,6 +26,7 @@ class PageManager extends Core
        private $systemHandleMode;                      // システム制御遷移モード(1=サイト非公開時)
        private $isPageEditable;                // フロント画面ページ編集可能モード
        private $isTransparentMode;             // 画面透過モード
+       private $isPersonalMode;                // 機能アクセスパーソナルモード
        private $isEditMode;                    // フロント画面編集モード
        private $isLayout;                              // 画面レイアウト中かどうか
        private $isPageTopUrl;                  // ページトップ(サブページ内のトップ位置)のURLかどうか
@@ -61,9 +62,11 @@ class PageManager extends Core
        private $headDescription;                               // HTMLヘッダ「description」に出力する文字列
        private $headKeywords;                          // HTMLヘッダ「keywords」に出力する文字列
        private $headOthers;                            // HTMLヘッダに出力するタグ文字列
+       private $adminHeadOthers;                               // HTMLヘッダに出力するタグ文字列(管理画面用)
        private $lastHeadTitle;                         // 最後にヘッダ部titleにセットした文字列
        private $lastHeadDescription;           // 最後にヘッダ部descriptionにセットした文字列
        private $lastHeadKeywords;                      // 最後にヘッダ部keywordsにセットした文字列
+       private $headFirstTag;                          // HTMLヘッダに最初に出力するタグ文字列
        private $headCss = array();                     // HTMLヘッダにCSS出力する文字列
        private $headScript = array();          // HTMLヘッダにJavascript出力する文字列
        private $headPreMobileScript = array();         // HTMLヘッダにJavascript出力する文字列(jQueryMobile用挿入スクリプト)
@@ -72,8 +75,12 @@ class PageManager extends Core
        private $lastHeadCss;                           // 最後に設定したHTMLヘッダにCSS出力する文字列
        private $lastHeadScript;                        // 最後に設定したHTMLヘッダにJavascript出力する文字列
        private $lastHeadString;                        // 最後に設定したHTMLヘッダに出力する任意文字列
+       private $headSubTitle = array();                                // ヘッダタグサブタイトル
+       private $headSubTitleUrl = array();                             // ヘッダサブタイトルのリンク先
+       private $headCanonicalUrl;                              // カノニカル属性URL
        private $initScript = '';                               // ウィンドウ初期化時に実行されるスクリプト
        private $outputByHtml = true;                           // HTMLフォーマットで出力するかどうか
+       private $outputByStandardHead;          // HTML文書の標準のヘッダタグを出力するかどうか
        private $outputHead;                            // HTMLヘッダ出力を行ったかどうか
        private $outputTheme;                           // jQueryUIテーマ出力を行ったかどうか
        private $outputAjaxResponseBody;        // AJAX用のレスポンスボディデータかどうか
@@ -83,8 +90,6 @@ class PageManager extends Core
        private $isSystemPage;                          // システム制御ページを表示するかどうか
        private $libFiles;                                      // javascript追加用ライブラリ
        private $pageDefRev = 234;                              // 画面定義のリビジョン番号
-       private $headSubTitle = array();                                // ヘッダタグサブタイトル
-       private $headSubTitleUrl = array();                             // ヘッダサブタイトルのリンク先
        private $pageInfo;                                      // すべてのページ情報
        private $currentPageInfo;                       // 現在のページのページ情報
        private $configWidgetInfo;                      // ウィジェット設定画面のウィジェットの情報
@@ -101,6 +106,7 @@ class PageManager extends Core
        private $urlParamOrder;                                 // URLパラメータの並び順
        private $wysiwygEditor;                         // 管理画面用WYSIWYGエディター
        private $optionTemplateId;                      // 追加設定するテンプレートID
+       private $optionSubTemplateId;                   // 追加設定するサブテンプレートID
        private $isContentGooglemaps;           // コンテンツにGoogleマップが含むかどうか
        private $useGooglemaps;                         // Googleマップを使用するかどうか
        private $useBootstrap;                          // Bootstrapを使用するかどうか
@@ -119,10 +125,12 @@ class PageManager extends Core
        const WIDGET_ID_TITLE_TAG_END = '}}';                                           // 遅延実行用タグ(タイトル埋め込み用)
        const WIDGET_ID_SEPARATOR = ',';
        const HEAD_TAGS                         = '{{HEAD_TAGS}}';                              // HTMLヘッダ出力用タグ
-       const MENUBAR_TAGS                      = '{{MENUBAR_TAGS}}';                           // メニューバー出力用タグ
+       const MENUBAR_TAGS                      = '{{MENUBAR_TAGS}}';                   // メニューバー出力用タグ
        const MENUBAR_SCRIPT_TAGS       = '{{MENUBAR_SCRIPT_TAGS}}';                            // メニューバー出力用スクリプトタグ
        const WIDGET_ICON_IMG_SIZE = 32;                        // ウィジェットアイコンサイズ
-       const WIDGET_OUTER_CLASS = 'm3_widget_outer';                   // ウィジェット外枠クラスクラス
+       const WIDGET_INVISIBLE_CLASS = 'm3invisible';                   // 非表示ウィジェットクラス
+       const WIDGET_LOGIN_STATUS_CLASS = 'm3loginstatus';              // ログイン状態連動クラス
+       const WIDGET_OUTER_CLASS = 'm3_widget_outer';                   // ウィジェット外枠クラス
        const WIDGET_OUTER_CLASS_HEAD_POSITION = 'm3_pos_';                     // ウィジェットの外枠クラス用ヘッダ(ポジション表示用)
        const WIDGET_OUTER_CLASS_WIDGET_TAG = 'm3_';                            // ウィジェットの外枠クラス用ヘッダ(ポジション表示用)
 //     const WIDGET_INNER_CLASS = 'm3_widget_inner';                   // ウィジェットの内側クラス
@@ -151,6 +159,7 @@ class PageManager extends Core
        const CF_GOOGLE_MAPS_KEY = 'google_maps_key';                           // Googleマップ利用キー
        const CF_CONFIG_WINDOW_OPEN_TYPE = 'config_window_open_type';           // ウィジェット設定画面のウィンドウ表示タイプ(0=別ウィンドウ、1=タブ)
        const CF_JQUERY_VERSION = 'jquery_version';                     // jQueryバージョン
+       const CF_EXTERNAL_JQUERY = 'external_jquery';                   // システム外部のjQueryを使用するかどうか
        const CF_WYSIWYG_EDITOR = 'wysiwyg_editor';             // 管理画面用WYSIWYGエディター
        const CF_ADMIN_JQUERY_VERSION = 'admin_jquery_version';                 // 管理画面用jQueryバージョン
        const CF_USE_JQUERY = 'use_jquery';                             // jQueryを常に使用するかどうか
@@ -179,8 +188,9 @@ class PageManager extends Core
        const PREV_ICON_FILE = '/images/system/prev48.png';             // ウィンドウ「前へ」アイコン
        const NEXT_ICON_FILE = '/images/system/next48.png';             // ウィンドウ「次へ」アイコン
        const DEFAULT_READMORE_TITLE = 'もっと読む';                       // もっと読むボタンのデフォルトタイトル
-       const POS_HEAD_NAV_MENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> ';               // 特殊ポジションブロック(ナビゲーションメニュー)
-       const WIDGET_MARK_MAIN = '<i class="glyphicon glyphicon-tower" rel="m3help" title="メイン型" data-placement="auto"></i> ';          // ウィジェットの機能マーク(メイン型ウィジェット)
+       const POS_HEAD_NAV_MENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> ';               // 特殊ポジションブロック(ナビゲーションメニュー型)
+       const POS_HEAD_MAIN = '<i class="glyphicon glyphicon-stop" rel="m3help" title="メイン型" data-placement="auto"></i> ';              // 特殊ポジションブロック(メイン型)
+       const WIDGET_MARK_MAIN = '<i class="glyphicon glyphicon-stop" rel="m3help" title="メイン型" data-placement="auto"></i> ';           // ウィジェットの機能マーク(メイン型ウィジェット)
        const WIDGET_MARK_NAVMENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> ';             // ウィジェットの機能マーク(ナビゲーションメニュー)
        const WIDGET_FUNCTION_MARK_BOOTSTRAP = ' <span class="label label-warning" rel="m3help" title="Bootstrap型テンプレート対応" data-placement="auto">B</span>';                   // ウィジェット機能マーク(Boostrap型テンプレート
        const WIDGET_FUNCTION_MARK_WORDPRESS = ' <span class="label label-warning" rel="m3help" title="WordPress型テンプレート対応" data-placement="auto">W</span>';                   // ウィジェット機能マーク(WordPress型テンプレート
@@ -200,11 +210,10 @@ class PageManager extends Core
        const IWIDTET_CMD_CALC = 'calc';                        // 計算
        
        // Magic3用スクリプト
-       const M3_ADMIN_SCRIPT_FILENAME                  = 'm3admin2.0.1.js';                            // 管理機能用スクリプト(FCKEditor2.6.6、CKEditor4.0.1対応)
+       const M3_ADMIN_SCRIPT_FILENAME                  = 'm3admin2.0.2.js';                            // 管理機能用スクリプト(FCKEditor2.6.6、CKEditor4.0.1対応)
        const M3_ADMIN_WIDGET_SCRIPT_FILENAME   = 'm3admin_widget2.0.10.js';    // 管理機能(ウィジェット操作)用スクリプト(Magic3 v1.15.0以降)
        const M3_ADMIN_WIDGET_CSS_FILE                  = '/m3/widget.css';                     // 管理機能(ウィジェット操作)用CSSファイル
        const M3_STD_SCRIPT_FILENAME                    = 'm3std1.5.2.js';                      // 一般、管理機能共通スクリプト
-//     const M3_PLUS_SCRIPT_FILENAME                   = 'm3plus1.6.2.js';                     // フロント画面追加用スクリプト(FCKEditor2.6.6対応、CKEditor4.0.1対応)
        const M3_OPTION_SCRIPT_FILENAME                 = 'm3opt1.2.1.js';                      // AJAXを含んだオプションライブラリファイル(jQuery必須)
        const M3_ADMIN_CSS_FILE                                 = 'm3/admin.css';                       // 管理機能用のCSS
        const M3_EDIT_CSS_FILE                                  = 'm3/edit.css';                        // フロント画面編集用のCSS
@@ -254,10 +263,6 @@ class PageManager extends Core
                if ($gEnvManager->isAdminDirAccess()){          // 管理画面へのアクセスのとき
                        $value = $gSystemManager->getSystemConfig(self::CF_ADMIN_JQUERY_VERSION);// 管理画面用jQueryバージョン
                        
-                       if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET && strStartsWith($widgetId, 'm/')){// 携帯用アクセスポイント用の管理画面の場合はWYSIWYGエディターはFCKEditorに固定
-                               $this->wysiwygEditor = ScriptLibInfo::LIB_FCKEDITOR;                            // FCKEditorに固定
-                       }
-                       
                        // 管理画面にBOOTSTRAPを使用するかどうか(初期値)
                        $this->useBootstrap = self::USE_BOOTSTRAP_ADMIN;
                        
@@ -402,7 +407,6 @@ class PageManager extends Core
                        M3_REQUEST_PARAM_FROM                                   => 18,          // メッセージの送信元ウィジェットID
                        M3_REQUEST_PARAM_VIEW_STYLE                             => 19,          // 表示スタイル
                        M3_REQUEST_PARAM_FORWARD                                => 20,          // 画面遷移用パラメータ
-                       M3_REQUEST_PARAM_ADMIN_KEY                              => 21,          // 管理者一時キー
                        M3_REQUEST_PARAM_OPEN_BY                                => 22,          // ウィンドウの開き方
                        M3_REQUEST_PARAM_SHOW_HEADER                    => 23,          // ヘッダ部表示制御
                        M3_REQUEST_PARAM_SHOW_FOOTER                    => 24,          // フッタ部表示制御
@@ -542,34 +546,53 @@ class PageManager extends Core
                }
        }
        /**
-        * HTMLヘッダに出力するタグ文字列を取得
+        * HTMLヘッダに出力するタグ文字列を追加(管理画面用)
         *
-        * @return string $str   出力文字列
+        * @param string $str   出力文字列
+        * @return なし
         */
-/*     function getHeadOthers()
+       function addAdminHeadOthers($str)
        {
-               return $this->headOthers;
-       }*/
+               if (is_string($str) && !empty($str)){
+                       // 追加されていない場合のみ追加
+                       $pos = strpos($this->adminHeadOthers, $str);
+                       if ($pos === false) $this->adminHeadOthers .= $str;
+               }
+       }
        /**
         * HTMLヘッダ「title」のサブタイトル出力する文字列を設定
         *
-        * @param string $str   出力文字列
-        * @param string $url   リンク先
+        * @param string $str           出力文字列
+        * @param string $url           リンク先
+        * @param bool $isDefault       デフォルト値かどうか
+        * @return                                      なし
         */
-       function setHeadSubTitle($str = '', $url = '')
+       function setHeadSubTitle($str = '', $url = '', $isDefault = false)
        {
-               global $gEnvManager;
+               // ##### ページのサブタイトルはデフォルトでページのMETAタイトルを使用し、メインウィジェット側で上書きする #####
                
-               if (is_string($str)){
-                       // 空の場合はウィジェットのヘッドタイトルから取得
-                       if (empty($str)) $str = $gEnvManager->getCurrentWidgetHeadTitle();
-
-                       if (!empty($str)){
-                               $this->headSubTitle[] = $str;
-                               $this->headSubTitleUrl[] = $url;
-                               $this->lastHeadTitle = $str;    // 最後に設定した値を退避
+               static $isUpdated = false;                      // デフォルト値が更新されているかどうか
+               
+               if (!is_string($str) || empty($str)) return;
+               
+               // デフォルト値の場合はデータを初期化
+               if ($isDefault){
+                       $this->headSubTitle = array();
+                       $this->headSubTitleUrl = array();
+                       $this->lastHeadTitle = '';
+                       $isUpdated = false;
+               } else {                        // デフォルトでない場合はデータを追加
+                       if (!$isUpdated){                       // デフォルト値が更新されていない場合は以前のデータを削除
+                               $this->headSubTitle = array();
+                               $this->headSubTitleUrl = array();
+                               $this->lastHeadTitle = '';
+                               $isUpdated = true;                      // デフォルト値は更新された
                        }
                }
+               // タイトル追加
+               $this->headSubTitle[] = $str;
+               $this->headSubTitleUrl[] = $url;
+               $this->lastHeadTitle = $str;    // 最後に設定した値を退避
        }
        /**
         * HTMLヘッダ「title」のサブタイトル出力する文字列を取得
@@ -791,6 +814,26 @@ class PageManager extends Core
                }
        }
        /**
+        * HTMLヘッダに最初に出力するタグ文字列を設定
+        *
+        * @param string $str   追加するタグ文字列
+        * @return                              なし
+        */
+       function setHeadFirstTag($str)
+       {
+               if (!empty($str)) $this->headFirstTag = $str;
+       }
+       /**
+        * ヘッダ部に出力するカノニカル属性URLを設定
+        *
+        * @param string $url           URL
+        * @return                                      なし
+        */
+       function setCanonicalUrl($url)
+       {
+               if (!empty($url)) $this->headCanonicalUrl = $url;                               // カノニカル属性URL
+       }
+       /**
         * RSSチャンネル部に出力するデータを設定
         *
         * @param array $rssData        RSSチャンネル部データ
@@ -864,11 +907,29 @@ class PageManager extends Core
         *
         * @return bool         true=編集モードオン、false=編集モードオフ
         */
-       function idEditMode()
+       function isEditMode()
        {
                return $this->isEditMode;
        }
        /**
+        * 機能アクセスパーソナルモードを設定
+        *
+        * @return                              なし
+        */
+       function setPersonalMode()
+       {
+               $this->isPersonalMode = true;
+       }
+       /**
+        * 機能アクセスパーソナルモードを取得
+        *
+        * @return bool         true=パーソナルモードオン、false=パーソナルモードオフ
+        */
+       function isPersonalMode()
+       {
+               return $this->isPersonalMode;
+       }
+       /**
         * 出力フォーマットがHTMLであるかを設定
         *
         * @param bool $isHtml  HTMLフォーマットかどうか
@@ -1063,7 +1124,7 @@ class PageManager extends Core
        /**
         * 追加設定するテンプレートIDを返す
         *
-        * @return string                                               テンプレートID
+        * @return array                                                テンプレートID,サブテンプレートIDの配列
         */
        function getOptionTemplateId()
        {
@@ -1076,17 +1137,17 @@ class PageManager extends Core
                        case M3_VIEW_TYPE_CONTENT:              // ページのコンテンツタイプ                         
                                // コンテンツ単位のテンプレート設定
                                $contentLibObj = $this->gInstance->getObject(self::CONTENT_OBJ_ID);
-                               if (isset($contentLibObj)) $this->optionTemplateId = $contentLibObj->getTemplate();
+                               if (isset($contentLibObj)) list($this->optionTemplateId, $this->optionSubTemplateId) = $contentLibObj->getOptionTemplate();
                                break;
                        case M3_VIEW_TYPE_BLOG:         // ページがブログタイプのとき
                                if ($pageId == $this->gEnv->getDefaultPageId()){                // PCサイトのとき
                                        // ブログライブラリオブジェクトからテンプレートを取得
                                        $blogLibObj = $this->gInstance->getObject(self::BLOG_OBJ_ID);
-                                       if (isset($blogLibObj)) $this->optionTemplateId = $blogLibObj->getOptionTemplate();
+                                       if (isset($blogLibObj)) list($this->optionTemplateId, $this->optionSubTemplateId) = $blogLibObj->getOptionTemplate();
                                }
                                break;
                }
-               return $this->optionTemplateId;
+               return array($this->optionTemplateId, $this->optionSubTemplateId);
        }
        /**
         * 使用した非共通ウィジェットの数を取得
@@ -1132,7 +1193,9 @@ class PageManager extends Core
        function getMainContentTypes()
        {
                // 「value」値のみ取得
-               return array_map(create_function('$a', 'return $a["value"];'), $this->mainContentTypeInfo);
+               //return array_map(create_function('$a', 'return $a["value"];'), $this->mainContentTypeInfo);
+               $types = array_map(function($a){ return $a["value"]; }, $this->mainContentTypeInfo);
+               return $types;
        }
        /**
         * フロント画面で使用するサブコンテンツタイプを取得
@@ -1142,7 +1205,9 @@ class PageManager extends Core
        function getSubContentTypes()
        {
                // 「value」値のみ取得
-               return array_map(create_function('$a', 'return $a["value"];'), $this->subContentTypeInfo);
+//             return array_map(create_function('$a', 'return $a["value"];'), $this->subContentTypeInfo);
+               $types = array_map(function($a){ return $a["value"]; }, $this->subContentTypeInfo);
+               return $types;
        }
        /**
         * フロント画面で使用する主要機能タイプ情報を取得
@@ -1161,7 +1226,9 @@ class PageManager extends Core
        function getMainFeatureTypes()
        {
                // 「value」値のみ取得
-               return array_map(create_function('$a', 'return $a["value"];'), $this->mainFeatureTypeInfo);
+//             return array_map(create_function('$a', 'return $a["value"];'), $this->mainFeatureTypeInfo);
+               $types = array_map(function($a){ return $a["value"]; }, $this->mainFeatureTypeInfo);
+               return $types;
        }
        
        /**
@@ -1236,6 +1303,7 @@ class PageManager extends Core
                global $gAccessManager;
                global $gSystemManager;
                global $gDispManager;
+               global $gOpeLogManager;
                
                // 実行コマンドを取得
                $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
@@ -1266,9 +1334,9 @@ class PageManager extends Core
                        }
                } else {
                        // 管理者キーがあればGETまたはPOST値のセッションIDを使用する
-                       if ($gEnvManager->isAdminDirAccess()){
-                               if ($gAccessManager->isValidAdminKey()) session_id($gRequestManager->trimValueOf(session_name()));
-                       }
+//                     if ($gEnvManager->isAdminDirAccess()){
+//                             if ($gAccessManager->isValidAdminKey()) session_id($gRequestManager->trimValueOf(session_name()));
+//                     }
                }
 
                // 最終HTML(ページ全体で使用するHTML)の出力
@@ -1290,8 +1358,21 @@ class PageManager extends Core
                
                // セッションからユーザ情報を取得
                $userInfo = $gRequestManager->getSessionValueWithSerialize(M3_SESSION_USER_INFO);
-               if (!$gAccessManager->checkSessionSecurity($userInfo)) return;                  // セキュリティ問題ありの場合は終了
+               if (!$gAccessManager->checkSessionSecurity($userInfo)) return;                  // セキュリティ問題ありの場合はここで終了
+               // ##### ここで終了した場合はページサブIDが未設定のためページ不正のエラーが発生しアクセスエラー画面が表示される #####
+               
+               // ##### POST時のリファラーチェック #####
+               // WooCommerceのAJAX処理が通らないのでチェックしない?
+/*             if ($gRequestManager->isPostMethod() && !$this->_checkReferer()){
+                       $errMsg = '不正なPOSTデータ(リファラー異常)を検出しました。アクセス元IP: ' . $gAccessManager->getClientIp();
+                       $msgDetail = 'アクセスをブロックしました。account=' . $userInfo->account . ', userid=' . $userInfo->userId;
+                       $gOpeLogManager->writeUserError(__METHOD__, $errMsg, 2210, $msgDetail);
+                       return;
+               }*/
                
+               // その他セッション情報取得
+               $gRequestManager->_doSessionOpenEventCallback();
+
                // ユーザ情報をロード
                $gInstanceManager->setUserInfo($userInfo);
 
@@ -1302,11 +1383,21 @@ class PageManager extends Core
                // デバッグモードの表示
                if (M3_SYSTEM_DEBUG) echo 'Debug mode<br />';
                
+               // ##### ユーザアクセスモードの設定 #####
+               if (!empty($userInfo) && $userInfo->isPersonal()) $this->setPersonalMode();             // パーソナルモードをオン
+/*             if (($userInfo->userType == UserInfo::USER_TYPE_MANAGER && $userInfo->userOptType == UserInfo::USER_OPT_TYPE_PAGE_MANAGER)||                    // ページ運用者の場合
+                       $userInfo->userType < UserInfo::USER_TYPE_MANAGER){                     // システム運用者よりも権限が低い場合
+                       
+                       // パーソナルモードをオン
+                       $this->setPersonalMode();
+               }*/
+
                // ##### ページIDの修正 #####
                // ポジション表示の場合はページID、ページサブIDを再設定。再設定はシステム管理者のみ可能。
                if (($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                                    // 管理画面(ウィジェットなしポジション表示)のとき
                        $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET) &&            // 管理画面(ウィジェット付きポジション表示)のとき
-                       $gEnvManager->isSystemAdmin()){
+//                     $gEnvManager->isSystemAdmin()){
+                       $gEnvManager->isSystemManageUser()){    // システム運用可能の場合(2018/8/5変更)
 
                        $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
                        if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId();          // 値がないときはデフォルトのページIDを設定
@@ -1332,8 +1423,9 @@ class PageManager extends Core
                                if ($paramCount == 0){
                                        $this->isPageTopUrl = true;                     // ページトップ(サブページ内のトップ位置)のURLかどうか
                                        
-                                       if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemAdmin() && empty($task)){
-                                               // ダッシュボード機能は、パラメータなし、管理者ディレクトリ、システム管理者の条件で使用可能
+                                       //if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemAdmin() && empty($task)){
+                                       if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemManageUser() && empty($task)){
+                                               // ダッシュボード機能は、パラメータなし、管理者ディレクトリ、システム運用者の条件で使用可能(2018/8/5変更)
                                                // POST値にタスクがある場合はダッシュボードとしない
                                                $subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_DASHBOARD, $gEnvManager->getCurrentPageId());// ページサブIDを取得
                                        }
@@ -1550,6 +1642,7 @@ class PageManager extends Core
                                                
                                        // 管理画面用ライブラリを追加
                                        if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){      // ウィジェット詳細設定画面のとき
+                                       //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){                                          // ウィジェット設定画面またはテンプレート設定画面のとき
                                                $this->addAdminScript('', ScriptLibInfo::getWysiwygEditorLibId());      // WYSIWYGエディターを追加
                                                
                                                // Googleマップライブラリの読み込み
@@ -1611,7 +1704,6 @@ class PageManager extends Core
                                        
 //                                             $this->addScript('', ScriptLibInfo::LIB_JQUERY_RESPONSIVETABLE);// 管理画面作成用
                                                $this->addScript('', ScriptLibInfo::getWysiwygEditorLibId());   // WYSIWYGエディターを追加
-                                       //      $this->addScriptFile(self::M3_PLUS_SCRIPT_FILENAME);            // フロント画面追加用スクリプト追加(PLUSライブラリを追加する場合はFCKEditorも使用可能にする)
                                                $this->addScriptFile(self::M3_ADMIN_SCRIPT_FILENAME);           // 管理スクリプトライブラリ追加
                                                $this->addScriptFile(self::M3_OPTION_SCRIPT_FILENAME);  // Magic3のオプションライブラリ追加
                                                $this->addScript('', ScriptLibInfo::LIB_JQUERY_HOVERINTENT);// HELP用スクリプト追加
@@ -1718,7 +1810,7 @@ class PageManager extends Core
                        $keyword        = $this->currentPageInfo['pn_meta_keywords'];           // ページキーワード
                        $headOthers     = $this->currentPageInfo['pn_head_others'];             // ヘッダその他タグ
                        
-                       if (!empty($title)) $this->setHeadSubTitle($title);
+                       if (!empty($title)) $this->setHeadSubTitle($title, '', true);           // デフォルト値として設定
                        if (!empty($desc)) $this->setHeadDescription($desc);
                        if (!empty($keyword)) $this->setHeadKeywords($keyword);
                        if (!empty($headOthers)) $this->setHeadOthers($headOthers);
@@ -1732,7 +1824,7 @@ class PageManager extends Core
                        $keyword        = $row['pn_meta_keywords'];             // ページキーワード
                        $headOthers = $row['pn_head_others'];           // ヘッダその他タグ
                        
-                       if (!empty($title)) $this->setHeadSubTitle($title);
+                       if (!empty($title)) $this->setHeadSubTitle($title, '', true);           // デフォルト値として設定
                        if (!empty($desc)) $this->setHeadDescription($desc);
                        if (!empty($keyword)) $this->setHeadKeywords($keyword);
                        if (!empty($headOthers)) $this->setHeadOthers($headOthers);
@@ -2166,6 +2258,9 @@ class PageManager extends Core
                $userInfo = $gInstanceManager->getUserInfo();
                $gRequestManager->setSessionValueWithSerialize(M3_SESSION_USER_INFO, $userInfo);
                
+               // その他セッション情報保存
+               $gRequestManager->_doSessionCloseEventCallback();
+               
                // 画面設定保存
                $gDispManager->save();
                        
@@ -2196,6 +2291,9 @@ class PageManager extends Core
                                // 更新日時
                                header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
                
+                               // 文字コード設定
+                               header('Content-Type: text/html; charset=UTF-8');                       // 2018/4/19 Firefoxで文字化けが起きる場合があるので追加
+                               
                                // Ajax用JSON型データをHTTPヘッダに格納
                                $gInstanceManager->getAjaxManager()->header();
                        }
@@ -2246,6 +2344,9 @@ class PageManager extends Core
                $userInfo = $gInstanceManager->getUserInfo();
                $gRequestManager->setSessionValueWithSerialize(M3_SESSION_USER_INFO, $userInfo);
                
+               // その他セッション情報保存
+               $gRequestManager->_doSessionCloseEventCallback();
+               
                $this->isAbort = true;                                  // ページ作成処理を中断するかどうか
        }
        /**
@@ -2276,7 +2377,7 @@ class PageManager extends Core
         * Joomla!v1.5タグを読み込んでウィジェット実行
         *
         * @param string        $srcBuf                 バッファデータ
-        * @param int           $templateVer    テンプレートバージョン(0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
+        * @param int           $templateVer    テンプレートバージョン(99=レイアウト用テンプレート、0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
         * @return string                                       変換後文字列
         */
        function launchWidgetByJoomlaTag($srcBuf, $templateVer)
@@ -2351,24 +2452,75 @@ class PageManager extends Core
                                        if (!empty($name)){             // ポジション名が取得できたとき
                                                // Joomla!では、テンプレートの「jdoc:include」タグの属性styleが空のときは「none」で処理される
                                                // Joomla!デフォルトで設定可能なのは「none,table,horz,xhtml,rounded,outline」
-/*                                             if (empty($style)){
-                                                       if (strStartsWith($name, 'user') ||             // ナビゲーションメニュー位置の場合
-                                                               strcasecmp($name, 'position-1') == 0){                          // Joomla!v2.5テンプレート対応
-                                                               $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
-                                                       } else {
-                                                               $style = 'none';
-                                                       }
-                                               }*/
+                                               // 配置ブロックがナビゲーション型に固定されていない場合はテンプレートの種類によってナビゲーションかどうかを判断
                                                if (strcasecmp($type, 'navmenu') == 0){                                                                                 // メニューウィジェット用配置ブロックの場合
                                                        $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
                                                        $attr['type'] = $type;                  // テンプレート内での参照用
-                                               } else if (strcasecmp($name, 'user3') == 0 ||           // ナビゲーションメニュー位置の場合
-                                                       strcasecmp($name, 'position-1') == 0 ||         // Joomla!v2.5テンプレート対応
-                                                       strcasecmp($posType, 'hmenu') == 0){            // Joomla!v3テンプレート対応
-                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
-                                               } else if (empty($style)){
-                                                       $style = 'none';
+                                               } else {
+                                                       switch ($templateVer){
+                                                       case 0:                 // デフォルトテンプレート(Joomla!v1.0)
+                                                       case 1:                 // Joomla!v1.5
+                                                       case 2:                 // Joomla!v2.5
+                                                       case 10:                // Bootstrap v3.0
+                                                       default:
+                                                               if (strcasecmp($name, 'user3') == 0 ||          // ナビゲーションメニュー位置の場合
+                                                                       strcasecmp($name, 'position-1') == 0 ||         // Joomla!v2.5テンプレート対応
+                                                                       strcasecmp($posType, 'hmenu') == 0){            // Joomla!v3テンプレート対応
+                                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                                               }
+                                                               break;
+                                                       case 99:                // レイアウト用テンプレート
+                                                               global $gRequestManager;
+                                                               static $templateType;           // レイアウト用テンプレートタイプを一度だけ取得
+                                                               static $templateGenerator;
+                                                               
+                                                               if (!isset($templateType)){
+                                                                       $templateType = 99;
+                                                                       
+                                                                       // レイアウト用テンプレートの場合は対象とするテンプレートの情報を取得して判断する
+                                                                       $pageId         = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+                                                                       $pageSubId      = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
+                                                               
+                                                                       // ページ用個別に設定されたテンプレートがある場合は取得
+                                                                       $curTemplate = '';
+                                                                       $line = $this->getPageInfo($pageId, $pageSubId);
+                                                                       if (!empty($line)) $curTemplate = $line['pn_template_id'];
+                               
+                                                                       // 取得できなければデフォルトを取得
+                                                                       if (empty($curTemplate)){
+                                                                               if ($pageId == $this->gEnv->getDefaultPageId()){                // 通常サイトのとき
+                                                                                       $curTemplate = $this->gSystem->defaultTemplateId();
+                                                                               } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){               // スマートフォン用サイトのとき
+                                                                                       $curTemplate = $this->gSystem->defaultSmartphoneTemplateId();           // スマートフォン用デフォルトテンプレート
+                                                                               }
+                                                                       }
+                                                                       
+                                                                       // テンプレートのタイプを取得
+                                                                       $ret = $this->db->getTemplate($curTemplate, $row);
+                                                                       if ($ret){
+                                                                               $templateType = $row['tm_type'];
+                                                                               $templateGenerator = $row['tm_generator'];
+                                                                       }
+                                                               }
+                                                               
+                                                               if ($templateType != 99){
+                                                                       // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+                                                                       if ($templateGenerator == 'themler'){
+                                                                               if (strcasecmp($name, 'hmenu') == 0){           // Joomla!v3テンプレート対応
+                                                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                                                               }
+                                                                       } else {
+                                                                               if (strcasecmp($name, 'user3') == 0 ||          // ナビゲーションメニュー位置の場合
+                                                                                       strcasecmp($name, 'position-1') == 0){          // Joomla!v2.5テンプレート対応
+                                                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                                                               }
+                                                                       }
+                                                               }
+                                                               break;
+                                                       }
                                                }
+                                               if (empty($style)) $style = 'none';
+                                               
                                                // ウィジェットの出力を取得
                                                $contents = $this->getContents($name, $style, $templateVer, $attr);
                                        }
@@ -2406,6 +2558,7 @@ class PageManager extends Core
         */
        function lateLaunchWidget($request, $srcBuf)
        {
+               static $render;         // HTML生成オブジェクト
                global $gEnvManager;
                global $gErrorManager;
                global $gDesignManager;
@@ -2415,7 +2568,10 @@ class PageManager extends Core
                
                // ウィジェットヘッダ(Joomla!1.0用)を出力のタイプを取得
                $widgetHeaderType = $this->getTemplateWidgetHeaderType();
-                                       
+               
+               // テンプレートタイプ取得
+               $templateVer = $gEnvManager->getCurrentTemplateType();
+               
                // 遅延実行ウィジェットをインデックス順にソート
                asort($this->lateLaunchWidgetList, SORT_NUMERIC);
                
@@ -2547,6 +2703,19 @@ class PageManager extends Core
                                        $srcContents = ob_get_contents();
                                        ob_end_clean();
                                        
+                                       // ### テンプレート側のウィジェット生成処理使える場合はウィジェットの出力と入れ替える ###
+                                       // ### 先のrequire($widgetIndexFile)で必要なデータは作成されている                    ###
+                                       if ($templateVer >= 1 && $templateVer < 100){           // Joomla!v1.5,v2.5テンプレートのとき
+                                               $widgetType = $pageDefRec['wd_type'];           // ウィジェットタイプ
+                                               if ($widgetType == 'breadcrumb'){               // パンくずリスト
+                                                       // 描画オブジェクト作成
+                                                       if (!isset($render)) $render = new JRender();
+
+                                                       $templateContents = $render->getBreadcrumbContents('', '', '', array(), array(), $pageDefRec, $templateVer);                    // テンプレートバージョンのみ必要
+                                                       if (!empty($templateContents)) $srcContents = $templateContents;
+                                               }
+                                       }
+
                                        // ウィジェットの出力を取得
                                        $tag = self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END;
                                        $destBuf = str_replace($tag, $srcContents, $destBuf);
@@ -2616,8 +2785,16 @@ class PageManager extends Core
 
                // ##### ヘッダ部分の置換 #####
                if ($this->outputHead){                         // HTMLヘッダ出力を行っているとき
+                       $replaceStr = '';
+                       
+                       // HTMLヘッダに最初に出力するタグ文字列がある場合は追加
+                       if (!empty($this->headFirstTag)) $replaceStr .= $this->headFirstTag;
+                       
+                       // METAタグcharset等のHTML文書の標準のヘッダタグを出力
+                       if ($this->outputByStandardHead) $replaceStr .= $this->getStandardHead();
+               
                        // タグ変換用文字列の取得
-                       $replaceStr = $this->getHeaderOutput();
+                       $replaceStr .= $this->getHeaderOutput();
                        
                        // HTMLヘッダのデータ埋め込み
                        $destBuf = str_replace(self::HEAD_TAGS, $replaceStr, $destBuf);
@@ -2849,6 +3026,7 @@ class PageManager extends Core
         * startWidget(),endWidget()は、以下のコマンドを処理する
         *  ・M3_REQUEST_CMD_SHOW_WIDGET(ウィジェットの単体表示)
         *  ・M3_REQUEST_CMD_CONFIG_WIDGET(ウィジェット設定画面)
+        *  ・M3_REQUEST_CMD_CONFIG_TEMPLATE(テンプレート設定画面)
         *  ・M3_REQUEST_CMD_DO_WIDGET(ウィジェット単体実行)
         * Widgetの出力方法は、以下のパターンがある
         *  ・HTMLヘッダ付加 - Widget単体で画面出力するためにHTMLヘッダを付加するパターン
@@ -2868,7 +3046,6 @@ class PageManager extends Core
                $openBy = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPEN_BY);              // ウィンドウオープンタイプ
                $task = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_TASK);
 
-//             $isHtml5 = false;               // HTML5で出力するかどうか
                $tempVer = $gEnvManager->getCurrentTemplateType();              // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
                if (intval($tempVer) >= 2) $this->isHtml5 = true;               // HTML5で出力するかどうか                             
                
@@ -2887,8 +3064,13 @@ class PageManager extends Core
                // HTMLのヘッダ部(headタグ内)出力
                $this->getHeader();
 
-               // 現在のウィジェットを取得
-               $widgetId = $gEnvManager->getCurrentWidgetId();         // カレントのウィジェットID
+               // ##### 作成対象がウィジェットの場合とテンプレートの場合に分ける #####
+               if ($cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){                    // テンプレート設定画面の場合
+                       $templateId = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID);// テンプレートID
+               } else {
+                       // 現在のウィジェットを取得
+                       $widgetId = $gEnvManager->getCurrentWidgetId();         // カレントのウィジェットID
+               }
                
                // URLを作成
                if ($gEnvManager->getUseSslAdmin()){
@@ -2903,7 +3085,8 @@ class PageManager extends Core
 
                // ##### テンプレートのCSSの読み込み #####
                // テンプレートは管理用テンプレートに固定されている
-               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||             // ウィジェット設定のとき
+               //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||           // ウィジェット設定のとき
+               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE ||                                           // ウィジェット設定画面またはテンプレート設定画面のとき
                        ($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy) && $gEnvManager->isContentEditableUser())){        // ウィジェット単体実行でウィンドウを持つ場合の追加スクリプト
                        $curTemplateUrl = $templatesUrl . '/' . $gEnvManager->getCurrentTemplateId();
                        if ($this->isHtml5){
@@ -2967,16 +3150,25 @@ class PageManager extends Core
                }
                // ##### スクリプト用出力用タグを埋め込む #####
                // ウィジェット設定画面用メニューバーの作成
-               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){   // ウィジェット設定画面またはフロント画面編集モードのとき
+               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE ||                                           // ウィジェット設定画面またはテンプレート設定画面のとき
+                       ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){       // ウィジェット設定画面またはフロント画面編集モードのとき
                        echo self::MENUBAR_SCRIPT_TAGS;                 // メニューバー出力用タグ
                }
                
+               // ##### 作成対象がウィジェットの場合とテンプレートの場合に分ける #####
                // ウィジェットのタイトルを設定
-               $title = $row['wd_name'];
-               if (empty($title)) $title = $row['wd_id'];
-               $gEnvManager->setCurrentWidgetTitle($title);
-               echo '<title>' . self::WIDGET_TITLE_START . htmlspecialchars($title) . self::WIDGET_TITLE_END . '</title>' . M3_NL;
+               if ($cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){                    // テンプレート設定画面の場合
+                       $title = self::WIDGET_TITLE_START . 'テンプレート' . self::WIDGET_TITLE_END . ' ' . $templateId;
+                       $gEnvManager->setCurrentWidgetTitle($title);
+                       echo '<title>' . htmlspecialchars($title) . '</title>' . M3_NL;
+               } else {
+                       $title = $row['wd_name'];
+                       if (empty($title)) $title = $row['wd_id'];
+                       $gEnvManager->setCurrentWidgetTitle($title);
+                       echo '<title>' . self::WIDGET_TITLE_START . htmlspecialchars($title) . self::WIDGET_TITLE_END . '</title>' . M3_NL;
+               }
                echo '</head>' . M3_NL;
+               
                // タブでウィンドウを開く場合は背景を透過モードにする
                if ($this->isTransparentMode){
                        echo '<body style="background-color:transparent;">' . M3_NL;
@@ -2984,7 +3176,8 @@ class PageManager extends Core
                        echo '<body>' . M3_NL;
                }
                // ウィジェット設定画面用メニューバーの作成
-               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){   // ウィジェット設定画面またはフロント画面編集モードのとき
+               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE ||                                           // ウィジェット設定画面またはテンプレート設定画面のとき
+                       ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){       // ウィジェット設定画面またはフロント画面編集モードのとき
                        // ウィジェット情報を設定
                        $desc = $row['wd_description'];         // 説明
                        $gEnvManager->setCurrentWidgetParams('desc', $desc);
@@ -2996,7 +3189,7 @@ class PageManager extends Core
                
                // 別ウィンドウで表示のときは、「閉じる」ボタンを表示
                if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET ||               // ウィジェットの単体表示のとき
-                       $cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェット詳細設定画面のとき
+                       $cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE ||                                               // ウィジェット設定画面またはテンプレート設定画面のとき
                        ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){               // ウィジェット単体実行でフロント画面編集モードのとき
 
 //                     if ($this->isEditMode){// フロント画面編集モードのとき
@@ -3034,7 +3227,6 @@ class PageManager extends Core
                                                        '" alt="' . $titleStr . '" title="' . $titleStr . '" rel="m3help" /></a></div>' . M3_NL;
 //                     }
                }
-//             echo '<div class="row">' . M3_NL;
                echo '<!-- Widget Start -->' . M3_NL;
        }
        /**
@@ -3043,6 +3235,7 @@ class PageManager extends Core
         * startWidget(),endWidget()は、以下のコマンドを処理する
         *  ・M3_REQUEST_CMD_SHOW_WIDGET(ウィジェットの単体表示)
         *  ・M3_REQUEST_CMD_CONFIG_WIDGET(ウィジェット設定画面)
+        *  ・M3_REQUEST_CMD_CONFIG_TEMPLATE(テンプレート設定画面)
         *  ・M3_REQUEST_CMD_DO_WIDGET(ウィジェット単体実行)
         *
         * @param string $cmd                   起動コマンド
@@ -3086,7 +3279,8 @@ class PageManager extends Core
                // ##### 初期処理 #####
                $replaceStr .= '$(function(){' . M3_NL;
                // トップ位置修正
-               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){           // ウィジェット設定画面またはフロント画面編集モードのとき
+               if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE ||                                           // ウィジェット設定画面またはテンプレート設定画面のとき
+                       ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){               // フロント画面編集モードのとき
                        if (!empty($this->adminSubNavbarDef) || !empty($this->adminBreadcrumbDef)){
                                $menubarHeight = $gDesignManager->getSubMenubarHeight();
                                $replaceStr .= str_repeat(M3_INDENT_SPACE, 1) . '$("nav.secondlevel").css("margin-top", "0");' . M3_NL;
@@ -3107,24 +3301,8 @@ class PageManager extends Core
                $destContent = str_replace(self::MENUBAR_SCRIPT_TAGS, $replaceStr, $destContent);
                echo $destContent;// 変換したコンテンツを出力
                
-//             echo '</div>' . M3_NL;                  // row
                echo '<!-- Widget End -->' . M3_NL;
                
-               // ##### ウィジェットからの指定による処理 #####
-/*             if ($this->updateParentWindow){                 // 親ウィンドウ再描画のとき
-                       echo '<script type="text/javascript">' . M3_NL;
-                       echo '//<![CDATA[' . M3_NL;
-                       echo '$(function(){' . M3_NL;
-                       if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){              // ウィジェット詳細設定画面のとき
-                               echo str_repeat(M3_INDENT_SPACE, 1) . 'm3UpdateParentWindowByConfig(' . $this->updateDefSerial . ');' . M3_NL;// 更新する項目のページ定義シリアル番号
-                       } else if ($cmd == M3_REQUEST_CMD_DO_WIDGET){                   // ウィジェット単体実行のとき
-                               echo str_repeat(M3_INDENT_SPACE, 1) . 'm3UpdateParentWindow();' . M3_NL;
-                       }
-                       echo '});' . M3_NL;
-                       echo '//]]>' . M3_NL;
-                       echo '</script>' . M3_NL;
-               }*/
-               
                // Bootstrap用のタグ出力
                if ($this->useBootstrap) echo '</div>' . M3_NL;
                
@@ -3271,11 +3449,7 @@ class PageManager extends Core
                                $docTypeStr = '<!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">';
                        }
                }
-               if ($gEnvManager->getIsMobileSite()){           // 携帯用サイトへのアクセスの場合
-                       echo '<?xml version="1.0" encoding="' . $gEnvManager->getMobileCharset() . '" ?>' . M3_NL;
-               } else {
-                       echo '<?xml version="1.0" encoding="' . M3_HTML_CHARSET . '" ?>' . M3_NL;
-               }
+               echo '<?xml version="1.0" encoding="' . M3_HTML_CHARSET . '" ?>' . M3_NL;
                if (empty($docTypeStr)) $docTypeStr = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
                echo $docTypeStr . M3_NL;
        }
@@ -3300,64 +3474,60 @@ class PageManager extends Core
         */
        function getHeader()
        {
+               // ヘッダタグ変換の設定
+               $this->outputHead = true;                               // HTMLヘッダ出力を行ったかどうか
+               $this->outputByStandardHead = true;             // HTML文書の標準のヘッダタグを出力するか
+               
+               // ##### Magic3システムで必要なヘッダ出力用のタグを埋め込む #####
+               echo self::HEAD_TAGS;                   // HTMLヘッダの埋め込みデータ
+       }
+       /**
+        * HTML文書の標準のヘッダタグを出力
+        *
+        * @return string                       標準ヘッダ文字列
+        */
+       function getStandardHead()
+       {
                global $gEnvManager;
                global $gRequestManager;
-
-               $this->outputHead = true;                               // HTMLヘッダ出力を行ったかどうか
+               
+               $headStr = '';                  // ヘッダ文字列;
                
                // 実行コマンドを取得
                $cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
                
-               // ######### 携帯用サイトの場合は別にヘッダを作成する #########
-               if ($gEnvManager->getIsMobileSite()){
-                       // キャラクターセット
-                       echo '<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=' . $gEnvManager->getMobileCharset() . '" />' . M3_NL;
-
-                       // キャッシュを保存させない
-                       echo '<meta http-equiv="Pragma" content="no-cache" />' . M3_NL;
-                       echo '<meta http-equiv="Cache-Control" content="no-cache" />' . M3_NL;
-                       echo '<meta http-equiv="Expires" content="-1" />' . M3_NL;
+               if ($gEnvManager->getIsSmartphoneSite()){               // スマートフォン用サイトのときはHTML5で設定
+                       $this->isHtml5 = true;
+               } else {
+                       $tempVer = $gEnvManager->getCurrentTemplateType();              // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
+                       if (intval($tempVer) >= 2) $this->isHtml5 = true;
+               }
                
-                       // サイト構築エンジン
-                       echo '<meta name="generator" content="' . M3_SYSTEM_NAME . ' ver.' . M3_SYSTEM_VERSION . ' - ' . M3_SYSTEM_DESCRIPTION . '" />' . M3_NL;
-               } else {                // PC用サイト、管理用サイト、スマートフォン用サイトのとき
-//                     $isHtml5 = false;               // HTML5で出力するかどうか
-                       if ($gEnvManager->getIsSmartphoneSite()){               // スマートフォン用サイトのときはHTML5で設定
-                               $this->isHtml5 = true;
-                       } else {
-                               $tempVer = $gEnvManager->getCurrentTemplateType();              // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
-                               if (intval($tempVer) >= 2) $this->isHtml5 = true;
-                       }
-                       
-                       // ********** メタタグの設定 **********
-                       // キャラクターセット
-                       //if ($gEnvManager->getIsSmartphoneSite()){             // スマートフォン用サイトのときはHTML5で設定
-                       if ($this->isHtml5){
-                               //echo '<meta http-equiv="content-type" content="text/html; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
-                               echo '<meta charset="' . M3_HTML_CHARSET . '">' . M3_NL;
+               // キャラクターセット
+               if ($this->isHtml5){
+                       $headStr .= '<meta charset="' . M3_HTML_CHARSET . '">' . M3_NL;
+               } else {
+                       $headStr .= '<meta http-equiv="content-script-type" content="text/javascript" />' . M3_NL;
+                       $headStr .= '<meta http-equiv="content-style-type" content="text/css" />' . M3_NL;
+                       $headStr .= '<meta http-equiv="content-type" content="application/xhtml+xml; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
+               }
+               if ($gEnvManager->isAdminDirAccess()){          // 管理画面へのアクセスのとき
+                       // Bootstrapで必要なMETAタグを追加
+                       $headStr .= '<meta name="viewport" content="width=device-width, initial-scale=1">' . M3_NL;
+               }
+               
+               // 基準ディレクトリの指定
+               if ($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                             // 表示位置を表示するとき
+                       $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){      // 表示位置を表示するとき(ウィジェット付き)
+               
+                       if ($gEnvManager->getUseSslAdmin()){
+                               $rootUrl = $gEnvManager->getSslRootUrl();
                        } else {
-                               echo '<meta http-equiv="content-script-type" content="text/javascript" />' . M3_NL;
-                               echo '<meta http-equiv="content-style-type" content="text/css" />' . M3_NL;
-                               echo '<meta http-equiv="content-type" content="application/xhtml+xml; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
-                       }
-                       if ($gEnvManager->isAdminDirAccess()){          // 管理画面へのアクセスのとき
-                               // Bootstrapで必要なMETAタグを追加
-                               echo '<meta name="viewport" content="width=device-width, initial-scale=1">' . M3_NL;
-                       }
-                       
-                       // 基準ディレクトリの指定
-                       if ($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                             // 表示位置を表示するとき
-                               $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){      // 表示位置を表示するとき(ウィジェット付き)
-                       
-                               if ($gEnvManager->getUseSslAdmin()){
-                                       $rootUrl = $gEnvManager->getSslRootUrl();
-                               } else {
-                                       $rootUrl = $gEnvManager->getRootUrl();
-                               }
-                               echo '<base href="' . $rootUrl . '/" />' . M3_NL;
+                               $rootUrl = $gEnvManager->getRootUrl();
                        }
+                       $headStr .= '<base href="' . $rootUrl . '/" />' . M3_NL;
                }
-               echo self::HEAD_TAGS;                   // HTMLヘッダの埋め込みデータ
+               return $headStr;
        }
        /**
         * HTMLヘッダ出力文字列の取得
@@ -3391,6 +3561,10 @@ class PageManager extends Core
                                        $this->addAdminScript('', ScriptLibInfo::LIB_BOOTSTRAP);                // 管理画面でBootstrapを使用するかどうか
                                        if ($cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){          // 管理画面(ウィジェット付きポジション表示)以外のとき
                                                $this->addAdminScript('', ScriptLibInfo::LIB_BOOTSTRAP_ADMIN);  // Bootstrap管理画面オプション
+                                       } else {
+                                               // テンプレートタイプが管理画面のBootstrapバージョン(v3.0)と異なる場合はBootstrapを使用しない場合の管理機能用スクリプトを読み込む
+                                               $templateType = $gEnvManager->getCurrentTemplateType();
+                                               if ($templateType != 10) $this->addAdminScript('', ScriptLibInfo::LIB_NOBOOTSTRAP);             // Bootstrapを使用しない場合の管理機能用スクリプト
                                        }
                                } else {                // ログインしていない場合(ログイン画面等)
                                        $this->addPermittedAdminScript(ScriptLibInfo::LIB_BOOTSTRAP);
@@ -3398,10 +3572,19 @@ class PageManager extends Core
                                }
                        } else {                // フロント画面へのアクセスの場合
                                // ### Bootstrapのjsとcssはテンプレート側で読み込む ###
-//                             $this->addScript('', ScriptLibInfo::LIB_BOOTSTRAP);             // Bootstrapライブラリ
-                               if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW ||                          // ログイン、ログアウト場合
+                               // ### フロントからプレビューコマンドでログイン画面を表示させるパターンがあるので注意 ###
+//                             if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW ||                          // ログイン、ログアウト場合
+                               if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || ($cmd == M3_REQUEST_CMD_PREVIEW && !$gEnvManager->isCurrentUserLogined()) ||                               // ログイン、ログアウト場合
                                        ($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy) && $gEnvManager->isContentEditableUser())){                // ウィジェット単体実行でウィンドウを持つ場合の追加スクリプト
+                                       
                                        $this->addScript('', ScriptLibInfo::LIB_BOOTSTRAP_ADMIN);               // Bootstrap管理画面オプション
+                               } else {
+                                       if ($gEnvManager->isSystemManageUser() ||               // システム運用権限がある場合
+                                               $gEnvManager->isContentEditableUser()){         // 投稿ユーザの場合
+                                               // テンプレートタイプが管理画面のBootstrapバージョン(v3.0)と異なる場合はBootstrapを使用しない場合の管理機能用スクリプトを読み込む
+                                               $templateType = $gEnvManager->getCurrentTemplateType();
+                                               if ($templateType != 10) $this->addScript('', ScriptLibInfo::LIB_NOBOOTSTRAP);          // Bootstrapを使用しない場合の管理機能用スクリプト
+                                       }
                                }
                        }
                } else {
@@ -3518,6 +3701,13 @@ class PageManager extends Core
                                $titleCount = count($this->headSubTitle);
                                if ($titleCount > 0) $title = $this->headSubTitle[$titleCount -1];              // サブタイトルが設定されている場合は変更
                                $replaceStr .= '<title>' . htmlspecialchars($title) . '</title>' . M3_NL;
+                               
+                               // その他HTMLヘッダに出力するタグ文字列
+                               if (!empty($this->adminHeadOthers)){
+                                       // マクロを変換
+                                       $this->adminHeadOthers = $gInstanceManager->getTextConvManager()->convContentMacro($this->adminHeadOthers, false/*改行コードをbrタグに変換しない*/, array(), true/*変換後の値はHTMLエスケープ処理する*/);
+                                       $replaceStr .= $this->adminHeadOthers . M3_NL;
+                               }
                        } else {                        // 管理画面以外の画面へのアクセスの場合
                                // 画面タイトル
                                $titleItemCount = 0;            // タイトル項目数
@@ -3582,7 +3772,7 @@ class PageManager extends Core
                        // サイト構築エンジン
                        $replaceStr .= '<meta name="generator" content="' . M3_SYSTEM_NAME . ' ver.' . M3_SYSTEM_VERSION . ' - ' . M3_SYSTEM_DESCRIPTION . '" />' . M3_NL;              
 
-                       // Faviconの読み込み
+                       // カノニカル属性、Faviconの読み込み
                        $templateId = $gEnvManager->getCurrentTemplateId();
                        if ($gEnvManager->isAdminDirAccess()){          // 管理画面へのアクセスのとき
                                // テンプレートのFaviconがない場合はシステムのデフォルトのFaviconを使用
@@ -3599,6 +3789,10 @@ class PageManager extends Core
                                        }
                                }
                        } else {
+                               // カノニカル属性
+                               if (!empty($this->headCanonicalUrl)) $replaceStr .= '<link rel="canonical" href="' . convertUrlToHtmlEntity($this->headCanonicalUrl) .'" />' . M3_NL;                           // カノニカル属性URL
+                               
+                               // Favicon
                                $faviconPath = $gEnvManager->getTemplatesPath() . '/' . $templateId . self::DEFAULT_FAVICON_FILE;
                                if (file_exists($faviconPath)){         // ファイルが存在しているとき
                                        $faviconFile = $templatesUrl . '/' . $templateId . self::DEFAULT_FAVICON_FILE;
@@ -3782,9 +3976,14 @@ class PageManager extends Core
                                // Googleマップライブラリの読み込み
                                if ($this->useGooglemaps && $this->isContentGooglemaps) $this->addScriptFile(ScriptLibInfo::getScript(ScriptLibInfo::LIB_GOOGLEMAPS));  // コンテンツにGoogleマップが含むかどうか
 
+                               $useExternalJquery = $gSystemManager->getSystemConfig(self::CF_EXTERNAL_JQUERY);                // システム外部のjQueryを使用するかどうか
+                               
                                $count = count($this->defaultScriptFiles);
                                for ($i = 0; $i < $count; $i++){
                                        $defaultScriptFile = $this->defaultScriptFiles[$i];
+
+                                       // 外部のjQueryを使用する場合はSCRIPTタグを出力しない
+                                       if ($defaultScriptFile == $this->selectedJQueryFilename && $useExternalJquery) continue;
                                        
                                        // ##### jQueryMobileスクリプトを追加する場合は直前に初期化スクリプトを追加 #####
                                        if ($defaultScriptFile == $this->selectedJQueryMobileFilename){
@@ -3819,7 +4018,9 @@ class PageManager extends Core
                                        $replaceStr .=  '<script type="text/javascript" src="' . convertUrlToHtmlEntity($scriptURL) . '"></script>' . M3_NL;
                                }
                                
-                               if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW){                           // ログイン、ログアウト場合
+                               // ### フロントからプレビューコマンドでログイン画面を表示させるパターンがあるので注意 ###
+//                             if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW){                           // ログイン、ログアウト場合
+                               if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || ($cmd == M3_REQUEST_CMD_PREVIEW && !$gEnvManager->isCurrentUserLogined())){                                // ログイン、ログアウト場合
                                        // 管理権限なしで管理ディレクトリアクセスで必要なスクリプトを読み込む
                                        $count = count($this->defaultAdminDirScriptFiles);
                                        for ($i = 0; $i < $count; $i++){
@@ -3914,6 +4115,12 @@ class PageManager extends Core
                                        $replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
                                }
 
+                               // 起動がパーソナルモードかどうか
+                               if ($this->isPersonalMode){
+                                       $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+                               } else {
+                                       $replaceStr .= 'var M3_PERSONAL_MODE = false;' . M3_NL;
+                               }
                                // 管理画面の小画面デバイス最適化を行うかどうか
                                if ($gEnvManager->isSmallDeviceAdmin()){
                                        $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = true;' . M3_NL;
@@ -3923,6 +4130,7 @@ class PageManager extends Core
                                
                                // ウィジェット詳細設定画面専用のJavaScriptグローバル変数
                                if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){
+                               //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){                                          // ウィジェット設定画面またはテンプレート設定画面のとき
                                        // ##### CKEditor用の設定 #####
                                        $replaceStr .= 'var M3_CONFIG_WIDGET_DEVICE_TYPE = ' . $this->configWidgetInfo['wd_device_type'] . ';' . M3_NL;                 // ウィジェット設定画面のウィジェットの端末タイプ
                                        
@@ -3932,20 +4140,25 @@ class PageManager extends Core
                                                $this->ckeditorCssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
                                                //array_unshift($this->ckeditorCssFiles, $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE);
                                                
-                                               $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+                                               //$fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+                                               $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $this->ckeditorCssFiles));
                                                $replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
                                        }
                                        // CKEditor用(レイアウト)のCSSファイル
                                        $cssFiles = array();
                                        $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_ADMIN_CSS;           // BootstrapのCSSを追加
                                        $cssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
-                                       $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+//                                     $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+                                       $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $cssFiles));
                                        $replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_LAYOUT_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
                                        
                                        // CKEditor用のテンプレートタイプ
                                        if (isset($this->ckeditorTemplateType)){
                                                $replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_TEMPLATE_TYPE = ' . $this->ckeditorTemplateType . ';' . M3_NL;
                                        }
+                               } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION){               // ポジション表示
+                                       $replaceStr .= 'var M3_POSITION_DATA = "' . implode(',', $this->defPositions) . '";' . M3_NL;                   // 管理画面画面の端末タイプ(主にテスト用に使用)
+                                       $replaceStr .= 'var M3_CONFIG_WIDGET_DEVICE_TYPE = 0;' . M3_NL;                 // 管理画面画面の端末タイプ(主にテスト用に使用)
                                } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){           // ウィジェット付きポジション表示
                                        // その他のポジションデータを取得
                                        $positionData = $this->getRestPositionData();
@@ -4012,6 +4225,24 @@ class PageManager extends Core
                                $replaceStr .= 'var M3_FILEBROWSER_WIDTH_RATIO = ' . self::FILEBROWSER_WIDTH_RATIO . ';' . M3_NL;                       // ファイルブラウザ幅比率
                                $replaceStr .= 'var M3_FILEBROWSER_HEIGHT_RATIO = ' . self::FILEBROWSER_HEIGHT_RATIO . ';' . M3_NL;             // ファイルブラウザ高さ比率
                                
+                               // Googleマップライブラリの読み込み
+                               if ($this->useGooglemaps){
+                                       $replaceStr .= 'var M3_USE_GOOGLEMAPS = true;' . M3_NL;
+                                       
+                                       // CKEditor拡張プラグイン用の定義
+                                       $googleMapsKey = $this->gSystem->getSystemConfig(self::CF_GOOGLE_MAPS_KEY);             // Googleマップ利用キー
+                                       if (!empty($googleMapsKey)) $replaceStr .= 'var M3_GOOGLEMAPS_KEY="' . $googleMapsKey . '";' . M3_NL;           // システムルートURL
+                               } else {
+                                       $replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
+                               }
+
+                               // 起動がパーソナルモードかどうか
+                               if ($this->isPersonalMode){
+                                       $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+                               } else {
+                                       $replaceStr .= 'var M3_PERSONAL_MODE = false;' . M3_NL;
+                               }
+                               
                                // テンプレートタイプ
                                $templateType = $gEnvManager->getCurrentTemplateType();
                                if (isset($templateType)) $replaceStr .= 'var M3_TEMPLATE_TYPE = ' . $templateType . ';' . M3_NL;
@@ -4036,6 +4267,9 @@ class PageManager extends Core
                                                $replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
                                        }
                                
+                                       // 起動がパーソナルモードかどうか(常にパーソナルモード)
+                                       $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+                               
                                        // 管理画面の小画面デバイス最適化を行うかどうか
                                        if ($gEnvManager->isSmallDeviceAdmin()){
                                                $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = true;' . M3_NL;
@@ -4054,14 +4288,16 @@ class PageManager extends Core
                                                $this->ckeditorCssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
                                                //array_unshift($this->ckeditorCssFiles, $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE);
                                        
-                                               $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+//                                             $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+                                               $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $this->ckeditorCssFiles));
                                                $replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
                                        }
                                        // CKEditor用(レイアウト)のCSSファイル
                                        $cssFiles = array();
                                        $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_ADMIN_CSS;           // BootstrapのCSSを追加
                                        $cssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
-                                       $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+               //                      $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+                                       $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $cssFiles));
                                        $replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_LAYOUT_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
                                        
                                        // CKEditor用のテンプレートタイプ
@@ -4087,6 +4323,12 @@ class PageManager extends Core
                                                $replaceStr .= '});' . M3_NL;
                                        }
                                }
+                       } else {                        // 権限なしの場合
+                               if (!$gEnvManager->isAdminDirAccess()){                 // フロント画面のとき
+                                       // テンプレートタイプを追加(ファイルローダ等で使用)
+                                       $templateType = $gEnvManager->getCurrentTemplateType();
+                                       if (isset($templateType)) $replaceStr .= 'var M3_TEMPLATE_TYPE = ' . $templateType . ';' . M3_NL;
+                               }
                        }
                        
                        // ##### パネルメニュー(フロント画面と管理画面の切り替え等)の表示 #####
@@ -4446,7 +4688,7 @@ class PageManager extends Core
 
                                                if (empty($cacheData)){         // キャッシュデータがないとき
                                                        ob_clean();
-                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, $widgetHeaderType);
+                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, $widgetHeaderType);
                                                        if (!$ret) break;
                                                        $widgetContent = ob_get_contents();
                                                        
@@ -4467,6 +4709,38 @@ class PageManager extends Core
                                                        $widgetOuterClass .= ' ' . self::WIDGET_OUTER_CLASS_HEAD_POSITION . $position;          // ポジションブロッククラス
                                                        $widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
                                                        if ($this->isPageEditable){             // フロント画面ページ編集可能モードのとき
+                                                               // ウィジェット表示タイプによる表示制御
+                                                               $widgetStatusClass = '';// ウィジェットの状態表示クラス
+                                                               $widgetStatusLabelOption = '';          // ウィジェット状態表示ラベル
+                                                               $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+                                                               $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+                                                               if (!empty($controlType)){
+                                                                       switch ($controlType){
+                                                                               case 1:                 // ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+                                                                                       break;
+                                                                               case 2:                 // 非ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               if (!empty($pageState)){
+                                                                       switch ($pageState){
+                                                                               case 1:                 // トップ時のみ表示
+                                                                                       if (!$this->isPageTopUrl){
+                                                                                               $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS;               // ページトップ(サブページ内のトップ位置)でなければ非表示
+                                                                                               $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+                                                                                       }
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+               
                                                                $configId = $this->pageDefRows[$i]['pd_config_id'];             // 定義ID
                                                                $serial = $this->pageDefRows[$i]['pd_serial'];          // シリアル番号
                                                                $hasAdmin = '0';                // 管理画面があるかどうか
@@ -4475,7 +4749,7 @@ class PageManager extends Core
                                                                if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1';  // 共通ウィジェットのとき
                                                                $m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
-                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget" rel="#m3editwidget" ' . $m3Option . '>' . $widgetContent . '</div>';
+                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
                                                        } else {
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
                                                                $widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
@@ -4516,13 +4790,18 @@ class PageManager extends Core
                                                $cacheData = $this->gCache->getWidgetCache($request, $this->pageDefRows[$i], $metaTitle, $metaDesc, $metaKeyword);
 
                                                if (empty($cacheData)){         // キャッシュデータがないとき
-
+                                                       // WordPressウィジェット用のパラメータ設定
+                                                       $gEnvManager->setWpWidgetClass('');                             // ウィジェットクラス名初期化
+                                                       
                                                        ob_clean();
-                                       //              $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, $widgetHeaderType);
-                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, 0/*タイトル出力なし*/);
+                                       //              $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, $widgetHeaderType);
+                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, 0/*タイトル出力なし*/);
                                                        if (!$ret) break;
                                                        $widgetContent = ob_get_contents();
 
+                                                       // WordPressウィジェット用のパラメータ設定
+                                                       $widgetClassName = $gEnvManager->getWpWidgetClass();                            // ウィジェットクラス名
+                                                       
                                                        $trimContent = trim($widgetContent);
                                                        if (!empty($trimContent)){              // 出力が空でない場合
                                                        
@@ -4546,6 +4825,19 @@ class PageManager extends Core
                                                                        $title = '';                    // タイトルは非表示
                                                                }
                                                        
+                                                               // 強制的にタイトルを非表示にする場合はタイトルを修正
+                                                               if (!empty($title) && $this->pageDefRows[$i]['wd_hide_title']){
+                                                                       if ($this->isPageEditable){             // フロント画面ページ編集可能モードのとき
+                                                                               $title = '[' . $title . ']';
+                                                                       } else {
+                                                                               $title = '';
+                                                                       }
+                                                               }
+                                                               
+                                                               // WordPress用パラメータ作成
+                                                               $params = array();                              // ウィジェットごとの属性
+                                                               if (!empty($widgetClassName))  $params['moduleclass'] = $widgetClassName;       // ウィジェットクラス名
+                                                                               
                                                                // ウィジェット生成
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . ($i + 1);                                // ウィジェット識別用ユニークタグ
                                                                
@@ -4574,6 +4866,38 @@ class PageManager extends Core
                                        //              $widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
                                        
                                                        if ($this->isPageEditable){             // フロント画面ページ編集可能モードのとき
+                                                               // ウィジェット表示タイプによる表示制御
+                                                               $widgetStatusClass = '';// ウィジェットの状態表示クラス
+                                                               $widgetStatusLabelOption = '';          // ウィジェット状態表示ラベル
+                                                               $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+                                                               $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+                                                               if (!empty($controlType)){
+                                                                       switch ($controlType){
+                                                                               case 1:                 // ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+                                                                                       break;
+                                                                               case 2:                 // 非ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               if (!empty($pageState)){
+                                                                       switch ($pageState){
+                                                                               case 1:                 // トップ時のみ表示
+                                                                                       if (!$this->isPageTopUrl){
+                                                                                               $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS;               // ページトップ(サブページ内のトップ位置)でなければ非表示
+                                                                                               $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+                                                                                       }
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               
                                                                $configId = $this->pageDefRows[$i]['pd_config_id'];             // 定義ID
                                                                $serial = $this->pageDefRows[$i]['pd_serial'];          // シリアル番号
                                                                $hasAdmin = '0';                // 管理画面があるかどうか
@@ -4582,7 +4906,7 @@ class PageManager extends Core
                                                                if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1';  // 共通ウィジェットのとき
                                                                $m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
-                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget" rel="#m3editwidget" ' . $m3Option . '>' . $widgetContent . '</div>';
+                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
                                                        } else {
                                                //              $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
                                                //              $widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
@@ -4634,7 +4958,7 @@ class PageManager extends Core
                                                        
                                                        // ウィジェットの出力を取得
                                                        ob_clean();
-                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, 0/*タイトル出力なし*/);
+                                                       $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, 0/*タイトル出力なし*/);
                                                        $widgetContent = ob_get_contents();
 
                                                        $trimContent = trim($widgetContent);
@@ -4663,6 +4987,15 @@ class PageManager extends Core
                                                                                        $title = '';                    // タイトルは非表示
                                                                                }
                                                                        
+                                                                               // 強制的にタイトルを非表示にする場合はタイトルを修正
+                                                                               if (!empty($title) && $this->pageDefRows[$i]['wd_hide_title']){
+                                                                                       if ($this->isPageEditable){             // フロント画面ページ編集可能モードのとき
+                                                                                               $title = '[' . $title . ']';
+                                                                                       } else {
+                                                                                               $title = '';
+                                                                                       }
+                                                                               }
+                                                                               
                                                                                // Joomla用パラメータ作成
                                                                                $params = array();                              // ウィジェットごとの属性
                                                                                $widgetType = $this->pageDefRows[$i]['wd_type'];                // ウィジェットタイプ
@@ -4675,24 +5008,39 @@ class PageManager extends Core
                                                                                if ($style == self::WIDGET_STYLE_NAVMENU){              // ナビゲーションバーメニューはメニュータイプのウィジェットのみ実行
                                                                                        $moduleContent = '';
                                                                                        
-                                                                                       // ã\83¡ã\83\8bã\83¥ã\83¼ã\82¿ã\82¤ã\83\97ã\81®ã\82¦ã\82£ã\82¸ã\82§ã\83\83ã\83\88ã\81®ã\81¿å®\9fè¡\8c
+                                                                                       // ã\82¦ã\82£ã\82¸ã\82§ã\83\83ã\83\88ã\82¿ã\82¤ã\83\97ã\81\8cã\83¡ã\83\8bã\83¥ã\83¼ã\81®ã\81¨ã\81\8dã\81¯ã\83\8aã\83\93ã\82²ã\83¼ã\82·ã\83§ã\83³ã\83¡ã\83\8bã\83¥ã\83¼ã\82\92ç\94\9fæ\88\90
                                                                                        if ($widgetType == 'menu') $moduleContent = $render->getNavMenuContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
                                                                
                                                                                        // ナビゲーションバータイプで作成できないときはデフォルトの出力を取得
                                                                                        if (empty($moduleContent)) $moduleContent = $render->getModuleContents('xhtml', $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
                                                                                        $widgetContent = $moduleContent;
                                                                                } else {
-                                                                                       if (strcmp($position, 'main') == 0){// メイン部のとき
-                                                                                               // ウィジェットの内枠(コンテンツ外枠)を設定
-                                                                                               // ウィジェットの内枠はレンダーで設定
-                                                                                               //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
-                                                                                               $widgetContent = $render->getComponentContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
-                                                                                       } else {                // その他の位置のとき
-                                                                                               // ウィジェットの内枠(コンテンツ外枠)を設定
-                                                                                               // ウィジェットの内枠はレンダーで設定
-                                                                                               //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+                                                                                       // ウィジェットタイプに応じた処理を実行
+                                                                                       if ($widgetType == 'breadcrumb'){               // パンくずリスト
+                                                                                               $moduleContent = '';
+                                                                                               
+                                                                                               if (empty($launchWidgetTag)){                   // 遅延実行の場合はここでパンくずリストを作成しないで遅延実行時に行う
+                                                                                                       $moduleContent = $render->getBreadcrumbContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+                                                                                               } else {
+                                                                                                       $moduleContent = $launchWidgetTag;              // 遅延実行ウィジェットのタグのみ取得
+                                                                                               }
+                                                                                               
+                                                                                               // パンくずリストで作成できないときはデフォルトの出力を取得
+                                                                                               if (empty($moduleContent)) $moduleContent = $render->getModuleContents('xhtml', $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+                                                                                               $widgetContent = $moduleContent;
+                                                                                       } else {
+                                                                                               if (strcmp($position, 'main') == 0){// メイン部のとき
+                                                                                                       // ウィジェットの内枠(コンテンツ外枠)を設定
+                                                                                                       // ウィジェットの内枠はレンダーで設定
+                                                                                                       //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+                                                                                                       $widgetContent = $render->getComponentContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+                                                                                               } else {                // その他の位置のとき
+                                                                                                       // ウィジェットの内枠(コンテンツ外枠)を設定
+                                                                                                       // ウィジェットの内枠はレンダーで設定
+                                                                                                       //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
                                                                                        
-                                                                                               $widgetContent = $render->getModuleContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+                                                                                                       $widgetContent = $render->getModuleContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+                                                                                               }
                                                                                        }
                                                                                }
 /*                                                                             if (strcmp($position, 'main') == 0){// メイン部のとき
@@ -4750,6 +5098,38 @@ class PageManager extends Core
                                                        $widgetOuterClass .= ' ' . self::WIDGET_OUTER_CLASS_HEAD_POSITION . $position;  // ポジションブロッククラス
                                                        $widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
                                                        if ($this->isPageEditable){             // フロント画面ページ編集可能モードのとき
+                                                               // ウィジェット表示タイプによる表示制御
+                                                               $widgetStatusClass = '';// ウィジェットの状態表示クラス
+                                                               $widgetStatusLabelOption = '';          // ウィジェット状態表示ラベル
+                                                               $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+                                                               $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+                                                               if (!empty($controlType)){
+                                                                       switch ($controlType){
+                                                                               case 1:                 // ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+                                                                                       break;
+                                                                               case 2:                 // 非ログイン時のみ表示
+                                                                                       $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+                                                                                       $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               if (!empty($pageState)){
+                                                                       switch ($pageState){
+                                                                               case 1:                 // トップ時のみ表示
+                                                                                       if (!$this->isPageTopUrl){
+                                                                                               $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS;               // ページトップ(サブページ内のトップ位置)でなければ非表示
+                                                                                               $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+                                                                                       }
+                                                                                       break;
+                                                                               default:
+                                                                                       break;
+                                                                       }
+                                                               }
+                       
                                                                //$editInfo = 'widgetid:' . $this->pageDefRows[$i]['wd_id'];
                                                                $configId = $this->pageDefRows[$i]['pd_config_id'];             // 定義ID
                                                                $serial = $this->pageDefRows[$i]['pd_serial'];          // シリアル番号
@@ -4759,7 +5139,7 @@ class PageManager extends Core
                                                                if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1';  // 共通ウィジェットのとき
                                                                $m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
-                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget" rel="#m3editwidget" ' . $m3Option . '>' . $widgetContent . '</div>';
+                                                               $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
                                                        } else {
                                                                $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i;                              // ウィジェット識別用ユニークタグ
                                                                $widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
@@ -4798,6 +5178,9 @@ class PageManager extends Core
                                $contents .= '<div style="background-color:#eee;margin:2px;padding:10px;border:3px solid #f00;color:#700;">ポジション名: ';
                                $contents .= '<b>' . $position . '</b>';
                                $contents .= '</div>';
+                               
+                               // ポジションを保存
+                               if (!in_array($position, $this->defPositions)) $this->defPositions[] = $position;       // テンプレート上のポジション
                                break;
                        case 2:         // ポジション表示(ウィジェット付き)
                                $rev = '555';                   // データのリビジョン番号
@@ -4826,7 +5209,11 @@ class PageManager extends Core
                                $posHead = '';
                                // ナビゲーション型のポジションの場合はアイコン付加
                                //if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU;              // 特殊ポジションブロックのアイコン付加
-                               if ($style == self::WIDGET_STYLE_NAVMENU) $posHead = self::POS_HEAD_NAV_MENU;           // 特殊ポジションブロックのアイコン付加
+                               if ($style == self::WIDGET_STYLE_NAVMENU){
+                                       $posHead = self::POS_HEAD_NAV_MENU;             // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+                               } else if (strcasecmp($position, 'main') == 0){
+                                       $posHead = self::POS_HEAD_MAIN;         // 特殊ポジションブロックのアイコン付加(メイン型)
+                               }
                                $contents .= '<div id="' . $viewPosId . '" class="m3_widgetpos_box" m3="pos:' . $position . ';rev:' . $rev . ';">' . M3_NL;             // リビジョン番号を付加
                                $contents .= '<h2 class="m3_widgetpos_box_title">' . $posHead . $position . '</h2>' . M3_NL;
                                
@@ -4955,7 +5342,8 @@ class PageManager extends Core
                                
                // 実行コマンドを取得
                $cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
-               if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){          // ウィジェット付きポジション表示
+               if ($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                                     // 管理画面(ウィジェットなしポジション表示)のとき
+                       $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){              // 管理画面(ウィジェット付きポジション表示)のとき
                        return 1;               // ウィジェットが設定されていないポジション名を表示するために固定で値を返す
                }
                
@@ -5201,6 +5589,31 @@ class PageManager extends Core
                                $ret = $this->db->getPageDef($pageId, $pageSubId, $position2, $rows2);// 0レコードでも正常とする
                        }
 
+                       // ##### 該当するページのテンプレートタイプを取得 #####
+                       $templateType = 99;
+                       $templateGenerator = '';
+               
+                       // ページ用個別に設定されたテンプレートがある場合は取得
+                       $curTemplate = '';
+                       $line = $this->getPageInfo($pageId, $pageSubId);
+                       if (!empty($line)) $curTemplate = $line['pn_template_id'];
+
+                       // 取得できなければデフォルトを取得
+                       if (empty($curTemplate)){
+                               if ($pageId == $this->gEnv->getDefaultPageId()){                // 通常サイトのとき
+                                       $curTemplate = $this->gSystem->defaultTemplateId();
+                               } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){               // スマートフォン用サイトのとき
+                                       $curTemplate = $this->gSystem->defaultSmartphoneTemplateId();           // スマートフォン用デフォルトテンプレート
+                               }
+                       }
+                       
+                       // テンプレートのタイプを取得
+                       $ret = $this->db->getTemplate($curTemplate, $row);
+                       if ($ret){
+                               $templateType = $row['tm_type'];
+                               $templateGenerator = $row['tm_generator'];
+                       }
+
                        // 更新データを作成
                        // 更新対象のポジションブロック
                        echo '<div>' . M3_NL;
@@ -5211,18 +5624,54 @@ class PageManager extends Core
                                // ポジション名取得
                                $posName = str_replace(self::POSITION_TAG_HEAD, '', substr($updatepos[$i], 0, strlen($updatepos[$i]) - strlen(strrchr($updatepos[$i], "_"))));
                                if ($task == 'wmove' && $posName == $position2){
+                                       // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+                                       $style = '';
+                                       if ($templateGenerator == 'themler'){
+                                               if (strcasecmp($position2, 'hmenu') == 0){              // Joomla!v3テンプレート対応
+                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                               }
+                                       } else {
+                                               if (strcasecmp($position2, 'user3') == 0 ||             // ナビゲーションメニュー位置の場合
+                                                       strcasecmp($position2, 'position-1') == 0){             // Joomla!v2.5テンプレート対応
+                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                               }
+                                       }
+                                                                       
                                        // ウィジェット一覧外枠
                                        $posHead = '';
-                                       if (strcasecmp($position2, 'user3') == 0 || strcasecmp($position2, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU;              // 特殊ポジションブロックのアイコン付加
+                                       if ($style == self::WIDGET_STYLE_NAVMENU){
+                                               $posHead = self::POS_HEAD_NAV_MENU;             // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+                                       } else if (strcasecmp($position2, 'main') == 0){
+                                               $posHead = self::POS_HEAD_MAIN;         // 特殊ポジションブロックのアイコン付加(メイン型)
+                                       }
+                                       //if (strcasecmp($position2, 'user3') == 0 || strcasecmp($position2, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU;            // 特殊ポジションブロックのアイコン付加
                                        echo '<div id="' . $updatepos[$i] . '" class="m3_widgetpos_box" m3="pos:' . $position2 . ';rev:' . $rev . ';">' . M3_NL;                // リビジョン番号を付加
                                        echo '<h2 class="m3_widgetpos_box_title">' . $posHead . $position2 . '</h2>' . M3_NL;
                                
                                        // ウィジェット一覧出力
                                        echo $this->getWidgetList($pageId, $pageSubId, $widgetTagHead, $rows2);
                                } else {
+                                       // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+                                       $style = '';
+                                       if ($templateGenerator == 'themler'){
+                                               if (strcasecmp($position, 'hmenu') == 0){               // Joomla!v3テンプレート対応
+                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                               }
+                                       } else {
+                                               if (strcasecmp($position, 'user3') == 0 ||              // ナビゲーションメニュー位置の場合
+                                                       strcasecmp($position, 'position-1') == 0){              // Joomla!v2.5テンプレート対応
+                                                       $style = self::WIDGET_STYLE_NAVMENU;            // デフォルトはナビゲーション型
+                                               }
+                                       }
+                                       
                                        // ウィジェット一覧外枠
                                        $posHead = '';
-                                       if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU;                // 特殊ポジションブロックのアイコン付加
+                                       if ($style == self::WIDGET_STYLE_NAVMENU){
+                                               $posHead = self::POS_HEAD_NAV_MENU;             // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+                                       } else if (strcasecmp($position, 'main') == 0){
+                                               $posHead = self::POS_HEAD_MAIN;         // 特殊ポジションブロックのアイコン付加(メイン型)
+                                       }
+                                       //if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU;              // 特殊ポジションブロックのアイコン付加
                                        echo '<div id="' . $updatepos[$i] . '" class="m3_widgetpos_box" m3="pos:' . $position . ';rev:' . $rev . ';">' . M3_NL;         // リビジョン番号を付加
                                        echo '<h2 class="m3_widgetpos_box_title">' . $posHead . $position . '</h2>' . M3_NL;
                                
@@ -5352,8 +5801,8 @@ class PageManager extends Core
                        
                        $contents .= '<dl class="m3_widget m3_widget_sortable" id="' . $widgetTag . '" ' . $m3Option . ' >' . M3_NL;
                        $contents .= '<dt class="m3_widget_with_check_box ' . $sharedClassName . '"><div class="m3widgettitle">' . $widgetMark . $rows[$i]['wd_name'] . '</div>' . $operationMenu . '</dt>' . M3_NL;
-                       $contents .= '<dd><table style="width:100%;"><tr style="vertical-align:top;"><td style="width:35px;">' . $imageTag . '</td><td>' . $desc . '</td></tr></table><hr />' . M3_NL;
-                       $contents .= '<table style="width:100%;"><tr><td>' . $configName . '</td><td style="text-align:right;">' . $configImg . '</td></tr></table></dd>' . M3_NL;
+                       $contents .= '<dd><table style="width:100%;"><tr style="vertical-align:top;"><td style="width:35px;border:none;">' . $imageTag . '</td><td style="border:none;">' . $desc . '</td></tr></table><hr />' . M3_NL;
+                       $contents .= '<table style="width:100%;"><tr><td style="border:none;">' . $configName . '</td><td style="text-align:right;border:none;">' . $configImg . '</td></tr></table></dd>' . M3_NL;
                        $contents .= '</dl>' . M3_NL;
                }
                return $contents;
@@ -5362,14 +5811,15 @@ class PageManager extends Core
         * ウィジェット出力を処理
         *
         * @param string $position                      HTMLテンプレート上の書き出し位置
-        * @param int $index                    行番号
-        * @param array $fetchedRow             fetch取得した行
-        * @param string $style                 ウィジェットの表示スタイル(空の場合=Joomla!v1.0テンプレート用、空以外=Joomla!v1.5テンプレート用)
-        * @param string $titleTag      タイトル埋め込み用タグ(遅延ウィジェットの場合のみ作成)
-        * @param int $widgetHeaderType ウィジェットタイトルを出力方法(0=出力なし、1=Joomla!v1.0PC用出力、2=Joomla!v1.0携帯用出力)
-        * @return bool                                 処理を継続するかどうか(true=続行、false=中断)
+        * @param int $index                            行番号
+        * @param array $fetchedRow                     fetch取得した行
+        * @param string $style                         ウィジェットの表示スタイル(空の場合=Joomla!v1.0テンプレート用、空以外=Joomla!v1.5テンプレート用)
+        * @param string $launchWidgetTag       遅延ウィジェット埋め込み用タグ(遅延ウィジェットの場合のみ作成)
+        * @param string $titleTag              タイトル埋め込み用タグ(遅延ウィジェットの場合のみ作成)
+        * @param int $widgetHeaderType         ウィジェットタイトルを出力方法(0=出力なし、1=Joomla!v1.0PC用出力、2=Joomla!v1.0携帯用出力)
+        * @return bool                                         処理を継続するかどうか(true=続行、false=中断)
         */
-       function pageDefLoop($position, $index, $fetchedRow, $style, &$titleTag, $widgetHeaderType = 0)
+       function pageDefLoop($position, $index, $fetchedRow, $style, &$launchWidgetTag, &$titleTag, $widgetHeaderType = 0)
        {
                global $gEnvManager;
                global $gErrorManager;
@@ -5417,6 +5867,7 @@ class PageManager extends Core
                }
                
                // パラメータ初期化
+               $launchWidgetTag = '';          // 遅延ウィジェット埋め込み用タグ
                $titleTag = '';
                
                // ウィジェットID取得
@@ -5459,7 +5910,8 @@ class PageManager extends Core
                        $this->latelaunchWidgetParam[] = array($widgetId, $maxNo, $configId, $prefix, $serial, $style, $cssStyle, $title, $shared, $exportCss, $position, $index, $fetchedRow);
                        
                        // 遅延実行用タグを埋め込む
-                       echo self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END;
+                       $launchWidgetTag = self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END;                // 遅延ウィジェット埋め込み用タグ
+                       echo $launchWidgetTag;
                        
                        // タイトル用タグ作成
                        $titleTag = self::WIDGET_ID_TITLE_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TITLE_TAG_END;
@@ -5792,6 +6244,10 @@ class PageManager extends Core
        function setResponse($responseCode)
        {
                switch ($responseCode){
+                       case 400:                       // リクエストにエラーがあるとき
+                               header('HTTP/1.1 400 Bad request');
+                               header('Status: 400 Bad request');
+                               break;
                        case 403:                       // アクセス禁止のとき
                                header('HTTP/1.1 403 Forbidden');
                                header('Status: 403 Forbidden');
@@ -5880,6 +6336,9 @@ class PageManager extends Core
                if ($autoSsl){
                        $isSslPage = false;
                        if ($gEnvManager->isAdminUrlAccess($toUrl)){            // 管理画面へのアクセスのとき
+                               // ルートURLがSSLの場合は管理画面は常にSSL付き
+                               if ($gEnvManager->isRootUrlSsl()) $isSslPage = true;
+                               
                                // 管理画面のSSL状態を参照
                                if ($gEnvManager->getUseSslAdmin()) $isSslPage = true;          // 管理画面でSSLを使用するとき
                        } else {                // フロント画面へのアクセスのとき
@@ -5923,11 +6382,13 @@ class PageManager extends Core
                        if ($noMessage){
                                header('HTTP/1.1 302 Found(Moved Temporary)');          // ダイアログメッセージを抑止(ドコモ携帯端末用)
                        } else {
-                               header('HTTP/1.1 301 Moved Permanently');
+//                             header('HTTP/1.1 301 Moved Permanently');
+                               header('HTTP/1.1 302 Moved Temporary');                         // ドメインのURLをHTTPからHTTPに変更するとChromeで問題が発生したので301から302リダイレクトに変更(2018/4/30)
                        }
                } else {                // レスポンスコードが指定されている場合
                        switch ($responseCode){
                                case 301:
+                                       // ##### 301リダイレクトはChromeではブラウザにキャッシュされてしまうので注意 #####
                                        header('HTTP/1.1 301 Moved Permanently');
                                        break;
                                case 302:
@@ -6034,7 +6495,7 @@ class PageManager extends Core
                                                        }
                                                }
                                        }
-                                       
+                               
                                        // リダイレクト処理
                                        $this->redirect($redirectUrl);
                                        $success = true;                // ログイン成功
@@ -6646,6 +7107,15 @@ class PageManager extends Core
                return $this->pageInfo[$pageId . self::PAGE_ID_SEPARATOR . $pageSubId];
        }
        /**
+        * 現在のページのページ情報を取得
+        *
+        * @return array                        ページ情報レコード
+        */     
+       function getCurrentPageInfo()
+       {
+               return $this->currentPageInfo;
+       }
+       /**
         * 現在のページ情報からテンプレートIDを取得
         *
         * @param string $subTemplateId         テンプレートIDが取得できるときはサブページIDが返る
@@ -6750,7 +7220,11 @@ class PageManager extends Core
                        if (!isset($orderNo)) $orderNo = 100;
                        $sortParam[] = array('key' => $key, 'value' => $value, 'no' => $orderNo);
                }
-               usort($sortParam, create_function('$a,$b', 'return $a["no"] - $b["no"];'));
+//             usort($sortParam, create_function('$a,$b', 'return $a["no"] - $b["no"];'));
+               usort($sortParam, function($a, $b)
+               {
+                       return $a['no'] - $b['no'];
+               });
                
                // 文字列を作成
                $sortCount = count($sortParam);
@@ -6761,19 +7235,67 @@ class PageManager extends Core
                return $destParam;
        }
        /**
-        * URLで指定した画面のCSSファイルを取得
+        * DBからCSSファイル(テンプレート独自のCSSまたは外部のCSS)を取得
+        *
+        * @param string $templateId    テンプレートID
+        * @return bool                                 true=取得成功、false=取得失敗
+        */
+       function loadCssFiles($templateId = '')
+       {
+               if (empty($templateId)) $templateId = $this->gSystem->defaultTemplateId();              // PC画面デフォルトのテンプレートを取得
+
+               $ret = $this->db->getTemplate($templateId, $row);
+               if (!$ret) return false;
+               
+               // 編集エディタ用パラメータが初期化されていない場合は初期化
+               if (empty($row['tm_editor_param'])){
+                       // テンプレートを解析し、使用しているCSSファイルを取得
+                       $editorParamObj = $this->parseTemplate($templateId);
+                       
+                       // テンプレートの情報を更新
+                       $updateParam = array();
+                       $updateParam['tm_editor_param'] = serialize($editorParamObj);
+                       $ret = $this->db->updateTemplate($templateId, $updateParam);
+               } else {
+                       $editorParamObj = unserialize($row['tm_editor_param']);
+               }
+               
+               if (isset($editorParamObj)){
+                       $this->ckeditorCssFiles = array();
+                       $cssFiles = $editorParamObj->cssFiles;
+                       for ($i = 0; $i < count($cssFiles); $i++){
+                               $cssFile = $cssFiles[$i];
+                               
+                               if (strStartsWith($cssFile, '//')){             // URLが「//」で始まる外部ファイルの場合はそのまま追加
+                                       $this->ckeditorCssFiles[] = $cssFile;
+                               } else if (strStartsWith($cssFile, '/')){               // URLが「/」で始まる相対パスの場合はURLに変換
+                                       $this->ckeditorCssFiles[] = $this->gEnv->getAdminUrl(true/*adminディレクトリ削除*/) . $cssFile;
+                               } else {
+                                       $this->ckeditorCssFiles[] = $cssFile;
+                               }
+                       }
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+       /**
+        * URLで指定した画面のCSSファイル(テンプレート独自のCSSまたは外部のCSS)を取得
         *
         * @param string $url   取得画面のURL
         * @return                              なし
         */
        function loadCssFilesByUrl($url)
        {
+               // ##### cURLを使用する場合はセッションのブロックを解除する #####
+               session_write_close();
+               
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_USERAGENT, M3_SYSTEM_NAME . '/' . M3_SYSTEM_VERSION);          // ユーザエージェント
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         // 画面に出力しない
-               curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
-               curl_setopt($ch, CURLOPT_TIMEOUT, 5);
+               curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
+               curl_setopt($ch, CURLOPT_TIMEOUT, 3);
                curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());          // セッションを維持
                $content = curl_exec($ch);
                curl_close($ch);
@@ -6791,10 +7313,21 @@ class PageManager extends Core
                                if (strEndsWith($match[1], '.css')){            // ファイル名の拡張子が「css」の場合
                                        $urlArray[] = $match[1];
                                } else {
-                                       // typeã\81\8cã\80\8ctext/cssã\80\8dã\81®å ´å\90\88ã\82\82取得
+                                       // typeã\81\8cã\80\8ctext/cssã\80\8dã\82\92取得
                                        $attrPattern = '/type\s*=\s*[\'"]+(.+?)[\'"]/si';
                                        if (preg_match($attrPattern, $match[0], $attrMatch)){
-                                               if (strcasecmp($attrMatch[1], 'text/css') == 0) $urlArray[] = $match[1];
+                                               if (strcasecmp($attrMatch[1], 'text/css') == 0){
+                                                       $urlArray[] = $match[1];
+                                                       continue;
+                                               }
+                                       }
+                                       // relが「stylesheet」を取得
+                                       $attrPattern = '/rel\s*=\s*[\'"]+(.+?)[\'"]/si';
+                                       if (preg_match($attrPattern, $match[0], $attrMatch)){
+                                               if (strcasecmp($attrMatch[1], 'stylesheet') == 0){
+                                                       $urlArray[] = $match[1];
+                                                       continue;
+                                               }
                                        }
                                }
                        }
@@ -6802,16 +7335,17 @@ class PageManager extends Core
 
                // ifで制御されているCSSファイルを除く
                $delUrlArray = array();
-               $pattern = '/<!--\[if\b.*?\]>[\b]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\b]*<!\[endif\]-->/si';
+               $pattern = '/<!--\[if\b.*?\]>[\s\S]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\s\S]*<!\[endif\]-->/si';
                if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
                        foreach ($matches as $match) $delUrlArray[] = $match[1];
                }
 
-               // テンプレート独自のCSSまたは外部のCSSを取得する
+               // ##### テンプレート独自のCSSまたは外部のCSSを取得する #####
                $this->ckeditorCssFiles = array();
                $cssFiles = array_merge(array_diff($urlArray, $delUrlArray));   // CKEditor用のCSSファイル
                for ($i = 0; $i < count($cssFiles); $i++){
                        $cssFileUrl = $cssFiles[$i];
+                       $baseUrl = '';
                        if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
                                $baseUrl = $this->gEnv->getRootUrl();
                        } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
@@ -6820,14 +7354,16 @@ class PageManager extends Core
                        // パスを解析
                        $relativePath = str_replace($baseUrl, '', $cssFileUrl);         // ルートURLからの相対パスを取得
                        
-                       if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){           // テンプレートディレクトリの場合
+                       if (strStartsWith($relativePath, '//')){                // URLが「//」で始まる外部ファイルの場合
+                               $this->ckeditorCssFiles[] = $cssFileUrl;
+                       } else if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){            // テンプレートディレクトリの場合
                                $this->ckeditorCssFiles[] = $cssFileUrl;
                        } else if (strStartsWith($relativePath, '/')){          // テンプレートディレクトリ以外のディレクトリの場合
                        } else {                        // 外部URLの場合
                                $this->ckeditorCssFiles[] = $cssFileUrl;
                        }
                }
-               
+
                // テンプレートタイプを取得
                $pattern = '/var\s*M3_TEMPLATE_TYPE\s*=\s*(\d+?)\s*;/si';
                if (preg_match($pattern, $headContent, $matches)) $this->ckeditorTemplateType = $matches[1];                    // CKEditor用のテンプレートタイプ
@@ -6841,5 +7377,185 @@ class PageManager extends Core
        {
                return $this->ckeditorTemplateType;
        }
+       /**
+        * POST時のリファラーチェック
+        *
+        * @return bool         true=正常、false=不正
+        */
+/*     function _checkReferer()
+       {
+               global $gEnvManager;
+               global $gRequestManager;
+               
+               // リファラーをチェック
+               $referer        = $gRequestManager->trimServerValueOf('HTTP_REFERER');
+               $uri            = $gEnvManager->getCurrentRequestUri();
+               if (empty($referer) || $referer != $uri){
+                       return false;
+               } else {
+                       return true;
+               }
+       }*/
+       /**
+        * テンプレート画面を解析してCSSファイルやポジションの情報を取得
+        *
+        * @param string $templateId    テンプレートID
+        * @return                                              テンプレート情報オブジェクト
+        */
+       function parseTemplate($templateId)
+       {
+               // ##### cURLを使用する場合はセッションのブロックを解除する #####
+               session_write_close();
+
+               // テンプレートのURL
+               $url = $this->gEnv->getDefaultAdminUrl() . '?' . M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_SHOW_POSITION . '&template=' . $templateId;
+               
+               // テンプレート情報オブジェクト
+               $tmplateInfoObj = new stdClass;
+               $tmplateInfoObj->cssFiles       = array();              // テンプレートで使用されているCSSファイル
+               
+               $ch = curl_init();
+               curl_setopt($ch, CURLOPT_URL, $url);
+               curl_setopt($ch, CURLOPT_USERAGENT, M3_SYSTEM_NAME . '/' . M3_SYSTEM_VERSION);          // ユーザエージェント
+               curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         // 画面に出力しない
+               curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
+               curl_setopt($ch, CURLOPT_TIMEOUT, 3);
+               curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());          // セッションを維持
+               $content = curl_exec($ch);
+               curl_close($ch);
+
+               // HEADタグを取り出す
+               $urlArray = array();
+               $headContent = '';
+               $pattern = '/<head\b[^>]*?>(.*?)<\/head\b[^>]*?>/si';
+               if (preg_match($pattern, $content, $matches)) $headContent = $matches[0];
+
+               // CSSファイル取り出し
+               $pattern = '/<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>/si';
+               if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
+                       foreach ($matches as $match){
+                               if (strEndsWith($match[1], '.css')){            // ファイル名の拡張子が「css」の場合
+                                       $urlArray[] = $match[1];
+                               } else {
+                                       // typeが「text/css」を取得
+                                       $attrPattern = '/type\s*=\s*[\'"]+(.+?)[\'"]/si';
+                                       if (preg_match($attrPattern, $match[0], $attrMatch)){
+                                               if (strcasecmp($attrMatch[1], 'text/css') == 0){
+                                                       $urlArray[] = $match[1];
+                                                       continue;
+                                               }
+                                       }
+                                       // relが「stylesheet」を取得
+                                       $attrPattern = '/rel\s*=\s*[\'"]+(.+?)[\'"]/si';
+                                       if (preg_match($attrPattern, $match[0], $attrMatch)){
+                                               if (strcasecmp($attrMatch[1], 'stylesheet') == 0){
+                                                       $urlArray[] = $match[1];
+                                                       continue;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // ifで制御されているCSSファイルを除く
+               $delUrlArray = array();
+               $pattern = '/<!--\[if\b.*?\]>[\s\S]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\s\S]*<!\[endif\]-->/si';
+               if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
+                       foreach ($matches as $match) $delUrlArray[] = $match[1];
+               }
+
+               // テンプレート独自のCSSまたは外部のCSSを取得する
+               $cssFiles = array_merge(array_diff($urlArray, $delUrlArray));   // CKEditor用のCSSファイル
+               for ($i = 0; $i < count($cssFiles); $i++){
+                       $cssFileUrl = $cssFiles[$i];
+                       $baseUrl = '';
+                       if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
+                               $baseUrl = $this->gEnv->getRootUrl();
+                       } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
+                               $baseUrl = $this->gEnv->getSslRootUrl();                // SSLの場合
+                       }
+                       // パスを解析
+                       $relativePath = str_replace($baseUrl, '', $cssFileUrl);         // ルートURLからの相対パスを取得
+                       
+                       if (strStartsWith($relativePath, '//')){                // URLが「//」で始まる外部ファイルの場合
+                               $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+                       } else if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){            // テンプレートディレクトリの場合
+                               $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+                       } else if (strStartsWith($relativePath, '/')){          // テンプレートディレクトリ以外のディレクトリの場合
+                       } else {                        // 外部URLの場合
+                               $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+                       }
+               }
+               
+               // パスを相対パスに変換
+               for ($i = 0; $i < count($tmplateInfoObj->cssFiles); $i++){
+                       $cssFileUrl = $tmplateInfoObj->cssFiles[$i];
+                       
+                       $baseUrl = '';
+                       if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
+                               $baseUrl = $this->gEnv->getRootUrl();
+                       } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
+                               $baseUrl = $this->gEnv->getSslRootUrl();                // SSLの場合
+                       }
+                       // パスを解析
+                       $relativePath = str_replace($baseUrl, '', $cssFileUrl);         // ルートURLからの相対パスを取得
+                       
+                       // テンプレート内のCSSの場合は相対パスに変換
+                       if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){// テンプレートディレクトリの場合
+                               $tmplateInfoObj->cssFiles[$i] = $relativePath;
+                       } else {
+                               $tmplateInfoObj->cssFiles[$i] = $cssFileUrl;
+                       }
+               }
+               
+               // テンプレートのポジションを取得
+               $tmplateInfoObj->positions = array();
+               $pattern = '/var\s*M3_POSITION_DATA\s*=\s*[\'"]+(.+?)[\'"]/si';
+               if (preg_match($pattern, $headContent, $matches) && !empty($matches[1])){
+                       $tmplateInfoObj->positions = explode(',', $matches[1]);
+               }
+               return $tmplateInfoObj;
+       }
+       /**
+        * デフォルトのテンプレートからレイアウト用テンプレートで使用していないポジションを取得
+        *
+        * @return array                                ポジション名の配列
+        */
+       function getLayoutTemplatePosition()
+       {
+               $removePositions = array('header', 'extra1', 'extra2', 'brand', 'hmenu', 'user3', 'banner1', 'top1', 'top2', 'top3',
+                                                               'left', 'banner2', 'breadcrumb', 'user1', 'user2', 'banner3', 'main-top', 'main', 'main-bottom', 'banner4', 'user4', 'user5', 'banner5', 
+                                                               'right','bottom1', 'bottom2', 'bottom3', 'banner6', 'syndicate', 'copyright', 'footer');                // レイアウト用テンプレートに存在するので削除するポジション
+               
+               // URLパラメータからデフォルトのテンプレートを取得
+               $pageId = $this->gRequest->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+
+               $templateId = '';
+               if ($pageId == $this->gEnv->getDefaultPageId()){                // 通常サイトのとき
+                       $templateId = $this->gSystem->defaultTemplateId();
+               } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){               // スマートフォン用サイトのとき
+                       $templateId = $this->gSystem->defaultSmartphoneTemplateId();            // スマートフォン用デフォルトテンプレート
+               }
+
+               // テンプレート情報取得
+               $ret = $this->db->getTemplate($templateId, $row);
+               if (!$ret) return array();
+               if (empty($row['tm_editor_param'])) return array();
+       
+               // レイアウト用テンプレートに存在しないポジション名のみ返す
+               $editorParamObj = unserialize($row['tm_editor_param']);
+               if (isset($editorParamObj)){
+                       if (isset($editorParamObj->positions)){
+                               $srcArray = $editorParamObj->positions;
+                               $destArray = array();
+                               for ($i = 0; $i < count($srcArray); $i++){
+                                       $position = $srcArray[$i];
+                                       if (!in_array($position, $removePositions)) $destArray[] = $position;
+                               }
+                               return $destArray;
+                       }
+               }
+               return array();
+       }
 }
 ?>