<?php
/**
* デフォルトのフォームモデル
*
* PHP version 5
*
* @package    components.db
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
abstract class charcoal_DefaultFormModel implements charcoal_IFormModel
{
	private $_class_name;
	private $_class_vars;
	private $_annotations;

	/*
	 *	コンストラクタ
	 */
	public function __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] = charcoal_AnnotationUtil::parse( $key, $var );
			}
		}
	}

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

	/**
	 * フィールドが存在するか
	 */
	public function fieldExists( $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 && $annot->getName() === 'field' && $annot->getValue() === NULL ){
						$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 && $annot->getName() === 'input' && $annot->getValue() === NULL ){
						$result[] = $field;
					}
				}
			}
		}

		return $result;
	}

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

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

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


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

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

	/*
	 *   デフォルトのキャプションクラスを取得
	 */
	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( $field_type )
	{
		$key = "___default_{$field_type}_class";
		return isset($this->_class_vars[$key]) ? $this->_class_vars[$key] : NULL;
	}

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


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


	/*
	 *   ダンプ
	 */
	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>' ;
				}
			}
		}
	}

}
