<?php
/*
	Copyright(c) 2010 Shift Tech Inc. All Rights Reserved.
 	http://www.shift-tech.jp/

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * ページの構成コンテナDBアクセスクラス
 * @author 	yamamoto
 * @version	
 */
require_once (LIB_PATH.'/common/pageunitDB.php');
class pageContainerDB extends Model
{
	var $_form = null;
	var $erchk = 'server';//quickformエラーチェックのフラグ'client'or'server;
	var $db=null;
	var $_sidx_code = null;
	var $_cat_code = null;
	var $_pidx_code = null;
	//KVa => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角英数字を半角英数字に変換する
	//KVC => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角ひらがなを全角カタカナに変換する
	//n   => 全角数字を半角数字に変換する
/*
DROP TABLE IF EXISTS tbl_page_container CASCADE;
CREATE TABLE tbl_page_container (
	pagec_code			integer,	--コンテナ登録コード
	pagec_pidx_code		integer,	--記事コード
	pagec_type			text,		--コンテナタイプ コンテナはtplとしてそれぞれ保存XX_N.tplのXX_Nの部分をタイプ名とする Nはカラム数
	pagec_order			integer,	--表示順
	primary key (pagec_code)
);
CREATE SEQUENCE tbl_page_container_pagec_code;

DROP TABLE IF EXISTS tbl_page_container_tmp CASCADE;
CREATE TABLE tbl_page_container_tmp (
	pagec_code			integer,	--コンテナ登録コード
	pagec_pidx_code		integer,	--記事コード
	pagec_type			text,		--コンテナタイプ コンテナはtplとしてそれぞれ保存XX_N.tplのXX_Nの部分をタイプ名とする Nはカラム数
	pagec_order			integer,	--表示順
	primary key (pagec_code)
);
*/
	var $columns = array(
						array("column"=>"pagec_code","conv"=>"n","tags"=>false),		//コンテナ登録コード
						array("column"=>"pagec_pidx_code","conv"=>"n","tags"=>false),	//記事コード
						array("column"=>"pagec_type","conv"=>"a","tags"=>false),		//コンテナタイプ コンテナはtplとしてそれぞれ保存XXX.tplのXXXの部分をタイプ名とする
						array("column"=>"pagec_order","conv"=>"n","tags"=>false)		//表示順
						);
	/**
	 * コンストラクタ php4対応・・・
	 */
	function pageContainerDB()
	{
		$this->__construct();
	}
	function __construct()
	{
		Model::__construct();
		$this->db = new DataBase();
	}

	//フォームエレメントの作成
	function setElements()
	{
		$this->_form->addElement('hidden','token', null);
		if(empty($this->_form->_submitValues)) {
			$record["token"] = $this->getToken();
			$this->_form->setDefaults($record);
		}
		$this->_form->addElement('hidden','sidx_code', $this->getrequest("sidx_code"),array("id"=>"sidx_code"));
		$this->_form->addElement('hidden','cat_code', $this->getrequest("cat_code"),array("id"=>"cat_code"));
		$this->_form->addElement('hidden','pidx_code', $this->getrequest("pidx_code"),array("id"=>"pidx_code"));
		$this->_form->addElement('hidden','mprev', $this->getrequest("mprev"),array("id"=>"mprev"));
	}
	
	//フォーム入力エラーチェックの設定
	function setRules()
	{

		$this->_form->applyFilter('__ALL__','trim');
		$this->_form->_submitValues = DataBase::ConvColumnVals($this->_form->_submitValues,$this->columns); //ルールに従った値変換、タグの除去
		$this->_form->setJsWarnings('下記の項目が不正です。','');		
		
		$this->_form->addRule('sidx_code','・「セクションコード」が不明です。コンテンツ管理よりやり直してください','required',null,$this->erchk);
		$this->_form->addRule('cat_code','・「カテゴリコード」が不明です。コンテンツ管理よりやり直してください','required',null,$this->erchk);
		$this->_form->addRule('pidx_code','・「ページコード」が不明です。コンテンツ管理よりやり直してください','required',null,$this->erchk);
	}
	
	//ボタン作成
	function setButtons() {
		$buttons = array();
		//$buttons[] = $this->_form->createElement('submit','BTNback','もどる',array('id'=>'BTNback'));
		$buttons[] = $this->_form->createElement('submit','BTNsave','保存する',array('id'=>'BTNsave'));
		$this->_form->addGroup($buttons,"buttons", null, '&nbsp;&nbsp;');
	}

	/**
	 * ページコードからコンテナ構成リスト取得
	 * @param pidx_code
	 * @return	array
	 */
	function getData($pidx_code, $prev=true)
	{
		$tbl = ($prev)?"tbl_page_container_tmp":"tbl_page_container";
		$rtn = array();
		if(isset($pidx_code)&&is_numeric($pidx_code)) {
			$sql = "select * 
					from ".$tbl." 
					where pagec_pidx_code = ? order by pagec_order";
			$result = $this->db->prepare($sql,$pidx_code);
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[] = $row;
			}
		}
		return $rtn;
	}

	//データ保存
	// return null == 成功、　エラー時はメッセージを返す
	function doSave()
	{
		if(!is_array($_SESSION["page_container"]) || !(count($_SESSION["page_container"])>0)) {
			return "・コンテナユニットが入力されていません。";
		}
		//updateかinsertかdeleteかを判断するため、DBよりデータを取得
		$savedlist = $this->getData($this->_pidx_code);
		//idだけの配列に変換
		foreach($savedlist as $key=>$val) {
			$saved_ids[] = $val["pagec_code"];
		}
		
		$this->db->query('BEGIN');
		$savedcmp_ids = array(); //保存、更新したidの保存
		//セッションデータの解析
		foreach($_SESSION["page_container"] as $key => $val) {
			//保存用レコードの作成
			$record = array();
			foreach($this->columns as $col) {
				if(isset($val[$col["column"]])){
					$record[$col["column"]] = $val[$col["column"]];
				} else {
					$record[$col["column"]] = null;
				}
			}
			//v1.2
			if($record["pagec_code"]<=0) {
				//新規
				//セッション内のpagec_codeには新規コンテナユニットの場合は0以下が入っているのでその場合はnextvalを取得する
				$record["pagec_code"] = $this->db->getKey("tbl_page_container_pagec_code");//登録ID
				if(!$this->db->insert("tbl_page_container_tmp",$record)) {
					$this->db->query('ROLLBACK');
					return "・データの保存に失敗しました";
				}
			} else if(is_array($saved_ids) && in_array($record["pagec_code"],$saved_ids)) {
				//更新
				if(!$this->db->update("tbl_page_container_tmp",$record, "pagec_code = ".$record["pagec_code"])) {
					$this->db->query('ROLLBACK');
					return "・データの保存に失敗しました";
				}
			}
			//保存処理を行ったidを保存しておく
			$savedcmp_ids[] = $record["pagec_code"];
		}
		//削除処理
		//保存するidがDB内にいなければ削除処理
		 if(is_array($saved_ids) && count($saved_ids)>0) {
			foreach($saved_ids as $key=>$val){
				 if(!in_array($val, $savedcmp_ids)) {
				 	if(!$this->db->delete("tbl_page_container_tmp",  "pagec_code = ".$val)) {
						$this->db->query('ROLLBACK');
							return "・既存データの削除に失敗しました";
					}
					//コンテナデータにリンクされているユニット配置情報の削除
					if(!$this->db->delete("tbl_page_unit_tmp", "pageu_pidx_code=".$this->_pidx_code." and pageu_pagec_code=".$val)) {
						$this->db->query('ROLLBACK');
						return "・既存データの削除に失敗しました";
					}
			 	}
			 }
		 }
		$this->db->query('COMMIT');
		return null;
	}

	function ContainerAdminmakeHTML($view, $container, $unit) {
		$html=null;
		$pageunitDB = new pageunitDB();
		if(is_array($container)) {
			foreach($container as $key => $val) {
				$data = array();
				for($i=0;$i<$this->getMaxColumn($val["pagec_type"]);$i++) {
					$unithtml_ar = array();
					if(is_array($unit[$val["pagec_code"]][$i])) {
						$unithtml_ar =  $pageunitDB->makeUnitListHTML($view,$unit[$val["pagec_code"]][$i],$prev=true);
						foreach($unithtml_ar as $ukey => $uval) {
							$data[$i] .= $uval;
						}
					}
				}
				$view->assign("data",$data);
				//$html.= '<li id="addunit_'.$val["pagec_code"].'" class="addunit" onmouseover=\'Element.show("addunit_'.$val["pagec_code"].'-handle"); \'onmouseout=\'Element.hide("addunit_'.$val["pagec_code"].'-handle");\'>
				//		<div id="addunit_'.$val["pagec_code"].'-handle" class="handles" style="text-align:center;font-size:13px;width:50%;position:absolute;background-color:#000;display:none;color:#fff;padding:5px 0px 5px 0px">ここをドラックすると移動できます</div>'.$view->fetch(PAGEC_PATH.$val["pagec_type"].".tpl").'</li>'."\n";
				$addunit_idname = 'addunit_'.$val["pagec_code"];
				//$html.= '<li id="'.$addunit_idname.'" class="addunit" onmouseover=\'Position.clone($("'.$addunit_idname.'"), $("'.$addunit_idname.'-handle"));Element.show("'.$addunit_idname.'-handle");\'>
				//		<div id="'.$addunit_idname.'-handle" class="handles" style="position:absolute;z-index:100;background-color:#fff;-moz-opacity: 0.0;opacity:.0;filter: alpha(opacity=0);display:none;">&nbsp;</div>'.$view->fetch(PAGEC_PATH.$val["pagec_type"].".tpl").'</li>'."\n";
				$html.= '<li id="'.$addunit_idname.'" class="addunit">
							<div class="handles1" id="'.$addunit_idname.'-handle"><div class="unitDelete"><a href="#noscript" onClick="ConfunitDel(\''.$addunit_idname.'\');" title="このユニットを削除する">削除</a></div></div>
							'.$view->fetch(PAGEC_PATH.$val["pagec_type"].".tpl").'
							<div class="handles2">&nbsp;</div>
							</li>'."\n";
			}
		}
		$html .= '<script type="text/javascript">//<![CDATA'."\n";
		$html .= 'Sortable.destroy("items")'."\n";
		$html .= 'Sortable.create("items", {tag:"li",dropOnEmpty:true, constraint:false,onUpdate:function(){getParams()}});'."\n";
		$html .= '//]]></script>'."\n";
		return $html;
	}
	
	
	//pagec_typeからカラム数取得処理
	function getMaxColumn($pagec_type) {
		$column = 0;
		if(isset($pagec_type)) {
			list($trash,$column) = explode("_", $pagec_type);
		}
		return $column;
	}
}
?>