<?php
/**
 * 
 */
class projBop_ViewClass extends Ethna_ViewClass
{
	/**
	 * フォームのタグを生成する (Override)
	 * 
	 * @access public
	 */
	function getFormInput($name, $params)
	{
	
/*	
		if ($this->af->isFreeze($name)) {
			echo $this->af->get($name);
		} else {
			parent::getFormInput($name, $params);
		}
*/
		
		$def = $this->_getHelperActionFormDef($name);
		if (is_null($def)) {
			return "";
		}

		if (isset($def['form_type']) == false) {
			$def['form_type'] = FORM_TYPE_TEXT;
		}
		
		switch ($def['form_type']) {
		case FORM_TYPE_BUTTON:
			$input = $this->_getFormInput_Button($name, $def, $params);
			break ;
		case FORM_TYPE_CHECKBOX:
			if ($this->af->isFreeze($name)) {
				$input = $this->_getFormValue_Checked($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Check($name, $def, $params);
			}
			break;
		case FORM_TYPE_FILE:
			$input = $this->_getFormInput_File($name, $def, $params);
			break;
		case FORM_TYPE_HIDDEN:
			$input = $this->_getFormInput_Hidden($name, $def, $params);
			break;
		case FORM_TYPE_PASSWORD:
			if ($this->af->isFreeze($name)) {
				$input = str_repeat('*', strlen($this->af->get($name))) . $this->_getFormInput_Hidden($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Password($name, $def, $params);
			}
			break;
		case FORM_TYPE_RADIO:
			if ($this->af->isFreeze($name)) {
				$input = $this->_getFormValue_Checked($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Radio($name, $def, $params);
			}
			break;
		case FORM_TYPE_SELECT:
			if ($this->af->isFreeze($name)) {
				$input = $this->_getFormValue_Select($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Select($name, $def, $params);
			}
			break;
		case FORM_TYPE_SUBMIT:
			$input = $this->_getFormInput_Submit($name, $def, $params);
			break;
		case FORM_TYPE_TEXTAREA:
			if ($this->af->isFreeze($name)) {
				$input = nl2br($this->af->get($name)) . $this->_getFormInput_Hidden($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Textarea($name, $def, $params);
			}
			break;
		case FORM_TYPE_TEXT:
		default:
			if ($this->af->isFreeze($name)) {
				$input = $this->af->get($name) . $this->_getFormInput_Hidden($name, $def, $params);
			} else {
				$input = $this->_getFormInput_Text($name, $def, $params);
			}
			break;
		}

		return $input;
	}
	
	/**
	 * チェックボックスの値を出力する
	 * 
	 * @access protected
	 */
	function _getFormValue_Checked($name, $def, $params)
	{
		// 元データを取得
		if (isset($params['source']) === false) {
			return;
		}
		$source = (array) $params['source'];
		
		// 表示用モード
		switch($params['resultMode']) {
		case 'only':
			$both = false;
			break;
		
		case 'both':
		case null:
		default:
			$both = true;
			break;
			
		}
		
		// チェックした 文字列
		$checkedMark = (isset($params['resultCheck']) === false) ? "(*)" : $params['resultCheck'];
		
		// チェックしてない文字列
		$uncheckedMark = (isset($params['resultUncheck']) === false) ? "( )" : $params['resultUncheck'];
		
		// separator
		$separator = (isset($params['resultSeparator']) === false) ? (array) '<br />' : (array) $params['resultSeparator'];
		
		// チェックされた値を表示
		$value = (array) $this->af->get($name);
		foreach ($source as $key=>$data) {
			$checked = in_array($key, $value);
			if (!$both && $checked) continue;
			
			$temp = $checked ? $checkedMark : $uncheckedMark;
			$temp .= $data['name'];
			$result[] = $temp;
		}
		
		// セパレータ
		$html = '';
		$sn = count($separator);
		for ($i=0, $n=count($result); $i<$n; $i++) {
			$html .= $result[$i];
			$html .= $separator[$i % $sn];
		}
		
		return $html;
	}
	
	
	/**
	 * チェックボックスのフォームタグを返す
	 * 
	 * @access protected
	 */
	function _getFormInput_Check($name, $def, $params)
	{
		// 元データの設定
		if (isset($params['source']) === false) {
			return;
		}
		$source = $params['source'];
				
		// エレメント間文字列の設定
		if (isset($params['separator']) === false) {
			$separator = (array) '<br />';
		} else {
			$separator = (array) $params['separator'];
		}
		
		// 不要な属性削除
		$unwantAttr = array(
			'source', 'separator', 'resultMode', 'resultCheck', 'resultUncheck', 'resultSeparator',
		);
		foreach ($unwantAttr as $attr) {
			unset($params[$attr]);
		}
		
		// ラベル用の属性設定
		foreach ($params as $key=>$value) {
			if (preg_match('/la_([a-z0-9]+$)/', $key, $usrAttr) === 1) {
				$labelTagUserAttr[$usrAttr[1]] = $value;
			}
		}
		
		// タグ生成
		foreach($source as $value=>$data) {
			$attr = array();
			$elementLabelTagUserAttr = array();
			
			$attr['type'] = 'checkbox';
			$attr['name'] = $name . '[]';
			$attr['value'] = $value;
			if (in_array($value, (array) $this->af->get($name)) === true) {
				$attr['checked'] = 'checked';
			}
			
			foreach ($data as $k=>$v) {
				if (preg_match('/la_([a-z0-9]+$)/', $k, $elemLabelAttr) === 1) {
					$elementLabelTagUserAttr[$elemLabelAttr[1]] = $value;
				}
			}
			
			if (isset($data['id']) === false) {
				$data['id'] = 'ethCheck_' . md5($name . $value);
			}
			$labelAttr['for'] = $data['id'];
			
			$temp = $this->_getFormInput_Html('input', $attr, array_merge($params, $data));
			$temp .= $this->_getFormInput_Html('label', $labelAttr, (array) array_merge($labelTagUserAttr, $elementLabelTagUserAttr), $data['name']);
			
			$tags[] = $temp;
		}
		
		// エレメント間文字列を付加しながら
		$html = '';
		$sn = count($separator);
		for ($i=0, $n=count($tags); $i<$n; $i++) {
			$html .= $tags[$i];
			if ($i != $n-1) {
				$html .= $separator[$i % $sn];
			}
		}
		
		return $html;
	}
	
	/**
	 * ラジオボタンのフォームタグを返す
	 * 
	 * @access protected
	 */
	function _getFormInput_Radio($name, $def, $params)
	{
		// 元データの設定
		if (isset($params['source']) === false) {
			return;
		}	
		$source = $params['source'];
		
		// エレメント間の文字列設定
		if (isset($params['separator']) === false) {
			$separator = (array) '&nbsp;';
		} else {
			$separator = (array) $params['separator'];
		}
		
		// 必要ないパラメータを削除
		// 不要な属性削除
		$unwantAttr = array(
			'source', 'separator', 'resultMode', 'resultCheck', 'resultUncheck', 'resultSeparator',
		);
		foreach ($unwantAttr as $attr) {
			unset($params[$attr]);
		}
		
		// ラベル用の属性設定
		foreach ($params as $key=>$value) {
			if (preg_match('/la_([a-z0-9]+$)/', $key, $usrAttr) === 1) {
				$labelTagUserAttr[$usrAttr[1]] = $value;
			}
		}
		
		// タグ生成
		foreach($source as $value=>$data) {
			$attr = array();
			$elementLabelTagUserAttr = array();
			$attr['type'] = 'radio';
			$attr['name'] = $name;
			$attr['value'] = $value;
			if ($this->af->get($name) == $value) {
				$attr['checked'] = 'checked';
			}
			
			// ラベル用の属性を抜き出す
			foreach ($data as $k=>$v) {
				if (preg_match('/la_([a-z0-9]+$)/', $k, $elemLabelAttr) === 1) {
					$elementLabelTagUserAttr[$elemLabelAttr[1]] = $v;
				}
			}
			
			// idが設定されていない場合は設定する
			if (isset($data['id']) === false) {
				$data['id'] = 'ethRadio_' . md5($name . $value);
			}
			$labelAttr['for'] = $data['id'];
			
			$temp = $this->_getFormInput_Html('input', $attr, array_merge($params, $data));
			$temp .= $this->_getFormInput_Html('label', $labelAttr, (array) array_merge($labelTagUserAttr, $elementLabelTagUserAttr), $data['name']);
			
			$tags[] = $temp;
		}
		
		// エレメント間文字列を付加しながら
		$html = '';
		$sn = count($separator);
		for ($i=0, $n=count($tags); $i<$n; $i++) {
			$html .= $tags[$i];
			if ($i != $n-1) {
				$html .= $separator[$i % $sn];
			}
		}
		
		return $html;
	}
	
	/**
	 * セレクタで選択した値を表示値で返す
	 * 
	 * @access protected
	 * @return string セレクタで選択した内容の表示名
	 */
	function _getFormValue_Select($name, $def, $params)
	{
		return $params['source'][$this->af->get($name)]['name'];
	}
	
	/**
	 * セレクタのフォームタグを返す
	 * 
	 * @access protected
	 */
	function _getFormInput_Select($name, $def, $params)
	{
		// ソース取得 (Ethna_SmartyPlugin - {select} に基本的に類似)
		if (isset($params['source']) === false) {
			return null;
		}
		$source = (array) $params['source'];
		unset($params['source']);
		
		// Select Tag, OptionTag用 属性設定 (sa_ で始まると selectタグ用, oa_ で始まると optionタグ用)
		foreach ($params as $key=>$value) {
			if (preg_match('/sa_([a-z0-9]+$)/', $key, $usrAttr) === 1) {
				$selectTagUserAttr[$usrAttr[1]] = $value;
			}
			
			if (preg_match('/oa_([a-z0-9]+$)/', $key, $usrAttr) === 1) {
				$optionTagUserAttr[$usrAttr[1]] = $value;
			} 
		}
		
		// 初期値設定
		if (isset($params['empty'])) {
			$empty = $params['empty'];
			unset($params['empty']);
			$attr['value'] = '';
			
			$options[] = $this->_getFormInput_Html('option', $attr, (array) $optionTagUserAttr, $empty);
		}
		
		// Optionタグ生成 Source内に個別に属性を割り振ることも可能
		foreach ($source as $value => $data) {
			$attr = array();
			$attr['value'] = $value;
			if ($this->af->get($name) == $value) {
				$attr['selected'] = 'selected';
			}
			
			$options[] = $this->_getFormInput_Html('option', $attr, (array) array_merge($optionTagUserAttr, $data), $data['name']);
		}
		
		// Selectタグ生成
		$r = array();
		$r['name'] = $name;
		$selector = $this->_getFormInput_Html('select', $r, (array) $selectTagUserAttr, '___OPTIONS___');
		
		// Optionタグを直接入れるとエスケープされるので置き換えで対応
		return str_replace('___OPTIONS___', implode("\n", $options), $selector);
	}
}
?>