<?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	
 */
class unitDB extends Model
{
	var $_form = null;
	var $erchk = 'server';//quickformエラーチェックのフラグ'client'or'server;
	var $db=null;
/*
CREATE TABLE tbl_unit (
	unit_code			serial,			--ユニットマスタコード (拡張ユニットは5000番台)
	unit_type				integer not null,	--ユニット種別 1:container 2:design 3:function 4:拡張デザインユニット 5:拡張機能ユニット　6:モジュール専用ユニット
	unit_name			text not null,		--ユニット名（識別名称）
	unit_tpl_path			text not null,		--Smarty用tplファイルパス（ユニットフォルダ名.tplの形式にて記載）
	unit_php_path		text,				--プログラム本体ファイルパス（ユニットフォルダ名.phpの形式にて記載）
	unit_active			smallint default 1,	--削除0: 有効 1
	unit_order			integer default 0,	--表示順
--以下より 1.2で追加
	unit_cache			smallint default 0,	--キャッシュ機能対応　0:未対応（常に動的） 1:対応(書き出し機能可能)
	unit_extmodule_code	integer,			--拡張モジュールマスタコード、（0>:モジュール付属のユニットの場合、-1:単体拡張ユニットの場合, 0 or null:デフォルトユニット）
	unit_extmodule_private	smallint default 0,	--拡張モジュール専用のユニット 0:非専用 1:専用（ある固定のページにのみデフォルト設置、削除不可、配置移動可能）
	unit_cdate			timestamptz,		--拡張ユニットインストール日
	unit_ver				text,				--拡張ユニットバージョン
	primary key (unit_code)
);
*/
	
	//KVa => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角英数字を半角英数字に変換する
	//KVC => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角ひらがなを全角カタカナに変換する
	//n   => 全角数字を半角数字に変換する
	var $columns = array(
						array("column"=>"unit_code","conv"=>"n","tags"=>false),				//ユニットコード
						array("column"=>"unit_type","conv"=>"n","tags"=>false),				//ユニット種別 1:コンテナ 2:デザイン 3:機能
						array("column"=>"unit_name","conv"=>"KVa","tags"=>false),			//名前
						array("column"=>"unit_tpl_path","conv"=>"KVa","tags"=>false),		//tplファイルパス
						array("column"=>"unit_php_path","conv"=>"KVa","tags"=>false),		//プログラムファイルパス
						array("column"=>"unit_active","conv"=>"n","tags"=>false),
						array("column"=>"unit_order","conv"=>"n","tags"=>false),
						array("column"=>"unit_cache","conv"=>"n","tags"=>false),
						array("column"=>"unit_extmodule_code","conv"=>"n","tags"=>false),
						array("column"=>"unit_extmodule_private","conv"=>"n","tags"=>false),
						array("column"=>"unit_cdate","conv"=>"","tags"=>false),
						array("column"=>"unit_ver","conv"=>"KVa","tags"=>false)
						);
	
	/**
	 * コンストラクタ php4対応・・・
	 */
	function unitDB()
	{
		$this->__construct();
	}
	function __construct()
	{
		Model::__construct();
		$this->db = new DataBase();
	}
	
	//フォームエレメントの作成
	function setElements()
	{

	}
	//フォーム入力エラーチェックの設定
	function setRules()
	{


	}
	//ボタン作成
	function setButtons($frozen = false) {

	}
	
	/**
	 * コードからユニットマスタ情報取得
	 * @param unit_code
	 * @return	array
	 */
	function getData($unit_code)
	{
		if(isset($unit_code)&&is_numeric($unit_code)) {
			$result = $this->db->prepare("select * from tbl_unit 
														left outer join tbl_extmodule on extmodule_code = unit_extmodule_code
														where (extmodule_active = 1 or extmodule_active is null) and unit_code = ?",$unit_code);
			if($result != null) {
				return $result->fetchRow(DB_FETCHMODE_ASSOC);
			}
		}
		return null;
	}
	
	/*
	 * ユニットリスト取得のためのプルダウン生成
	 * ユニットレイアウト設定：
	 */
	function getUnitsMasterList() {
		global $m_unit_type;
		$data = array("2:0"=>$m_unit_type[2],
						"3:0"=>$m_unit_type[3],
						"0:0"=>"クリップボード");
		$sql = "select * from tbl_unit
left outer join tbl_extmodule on extmodule_code = unit_extmodule_code
where unit_active = 1 and (unit_type = 4 or unit_type = 5) 
	or (unit_type = 6 and extmodule_active = 1 and unit_extmodule_private = 0)
	order by unit_type, unit_extmodule_code";
		$result = $this->db->query($sql);
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
				switch($row["unit_type"]) {
					case 4:
					$data[$row["unit_type"].":0"] = $m_unit_type[$row["unit_type"]];
					break;
					case 5:
					$data[$row["unit_type"].":0"] = $m_unit_type[$row["unit_type"]];
					break;
					case 6:
					$data[$row["unit_type"].":".$row["unit_extmodule_code"]] = $row["extmodule_name"];
					break;
				}
			}
		}
		return $data;
	}
	
	/**
	 * ページレイアウト設定：
	 * ユニットレイアウト設定：
	 * ユニットタイプ、拡張モジュールコード別、ユニット一覧取得
	 * システムモジュール専用ユニットは取得しない
	 * @param string (unit_type : extmodule_code)
	 * @param limit 取得件数
	 * @param page　ページ番号
	 */
	function getUnits($type_and_code, $limit=10, $page=0){
		if(!isset($type_and_code)||$type_and_code == null) {
			return null;
		} else {
			global $m_unit_type;
			list($unit_type,$unit_extmodule_code)	= explode(":",$type_and_code);
			if(!is_numeric($unit_type)) {
				return null;
			}
			$unit_extmodule_code = is_numeric($unit_extmodule_code) ? $unit_extmodule_code : 0;
			if($unit_type!=0) {
				$sql = "select * from tbl_unit 
							left outer join tbl_extmodule on unit_extmodule_code = extmodule_code and extmodule_active = 1 
							where unit_active = 1 and unit_type = ".$unit_type;
				if($unit_extmodule_code>0) {
					$sql .= " and unit_extmodule_private = 0 and unit_extmodule_code = ".$unit_extmodule_code;
				}
				$sql .= " order by unit_order limit ".$limit." offset ".$page*$limit;
				$result = $this->db->query($sql);
				if($result != null) {
					while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
						if(isset($row) && is_array($row) && count($row) > 0) {
							if(isset($row["unit_type"])){
							 	$row["unit_type_name"] = $m_unit_type[$row["unit_type"]];
							}
							//ajaxで使うユニットdiv idのセット
							if(isset($row["unit_tpl_path"])){
							 	 $tmp = explode(".", $row["unit_tpl_path"]);
							 	 $row["unit_idname"] = $tmp[0];
							}
							$data[$row["unit_code"]] = $row;
						}
					}
				}
				return $data;
			} else { //コピー済みユニット取得
				$sql = "select * from tbl_unitclip
inner join tbl_unit on pageu_unit_code = unit_code
left outer join tbl_extmodule on unit_extmodule_code = extmodule_code
where unitclip_active=1 and unit_active=1 and (extmodule_active is null or extmodule_active = 1) ";
				$sql .= " order by pageu_code desc limit ".$limit." offset ".$page*$limit;
				$result = $this->db->query($sql);
				if($result != null) {
					while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
						if(isset($row) && is_array($row) && count($row) > 0) {
							if(isset($row["unit_type"])){
							 	$row["unit_type_name"] = $m_unit_type[$row["unit_type"]];
							}
							//ajaxで使うユニットdiv idのセット
							if(isset($row["unit_tpl_path"])){
							 	 $tmp = explode(".", $row["unit_tpl_path"]);
							 	 $row["unit_idname"] =$tmp[0];
							}
							$data[] = $row;
						}
					}
				}
				return $data;
			}
		}
	}
	
	/*
	 * ユニットフローティングウィンドウページング取得
	 * @param string (unit_type : extmodule_code)
	 * @param limit 取得件数
	 * @param page　ページ番号
	 */
	function getUnitPaging($type_and_code, $limit=10, $page=0){
		if(!isset($type_and_code)||$type_and_code == null) {
			return null;
		} else {
			list($unit_type,$unit_extmodule_code)	= explode(":",$type_and_code);
			if(!is_numeric($unit_type)) {
				return null;
			}
			$unit_extmodule_code = is_numeric($unit_extmodule_code) ? $unit_extmodule_code : 0;
			
			if($unit_type!=0) {
				$sql = "select count(*) from tbl_unit 
							left outer join tbl_extmodule on unit_extmodule_code = extmodule_code and extmodule_active = 1 
							where unit_active = 1 and unit_type = ".$unit_type;
				if($unit_extmodule_code>0) {
					$sql .= " and unit_extmodule_private = 0 and unit_extmodule_code = ".$unit_extmodule_code;
				}
				$count = $this->db->getOne($sql);
			
			} else { //コピー済みユニット取得
				$sql = "select count(*) from tbl_unitclip
inner join tbl_unit on pageu_unit_code = unit_code
left outer join tbl_extmodule on unit_extmodule_code = extmodule_code
where  unit_active=1 and unitclip_active=1 and (extmodule_active is null or extmodule_active = 1) ";
				$count = $this->db->getOne($sql);
			}

			//次へボタンの生成
			$html = null;
			if($count>($page+1)*$limit) {
				$html .= ' <input type="hidden" value="'.($page+1).'" name="unitmaster-next" id="unitmaster-next" />';
			}
			//戻るボタンの生成
			if($page!=0) {
				$html .= ' <input type="hidden" value="'.($page-1).'" name="unitmaster-prev" id="unitmaster-prev" />';
			}
			return $html;
		}
	}
	
	
	/**
	 * ユニットマスタ取得
	 * @param $type (array)
	 * @return 
	 */
	function getList($unit_type=null)
	{
		$sql = "select * from tbl_unit ";
		$sql .= "left outer join tbl_extmodule on extmodule_code = unit_extmodule_code "; //2008.11.13 v1.2
		$sql .= "where unit_active = 1 and (extmodule_active is null or extmodule_active = 1) ";
		$whrdata = null;
		$whrsql = null;
		if(is_array($unit_type)) {
			foreach($unit_type as $key=>$val) {
				if(is_numeric($val)){
					$whrdata[] = $val;
					$whrsql[] .= " unit_type = ?";
				}
			}
		}
		$order = " order by unit_type, unit_order";
		if(count($whrdata) > 0) {
			$sql .= " and (".implode(" or ", $whrsql)." ) ";
			$result = $this->db->prepare($sql.$order,$whrdata);
		} else {
			$result = $this->db->query($sql.$order);
		}
		$rtn=null;
		if($result != null) {
			//データ取得
			$data = array();
			global $m_unit_type;
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
				if(isset($row) && is_array($row) && count($row) > 0) {
					if(isset($row["unit_type"])){
					 	$row["unit_type_name"] = $m_unit_type[$row["unit_type"]];
					}
					//ajaxで使うユニットdiv idのセット
					if(isset($row["unit_tpl_path"])){
					 	 $tmp = explode(".", $row["unit_tpl_path"]);
					 	 $row["unit_idname"] = $tmp[0];
					}
					
					$data[$row["unit_code"]] = $row;
				}
			}
		}
		return $data;
	}

	/*
		ユニットが利用されているページを取得
	*/
	function getExtUnitUsingPages($code_ar) {
		if(!is_array($code_ar) || count($code_ar)<1) {
			return null;
		}
		$rtn = null;
		$str = implode(", ", $code_ar);
		//編集中ページ
		$sql = "SELECT sidx_title,cat_name,pidx_title,pidx_code, unit_code
FROM tbl_unit
INNER JOIN tbl_page_unit_tmp ON pageu_unit_code = unit_code
INNER JOIN tbl_page_idx_tmp ON pidx_code = pageu_pidx_code
INNER JOIN tbl_section_idx_tmp ON pidx_sidx_code = sidx_code
INNER JOIN tbl_category_tmp ON pidx_cat_code = cat_code
WHERE sidx_active = 1
AND cat_active = 1
AND pidx_active =1
AND unit_active =1
AND unit_code in (".$str.") 
GROUP BY sidx_title,cat_name,pidx_title,pidx_code, unit_code 
ORDER BY pidx_code";
		$result = $this->db->query($sql);
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
				$rtn["tmp"][$row["unit_code"]][$row["pidx_code"]] = $row["sidx_title"]."&gt;".$row["cat_name"]."&gt;".$row["pidx_title"];
			}
		}
		//公開ページ
		$sql = "SELECT sidx_title,cat_name,pidx_title,pidx_code, unit_code
FROM tbl_unit
INNER JOIN tbl_page_unit ON pageu_unit_code = unit_code
INNER JOIN tbl_page_idx ON pidx_code = pageu_pidx_code
INNER JOIN tbl_section_idx ON pidx_sidx_code = sidx_code
INNER JOIN tbl_category ON pidx_cat_code = cat_code
WHERE sidx_active = 1
AND cat_active = 1
AND pidx_active =1
AND unit_active =1
AND unit_code in (".$str.") 
GROUP BY sidx_title,cat_name,pidx_title,pidx_code, unit_code 
ORDER BY pidx_code";
		$result = $this->db->query($sql);
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
				$rtn["open"][$row["unit_code"]][$row["pidx_code"]] = $row["sidx_title"]."&gt;".$row["cat_name"]."&gt;".$row["pidx_title"];
			}
		}
		return $rtn;

	}
	
	
	
	/*
	 *  getModuleUnitPath
	 */
	function getModuleUnitPath($module_path) {
		return $module_path."/units/";
	}

	/*
	 * ユニットコードからユニットのディレクトリを取得
	 */
	function getUnitPathFromCode($unit_code) {
		//マスタ情報の取得
		$data = $this->getData($unit_code);
		if(is_array($data)&&isset($data["unit_type"])&&isset($data["unit_php_path"])){
			$unitdir = basename($data["unit_php_path"],".php");
			switch($data["unit_type"]) {
				case 2:
				case 3:
					return UNITS_PATH."/".$unitdir;
					break;
				case 4:
				case 5:
					return EXT_UNITS_PATH."/".$unitdir;
					break;
				case 6:
						if(isset($data["extmodule_path"])) {
							return MODULES_PATH."/".$this->getModuleUnitPath($data["extmodule_path"]).$unitdir;
						}
					break;
				default :
					break;
			}
		}
		return null;
	}
	
	/*
	 * ページコードからページ内にモジュール専用ユニット(unit_extmodule_private=1)があるかチェックする
	 * @param: ページID pidx_code
	 * @return 1: いる 0:いない
	 */
	function is_existPrivateExtUnit($pidx_code) {
		$count = 0;
		if($pidx_code!=null && is_numeric($pidx_code)) {
			$sql = "select count(*) from tbl_page_unit 
						inner join tbl_unit on unit_code = pageu_unit_code 
						where pageu_pidx_code = ".$pidx_code." and unit_extmodule_private = 1 and unit_active = 1 ";
			$count = $this->db->getOne($sql);
			$sql = "select count(*) from tbl_page_unit_tmp
						inner join tbl_unit on unit_code = pageu_unit_code 
						where pageu_pidx_code = ".$pidx_code." and unit_extmodule_private = 1 and unit_active = 1 ";
			$count += $this->db->getOne($sql);
			return $count;
		} else {
			return false;	
		}
	}
	
}
?>