<?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/skinDB.php');
require_once (LIB_PATH.'/common/templateDB.php');
class Admin_admin_skin_Index extends skinDB
{
	var $_p = 0;

	function prepare($view)
	{
		$this->_p = $this->getRequest('p') ? $this->getRequest('p') : 0;
		
		$this->_form = new HTML_QuickForm('search','post',$_SERVER['PHP_SELF'],'',null,true);
		$this->_form->addElement('file', 'installfile', '');//zipアップ用ボタン
		$this->_form->addElement('submit','BTNinstall',' 登録 ',array('id'=>'BTNinstall','class'=>'bBtnReg'));
		$this->_form->addRule('installfile','・テンプレートの圧縮ファイルを選択してください。','uploadedfile',null,'server');
		//$this->_form->addRule('installfile','・アップロードできるファイル形式はzipファイルのみとなっております。','mimetype',array("application/zip","application/x-zip-compressed"));
		//firefox3系にて ダウンロードしたzipファイルのmimeTypeがdownload/〜〜となったため廃止
		return null;
	}

	function perform($view)
	{
		//skin_use変更 v1.1aで廃止
		if($this->getRequest("BtnUseOff")||$this->getRequest("BtnUseOn")) {
			if(!check_token($_REQUEST["token"])) {
				$this->putTokenError();
			}
			$msg=null;
			$chg_skin_code = $this->getRequest("skin_code");
			$chg_skin_use = $this->getRequest("skin_use");
			if(is_numeric($chg_skin_code)&&is_numeric($chg_skin_use)){
				if(!$this->setSkinUse($chg_skin_code,$chg_skin_use)){
					$msg="保存に失敗しました";
				}
			} else {
				$msg="テンプレートコードが不明です。";
			}
			$this->_form->setElementError("",$msg);
		}
		
		//テンプレートアップロード
		if($this->getRequest("BTNinstall")) {
			if(!check_token($_REQUEST["token"])) {
				$this->putTokenError();
			}
			if($this->_form->validate()) {
				$upfile_name = explode(".", $_FILES["installfile"]["name"]);
				if(isset($upfile_name[1])&&$upfile_name[1] == "zip") {
					if (is_uploaded_file($_FILES['installfile']["tmp_name"])) {
						$fl = $this->_form->getElement('installfile');
						$result = $this->installSkin($fl,"installfile");
						if($result!=null) {
							$this->_form->setElementError("",$result);
						}
					} else {
						$this->_form->setElementError("","アップロードに失敗しました");
					}
				} else {
					$this->_form->setElementError("","・アップロードできるファイル形式はzipファイルのみとなっております。");
				}
			}
		} else if($this->getRequest("Btndel")) {//削除
			if(!check_token($_REQUEST["token"])) {
				$this->putTokenError();
			}
			$del_code = $this->getRequest('skin_code');
			if(is_numeric($del_code)) {
				$rtn = $this->delete($del_code);
			}
			if($rtn===true) {
				header("location:index.php");
			} else if($rtn===false){
				$this->_form->setElementError("","削除に失敗しました");
			} else {
				$this->_form->setElementError("",$rtn);
			}
		}
		
		$rtn = array();
		$list = $this->getList();
		$rtn = Pager(AD_PAGER_LIMIT, $this->_p, $list, $method='GET', $urlvar='p');
		
		
		//削除判定用に現在作成されているテンプレート一覧を取得
		$templateDB = new templateDB();
		$templatelist = array();
		$skin_code_ar = array();
		$templatelist = $templateDB->getList();
		if(is_array($templatelist) && count($templatelist)>0) {
			foreach($templatelist as $val) {
				$skin_code_ar[] = $val["skin_code"];
			}
		}
		foreach($rtn["pagedata"] as $key => $val) {
			if(!in_array($val["skin_code"],$skin_code_ar)) {
				$rtn["pagedata"][$key]["delflg"] = 1;
			}
		}
		
		if(is_array($rtn)) {
			foreach($rtn["pagedata"] as $key => $val) {
				if(is_file(TEMPLATE_PATH."/".$val["skin_path"]."/thum.jpg")){
					$rtn["pagedata"][$key]["thum"] = TEMPLATE_DIR."/".$val["skin_path"]."/thum.jpg";
				}
			}
		}
		//登録エラー時
		if(!empty($this->_form->_errors)) {
			$view->assign('ERROR',$this->_form->_errors);
			foreach($this->_form->_errors as $key => $val) {
				$this->_form->updateElementAttr($key, array("class"=>"err"));
			}
		}
		
		$view->assign('list', $rtn["pagedata"]);
		$view->assign('Pages', $rtn["pageNavi"]["all"]);
		
		$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($view);
		$this->_form->accept($renderer);
		$view->assign('form',$renderer->toArray());
		$view->assign("token", $this->getToken());
        return 'skin/index.tpl';
	}
	
	
	
	function installSkin($fl,$felename) {
		if (!is_dir(TEMPLATE_WORKPATH)) {
			if (!mkdir(TEMPLATE_WORKPATH, 0777)) {
				return "・保存先ディレクトリを作成できませんでした。";
			}
		}
		//workディレクトリにzipを保存
		if (!$fl->moveUploadedFile(TEMPLATE_WORKPATH, $_FILES[$felename]["name"])) {
			return "・ファイルの保存に失敗しました。";
		} else {
			$zipfilepath = TEMPLATE_WORKPATH."/".$_FILES[$felename]["name"];
			require_once("Archive/Zip.php");
			$objZip = new Archive_Zip($zipfilepath);
			//workディレクトリに展開し、path,セッティングファイルがあるか確認
			$tmp_path = str_replace(".zip","",$zipfilepath);
			$p_params = array ('add_path' => TEMPLATE_WORKPATH);
			if(!$objZip->extract($p_params)) {
				@unlink($zipfilepath);
				return "・zipファイルの解凍に失敗しました";
			}
			//config.incの確認
			if(!is_file($tmp_path."/config.inc")) {
				@unlink($zipfilepath);
				commonFile::AlldelDir($tmp_path);
				return "・テンプレート定義ファイル(config.inc)がありません。デザインテンプレートのzipファイルの内容を確認してください";
			}
			//インストール先のパス
			$inst_skin_path = TEMPLATE_PATH."/".basename($zipfilepath,".zip");
			//同じpathがいないかチェック
			if(is_dir($inst_skin_path)){
				//既に同じ名前のテンプレートが居る場合
				//既存のテンプレートのパス名を変更
				//新しいskin_path
				$cur_data = $this->getData(null,basename($zipfilepath,".zip"));
				$cur_data["skin_path"] = $cur_data["skin_path"]."_".date("YmdHis");
				$this->db->query('BEGIN');
				if(!$this->db->update("tbl_skin", $cur_data,"skin_code=".$cur_data["skin_code"])) {
					$this->db->query('ROLLBACK');
					@unlink($zipfilepath);
					commonFile::AlldelDir($tmp_path);
					return "・保存に失敗しました";
				}
				//ディレクトリ名変更
				if(!rename($inst_skin_path,TEMPLATE_PATH."/".$cur_data["skin_path"])) {
					$this->db->query('ROLLBACK');
					@unlink($zipfilepath);
					commonFile::AlldelDir($tmp_path);
					return "・既存ディレクトリの変更に失敗しました";
				}
				$this->db->query('COMMIT');
			}
			//DB保存
			require_once($tmp_path."/config.inc");
			$record = array("skin_code"=>$this->db->getKey("tbl_skin_skin_code"),
							"skin_name"=>$NAME,
							"skin_type"=>$TYPE,
							"skin_side"=>$SIDEBARAREA?1:0,
							"skin_ver"=>$VERSION,
							"skin_author"=>$AUTHOR,
							"skin_path"=>basename($zipfilepath,".zip"),
							"skin_use"=>1
							);
			
			$this->db->query('BEGIN');
			if(!$this->db->insert("tbl_skin",$record)) {
				$this->db->query('ROLLBACK');
				@unlink($zipfilepath);
				commonFile::AlldelDir($tmp_path);
				return "・保存に失敗しました";
			} else {
				//インストール先に解凍
				$p_params = array ('add_path' => TEMPLATE_PATH);
				$result = $objZip->extract($p_params);
				$this->db->query('COMMIT');
			}
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・新しいテンプレートを保存しました。";
		}

	}
	
}
?>
