<?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/>.
*/

require_once (LIB_PATH.'/common/pageunitDB.php');
require_once (LIB_PATH.'/common/unitDB.php');
class unitCommon extends Model
{
	var $_view = null;
	var $_pageu_code = null;
	var $_prev = false; //プレビューモード判定
	var $_dir = null; //ユニットライブラリ格納ディレクトリ名
	//ディレクトリ名は必ず本phpファイル名の拡張しを除いた部分を使用してください。
	
	//------ ユニット毎に必ず設定しなくてはならない変数 -------//
	var $_table = ""; //公開用テーブル名
	var $_tmptable = ""; //下書き用テーブル名 //必ず公開用テーブル名のうしろに_tmpをつけてください
	var $columns = array();
	var $_unit_data = array(); //ユニットマスタ情報
	var $_current_topurl = '';
	//ユニット共通変数
	//ユニット下の余白、array(プルダウン値=>クラス名)
	var $_unit_decoration = array(
		"btm_padding" => array(
								0=>"",
								1=>"hsNarrow",
								2=>"hsNormal",
								3=>"hsWide"
						),
		"btm_padding_set" => array(
								0=>"なし",
								1=>"狭い",
								2=>"標準",
								3=>"広い"
						),
		"bg_color" => array(	""=>"",
								0=>"",
								1=>"bgColor"
						),
		"bdr_type" => array(
								0=>"",
								1=>"bdSolid",
								2=>"bdDot"
						),
		"bdr_type_set" => array(
								0=>"なし",
								1=>"実線",
								2=>"点線"
						),
	);
	
	function unitCommon()
	{
		$this->__construct();
	}
	function __construct()
	{
		Model::__construct();
		$this->db = new DataBase();
	}
	
	/*
	 * 初期設定メソッド(必須)（共通）
	 * pageunitDBから呼ばれる
	 */
	function init($pageu_code, $unit_class_name, $view, $prev, $unit_data)
	{
		$this->_pageu_code = $pageu_code;
		//ディレクトリ取得
		$this->_dir = "/".$unit_class_name;
		$this->_view =& $view;
		$this->_prev = $prev; //下書きモードか公開モードか
		$this->_unit_data = $unit_data;
		if($this->_view) {
			$this->_current_topurl = $this->_view->get_template_vars('BINGOTOPURL');
		} else {
			$this->_current_topurl = BINGOTOPURL;
		}
	}
	
	/*
	 * データベースから取得したユニットデータから
	 * 装飾のためのclassnameを半角スペースつながり文字列を返します
	 * @param $record unit基本情報のDBデータ
	 * @return $str or null class="{$str}"として使用できます
	 */
	function getCommonUnitDecorationClassNames($record) {
		if(is_array($record)&&count($record)>0) {
			if($this->_unit_decoration["btm_padding"][$record["btm_padding"]]!=null){
				$classnames[] = $this->_unit_decoration["btm_padding"][$record["btm_padding"]];
			}
			if($this->_unit_decoration["bg_color"][$record["bg_color"]]!=null) {
				$classnames[] = $this->_unit_decoration["bg_color"][$record["bg_color"]];
			}
			if($this->_unit_decoration["bdr_type"][$record["bdr_type"]]!=null) {
				$classnames[] = $this->_unit_decoration["bdr_type"][$record["bdr_type"]];
			}
			if(is_array($classnames)&&count($cloassnames>0)) {
				$str = implode(" ",$classnames);
			} else {
				$str = $classnames;
			}
		}
		return $str;
	}
	
	/*
	 * ユニット共通フォームエレメントの作成
	 * @param $qckfrm (quikformobj)
	 */
	function setCommonDecorationElements() {
		$this->_form->setDefaults(array("btm_padding"=>2));
		$this->_form->addElement('checkbox', 'bg_color', null,'背景色を付ける',null);
		$this->_form->updateElementAttr('bg_color',array('value'=>1));
		$this->_form->addElement('select', 'bdr_type', null, $this->_unit_decoration["bdr_type_set"]);
		$this->_form->addElement('select', 'btm_padding', null, $this->_unit_decoration["btm_padding_set"]);
	}
	
	/*
	 * テーブル判定
	 */
	function getTbl() {
		$tbl = ($this->_prev) ? $this->_tmptable : $this->_table;
		return $tbl;
	}
	
	function setDisplayData() {
		return null;
	}
	
	/*
	 * 一般出力用htmlコード出力（必須）（共通）
	 * pageunitDBから呼ばれる
	 */
	function output($unit_type=null) {
		//ユニットタイプからユニットテンプレートのパスを判定
		switch($unit_type) {
			case 4:
			case 5:
				$unit_tplpath = EXT_UNITS_PATH;
				break;
			case 6:
					$unit_tplpath = MODULES_PATH."/".unitDB::getModuleUnitPath($this->_unit_data["extmodule_path"]);
				break;
			case 2:
			case 3:
			default :
				$unit_tplpath = UNITS_PATH;
				break;
		}
		$data = $this->setDisplayData();
		if($data!=null) {
			$this->_view->assign("data", $data);
			$classname = $this->getCommonUnitDecorationClassNames($data);
			if($classname!=null) {
				return '<div id="unit-'.$data["pageu_code"].'" class="'.$classname.'">'.$this->_view->fetch($unit_tplpath.$this->_dir.'/'.$this->_dir.'.tpl').'</div>';
			} else {
				return "<div id=\"unit-".$data["pageu_code"]."\">".$this->_view->fetch($unit_tplpath.$this->_dir."/".$this->_dir.".tpl")."</div>\n";
			}
		} else {
			return '<div  class="'.$this->_unit_decoration["btm_padding"][2].'">'.$this->_view->fetch($unit_tplpath.$this->_dir."/dummy.tpl")."</div>\n";
		}
	}
	
	function setDefault() {
	
	}
	function setElements() {
	
	}
	//ボタン作成
	function setButtons() {
		$buttons = array();
		$buttons[] = $this->_form->createElement('button','BTNback',' キャンセル ',array('id'=>'BTNback', 'class'=>'bBtnCancel', 'onClick'=>'parent.closeBox();'));
		$buttons[] = $this->_form->createElement('submit','BTNsave',' 保存 ',array('id'=>'BTNsave', 'class'=>'bBtnSave'));
		$this->_form->addGroup($buttons,"buttons", null, '&nbsp;&nbsp;');
	}
	
	function setRules() {
	
	}
	
	/*
	 * 管理画面用ユニット編集画面処理(必須)
	 * pageunitDBから呼ばれる
	 */
	function initAdmin()
	{
			//フォーム宣言
			$this->_form = new HTML_QuickForm('form','post',$_SERVER['PHP_SELF'],'',null,true);
			$this->setCommonDecorationElements();
			$this->setDefault();
			$this->_form->addElement('hidden','token', null);
			if(empty($this->_form->_submitValues)) {
				$this->_form->setDefaults(array('token'=>$this->getToken()));
			}
			$this->setElements();
			$this->setButtons();
			$this->setRules();
			$this->_form->registerRule('check_token', 'callback','check_token');
			$this->_form->addRule('token','・不正なページ遷移の為処理を停止しました。管理トップよりやり直してください','check_token',null,$this->erchk);
			$this->_form->addRule('token','・不正なページ遷移の為処理を停止しました。管理トップよりやり直してください','required',null,$this->erchk);


			//POST処理
			$req = $this->getRequest('buttons');
			if(isset($req['BTNsave'])&&$req['BTNsave']!=null) {
				if($this->_form->validate()){
					$post = $this->_form->getSubmitValues();
					$rtn = $this->doSave($post);
					if($rtn==null) {
						return '<script language="javascript">window.onload = function() {parent.closeBox();}</script>';
					} else {
						$this->_form->setElementError("",$rtn);
					}
				}
			}
			//登録エラー時
			if(!empty($this->_form->_errors)) {
				$this->_view->assign('ERROR',$this->_form->_errors);
				foreach($this->_form->_errors as $key => $val) {
					$this->_form->updateElementAttr($key, array("class"=>"err"));
				}
			}
			//フォームアサイン
			$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($this->_view);
			$this->_form->accept($renderer);
			$this->_view->assign('form',$renderer->toArray());
		
			//エディター利用
			global $unit_editor_type;
			if(is_file(BASE_PATH.'/usr-data/editor/'.$unit_editor_type[SEDITOR].".inc")) {
				require_once(BASE_PATH.'/usr-data/editor/'.$unit_editor_type[SEDITOR].".inc");
				$this->_view->assign('WYSIWYG_EDITOR',$wysiwyg_editor_html);
			}
			//ユニットタイプからユニットテンプレートのパスを判定
			switch($this->_unit_data["unit_type"]) {
				case 4:
				case 5:
					$unit_tplpath = EXT_UNITS_PATH;
					break;
				case 6:
						$unit_tplpath = MODULES_PATH."/".unitDB::getModuleUnitPath($this->_unit_data["extmodule_path"]);
					break;
				case 2:
				case 3:
				default :
					$unit_tplpath = UNITS_PATH;
					break;
			}
			return $this->_view->fetch($unit_tplpath.$this->_dir."/admin/form.tpl");
	}
	
	/*
	 * 公開処理（公開テーブルへのデータコピー処理）（共通）
	 * pageView.phpが呼びます、ロールバック、コミットはpageViewにて行うのでbooleanで返してください。
	 */
	function TmptoCommon($pageu_code,$db) {
		if(isset($this->_table)&&$this->_table!=null&&isset($this->_tmptable)&&$this->_tmptable!=null) {
			if(!$db->delete($this->_table, "pageu_code=".$pageu_code)) {
				return false;
			}
			$sql = "INSERT INTO ".$this->_table." (SELECT * FROM ".$this->_tmptable." where pageu_code = ".$pageu_code.")";
			return $db->query($sql);
		}
		return true;
	}
	
	/*
	 * ユニット複製処理（共通）
	 * page-unitlayout.phpより呼ばれます
	 * トランザクション処理は呼び元で行います
	 * @param $pageu_code コピー元のコード
	 * @param $target_pageu_code コピー先のコード
	 */
	function unitCopy($pageu_code, $target_pageu_code, $db) {
		if(isset($this->_tmptable)&&$this->_tmptable!=null && $pageu_code!="" && is_numeric($pageu_code)&&$target_pageu_code!="" && is_numeric($target_pageu_code)) {
			$sql = "select * from ".$this->_tmptable." where pageu_code = ".$pageu_code." limit 1";
			$result = $db->query($sql);
			if(!$result) {
				return false;
				exit();
			} 
			$record = $result->fetchRow(DB_FETCHMODE_ASSOC);
			$record["pageu_code"] = $target_pageu_code;
			if($db->insert($this->_tmptable,$record)) {
					return true;
					exit();
			}
		}
		return false;
	}
	
	/*
	 * ユニットマスタ情報からユニットのディレクトリを取得
	 */
	function getUnitURLFromUnitData($data) {
		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_DIR."/".$unitdir;
					break;
				case 4:
				case 5:
					return EXT_UNITS_DIR."/".$unitdir;
					break;
				case 6:
						if(isset($data["extmodule_path"])) {
							return MODULES_DIR."/".unitDB::getModuleUnitPath($data["extmodule_path"]).$unitdir;
						}
					break;
				default :
					break;
			}
		}
		return null;
	}
	
	function getUnitPathFromUnitData($data) {
		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."/".unitDB::getModuleUnitPath($data["extmodule_path"]).$unitdir;
						}
					break;
				default :
					break;
			}
		}
		return null;
	}
	
	function getModulePathFromUnitData($data) {
		if(is_array($data)&&isset($data["unit_type"])&&isset($data["unit_php_path"])){
			switch($data["unit_type"]) {
				case 6:
						if(isset($data["extmodule_path"])) {
							return MODULES_PATH."/".$data["extmodule_path"];
						}
					break;
				default :
					break;
			}
		}
		return null;
	}
	
}
?>