<?php
/**
* デフォルトのフォームモデル
*
* PHP version 5
*
* @package    form_models
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
abstract class DefaultFormModel extends CharcoalComponent implements IFormModel
{
	private $_model_id;
	private $_class_name;
	private $_class_vars;
	private $_annotations;

	/*
	 *	コンストラクタ
	 */
	public function __construct()
	{
		parent::__construct();

		$this->_class_name = get_class($this);
		$this->_class_vars = get_class_vars($this->_class_name);

		$this->_annotation_list = array();
		foreach( $this->_class_vars as $key => $var ){
			if ( strpos($var,'@') !== FALSE ){
				$this->_annotations[$key] = AnnotationUtil::parse( $key, $var );
			}
		}
	}

	/*
	 *   フォーム固有のDTOを作成
	 */
	public function createDTO()
	{
		return new DTO();
	}

	/**
	 * モデルIDを設定
	 */
	public function setModelID( $model_id )
	{
		$this->_model_id = $model_id;
	}

	/**
	 * モデルIDを取得
	 */
	public function getModelID()
	{
		return $this->_model_id;
	}

	/*
	 *	フォーム名を取得
	 */
	public function getFormName()
	{
		if ( property_exists($this,'___form_name') ){
			$table_name = $this->___form_name;
		}
		else{
			$table_name = $this->_class_name;
		}
		return $table_name;
	}

	/*
	 *   action属性を取得
	 */
	public function getAction()
	{
		return $this->getFormAnnotationValue( s('action') );
	}

	/*
	 *   action属性を設定
	 */
	public function setAction( String $action )
	{
		$this->setFormAnnotationValue( s('action'), $action );
	}

	/**
	 * フィールドが存在するか
	 */
	public function fieldExists( String $field_name )
	{
		return isset($this->_class_vars[ "$field_name" ]);
	}

	/*
	 *   フィールド名一覧を取得
	 */
	public function getFieldList()
	{
		$result = array();

		$annotations = $this->_annotations;
		if ( $annotations ){
			foreach( $annotations as $field => $annot_list ){
				foreach( $annot_list as $annot ){
					// @fieldが指定されていたらフィールド
					if ( $annot->getName()->equals( s('field') ) && $annot->getValue()->equals( s('') ) ){
						$result[] = $field;
					}
				}
			}
		}

		return $result;
	}

	/*
	 *   入力コントロール一覧を取得
	 */
	public function getInputList()
	{
		$result = array();

		$annotations = $this->_annotations;
		if ( $annotations ){
			foreach( $annotations as $field => $annot_list ){
				foreach( $annot_list as $annot ){
					// @inputが指定されていたらフィールド
					if ( $annot->getName()->equals( s('input') ) && $annot->getValue()->equals( s('') ) ){
						$result[] = $field;
					}
				}
			}
		}

		return $result;
	}

	/*
	 *   アノテーションを取得
	 */
	public function getAnnotation( String $field, String $annotation_name )
	{
		$annot_map = $this->getAnnotationMap( $field );
		if ( is_null($annot_map) || !isset($annot_map["$annotation_name"]) ){
			return NULL;
		}
		$annot = $annot_map["$annotation_name"];
		return $annot;
	}

	/*
	 *   指定したフィールドのアノテーションマップを取得
	 */
	public function getAnnotationMap( String $field )
	{
		if ( !isset($this->_annotations["$field"]) ){
			return NULL;
		}
		return $this->_annotations["$field"];
	}

	/*
	 *   アノテーション設定値を取得
	 */
	public function getAnnotationValue( String $field, String $annotation_name, $defaultValue = NULL )
	{
		$annot = $this->getAnnotation( $field, $annotation_name );

		return $annot ? $annot->getValue() : $defaultValue;
	}

	/*
	 *   アノテーション設定値を設定
	 */
	public function setAnnotationValue( String $field, String $annotation_name, String $value )
	{
		$annot = $this->getAnnotation( $field, $annotation_name );

		if ( $annot ){
			$annot->setValue( $value );
		}
	}

	/*
	 *   フォームアノテーションを取得
	 */
	public function getFormAnnotation( String $type )
	{
		$field = '___form';
		return $this->getAnnotation( $field, $type );
	}

	/*
	 *   フォームアノテーション設定値を取得
	 */
	public function getFormAnnotationValue( String $type )
	{
		$field = s('___form');
		return $this->getAnnotationValue( $field, $type );
	}

	/*
	 *   フォームアノテーション設定値を設定
	 */
	public function setFormAnnotationValue( String $type, String $value )
	{
		$field = s('___form');
		return $this->setAnnotationValue( $field, $type, $value );
	}

	/*
	 *   デフォルトのキャプションクラスを取得
	 */
	public function getDefaultCaptionClass()
	{
		$key = "___default_caption_class";
		return isset($this->_class_vars[$key]) ? $this->_class_vars[$key] : NULL;
	}

	/*
	 *   デフォルトのキャプションスタイルを取得
	 */
	public function getDefaultCaptionStyle()
	{
		$key = "___default_caption_style";
		return isset($this->_class_vars[$key]) ? $this->_class_vars[$key] : NULL;
	}

	/*
	 *   デフォルトのフィールドクラスを取得
	 */
	public function getDefaultFieldClass( String $field_type )
	{
		$key = "___default_{$field_type}_class";
		return isset($this->_class_vars[$key]) ? $this->_class_vars[$key] : NULL;
	}

	/*
	 *   デフォルトのフィールドスタイルを取得
	 */
	public function getDefaultFieldStyle( String $field_type )
	{
		$key = "___default_{$field_type}_style";
		return isset($this->_class_vars[$key]) ? $this->_class_vars[$key] : NULL;
	}


	/*
	 *   選択リストの候補を取得
	 */
	public function getChoiceList( String $list_name )
	{
		return NULL;
	}


	/*
	 *   ダンプ
	 */
	public function dump()
	{
		print "[annotation dump]<BR>";
		print "form name:" . $this->getFormName() . "<BR>";
		$annotations = $this->_annotations;
		if ( $annotations ){
			foreach( $annotations as $field => $annot_array ){
				print "field[$field]:<BR>";
				foreach( $annot_array as $name => $annot ){
					print str_repeat('&nbsp;',8);
					print '@' . $name . ' value=&gt;' . $annot->getValue() . ' param=&gt;' . $annot->getParameter() . '<BR>' ;
				}
			}
		}
	}

}

return __FILE__;