<?php
/**
* 文字エンコーディング出力フィルタ
*
* PHP version 5
*
* @package    filters
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class EncodingOutputFilter extends CharcoalComponent implements IFilter
{
	var $_config;
	var $_output_filters;

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

	/*
	 * フィルタを行う
	 */
	public function filter( IRequest $request, Response $response )
	{
		log_info( "system",  "EncodingOutputFilterを実行します。", __FILE__, __LINE__ );

		// EncodingConverterを作成
		$conv = EncodingConverter::fromString( 'PHP_TO_HTML' );

		// responseの中身をすべてエンコーディング変換
		$keys = $response->getKeys();
		foreach( $keys as $key ){
			$key = s($key);
			$value = $response->get( $key );
			if ( is_string($value) ){
				$value = $conv->convertEncoding($value);
				$response->set( $key, $value );
			}
			else if ( is_array($value) ){
				$value = $this->_convertEncodingArray( $value, $conv, 1 );
				$response->set( $key, $value );
			}
			else if ( is_object($value) ){
				$value = $this->_convertEncodingObject( $value, $conv, 1 );
				$response->set( $key, $value );
			}
		}

		foreach( $keys as $key ){
			$value = $response->get( s($key) );
		}

		log_info( "system",  "EncodingOutputFilterを実行が完了しました。", __FILE__, __LINE__ );
	}

	/*
	 * オブジェクトのエンコーディング変換（再帰メソッド）
	 */
	private function _convertEncodingObject( $obj, EncodingConverter $conv, $level )
	{
		$vars = get_object_vars($obj);

		foreach( $vars as $key => $var ){
			if ( is_string($var) ){
				$var = $conv->convertEncoding($var);
				$obj->$key = $var;
			}
			else if ( is_array($var) ){
				$var = $this->_convertEncodingArray( $var, $conv, $level + 1 );
				$obj->$key = $var;
			}
			else if ( is_object($var) ){
				$var = $this->_convertEncodingObject( $var, $conv, $level + 1 );
				$obj->$key = $var;
			}
			else{
				$obj->$key = $var;
			}
		}

		return $obj;
	}

	/*
	 * 配列のエンコーディング変換（再帰メソッド）
	 */
	private function _convertEncodingArray( $ary, EncodingConverter $conv, $level )
	{
		foreach( $ary as $key => $value ){
			if ( is_string($value) ){
				$value = $conv->convertEncoding($value);
				$ary[ $key ] = $value;
			}
			else if ( is_array($value) ){
				$value = $this->_convertEncodingArray( $value, $conv, $level + 1 );
				$ary[ $key ] = $value;
			}
			else if ( is_object($value) ){
				$value = $this->_convertEncodingObject( $value, $conv, $level + 1 );
				$ary[ $key ] = $value;
			}
			else{
				$ary[ $key ] = $value;
			}
		}

		return $ary;
	}

}

return __FILE__;