<?php
/**
* 単純なディスパッチャを実装するクラス
*
* PHP version 5
*
* @package    dispatchers
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class charcoal_SimpleDispatcher implements charcoal_IDispatcher
{
	const DISPATCH_KEYWORD   = 'dispatch:';
	const REDIRECT_KEYWORD   = 'redirect';
	const DEFAULT_PROCKEY    = 'index';

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

	/*
	 * リクエストディスパッチャ名を取得
	 */
	public function getDispatcherName()
	{
		return "Simple Sispatcher";
	}

	/*
	 * リクエストディスパッチャを初期化する
	 */
	public function init( charcoal_Config $config )
	{
	}

	/*
	 * ディスパッチを行う
	 *
	 * @return 文字列 プロシージャ名
	 */
	public function dispatch( charcoal_Request $request )
	{
		// プロシージャを決定
		$proc = $request->get( PROC_KEYWORD );

		// urlencodeされたものを元に戻す
//		$proc = rawurldecode ($proc);

		// プロシージャ指定なしの場合はデフォルトとする
		if ( $proc == NULL ){
			log_info( "system",  "プロシージャキー[" . PROC_KEYWORD . "]が指定されていません。", __FILE__, __LINE__ );
			$proc = self::DEFAULT_PROCKEY;
		}

		// Requestオブジェクトのキー一覧
		$keys = $request->getKeys();

		// Requestオブジェクトから「dispatch:」で始まるエントリを検索
		foreach( $keys as $key ){
			// _xで終わるなら、その部分を削る（input type="image"対応）
			if ( ereg("_x$",$key) ){
				$key = substr( $key, 0, strlen($key) - 2 );
			}
			$pos = strpos($key,charcoal_SimpleDispatcher::DISPATCH_KEYWORD);
			if ( is_int($pos) && intval($pos) == 0 ){
				// キーワード以降を取得
				$proc = substr( $key, strlen(charcoal_SimpleDispatcher::DISPATCH_KEYWORD) );
				// &以降はGETパラメータとして追加
				// <input type="submit" name="dispatch:proc_name&p1=value1&p2=value2...">
				$params = explode( "&", $proc );
				// プロシージャ名と取り出す
				$proc = array_shift( $params );
				// 残りはキー=値としてRequestオブジェクトにセット
				foreach( $params as $key_value ){
					list( $key, $value ) = explode( "=", $key_value );
					$request->set( $key, $value );
				}
				break;
			}
		}

		// プロシージャ名を返却
		return s($proc);
	}
}
