<?php
/**
 * コンテナクラス
 *
 * PHP versions 5
 *
 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
 *
 * @package    Magic3 Framework
 * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
 * @copyright  Copyright 2006-2012 Magic3 Project.
 * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
 * @version    SVN: $Id: admin_s_contentContentWidgetContainer.php 4813 2012-03-31 17:20:32Z fishbone $
 * @link       http://www.magic3.org
 */
require_once($gEnvManager->getCurrentWidgetContainerPath() . '/admin_s_contentBaseWidgetContainer.php');
require_once($gEnvManager->getCurrentWidgetDbPath() . '/s_contentDb.php');

class admin_s_contentContentWidgetContainer extends admin_s_contentBaseWidgetContainer
{
	private $db;	// DB接続オブジェクト
	private $serialNo;		// 選択中の項目のシリアル番号
	private $serialArray = array();		// 表示されているコンテンツシリアル番号
	private $selectedItem = array();	// 選択中の項目
	private $completed;			// データ登録完了かどうか
	private $_menuId = 'main_menu';				// メインメニューID
	private $isExistsContent;		// コンテンツ項目が存在するかどうか
	const ICON_SIZE = 16;		// アイコンのサイズ
	const INC_INDEX = 1;		// メニュー項目表示順の増加分
	const ADMIN_WIDGET_ID = 'admin_main';		// 管理ウィジェットのウィジェットID
	const CONTENT_TYPE = 'smartphone';			// コンテンツタイプ
	const VIEW_CONTENT_TYPE = 'sc';		// 参照数カウント用
	const CALENDAR_ICON_FILE = '/images/system/calendar.png';		// カレンダーアイコン
	const ACTIVE_ICON_FILE = '/images/system/active.png';			// 公開中アイコン
	const INACTIVE_ICON_FILE = '/images/system/inactive.png';		// 非公開アイコン
	const MSG_UPDATE_CONTENT = 'コンテンツを更新しました';			// コンテンツ更新メッセージ
	const DEFAULT_SEARCH_KEY = '1';			// デフォルトの検索キー(更新日時)
	const DEFAULT_SEARCH_ORDER = '1';			// デフォルトの検索ソート順(降順)
	const DEFAULT_LIST_COUNT = 20;			// 最大リスト表示数
	
	/**
	 * コンストラクタ
	 */
	function __construct()
	{
		// 親クラスを呼び出す
		parent::__construct();
		
		// DBオブジェクト作成
		$this->db = new s_contentDb();
	}
	/**
	 * テンプレートファイルを設定
	 *
	 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
	 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param object         $param			任意使用パラメータ。そのまま_assign()に渡る
	 * @return string 						テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
	 */
	function _setTemplate($request, &$param)
	{
		$filename = '';
		$task = $request->trimValueOf('task');
		switch ($task){
			case 'content':		// コンテンツ管理
			default:
				$filename = 'admin_main.tmpl.html';
				break;
			case 'content_detail':		// 詳細画面
				$filename = 'admin_main_detail.tmpl.html';
				break;
			case 'add_to_menu':		// コンテンツへのリンクをメニュー項目に追加
				$filename = 'admin_list.tmpl.html';
				break;
		}
		return $filename;
	}
	/**
	 * テンプレートにデータ埋め込む
	 *
	 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param object         $param			任意使用パラメータ。_setTemplate()と共有。
	 * @return								なし
	 */
	function _assign($request, &$param)
	{
		$task = $request->trimValueOf('task');
		switch ($task){
			case 'content':		// コンテンツ管理
			default:
				$this->createList($request);
				break;
			case 'content_detail':		// 詳細画面
				$this->createDetail($request);
				break;
			case 'add_to_menu':		// コンテンツへのリンクをメニュー項目に追加
				$this->createAddToMenu($request);
				break;
		}
	}
	/**
	 * コンテンツ一覧画面作成
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param								なし
	 */
	function createList($request)
	{
		// ユーザ情報、表示言語
		$userId = $this->gEnv->getCurrentUserId();
		$this->langId = $this->gEnv->getDefaultLanguage();
		
		// 一覧表示数
		$maxListCount = self::DEFAULT_LIST_COUNT;
		
		// ##### 検索条件 #####
		$pageNo = $request->trimValueOf('page');				// ページ番号
		if (empty($pageNo)) $pageNo = 1;
		$searchKeyword = $request->trimValueOf('search_keyword');			// 検索キーワード
		$searchKey = $request->trimValueOf('search_key');			// 検索ソートキー
		if ($searchKey == '') $searchKey = self::DEFAULT_SEARCH_KEY;
		$searchOrder = $request->trimValueOf('search_order');			// 検索ソート順
		if ($searchOrder == '') $searchOrder = self::DEFAULT_SEARCH_ORDER;

		$act = $request->trimValueOf('act');
		if ($act == 'delete'){		// 項目削除の場合
			$listedItem = explode(',', $request->trimValueOf('seriallist'));
			$delItems = array();
			for ($i = 0; $i < count($listedItem); $i++){
				// 項目がチェックされているかを取得
				$itemName = 'item' . $i . '_selected';
				$itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
				
				if ($itemValue){		// チェック項目
					$delItems[] = $listedItem[$i];
				}
			}
			if (count($delItems) > 0){
				// 削除するコンテンツの情報を取得
				$delContentInfo = array();
				for ($i = 0; $i < count($delItems); $i++){
					$ret = $this->db->getContentBySerial($delItems[$i], $row);
					if ($ret){
						$newInfoObj = new stdClass;
						$newInfoObj->contentId = $row['cn_id'];		// コンテンツID
						$newInfoObj->name = $row['cn_name'];		// コンテンツ名前
						$delContentInfo[] = $newInfoObj;
					}
				}
				
				$ret = $this->db->delContentItem($delItems);
				if ($ret){		// データ削除成功のとき
					$this->setGuidanceMsg('データを削除しました');
					
					// キャッシュデータのクリア
					for ($i = 0; $i < count($delItems); $i++){
						$this->clearCacheBySerial($delItems[$i]);
					}
					
					// 運用ログを残す
					for ($i = 0; $i < count($delContentInfo); $i++){
						$infoObj = $delContentInfo[$i];
						$this->gOpeLog->writeUserInfo(__METHOD__, '汎用コンテンツ(スマートフォン)を削除しました。ID: ' . $infoObj->contentId, 2100, 'タイトル=' . $infoObj->name);
					}
				} else {
					$this->setAppErrorMsg('データ削除に失敗しました');
				}
			}
		} else if ($act == 'search'){		// 検索のとき
			$pageNo = 1;		// ページ番号初期化
		} else if ($act == 'selpage'){			// ページ選択
		}
		// コンテンツ総数を取得
		$totalCount = $this->db->getContentCount(self::CONTENT_TYPE, $this->langId, $searchKeyword, $searchKey, $searchOrder);

		// 表示するページ番号の修正
		$pageCount = (int)(($totalCount -1) / $maxListCount) + 1;		// 総ページ数
		if ($pageNo < 1) $pageNo = 1;
		if ($pageNo > $pageCount) $pageNo = $pageCount;
		$this->firstNo = ($pageNo -1) * $maxListCount + 1;		// 先頭番号
		
		// ページング用リンク作成
		$pageLink = '';
		if ($pageCount > 1){	// ページが2ページ以上のときリンクを作成
			for ($i = 1; $i <= $pageCount; $i++){
				if ($i == $pageNo){
					$link = '&nbsp;' . $i;
				} else {
					$link = '&nbsp;<a href="#" onclick="selpage(\'' . $i . '\');return false;">' . $i . '</a>';
				}
				$pageLink .= $link;
			}
		}
		
		// コンテンツリストを取得
		$this->db->searchContent(self::CONTENT_TYPE, $this->langId, $maxListCount, $pageNo, $searchKeyword, $searchKey, $searchOrder, array($this, 'itemListLoop'));
		if (!$this->isExistsContent) $this->tmpl->setAttribute('itemlist', 'visibility', 'hidden');// コンテンツ項目がないときは、一覧を表示しない
		
		// 画面にデータを埋め込む
		// 検索条件
		if (empty($searchKey)){			// コンテンツIDをキーにする場合
			$this->tmpl->addVar('_widget', 'search_content_id_checked', 'checked');
		} else {
			$this->tmpl->addVar('_widget', 'search_update_dt_checked', 'checked');
		}
		if (empty($searchOrder)){			// 昇順にソートするとき
			$this->tmpl->addVar('_widget', 'search_asc_checked', 'checked');
		} else {
			$this->tmpl->addVar('_widget', 'search_desc_checked', 'checked');
		}
		
		// 検索結果
		$this->tmpl->addVar("_widget", "page_link", $pageLink);
		$this->tmpl->addVar("_widget", "total_count", $totalCount);
		$this->tmpl->addVar("_widget", "search_keyword", $searchKeyword);	// 検索キーワード
		$this->tmpl->addVar('_widget', 'widget_id', $this->gEnv->getCurrentWidgetId());		// ウィジェットID
				
		// その他
		$this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
	}
	/**
	 * コンテンツ詳細画面作成
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param								なし
	 */
	function createDetail($request)
	{
		// ユーザ情報、表示言語
		$this->langId = $this->gEnv->getDefaultLanguage();
		
		// ウィンドウ表示状態
		$openby = $request->trimValueOf(M3_REQUEST_PARAM_OPEN_BY);
		
		$act = $request->trimValueOf('act');
		$this->serialNo = $request->trimValueOf('serial');		// 選択項目のシリアル番号
		$name = $request->trimValueOf('item_name');
		$html = $request->valueOf('item_html');		// HTMLタグを可能とする
		$key = $request->trimValueOf('item_key');		// 外部参照用キー
		$visible = ($request->trimValueOf('item_visible') == 'on') ? 1 : 0;		// チェックボックス
		$limited = ($request->trimValueOf('item_limited') == 'on') ? 1 : 0;		// チェックボックス
		$default = ($request->trimValueOf('item_default') == 'on') ? 1 : 0;		// チェックボックス
		$metaTitle = $request->trimValueOf('item_meta_title');		// ページタイトル名
		$metaDesc = $request->trimValueOf('item_meta_desc');			// ページ要約
		$metaKeyword = $request->trimValueOf('item_meta_keyword');	// ページキーワード
		$start_date = $request->trimValueOf('item_start_date');		// 公開期間開始日付
		if (!empty($start_date)) $start_date = $this->convertToProperDate($start_date);
		$start_time = $request->trimValueOf('item_start_time');		// 公開期間開始時間
		if (empty($start_date)){
			$start_time = '';					// 日付が空のときは時刻も空に設定する
		} else {
			if (empty($start_time)) $start_time = '00:00';		// 日付が入っているときは時間にデフォルト値を設定
		}
		if (!empty($start_time)) $start_time = $this->convertToProperTime($start_time, 1/*時分フォーマット*/);
		
		$end_date = $request->trimValueOf('item_end_date');		// 公開期間終了日付
		if (!empty($end_date)) $end_date = $this->convertToProperDate($end_date);
		$end_time = $request->trimValueOf('item_end_time');		// 公開期間終了時間
		if (empty($end_date)){
			$end_time = '';					// 日付が空のときは時刻も空に設定する
		} else {
			if (empty($end_time)) $end_time = '00:00';		// 日付が入っているときは時間にデフォルト値を設定
		}
		if (!empty($end_time)) $end_time = $this->convertToProperTime($end_time, 1/*時分フォーマット*/);
		
		$reloadData = false;		// データの再読み込み
		if ($act == 'add'){		// 項目追加の場合
			// 入力チェック
			$this->checkInput($name, '名前');

			// 期間範囲のチェック
			if (!empty($start_date) && !empty($end_date)){
				if (strtotime($start_date . ' ' . $start_time) >= strtotime($end_date . ' ' . $end_time)) $this->setUserErrorMsg('公開期間が不正です');
			}
			
			// エラーなしの場合は、データを登録
			if ($this->getMsgCount() == 0){
				// 保存データ作成
				if (empty($start_date)){
					$startDt = $this->gEnv->getInitValueOfTimestamp();
				} else {
					$startDt = $start_date . ' ' . $start_time;
				}
				if (empty($end_date)){
					$endDt = $this->gEnv->getInitValueOfTimestamp();
				} else {
					$endDt = $end_date . ' ' . $end_time;
				}
								
				$ret = $this->db->addContentItem(self::CONTENT_TYPE, 0, $this->langId, $name, ''/*説明*/, $html, $visible, $default, $limited, $key, 
													$metaTitle, $metaDesc, $metaKeyword, $startDt, $endDt, $newSerial);
				if ($ret){
					$this->setGuidanceMsg('データを追加しました');
					// シリアル番号更新
					$this->serialNo = $newSerial;
					$reloadData = true;		// データの再読み込み
					
					// 親ウィンドウを更新
					$this->gPage->updateParentWindow($this->serialNo);
					
					// コンテンツ更新情報をサーバへ登録
					$ret = $this->registContentInfoBySerial($this->serialNo, true/*新規*/);
					if ($ret) $this->setGuidanceMsg('更新情報をサーバへアップしました');
					
					// 運用ログを残す
					$ret = $this->db->getContentBySerial($this->serialNo, $row);
					if ($ret){
						$contentId = $row['cn_id'];		// コンテンツID
						$name = $row['cn_name'];		// コンテンツ名前
					}
					$this->gOpeLog->writeUserInfo(__METHOD__, '汎用コンテンツ(スマートフォン)を追加しました。ID: ' . $contentId, 2100, 'タイトル=' . $name);
				} else {
					$this->setAppErrorMsg('データ追加に失敗しました');
				}
			}
		} else if ($act == 'update'){		// 項目更新の場合
			// 入力チェック
			$this->checkInput($name, '名前');
			
			// 期間範囲のチェック
			if (!empty($start_date) && !empty($end_date)){
				if (strtotime($start_date . ' ' . $start_time) >= strtotime($end_date . ' ' . $end_time)) $this->setUserErrorMsg('公開期間が不正です');
			}
			
			// エラーなしの場合は、データを更新
			if ($this->getMsgCount() == 0){
				// 保存データ作成
				if (empty($start_date)){
					$startDt = $this->gEnv->getInitValueOfTimestamp();
				} else {
					$startDt = $start_date . ' ' . $start_time;
				}
				if (empty($end_date)){
					$endDt = $this->gEnv->getInitValueOfTimestamp();
				} else {
					$endDt = $end_date . ' ' . $end_time;
				}
				
				$ret = $this->db->updateContentItem(self::CONTENT_TYPE, $this->serialNo, $name, $html, $visible, $default, $limited, $key, 
														$metaTitle, $metaDesc, $metaKeyword, $startDt, $endDt, $newSerial);
				if ($ret){
					$this->setGuidanceMsg('データを更新しました');
					// シリアル番号更新
					$this->serialNo = $newSerial;
					$reloadData = true;		// データの再読み込み
					
					// キャッシュデータのクリア
					$this->clearCacheBySerial($this->serialNo);
					
					// 親ウィンドウを更新
					$this->gPage->updateParentWindow($this->serialNo);
					
					// コンテンツ更新情報をサーバへ登録
					$ret = $this->registContentInfoBySerial($this->serialNo);
					if ($ret) $this->setGuidanceMsg('更新情報をサーバへアップしました');
					
					// 運用ログを残す
					$ret = $this->db->getContentBySerial($this->serialNo, $row);
					if ($ret){
						$contentId = $row['cn_id'];		// コンテンツID
						$name = $row['cn_name'];		// コンテンツ名前
					}
					$this->gOpeLog->writeUserInfo(__METHOD__, '汎用コンテンツ(スマートフォン)を更新しました。ID: ' . $contentId, 2100, 'タイトル=' . $name);
				} else {
					$this->setAppErrorMsg('データ更新に失敗しました');
				}
			}				
		} else if ($act == 'delete'){		// 項目削除の場合
			if (empty($this->serialNo)){
				$this->setUserErrorMsg('削除項目が選択されていません');
			}
			// エラーなしの場合は、データを削除
			if ($this->getMsgCount() == 0){
				// 削除するコンテンツの情報を取得
				$ret = $this->db->getContentBySerial($this->serialNo, $row);
				if ($ret){
					$contentId = $row['cn_id'];		// コンテンツID
					$name = $row['cn_name'];		// コンテンツ名前
				}
				
				$ret = $this->db->delContentItem(array($this->serialNo));
				if ($ret){		// データ削除成功のとき
					$this->setGuidanceMsg('データを削除しました');
					$reloadData = true;		// データの再読み込み
					
					// キャッシュデータのクリア
					$this->clearCacheBySerial($this->serialNo);
					
					// 親ウィンドウを更新
					$this->gPage->updateParentWindow();
					
					// 運用ログを残す
					$this->gOpeLog->writeUserInfo(__METHOD__, '汎用コンテンツ(スマートフォン)を削除しました。ID: ' . $contentId, 2100, 'タイトル=' . $name);
				} else {
					$this->setAppErrorMsg('データ削除に失敗しました');
				}
			}
		} else {
			// コンテンツIDが設定されているとき(他ウィジェットからの表示)は、データを取得
			$contentId = $request->trimValueOf('contentid');		// コンテンツID
			if (empty($contentId)){
				if (empty($this->serialNo)){		// 新規項目追加のとき
					$visible = 1;		// 初期状態は表示
				} else {
					$reloadData = true;		// データの再読み込み
				}
			} else {
				// コンテンツを取得
				$ret = $this->db->getContentByContentId(self::CONTENT_TYPE, $contentId, $this->langId, $row);
				if ($ret){
					$this->serialNo = $row['cn_serial'];		// コンテンツシリアル番号
					$reloadData = true;		// データの再読み込み
				} else {
					$this->serialNo = 0;
				}
			}
		}
		if ($reloadData){		// データの再読み込み
			$ret = $this->db->getContentBySerial($this->serialNo, $row);
			if ($ret){
				$contentId = $row['cn_id'];		// コンテンツID
				$name = $row['cn_name'];		// コンテンツ名前
				$html = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $this->getUrl($this->gEnv->getRootUrl()), $row['cn_html']);				// HTML
				$key = $row['cn_key'];					// 外部参照用キー
				$update_user = $this->convertToDispString($row['lu_name']);// 更新者
				$update_dt = $this->convertToDispDateTime($row['cn_create_dt']);
			
				// 項目表示、デフォルト値チェックボックス
				$visible = $row['cn_visible'];
				$default = $row['cn_default'];
				$limited = $row['cn_user_limited'];		// ユーザ制限
				$metaTitle = $row['cn_meta_title'];		// ページタイトル名(METAタグ)
				$metaDesc = $row['cn_meta_description'];		// ページ要約(METAタグ)
				$metaKeyword = $row['cn_meta_keywords'];		// ページキーワード(METAタグ)
				$start_date = $this->convertToDispDate($row['cn_active_start_dt']);	// 公開期間開始日
				$start_time = $this->convertToDispTime($row['cn_active_start_dt'], 1/*時分*/);	// 公開期間開始時間
				$end_date = $this->convertToDispDate($row['cn_active_end_dt']);	// 公開期間終了日
				$end_time = $this->convertToDispTime($row['cn_active_end_dt'], 1/*時分*/);	// 公開期間終了時間
			} else {
				$this->serialNo = 0;
			}
		}
		
		// ### 入力値を再設定 ###
		$this->tmpl->addVar("_widget", "sel_item_name", $name);		// 名前
		$this->tmpl->addVar("_widget", "sel_item_html", $html);		// HTML
		$this->tmpl->addVar("_widget", "sel_item_key", $key);		// 外部参照用キー
		$this->tmpl->addVar("_widget", "meta_title", $metaTitle);		// ページタイトル名(METAタグ)
		$this->tmpl->addVar("_widget", "meta_desc", $metaDesc);		// ページ要約(METAタグ)
		$this->tmpl->addVar("_widget", "meta_keyword", $metaKeyword);		// ページキーワード(METAタグ)
		$this->tmpl->addVar("_widget", "update_user", $update_user);	// 更新者
		$this->tmpl->addVar("_widget", "update_dt", $update_dt);	// 更新日時
		$this->tmpl->addVar("_widget", "start_date", $start_date);	// 公開期間開始日
		$this->tmpl->addVar("_widget", "start_time", $start_time);	// 公開期間開始時間
		$this->tmpl->addVar("_widget", "end_date", $end_date);	// 公開期間終了日
		$this->tmpl->addVar("_widget", "end_time", $end_time);	// 公開期間終了時間
		
		// 項目表示、項目利用可否チェックボックス
		$visibleStr = '';
		if ($visible) $visibleStr = 'checked';
		$this->tmpl->addVar("_widget", "sel_item_visible", $visibleStr);
		$defaultStr = '';
		if ($default) $defaultStr = 'checked';
		$this->tmpl->addVar("_widget", "sel_item_default", $defaultStr);
		$limitedStr = '';
		if ($limited) $limitedStr = 'checked';
		$this->tmpl->addVar("_widget", "sel_item_limited", $limitedStr);
	
		// 選択中のシリアル番号を設定
		$this->tmpl->addVar("_widget", "serial", $this->serialNo);
			
		// パスの設定
		$this->tmpl->addVar('_widget', 'admin_url', $this->getUrl($this->gEnv->getDefaultAdminUrl()));// 管理者URL
		$previewUrl = $this->gEnv->getDefaultSmartphoneUrl() . '?' . M3_REQUEST_PARAM_CONTENT_ID . '=' . $contentId . '&' . M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_PREVIEW;
		$this->tmpl->addVar('_widget', 'preview_url', $previewUrl);// プレビュー用URL(一般画面)
		$this->tmpl->addVar('_widget', 'custom_value_task', 'usercustom');		// ユーザ定義値参照用
		$this->tmpl->addVar('_widget', 'admin_widget_id', self::ADMIN_WIDGET_ID);// ユーザ定義値参照用(管理ウィジェットのウィジェットID)
		$this->tmpl->addVar('_widget', 'calendar_img', $this->getUrl($this->gEnv->getRootUrl() . self::CALENDAR_ICON_FILE));	// カレンダーアイコン
		
		// ボタンの表示制御
		if (empty($this->serialNo)){		// 新規追加項目を選択しているとき
			$this->tmpl->addVar("_widget", "sel_item_id", '新規');			// コンテンツID
			$this->tmpl->setAttribute('add_button', 'visibility', 'visible');// 「新規追加」ボタン
			$this->tmpl->addVar('_widget', 'preview_btn_disabled', 'disabled');// プレビューボタン使用不可
		} else {
			$this->tmpl->addVar("_widget", "sel_item_id", $contentId);			// コンテンツID
			$this->tmpl->setAttribute('del_button', 'visibility', 'visible');// 「削除」ボタン
		}
		// 「戻る」ボタンの表示
		if ($openby == 'simple') $this->tmpl->setAttribute('cancel_button', 'visibility', 'hidden');		// 詳細画面のみの表示のときは戻るボタンを隠す
	}
	/**
	 * コンテンツへのリンクをメニューに追加するための画面作成
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param								なし
	 */
	function createAddToMenu($request)
	{
		// ユーザ情報、表示言語
		$userId = $this->gEnv->getCurrentUserId();
		$this->langId = $this->gEnv->getDefaultLanguage();

		$act = $request->trimValueOf('act');
		$contentId = $request->trimValueOf('contentid');		// コンテンツID
		$serialList = $request->trimValueOf('seriallist');
		if (!empty($serialList)){
			$listedItem = explode(',', $serialList);
			for ($i = 0; $i < count($listedItem); $i++){
				// 項目がチェックされているかを取得
				$itemName = 'item' . $i . '_selected';
				$itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
				if ($itemValue) $this->selectedItem[] = $listedItem[$i];// チェック項目
			}
		}
		if ($act == 'addtomenu'){			// メニューに項目を追加
			// URLの作成
			$url = M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END . '/' . M3_DIR_NAME_SMARTPHONE . '/' . M3_FILENAME_INDEX . '?contentid=' . $contentId;

			// コンテンツ名を取得
			$menutItemName = '';
			$ret = $this->db->getContentByContentId(self::CONTENT_TYPE, $contentId, $this->langId, $row);
			if ($ret) $menutItemName = $row['cn_name'];		// 名前は取得値を設定

			// メニュー項目追加
			for ($i = 0; $i < count($this->selectedItem); $i++){
				$ret = $this->db->addMenuItem($this->selectedItem[$i], $menutItemName, $url);
				if (!$ret) break;
			}
			if ($ret){
				// 親ウィンドウを更新
				$this->gPage->updateParentWindow();
				
				$this->setGuidanceMsg('メニューにリンクを追加しました');
				$this->completed = true;			// データ登録完了かどうか
			} else {
				$this->setAppErrorMsg('メニューのリンク追加に失敗しました');
			}
		}
		
		// メニューID選択メニュー作成
		$this->db->getMenuIdList(2/*スマートフォン用*/, array($this, 'menuIdListLoop'));
		
		$this->tmpl->addVar("_widget", "content_id", $contentId);// コンテンツID
		$this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
		
		// 一覧項目がないときは、一覧を表示しない
		if (!$this->isExistsContent) $this->tmpl->setAttribute('itemlist', 'visibility', 'hidden');
		
		if ($this->completed){// 	データ追加完了のとき
			$this->tmpl->addVar('_widget', 'add_disabled', 'disabled');// 「追加」ボタン
		}
	}
	/**
	 * 取得したデータをテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function itemListLoop($index, $fetchedRow, $param)
	{
		$serial = $this->convertToDispString($fetchedRow['cn_serial']);
		
		// 表示状態
		$visible = '';
		if ($fetchedRow['cn_visible']) $visible = 'checked';

		// ユーザ制限
		$limited = '';
		if ($fetchedRow['cn_user_limited']) $limited = 'checked';

		// デフォルト時の項目かどうか
		$default = '';
		if ($fetchedRow['cn_default']) $default = 'checked';
		
		// 対応言語を取得
		$lang = '';
		$ret = $this->db->getLangByContentId(self::CONTENT_TYPE, $fetchedRow['cn_id'], $rows);
		if ($ret){
			$count = count($rows);
			for ($i = 0; $i < $count; $i++){
				if ($this->gEnv->getCurrentLanguage() == 'ja'){	// 日本語の場合
					$lang .= $rows[$i]['ln_name'];
					if ($i != $count -1) $lang .= ',';
				} else {
					$lang .= $rows[$i]['ln_name_en'];
					if ($i != $count -1) $lang .= ',';
				}
			}
		}
		// 総参照数
		$totalViewCount = $this->gInstance->getAnalyzeManager()->getTotalContentViewCount(self::VIEW_CONTENT_TYPE, $serial);
		
		// 公開状況の設定
		$now = date("Y/m/d H:i:s");	// 現在日時
		$startDt = $fetchedRow['cn_active_start_dt'];
		$endDt = $fetchedRow['cn_active_end_dt'];
		
		$isActive = false;		// 公開状態
		if ($fetchedRow['cn_visible']) $isActive = $this->isActive($startDt, $endDt, $now);// 表示可能
		
		if ($isActive){		// コンテンツが公開状態のとき
			$iconUrl = $this->gEnv->getRootUrl() . self::ACTIVE_ICON_FILE;			// 公開中アイコン
			$iconTitle = '公開中';
		} else {
			$iconUrl = $this->gEnv->getRootUrl() . self::INACTIVE_ICON_FILE;		// 非公開アイコン
			$iconTitle = '非公開';
		}
		$statusImg = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
		$row = array(
			'index' => $index,													// 項目番号
			'serial' => $serial,			// シリアル番号
			'id' => $this->convertToDispString($fetchedRow['cn_id']),			// ID
			'name' => $this->convertToDispString($fetchedRow['cn_name']),		// 名前
			'lang' => $lang,													// 対応言語
			'view_count' => $totalViewCount,									// 総参照数
			'status' => $statusImg,												// 公開状況
			'update_user' => $this->convertToDispString($fetchedRow['lu_name']),	// 更新者
			'update_dt' => $this->convertToDispDateTime($fetchedRow['cn_create_dt']),	// 更新日時
			'visible' => $visible,											// メニュー項目表示制御
			'limited' => $limited,											// ユーザ制限
			'default' => $default											// デフォルト項目
		);
		$this->tmpl->addVars('itemlist', $row);
		$this->tmpl->parseTemplate('itemlist', 'a');
		
		// 表示中のコンテンツIDを保存
		$this->serialArray[] = $fetchedRow['cn_serial'];
		
		$this->isExistsContent = true;		// コンテンツ項目が存在するかどうか
		return true;
	}
	/**
	 * 取得したデータをテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function menuIdListLoop($index, $fetchedRow, $param)
	{
		$id = $fetchedRow['mn_id'];
		
		$checkStr = '';
		if (in_array($id, $this->selectedItem)) $checkStr = 'checked ';
		if ($this->completed) $checkStr .= 'disabled ';			// 追加完了のとき
		
		$row = array(
			'index' => $index,													// 項目番号
			'serial' => $this->convertToDispString($id),			// シリアル番号
			'id' => $this->convertToDispString($id),			// ID
			'name' => $this->convertToDispString($fetchedRow['mn_name']),		// 名前
			'check' => $checkStr		// チェック状態
		);
		$this->tmpl->addVars('itemlist', $row);
		$this->tmpl->parseTemplate('itemlist', 'a');
		
		// 表示中項目IDを保存
		$this->serialArray[] = $id;
		$this->isExistsContent = true;		// コンテンツ項目が存在するかどうか
		return true;
	}
	/**
	 * キャッシュデータをクリア
	 *
	 * @param int $serial		削除対象のコンテンツシリアル番号
	 * @return					なし
	 */
	function clearCacheBySerial($serial)
	{
		$ret = $this->db->getContentBySerial($serial, $row);		// コンテンツID取得
		if ($ret){
			$contentId = $row['cn_id'];		// コンテンツID
			$urlParam = array();
			$urlParam[] = M3_REQUEST_PARAM_CONTENT_ID . '=' . $contentId;		// コンテンツID
			$urlParam[] = M3_REQUEST_PARAM_CONTENT_ID_SHORT . '=' . $contentId;		// コンテンツID略式
			$this->clearCache($urlParam);
		}
	}
	/**
	 * 期間から公開可能かチェック
	 *
	 * @param timestamp	$startDt		公開開始日時
	 * @param timestamp	$endDt			公開終了日時
	 * @param timestamp	$now			基準日時
	 * @return bool						true=公開可能、false=公開不可
	 */
	function isActive($startDt, $endDt, $now)
	{
		$isActive = false;		// 公開状態

		if ($startDt == $this->gEnv->getInitValueOfTimestamp() && $endDt == $this->gEnv->getInitValueOfTimestamp()){
			$isActive = true;		// 公開状態
		} else if ($startDt == $this->gEnv->getInitValueOfTimestamp()){
			if (strtotime($now) < strtotime($endDt)) $isActive = true;		// 公開状態
		} else if ($endDt == $this->gEnv->getInitValueOfTimestamp()){
			if (strtotime($now) >= strtotime($startDt)) $isActive = true;		// 公開状態
		} else {
			if (strtotime($startDt) <= strtotime($now) && strtotime($now) < strtotime($endDt)) $isActive = true;		// 公開状態
		}
		return $isActive;
	}
	/**
	 * コンテンツ更新情報をサーバへ登録
	 *
	 * @param int $serial		コンテンツシリアル番号
	 * @param bool $isNew		新規または更新
	 * @return					なし
	 */
	function registContentInfoBySerial($serial, $isNew=false)
	{
		$ret = $this->db->getContentBySerial($serial, $row);		// コンテンツID取得
		if ($ret){
			$contentId = $row['cn_id'];		// コンテンツID
			$contentTitle = $row['cn_name'];		// コンテンツタイトル
			$contentLink = $url = $this->gEnv->getDefaultSmartphoneUrl() . '?contentid=' . $contentId;		// コンテンツリンク先
			$contentDt = $row['cn_create_dt'];		// コンテンツ更新日時
			
			$ret = $this->gInstance->getConnectManager()->registUpdateInfo(self::CONTENT_TYPE/*スマートフォン用汎用コンテンツ*/, ''/*送信先はデフォルトURL*/, ''/*デフォルトウィジェットに送信*/, 
								$this->gEnv->getCurrentWidgetId(), self::MSG_UPDATE_CONTENT, $contentTitle, $contentLink, $contentDt);
		}
		return $ret;
	}
}
?>
