<?php

define ('FALSE_ON_NULL', 1);
define ('EMPTY_ON_NULL', 2);

class Params extends kBase {
	var $_Params = Array();
	
	function Params($params_str=null)
	{
		parent::kBase();
		if($params_str != '') $this->SplitParamsStr($params_str);
	}
	
	/**
	 * Splits tag params into associative array
	 *
	 * @param string $params_str
	 * @access private
	 */
	function SplitParamsStr($params_str)
	{
		preg_match_all('/([\${}a-zA-Z0-9_.]+)=(["\']{1,1})(.*?)(?<!\\\)\\2/s', $params_str, $rets, PREG_SET_ORDER);
		
		$values = Array();
		foreach ($rets AS $key => $val){
			$values[$val[1]] = str_replace('\\' . $val[2], $val[2], $val[3]);
		}
		$this->AddParams($values);
	}
	
	/**
	 * Sets new parameter value
	 *
	 * @param string $name
	 * @param string $val
	 * @access public
	 */
	function Set($name, $val)
	{
		//echo "sessing params: [$name] = [$val] (class: <b>".get_class($this)."</b>)<br>";
//		$this->_Params[strtolower($name)] = $val;
		$this->_Params[$name] = $val;
	}
	
	/**
	 * Removes parameter
	 *
	 * @param string $name
	 * @access public
	 */
	function Remove($name)
	{
		unset($this->_Params[$name]);
	}
	
	/**
	 * Gets parameter value by parameter name
	 *
	 * @param string $name
	 * @param int $mode
	 * @return string
	 * @access public
	 */
	function Get($name, $mode=FALSE_ON_NULL)
	{
		// echo " name : '$name' || mode : $mode <br> ";
		//$name = strtolower($name);
		if (array_key_exists($name, $this->_Params)) 
			return $this->_Params[$name];
		else
			return $mode == FALSE_ON_NULL ? false : '';
	}
	
	/**
	 * Mass parameter setting from hash
	 *
	 * @param Array $params
	 * @access public
	 */
	function AddParams($params)
	{
		if (!is_array($params)) return;
		/*if (count($this->_Params) == 0) {
			$this->_Params = $params;	
		}
		else {*/
			foreach ($params as $name => $val)
//				$this->Set(strtolower($name), $val);
				$this->Set($name, $val);
		//}
	}
		
	/**
	 * Return all paramters as hash
	 *
	 * @return Array
	 * @access public
	 */
	function GetParams()
	{
		return $this->_Params;
	}
}

class kArray extends kBase {
	var $_Array;
	
	/**
	 * Returns array value with any deep key
	 *
	 * @return mixed
	 * @todo array_unshift doesn't accept parameters by reference, fix it's usage in this method
	 */
	function GetArrayValue()
	{
		$args = func_get_args(); 
		array_unshift_ref($args, $this->_Array);
		return call_user_func_array('getArrayValue', $args);
	}

	function SetArrayValue()
	{
		$args = func_get_args(); 
		$value = array_pop($args);
		
		$arr =& $this->_Array;
		for ($i=0; $i<count($args); $i++) {
			$key = $args[$i];
			if ( !isset($arr[$key]) || !is_array($arr[$key]) ) {
				$arr[$key] = Array();
			}
			$arr =& $arr[$key];
		}
		$arr = $value;
	}
}

?>